|
1 | 1 | /* |
2 | | - Copyright © 1995-2007, The AROS Development Team. All rights reserved. |
| 2 | + Copyright © 1995-2007, The AROS Development Team. All rights reserved. |
3 | 3 | $Id$ |
4 | 4 |
|
5 | 5 | Desc: Graphics function DoCollision() |
|
52 | 52 |
|
53 | 53 | struct VSprite * CurVSprite, * _CurVSprite; |
54 | 54 | int shift, _shift; |
| 55 | + BOOL brdh; |
| 56 | + struct Layer *layer; |
| 57 | + struct VSprite brdSprite, *brds; |
55 | 58 |
|
56 | 59 | if (NULL != rp->GelsInfo) |
57 | 60 | { |
58 | 61 | CurVSprite = rp->GelsInfo->gelHead->NextVSprite; |
| 62 | + |
| 63 | + brdh = (LONG)(rp->GelsInfo->collHandler->collPtrs[0]) != 0; |
| 64 | + layer = rp->Layer; |
| 65 | + if(layer) |
| 66 | + ObtainSemaphore(&layer->Lock); |
| 67 | + |
59 | 68 | if (CurVSprite->Flags & VSPRITE) |
60 | 69 | shift = 1; |
61 | 70 | else |
|
64 | 73 | while (NULL != CurVSprite->NextVSprite) |
65 | 74 | { |
66 | 75 | _CurVSprite = CurVSprite->NextVSprite; |
| 76 | + |
| 77 | + // For safety, break at the tail GEL |
| 78 | + if(CurVSprite == rp->GelsInfo->gelTail) |
| 79 | + break; |
| 80 | + |
| 81 | + /* |
| 82 | + * Check border collision |
| 83 | + */ |
| 84 | + brds = CurVSprite; |
| 85 | + if(layer && (brds->Flags & VSPRITE)) |
| 86 | + { |
| 87 | + brdSprite = *CurVSprite; |
| 88 | + brds = &brdSprite; |
| 89 | + brds->X = brds->X - (layer->bounds.MinX - layer->Scroll_X); |
| 90 | + brds->Y = brds->Y - (layer->bounds.MinY - layer->Scroll_Y); |
| 91 | + } |
| 92 | + if(brdh) |
| 93 | + { |
| 94 | + if(brds->HitMask | 0) |
| 95 | + { |
| 96 | + WORD hit = 0; |
| 97 | + WORD lr; |
| 98 | + |
| 99 | + // top hit |
| 100 | + if(brds->Y <= rp->GelsInfo->topmost) |
| 101 | + { |
| 102 | + hit = 1; |
| 103 | + } |
| 104 | + // bottom hit |
| 105 | + if( ((brds->Y + brds->Height) ) >= rp->GelsInfo->bottommost) |
| 106 | + { |
| 107 | + hit |= 2; |
| 108 | + } |
| 109 | + // left hit |
| 110 | + lr = rp->GelsInfo->leftmost - brds->X; |
| 111 | + if(lr >= 0) |
| 112 | + { |
| 113 | + if(lr > (brds->Width << 4)) |
| 114 | + lr = (brds->Width << 4); |
| 115 | + hit |= 4; |
| 116 | + } |
| 117 | + // right hit |
| 118 | + lr = (brds->X + (brds->Width << 4)) - rp->GelsInfo->rightmost; |
| 119 | + if(lr >= 0) |
| 120 | + { |
| 121 | + if(lr > (brds->Width << 4)) |
| 122 | + lr = (brds->Width << 4); |
| 123 | + hit |= 8; |
| 124 | + } |
| 125 | + /* |
| 126 | + * Did we hit a border? Then call Collision 0 |
| 127 | + */ |
| 128 | + if(hit != 0) |
| 129 | + { |
| 130 | + if(CurVSprite->VSBob && (CurVSprite->VSBob->Flags & BOBSAWAY)) |
| 131 | + {} |
| 132 | + else |
| 133 | + rp->GelsInfo->collHandler->collPtrs[0]( CurVSprite, hit); |
| 134 | + } |
| 135 | + } |
| 136 | + } |
67 | 137 |
|
68 | 138 | /* |
69 | 139 | * As long as they can overlap vertically.. |
|
212 | 282 | if (collision) |
213 | 283 | { |
214 | 284 | UWORD mask = CurVSprite->MeMask & _CurVSprite->HitMask; |
215 | | - int i = 0; |
| 285 | + int i = 1; |
216 | 286 | while (i < 16 && 0 != mask) |
217 | 287 | { |
218 | 288 | if (mask & 0x01) |
|
232 | 302 | } |
233 | 303 | CurVSprite = CurVSprite->NextVSprite; |
234 | 304 | } |
| 305 | + |
| 306 | + if(layer) |
| 307 | + ReleaseSemaphore( &layer->Lock); |
235 | 308 | } |
236 | 309 |
|
237 | 310 | AROS_LIBFUNC_EXIT |
|
0 commit comments