2 Copyright © 1995-2004, The AROS Development Team. All rights reserved.
5 Desc: Graphics function DoCollision()
8 #include <graphics/rastport.h>
9 #include <graphics/gels.h>
11 /*****************************************************************************
14 #include <proto/graphics.h>
16 AROS_LH1(void, DoCollision
,
19 AROS_LHA(struct RastPort
*, rp
, A1
),
22 struct GfxBase
*, GfxBase
, 18, Graphics
)
25 Tests each gel in gel list for boundary and gel-to-gel collisions.
26 If a collision happens the collision handling routine is called.
27 The gel list must be sorted by y,x order.
30 rp - pointer to RastPort
47 ******************************************************************************/
50 AROS_LIBBASE_EXT_DECL(struct GfxBase
*,GfxBase
)
52 struct VSprite
* CurVSprite
, * _CurVSprite
;
55 if (NULL
!= rp
->GelsInfo
)
57 CurVSprite
= rp
->GelsInfo
->gelHead
->NextVSprite
;
58 if (CurVSprite
->Flags
& VSPRITE
)
63 while (NULL
!= CurVSprite
->NextVSprite
)
65 _CurVSprite
= CurVSprite
->NextVSprite
;
68 * As long as they can overlap vertically..
70 while (NULL
!= _CurVSprite
&&
71 (CurVSprite
->Y
+ CurVSprite
->Height
- 1) >= _CurVSprite
->Y
)
74 * Do these two overlap horizontally ???
76 if (_CurVSprite
->Flags
& VSPRITE
)
82 ((CurVSprite
->X
>_CurVSprite
->X
+(_CurVSprite
->Width
<<_shift
)-1) ||
83 (CurVSprite
->X
+(CurVSprite
->Width
<<shift
)-1<_CurVSprite
->X
))
87 * Must test the collision masks!!
88 * Phew, this is not going to be easy.
90 int collision
= FALSE
;
91 int dy
= _CurVSprite
->Y
- CurVSprite
->Y
;
92 UWORD
* collmask
= CurVSprite
->CollMask
;
93 UWORD
* _collmask
= _CurVSprite
->CollMask
;
94 unsigned short wordsperline
;
95 unsigned short _wordsperline
;
97 int offset
, _offset
= 0;
101 * I will hold the CurVSprite's collision mask still
102 * and adjust/shift the collision mask of _CurVSprite.
103 * If any and'ing results with non-zero, there is a
106 if (CurVSprite
->Flags
& VSPRITE
)
107 wordsperline
= CurVSprite
->Width
>> 4; // should be 1
109 wordsperline
= CurVSprite
->Width
;
111 if (_CurVSprite
->Flags
& VSPRITE
)
112 _wordsperline
= _CurVSprite
->Width
>> 4; // should be 1
114 _wordsperline
= _CurVSprite
->Width
;
119 * _CurVSprite is lower than CurVSprite
121 i
= wordsperline
* dy
;
122 line
= _CurVSprite
->Y
;
126 _i
= _wordsperline
* dy
;
127 line
= CurVSprite
->Y
;
130 offset
= _CurVSprite
->X
- CurVSprite
->X
;
133 _offset
= (-offset
) >> 4;
134 _scroll
= (-offset
) & 0xf;
140 * _CurVSprite is further to the right than
143 _scroll
= -(offset
& 0xf);
148 * _scroll > 0 means shift the bits to the RIGHT!
150 while ((line
< ( CurVSprite
->Height
+ CurVSprite
->Y
)) &&
151 (line
< (_CurVSprite
->Height
+_CurVSprite
->Y
)) )
153 int curindex
= offset
;
154 int _curindex
= _offset
;
155 while ( curindex
< wordsperline
&&
156 _curindex
< _wordsperline
)
160 if (collmask
[curindex
+i
] & (_collmask
[_curindex
+_i
] >> _scroll
) )
166 if (curindex
> wordsperline
)
169 if (collmask
[curindex
+i
] & (_collmask
[_curindex
+_i
] << (16-_scroll
)))
179 if (collmask
[curindex
+i
] & _collmask
[_curindex
+_i
])
189 if (collmask
[curindex
+i
] & (_collmask
[_curindex
+_i
] << (-_scroll
)))
195 if (_curindex
> _wordsperline
)
198 if (collmask
[curindex
+i
] & (_collmask
[_curindex
+_i
] >> (16+_scroll
)))
211 if (TRUE
== collision
)
213 UWORD mask
= CurVSprite
->MeMask
& _CurVSprite
->HitMask
;
215 while (i
< 16 && 0 != mask
)
219 if (rp
->GelsInfo
->collHandler
&&
220 rp
->GelsInfo
->collHandler
->collPtrs
[i
])
221 rp
->GelsInfo
->collHandler
->collPtrs
[i
]( CurVSprite
,
230 _CurVSprite
= _CurVSprite
->NextVSprite
;
232 CurVSprite
= CurVSprite
->NextVSprite
;