1 #include "ContactListener.h"
2
3 ContactListener *currentContactAddedListener = 0;
4 ContactListener *currentContactProcessedListener = 0;
5 ContactListener *currentContactDestroyedListener = 0;
6 ContactListener *currentContactStartedListener = 0;
7 ContactListener *currentContactEndedListener = 0;
8
ContactAddedListener_CB_wrapper_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)9 inline bool ContactAddedListener_CB_wrapper_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
10 return currentContactAddedListener->onContactAdded(cp, *colObj0Wrap, partId0, index0, *colObj1Wrap, partId1, index1);
11 }
ContactAddedListener_CB_object_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)12 inline bool ContactAddedListener_CB_object_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
13 return currentContactAddedListener->onContactAdded(cp, colObj0Wrap->m_collisionObject, partId0, index0, colObj1Wrap->m_collisionObject, partId1, index1);
14 }
ContactAddedListener_CB_value_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)15 inline bool ContactAddedListener_CB_value_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
16 return currentContactAddedListener->onContactAdded(cp,
17 ((GdxCollisionObjectBridge*)(colObj0Wrap->m_collisionObject->getUserPointer()))->userValue,
18 partId0, index0,
19 ((GdxCollisionObjectBridge*)(colObj1Wrap->m_collisionObject->getUserPointer()))->userValue,
20 partId1, index1);
21 }
22
ContactAddedListener_CB_wrapper_filter_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)23 inline bool ContactAddedListener_CB_wrapper_filter_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
24 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
25 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
26 return (!match0 && !match1) ? false :
27 currentContactAddedListener->onContactAdded(cp, *colObj0Wrap, partId0, index0, match0, *colObj1Wrap, partId1, index1, match1);
28 }
ContactAddedListener_CB_object_filter_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)29 inline bool ContactAddedListener_CB_object_filter_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
30 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
31 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
32 return (!match0 && !match1) ? false :
33 currentContactAddedListener->onContactAdded(cp, colObj0Wrap->m_collisionObject, partId0, index0, match0, colObj1Wrap->m_collisionObject, partId1, index1, match1);
34 }
ContactAddedListener_CB_value_filter_point(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)35 inline bool ContactAddedListener_CB_value_filter_point(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
36 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
37 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
38 return (!match0 && !match1) ? false :
39 currentContactAddedListener->onContactAdded(cp,
40 ((GdxCollisionObjectBridge*)(colObj0Wrap->m_collisionObject->getUserPointer()))->userValue,
41 partId0, index0, match0,
42 ((GdxCollisionObjectBridge*)(colObj1Wrap->m_collisionObject->getUserPointer()))->userValue,
43 partId1, index1, match1);
44 }
45
ContactAddedListener_CB_wrapper(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)46 inline bool ContactAddedListener_CB_wrapper(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
47 return currentContactAddedListener->onContactAdded(*colObj0Wrap, partId0, index0, *colObj1Wrap, partId1, index1);
48 }
ContactAddedListener_CB_object(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)49 inline bool ContactAddedListener_CB_object(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
50 return currentContactAddedListener->onContactAdded(colObj0Wrap->m_collisionObject, partId0, index0, colObj1Wrap->m_collisionObject, partId1, index1);
51 }
ContactAddedListener_CB_value(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)52 inline bool ContactAddedListener_CB_value(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
53 return currentContactAddedListener->onContactAdded(
54 ((GdxCollisionObjectBridge*)(colObj0Wrap->m_collisionObject->getUserPointer()))->userValue,
55 partId0, index0,
56 ((GdxCollisionObjectBridge*)(colObj1Wrap->m_collisionObject->getUserPointer()))->userValue,
57 partId1, index1);
58 }
59
ContactAddedListener_CB_wrapper_filter(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)60 inline bool ContactAddedListener_CB_wrapper_filter(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
61 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
62 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
63 return (!match0 && !match1) ? false :
64 currentContactAddedListener->onContactAdded(*colObj0Wrap, partId0, index0, match0, *colObj1Wrap, partId1, index1, match1);
65 }
ContactAddedListener_CB_object_filter(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)66 inline bool ContactAddedListener_CB_object_filter(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
67 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
68 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
69 return (!match0 && !match1) ? false :
70 currentContactAddedListener->onContactAdded(colObj0Wrap->m_collisionObject, partId0, index0, match0, colObj1Wrap->m_collisionObject, partId1, index1, match1);
71 }
ContactAddedListener_CB_value_filter(btManifoldPoint & cp,const btCollisionObjectWrapper * colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper * colObj1Wrap,int partId1,int index1)72 inline bool ContactAddedListener_CB_value_filter(btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) {
73 const bool match0 = gdxCheckFilter(colObj0Wrap->m_collisionObject, colObj1Wrap->m_collisionObject);
74 const bool match1 = gdxCheckFilter(colObj1Wrap->m_collisionObject, colObj0Wrap->m_collisionObject);
75 return (!match0 && !match1) ? false :
76 currentContactAddedListener->onContactAdded(
77 ((GdxCollisionObjectBridge*)(colObj0Wrap->m_collisionObject->getUserPointer()))->userValue,
78 partId0, index0, match0,
79 ((GdxCollisionObjectBridge*)(colObj1Wrap->m_collisionObject->getUserPointer()))->userValue,
80 partId1, index1, match1);
81 }
82 // ContactProcessed
ContactProcessedListener_CB_object_point(btManifoldPoint & cp,void * body0,void * body1)83 inline bool ContactProcessedListener_CB_object_point(btManifoldPoint& cp,void *body0, void *body1) {
84 currentContactProcessedListener->onContactProcessed(cp, (btCollisionObject*)body0, (btCollisionObject*)body1);
85 return false;
86 }
ContactProcessedListener_CB_value_point(btManifoldPoint & cp,void * body0,void * body1)87 inline bool ContactProcessedListener_CB_value_point(btManifoldPoint& cp,void *body0, void *body1) {
88 currentContactProcessedListener->onContactProcessed(cp,
89 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body0)->getUserPointer()))->userValue,
90 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body1)->getUserPointer()))->userValue);
91 return false;
92 }
ContactProcessedListener_CB_object_filter_point(btManifoldPoint & cp,void * body0,void * body1)93 inline bool ContactProcessedListener_CB_object_filter_point(btManifoldPoint& cp,void *body0, void *body1) {
94 const bool match0 = gdxCheckFilter((btCollisionObject*)body0, (btCollisionObject*)body1);
95 const bool match1 = gdxCheckFilter((btCollisionObject*)body1, (btCollisionObject*)body0);
96 if (match0 || match1)
97 currentContactProcessedListener->onContactProcessed(cp, (btCollisionObject*)body0, match0, (btCollisionObject*)body1, match1);
98 return false;
99 }
ContactProcessedListener_CB_value_filter_point(btManifoldPoint & cp,void * body0,void * body1)100 inline bool ContactProcessedListener_CB_value_filter_point(btManifoldPoint& cp,void *body0, void *body1) {
101 const bool match0 = gdxCheckFilter((btCollisionObject*)body0, (btCollisionObject*)body1);
102 const bool match1 = gdxCheckFilter((btCollisionObject*)body1, (btCollisionObject*)body0);
103 if (match0 || match1)
104 currentContactProcessedListener->onContactProcessed(cp,
105 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body0)->getUserPointer()))->userValue, match0,
106 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body1)->getUserPointer()))->userValue, match1);
107 return false;
108 }
ContactProcessedListener_CB_object(btManifoldPoint & cp,void * body0,void * body1)109 inline bool ContactProcessedListener_CB_object(btManifoldPoint& cp,void *body0, void *body1) {
110 currentContactProcessedListener->onContactProcessed((btCollisionObject*)body0, (btCollisionObject*)body1);
111 return false;
112 }
ContactProcessedListener_CB_value(btManifoldPoint & cp,void * body0,void * body1)113 inline bool ContactProcessedListener_CB_value(btManifoldPoint& cp,void *body0, void *body1) {
114 currentContactProcessedListener->onContactProcessed(
115 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body0)->getUserPointer()))->userValue,
116 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body1)->getUserPointer()))->userValue);
117 return false;
118 }
ContactProcessedListener_CB_object_filter(btManifoldPoint & cp,void * body0,void * body1)119 inline bool ContactProcessedListener_CB_object_filter(btManifoldPoint& cp,void *body0, void *body1) {
120 const bool match0 = gdxCheckFilter((btCollisionObject*)body0, (btCollisionObject*)body1);
121 const bool match1 = gdxCheckFilter((btCollisionObject*)body1, (btCollisionObject*)body0);
122 if (match0 || match1)
123 currentContactProcessedListener->onContactProcessed((btCollisionObject*)body0, match0, (btCollisionObject*)body1, match1);
124 return false;
125 }
ContactProcessedListener_CB_value_filter(btManifoldPoint & cp,void * body0,void * body1)126 inline bool ContactProcessedListener_CB_value_filter(btManifoldPoint& cp,void *body0, void *body1) {
127 const bool match0 = gdxCheckFilter((btCollisionObject*)body0, (btCollisionObject*)body1);
128 const bool match1 = gdxCheckFilter((btCollisionObject*)body1, (btCollisionObject*)body0);
129 if (match0 || match1)
130 currentContactProcessedListener->onContactProcessed(
131 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body0)->getUserPointer()))->userValue, match0,
132 ((GdxCollisionObjectBridge*)(((btCollisionObject*)body1)->getUserPointer()))->userValue, match1);
133 return false;
134 }
135 // ContactDestroyed
ContactDestroyedListener_CB(void * userPersistentData)136 inline bool ContactDestroyedListener_CB(void *userPersistentData) {
137 int val;
138 *(const void **)&val = userPersistentData;
139 currentContactDestroyedListener->onContactDestroyed(val);
140 return false;
141 }
142 // ContactStarted
ContactStartedListener_CB_manifold(btPersistentManifold * const & manifold)143 inline void ContactStartedListener_CB_manifold(btPersistentManifold* const &manifold) {
144 currentContactStartedListener->onContactStarted(manifold);
145 }
ContactStartedListener_CB_object(btPersistentManifold * const & manifold)146 inline void ContactStartedListener_CB_object(btPersistentManifold* const &manifold) {
147 currentContactStartedListener->onContactStarted(manifold->getBody0(), manifold->getBody1());
148 }
ContactStartedListener_CB_value(btPersistentManifold * const & manifold)149 inline void ContactStartedListener_CB_value(btPersistentManifold* const &manifold) {
150 currentContactStartedListener->onContactStarted(
151 ((GdxCollisionObjectBridge*)(manifold->getBody0()->getUserPointer()))->userValue,
152 ((GdxCollisionObjectBridge*)(manifold->getBody1()->getUserPointer()))->userValue);
153 }
ContactStartedListener_CB_manifold_filter(btPersistentManifold * const & manifold)154 inline void ContactStartedListener_CB_manifold_filter(btPersistentManifold* const &manifold) {
155 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
156 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
157 if (match0 || match1)
158 currentContactStartedListener->onContactStarted(manifold, match0, match1);
159 }
ContactStartedListener_CB_object_filter(btPersistentManifold * const & manifold)160 inline void ContactStartedListener_CB_object_filter(btPersistentManifold* const &manifold) {
161 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
162 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
163 if (match0 || match1)
164 currentContactStartedListener->onContactStarted(manifold->getBody0(), match0, manifold->getBody1(), match1);
165 }
ContactStartedListener_CB_value_filter(btPersistentManifold * const & manifold)166 inline void ContactStartedListener_CB_value_filter(btPersistentManifold* const &manifold) {
167 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
168 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
169 if (match0 || match1)
170 currentContactStartedListener->onContactStarted(
171 ((GdxCollisionObjectBridge*)(manifold->getBody0()->getUserPointer()))->userValue, match0,
172 ((GdxCollisionObjectBridge*)(manifold->getBody1()->getUserPointer()))->userValue, match1);
173 }
174 // ContactEnded
ContactEndedListener_CB_manifold(btPersistentManifold * const & manifold)175 inline void ContactEndedListener_CB_manifold(btPersistentManifold* const &manifold) {
176 currentContactEndedListener->onContactEnded(manifold);
177 }
ContactEndedListener_CB_object(btPersistentManifold * const & manifold)178 inline void ContactEndedListener_CB_object(btPersistentManifold* const &manifold) {
179 currentContactEndedListener->onContactEnded(manifold->getBody0(), manifold->getBody1());
180 }
ContactEndedListener_CB_value(btPersistentManifold * const & manifold)181 inline void ContactEndedListener_CB_value(btPersistentManifold* const &manifold) {
182 currentContactEndedListener->onContactEnded(
183 ((GdxCollisionObjectBridge*)(manifold->getBody0()->getUserPointer()))->userValue,
184 ((GdxCollisionObjectBridge*)(manifold->getBody1()->getUserPointer()))->userValue);
185 }
ContactEndedListener_CB_manifold_filter(btPersistentManifold * const & manifold)186 inline void ContactEndedListener_CB_manifold_filter(btPersistentManifold* const &manifold) {
187 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
188 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
189 if (match0 || match1)
190 currentContactEndedListener->onContactEnded(manifold, match0, match1);
191 }
ContactEndedListener_CB_object_filter(btPersistentManifold * const & manifold)192 inline void ContactEndedListener_CB_object_filter(btPersistentManifold* const &manifold) {
193 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
194 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
195 if (match0 || match1)
196 currentContactEndedListener->onContactEnded(manifold->getBody0(), match0, manifold->getBody1(), match1);
197 }
ContactEndedListener_CB_value_filter(btPersistentManifold * const & manifold)198 inline void ContactEndedListener_CB_value_filter(btPersistentManifold* const &manifold) {
199 const bool match0 = gdxCheckFilter(manifold->getBody0(), manifold->getBody1());
200 const bool match1 = gdxCheckFilter(manifold->getBody1(), manifold->getBody0());
201 if (match0 || match1)
202 currentContactEndedListener->onContactEnded(
203 ((GdxCollisionObjectBridge*)(manifold->getBody0()->getUserPointer()))->userValue, match0,
204 ((GdxCollisionObjectBridge*)(manifold->getBody1()->getUserPointer()))->userValue, match1);
205 }
206
ContactListener(bool dummy)207 ContactListener::ContactListener(bool dummy)
208 : events(0) {}
209
~ContactListener()210 ContactListener::~ContactListener() {
211 disable();
212 }
213
setEvents(const int & events)214 void ContactListener::setEvents(const int &events) {
215 this->events = events;
216 }
217
enable()218 void ContactListener::enable() {
219 enableOnAdded();
220 enableOnProcessed();
221 enableOnDestroyed();
222 enableOnStarted();
223 enableOnEnded();
224 }
225
disable()226 void ContactListener::disable() {
227 disableOnAdded();
228 disableOnProcessed();
229 disableOnDestroyed();
230 disableOnStarted();
231 disableOnEnded();
232 }
233
enableOnAdded()234 void ContactListener::enableOnAdded() {
235 const int e = (events >> SHIFT_ON_ADDED) & TYPE_MASK;
236 if (e == 0)
237 return;
238 const bool filter = (e & FILTERED) != 0;
239 const bool point = (e & INCLUDE_POINT) != 0;
240 const int by = (e & BY_MASK);
241 currentContactAddedListener = this;
242 if (by == BY_OBJECT)
243 gContactAddedCallback = filter ?
244 (point ? ContactAddedListener_CB_object_filter_point : ContactAddedListener_CB_object_filter) :
245 (point ? ContactAddedListener_CB_object_point : ContactAddedListener_CB_object);
246 else if (by == BY_VALUE)
247 gContactAddedCallback = filter ?
248 (point ? ContactAddedListener_CB_value_filter_point : ContactAddedListener_CB_value_filter) :
249 (point ? ContactAddedListener_CB_value_point : ContactAddedListener_CB_value);
250 else
251 gContactAddedCallback = filter ?
252 (point ? ContactAddedListener_CB_wrapper_filter_point: ContactAddedListener_CB_wrapper_filter) :
253 (point ? ContactAddedListener_CB_wrapper_point : ContactAddedListener_CB_wrapper);
254 }
255
disableOnAdded()256 void ContactListener::disableOnAdded() {
257 if (currentContactAddedListener == this) {
258 gContactAddedCallback = 0;
259 currentContactAddedListener = 0;
260 }
261 }
262
isOnAddedEnabled()263 bool ContactListener::isOnAddedEnabled() {
264 return currentContactAddedListener == this;
265 }
266
enableOnProcessed()267 void ContactListener::enableOnProcessed() {
268 const int e = (events >> SHIFT_ON_PROCESSED) & TYPE_MASK;
269 if (e == 0)
270 return;
271 const bool filter = (e & FILTERED) != 0;
272 const bool point = (e & INCLUDE_POINT) != 0;
273 const int by = (e & BY_MASK);
274 currentContactProcessedListener = this;
275 if (by == BY_VALUE)
276 gContactProcessedCallback = filter ?
277 (point ? ContactProcessedListener_CB_value_filter_point : ContactProcessedListener_CB_value_filter) :
278 (point ? ContactProcessedListener_CB_value_point : ContactProcessedListener_CB_value);
279 else
280 gContactProcessedCallback = filter ?
281 (point ? ContactProcessedListener_CB_object_filter_point : ContactProcessedListener_CB_object_filter) :
282 (point ? ContactProcessedListener_CB_object_point : ContactProcessedListener_CB_object);
283 }
284
disableOnProcessed()285 void ContactListener::disableOnProcessed() {
286 if (currentContactProcessedListener == this) {
287 gContactProcessedCallback = 0;
288 currentContactProcessedListener = 0;
289 }
290 }
291
isOnProcessedEnabled()292 bool ContactListener::isOnProcessedEnabled() {
293 return currentContactProcessedListener == this;
294 }
295
enableOnDestroyed()296 void ContactListener::enableOnDestroyed() {
297 const int e = (events >> SHIFT_ON_DESTROYED) & TYPE_MASK;
298 if (e == 0)
299 return;
300 const bool filter = (e & FILTERED) != 0;
301 const bool point = (e & INCLUDE_POINT) != 0;
302 const int by = (e & BY_MASK);
303 currentContactDestroyedListener = this;
304 gContactDestroyedCallback = ContactDestroyedListener_CB;
305 }
306
disableOnDestroyed()307 void ContactListener::disableOnDestroyed() {
308 if (currentContactDestroyedListener == this) {
309 gContactDestroyedCallback = 0;
310 currentContactDestroyedListener = 0;
311 }
312 }
313
isOnDestroyedEnabled()314 bool ContactListener::isOnDestroyedEnabled() {
315 return currentContactDestroyedListener == this;
316 }
317
enableOnStarted()318 void ContactListener::enableOnStarted() {
319 const int e = (events >> SHIFT_ON_STARTED) & TYPE_MASK;
320 if (e == 0)
321 return;
322 const bool filter = (e & FILTERED) != 0;
323 const bool point = (e & INCLUDE_POINT) != 0;
324 const int by = (e & BY_MASK);
325 currentContactStartedListener = this;
326 if (by == BY_OBJECT)
327 gContactStartedCallback = filter ? ContactStartedListener_CB_object_filter : ContactStartedListener_CB_object;
328 else if (by == BY_VALUE)
329 gContactStartedCallback = filter ? ContactStartedListener_CB_value_filter : ContactStartedListener_CB_value;
330 else
331 gContactStartedCallback = filter ? ContactStartedListener_CB_manifold_filter : ContactStartedListener_CB_manifold;
332 }
333
disableOnStarted()334 void ContactListener::disableOnStarted() {
335 if (currentContactStartedListener == this) {
336 gContactStartedCallback = 0;
337 currentContactStartedListener = 0;
338 }
339 }
340
isOnStartedEnabled()341 bool ContactListener::isOnStartedEnabled() {
342 return currentContactStartedListener == this;
343 }
344
enableOnEnded()345 void ContactListener::enableOnEnded() {
346 const int e = (events >> SHIFT_ON_ENDED) & TYPE_MASK;
347 if (e == 0)
348 return;
349 const bool filter = (e & FILTERED) != 0;
350 const bool point = (e & INCLUDE_POINT) != 0;
351 const int by = (e & BY_MASK);
352 currentContactEndedListener = this;
353 if (by == BY_OBJECT)
354 gContactEndedCallback = filter ? ContactEndedListener_CB_object_filter : ContactEndedListener_CB_object;
355 else if (by == BY_VALUE)
356 gContactEndedCallback = filter ? ContactEndedListener_CB_value_filter : ContactEndedListener_CB_value;
357 else
358 gContactEndedCallback = filter ? ContactEndedListener_CB_manifold_filter : ContactEndedListener_CB_manifold;
359 }
360
disableOnEnded()361 void ContactListener::disableOnEnded() {
362 if (currentContactEndedListener == this) {
363 gContactEndedCallback = 0;
364 currentContactEndedListener = 0;
365 }
366 }
367
isOnEndedEnabled()368 bool ContactListener::isOnEndedEnabled() {
369 return currentContactEndedListener == this;
370 }