Mercurial > projects > chipmunkd
diff 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 |
line wrap: on
line diff
--- a/trunk/chipmunkd/cpSpaceStep.d Mon Dec 13 21:40:56 2010 +0100 +++ b/trunk/chipmunkd/cpSpaceStep.d Thu Dec 16 00:33:06 2010 +0100 @@ -19,21 +19,21 @@ // //#pragma mark Post Step Callback Functions -struct postStepCallback { +struct PostStepCallback { cpPostStepFunc func; void *obj; void *data; } static cpBool -postStepFuncSetEql(postStepCallback *a, postStepCallback *b){ +postStepFuncSetEql(PostStepCallback *a, PostStepCallback *b){ return a.obj == b.obj; } static void * -postStepFuncSetTrans(postStepCallback *callback, void *ignored) +postStepFuncSetTrans(PostStepCallback *callback, void *ignored) { - postStepCallback *value = cast(postStepCallback *)cpmalloc(postStepCallback.sizeof); + PostStepCallback *value = cast(PostStepCallback *)cpmalloc(PostStepCallback.sizeof); (*value) = (*callback); return value; @@ -46,10 +46,22 @@ space.postStepCallbacks = cpHashSetNew(0, cast(cpHashSetEqlFunc)&postStepFuncSetEql, cast(cpHashSetTransFunc)&postStepFuncSetTrans); } - postStepCallback callback = {func, obj, data}; + PostStepCallback callback = {func, obj, data}; cpHashSetInsert(space.postStepCallbacks, cast(cpHashValue)cast(size_t)obj, &callback, null); } +void * +cpSpaceGetPostStepData(cpSpace *space, void *obj) +{ + if(space.postStepCallbacks){ + PostStepCallback query = {null, obj, null}; + PostStepCallback *callback = cast(PostStepCallback *)cpHashSetFind(space.postStepCallbacks, cast(cpHashValue)cast(size_t)obj, &query); + return (callback ? callback.data : null); + } else { + return null; + } +} + //#pragma mark Contact Buffer Functions enum CP_CONTACTS_BUFFER_SIZE = ((CP_BUFFER_BYTES - cpContactBufferHeader.sizeof)/cpContact.sizeof); @@ -253,7 +265,7 @@ // Hashset filter func to call and throw away post step callbacks. static void -postStepCallbackSetIter(postStepCallback *callback, cpSpace *space) +postStepCallbackSetIter(PostStepCallback *callback, cpSpace *space) { callback.func(space, callback.obj, callback.data); cpfree(callback); @@ -269,7 +281,6 @@ cpSpaceStep(cpSpace *space, cpFloat dt) { if(!dt) return; // don't step if the timestep is 0! - cpFloat dt_inv = 1.0f/dt; cpArray *bodies = space.bodies; @@ -287,7 +298,7 @@ // Pre-cache BBoxes and shape data. cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&updateBBCache, null); - space.locked = cpTrue; + cpSpaceLock(space); // Collide! cpSpacePushFreshContactBuffer(space); @@ -295,7 +306,7 @@ cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&active2staticIter, space); cpSpaceHashQueryRehash(space.activeShapes, cast(cpSpaceHashQueryFunc)&queryFunc, space); - space.locked = cpFalse; + cpSpaceUnlock(space); // If body sleeping is enabled, do that now. if(space.sleepTimeThreshold != INFINITY){ @@ -351,7 +362,7 @@ } } - space.locked = cpTrue; + cpSpaceLock(space); // run the post solve callbacks for(int i=0; i<arbiters.num; i++){ @@ -363,7 +374,7 @@ arb.state = cpArbiterState.cpArbiterStateNormal; } - space.locked = cpFalse; + cpSpaceUnlock(space); // Run the post step callbacks // Loop because post step callbacks may create more post step callbacks