• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }