Mercurial > projects > chipmunkd
comparison trunk/chipmunkd/cpSpaceStep.d @ 29:80058cee1a77
updated to chipmunk 5.3.4
author | Extrawurst |
---|---|
date | Thu, 16 Dec 2010 00:33:06 +0100 |
parents | 4ceef5833c8c |
children |
comparison
equal
deleted
inserted
replaced
28:4541ca17975b | 29:80058cee1a77 |
---|---|
17 //import chipmunkd.constraints.cpConstraint; | 17 //import chipmunkd.constraints.cpConstraint; |
18 //import chipmunkd.cpSpaceQuery; | 18 //import chipmunkd.cpSpaceQuery; |
19 // | 19 // |
20 //#pragma mark Post Step Callback Functions | 20 //#pragma mark Post Step Callback Functions |
21 | 21 |
22 struct postStepCallback { | 22 struct PostStepCallback { |
23 cpPostStepFunc func; | 23 cpPostStepFunc func; |
24 void *obj; | 24 void *obj; |
25 void *data; | 25 void *data; |
26 } | 26 } |
27 | 27 |
28 static cpBool | 28 static cpBool |
29 postStepFuncSetEql(postStepCallback *a, postStepCallback *b){ | 29 postStepFuncSetEql(PostStepCallback *a, PostStepCallback *b){ |
30 return a.obj == b.obj; | 30 return a.obj == b.obj; |
31 } | 31 } |
32 | 32 |
33 static void * | 33 static void * |
34 postStepFuncSetTrans(postStepCallback *callback, void *ignored) | 34 postStepFuncSetTrans(PostStepCallback *callback, void *ignored) |
35 { | 35 { |
36 postStepCallback *value = cast(postStepCallback *)cpmalloc(postStepCallback.sizeof); | 36 PostStepCallback *value = cast(PostStepCallback *)cpmalloc(PostStepCallback.sizeof); |
37 (*value) = (*callback); | 37 (*value) = (*callback); |
38 | 38 |
39 return value; | 39 return value; |
40 } | 40 } |
41 | 41 |
44 { | 44 { |
45 if(!space.postStepCallbacks){ | 45 if(!space.postStepCallbacks){ |
46 space.postStepCallbacks = cpHashSetNew(0, cast(cpHashSetEqlFunc)&postStepFuncSetEql, cast(cpHashSetTransFunc)&postStepFuncSetTrans); | 46 space.postStepCallbacks = cpHashSetNew(0, cast(cpHashSetEqlFunc)&postStepFuncSetEql, cast(cpHashSetTransFunc)&postStepFuncSetTrans); |
47 } | 47 } |
48 | 48 |
49 postStepCallback callback = {func, obj, data}; | 49 PostStepCallback callback = {func, obj, data}; |
50 cpHashSetInsert(space.postStepCallbacks, cast(cpHashValue)cast(size_t)obj, &callback, null); | 50 cpHashSetInsert(space.postStepCallbacks, cast(cpHashValue)cast(size_t)obj, &callback, null); |
51 } | |
52 | |
53 void * | |
54 cpSpaceGetPostStepData(cpSpace *space, void *obj) | |
55 { | |
56 if(space.postStepCallbacks){ | |
57 PostStepCallback query = {null, obj, null}; | |
58 PostStepCallback *callback = cast(PostStepCallback *)cpHashSetFind(space.postStepCallbacks, cast(cpHashValue)cast(size_t)obj, &query); | |
59 return (callback ? callback.data : null); | |
60 } else { | |
61 return null; | |
62 } | |
51 } | 63 } |
52 | 64 |
53 //#pragma mark Contact Buffer Functions | 65 //#pragma mark Contact Buffer Functions |
54 | 66 |
55 enum CP_CONTACTS_BUFFER_SIZE = ((CP_BUFFER_BYTES - cpContactBufferHeader.sizeof)/cpContact.sizeof); | 67 enum CP_CONTACTS_BUFFER_SIZE = ((CP_BUFFER_BYTES - cpContactBufferHeader.sizeof)/cpContact.sizeof); |
251 return cpTrue; | 263 return cpTrue; |
252 } | 264 } |
253 | 265 |
254 // Hashset filter func to call and throw away post step callbacks. | 266 // Hashset filter func to call and throw away post step callbacks. |
255 static void | 267 static void |
256 postStepCallbackSetIter(postStepCallback *callback, cpSpace *space) | 268 postStepCallbackSetIter(PostStepCallback *callback, cpSpace *space) |
257 { | 269 { |
258 callback.func(space, callback.obj, callback.data); | 270 callback.func(space, callback.obj, callback.data); |
259 cpfree(callback); | 271 cpfree(callback); |
260 } | 272 } |
261 | 273 |
267 | 279 |
268 void | 280 void |
269 cpSpaceStep(cpSpace *space, cpFloat dt) | 281 cpSpaceStep(cpSpace *space, cpFloat dt) |
270 { | 282 { |
271 if(!dt) return; // don't step if the timestep is 0! | 283 if(!dt) return; // don't step if the timestep is 0! |
272 | |
273 cpFloat dt_inv = 1.0f/dt; | 284 cpFloat dt_inv = 1.0f/dt; |
274 | 285 |
275 cpArray *bodies = space.bodies; | 286 cpArray *bodies = space.bodies; |
276 cpArray *constraints = space.constraints; | 287 cpArray *constraints = space.constraints; |
277 | 288 |
285 } | 296 } |
286 | 297 |
287 // Pre-cache BBoxes and shape data. | 298 // Pre-cache BBoxes and shape data. |
288 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&updateBBCache, null); | 299 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&updateBBCache, null); |
289 | 300 |
290 space.locked = cpTrue; | 301 cpSpaceLock(space); |
291 | 302 |
292 // Collide! | 303 // Collide! |
293 cpSpacePushFreshContactBuffer(space); | 304 cpSpacePushFreshContactBuffer(space); |
294 if(space.staticShapes.handleSet.entries) | 305 if(space.staticShapes.handleSet.entries) |
295 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&active2staticIter, space); | 306 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&active2staticIter, space); |
296 cpSpaceHashQueryRehash(space.activeShapes, cast(cpSpaceHashQueryFunc)&queryFunc, space); | 307 cpSpaceHashQueryRehash(space.activeShapes, cast(cpSpaceHashQueryFunc)&queryFunc, space); |
297 | 308 |
298 space.locked = cpFalse; | 309 cpSpaceUnlock(space); |
299 | 310 |
300 // If body sleeping is enabled, do that now. | 311 // If body sleeping is enabled, do that now. |
301 if(space.sleepTimeThreshold != INFINITY){ | 312 if(space.sleepTimeThreshold != INFINITY){ |
302 cpSpaceProcessComponents(space, dt); | 313 cpSpaceProcessComponents(space, dt); |
303 bodies = space.bodies; // rebuilt by processContactComponents() | 314 bodies = space.bodies; // rebuilt by processContactComponents() |
349 cpConstraint *constraint = cast(cpConstraint *)constraints.arr[j]; | 360 cpConstraint *constraint = cast(cpConstraint *)constraints.arr[j]; |
350 constraint.klass.applyImpulse(constraint); | 361 constraint.klass.applyImpulse(constraint); |
351 } | 362 } |
352 } | 363 } |
353 | 364 |
354 space.locked = cpTrue; | 365 cpSpaceLock(space); |
355 | 366 |
356 // run the post solve callbacks | 367 // run the post solve callbacks |
357 for(int i=0; i<arbiters.num; i++){ | 368 for(int i=0; i<arbiters.num; i++){ |
358 cpArbiter *arb = cast(cpArbiter *) arbiters.arr[i]; | 369 cpArbiter *arb = cast(cpArbiter *) arbiters.arr[i]; |
359 | 370 |
361 handler.postSolve(arb, space, handler.data); | 372 handler.postSolve(arb, space, handler.data); |
362 | 373 |
363 arb.state = cpArbiterState.cpArbiterStateNormal; | 374 arb.state = cpArbiterState.cpArbiterStateNormal; |
364 } | 375 } |
365 | 376 |
366 space.locked = cpFalse; | 377 cpSpaceUnlock(space); |
367 | 378 |
368 // Run the post step callbacks | 379 // Run the post step callbacks |
369 // Loop because post step callbacks may create more post step callbacks | 380 // Loop because post step callbacks may create more post step callbacks |
370 while(space.postStepCallbacks){ | 381 while(space.postStepCallbacks){ |
371 cpHashSet *callbacks = space.postStepCallbacks; | 382 cpHashSet *callbacks = space.postStepCallbacks; |