00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00024
00025 typedef struct cpContactBufferHeader cpContactBufferHeader;
00026 typedef void (*cpSpaceArbiterApplyImpulseFunc)(cpArbiter *arb);
00027
00029 struct cpSpace {
00031 int iterations;
00032
00034 cpVect gravity;
00035
00040 cpFloat damping;
00041
00044 cpFloat idleSpeedThreshold;
00045
00049 cpFloat sleepTimeThreshold;
00050
00055 cpFloat collisionSlop;
00056
00060 cpFloat collisionBias;
00061
00064 cpTimestamp collisionPersistence;
00065
00068 cpBool enableContactGraph;
00069
00073 cpDataPointer data;
00074
00078 cpBody *staticBody;
00079
00080 CP_PRIVATE(cpTimestamp stamp);
00081 CP_PRIVATE(cpFloat curr_dt);
00082
00083 CP_PRIVATE(cpArray *bodies);
00084 CP_PRIVATE(cpArray *rousedBodies);
00085 CP_PRIVATE(cpArray *sleepingComponents);
00086
00087 CP_PRIVATE(cpSpatialIndex *staticShapes);
00088 CP_PRIVATE(cpSpatialIndex *activeShapes);
00089
00090 CP_PRIVATE(cpArray *arbiters);
00091 CP_PRIVATE(cpContactBufferHeader *contactBuffersHead);
00092 CP_PRIVATE(cpHashSet *cachedArbiters);
00093 CP_PRIVATE(cpArray *pooledArbiters);
00094 CP_PRIVATE(cpArray *constraints);
00095
00096 CP_PRIVATE(cpArray *allocatedBuffers);
00097 CP_PRIVATE(int locked);
00098
00099 CP_PRIVATE(cpHashSet *collisionHandlers);
00100 CP_PRIVATE(cpCollisionHandler defaultHandler);
00101
00102 CP_PRIVATE(cpBool skipPostStep);
00103 CP_PRIVATE(cpArray *postStepCallbacks);
00104
00105 CP_PRIVATE(cpBody _staticBody);
00106 };
00107
00109 cpSpace* cpSpaceAlloc(void);
00111 cpSpace* cpSpaceInit(cpSpace *space);
00113 cpSpace* cpSpaceNew(void);
00114
00116 void cpSpaceDestroy(cpSpace *space);
00118 void cpSpaceFree(cpSpace *space);
00119
00120 #define CP_DefineSpaceStructGetter(type, member, name) \
00121 static inline type cpSpaceGet##name(const cpSpace *space){return space->member;}
00122
00123 #define CP_DefineSpaceStructSetter(type, member, name) \
00124 static inline void cpSpaceSet##name(cpSpace *space, type value){space->member = value;}
00125
00126 #define CP_DefineSpaceStructProperty(type, member, name) \
00127 CP_DefineSpaceStructGetter(type, member, name) \
00128 CP_DefineSpaceStructSetter(type, member, name)
00129
00130 CP_DefineSpaceStructProperty(int, iterations, Iterations)
00131 CP_DefineSpaceStructProperty(cpVect, gravity, Gravity)
00132 CP_DefineSpaceStructProperty(cpFloat, damping, Damping)
00133 CP_DefineSpaceStructProperty(cpFloat, idleSpeedThreshold, IdleSpeedThreshold)
00134 CP_DefineSpaceStructProperty(cpFloat, sleepTimeThreshold, SleepTimeThreshold)
00135 CP_DefineSpaceStructProperty(cpFloat, collisionSlop, CollisionSlop)
00136 CP_DefineSpaceStructProperty(cpFloat, collisionBias, CollisionBias)
00137 CP_DefineSpaceStructProperty(cpTimestamp, collisionPersistence, CollisionPersistence)
00138 CP_DefineSpaceStructProperty(cpBool, enableContactGraph, EnableContactGraph)
00139 CP_DefineSpaceStructProperty(cpDataPointer, data, UserData)
00140 CP_DefineSpaceStructGetter(cpBody*, staticBody, StaticBody)
00141 CP_DefineSpaceStructGetter(cpFloat, CP_PRIVATE(curr_dt), CurrentTimeStep)
00142
00144 static inline cpBool
00145 cpSpaceIsLocked(cpSpace *space)
00146 {
00147 return space->CP_PRIVATE(locked);
00148 }
00149
00154 void cpSpaceSetDefaultCollisionHandler(
00155 cpSpace *space,
00156 cpCollisionBeginFunc begin,
00157 cpCollisionPreSolveFunc preSolve,
00158 cpCollisionPostSolveFunc postSolve,
00159 cpCollisionSeparateFunc separate,
00160 void *data
00161 );
00162
00165 void cpSpaceAddCollisionHandler(
00166 cpSpace *space,
00167 cpCollisionType a, cpCollisionType b,
00168 cpCollisionBeginFunc begin,
00169 cpCollisionPreSolveFunc preSolve,
00170 cpCollisionPostSolveFunc postSolve,
00171 cpCollisionSeparateFunc separate,
00172 void *data
00173 );
00174
00176 void cpSpaceRemoveCollisionHandler(cpSpace *space, cpCollisionType a, cpCollisionType b);
00177
00180 cpShape* cpSpaceAddShape(cpSpace *space, cpShape *shape);
00182 cpShape* cpSpaceAddStaticShape(cpSpace *space, cpShape *shape);
00184 cpBody* cpSpaceAddBody(cpSpace *space, cpBody *body);
00186 cpConstraint* cpSpaceAddConstraint(cpSpace *space, cpConstraint *constraint);
00187
00189 void cpSpaceRemoveShape(cpSpace *space, cpShape *shape);
00191 void cpSpaceRemoveStaticShape(cpSpace *space, cpShape *shape);
00193 void cpSpaceRemoveBody(cpSpace *space, cpBody *body);
00195 void cpSpaceRemoveConstraint(cpSpace *space, cpConstraint *constraint);
00196
00198 cpBool cpSpaceContainsShape(cpSpace *space, cpShape *shape);
00200 cpBool cpSpaceContainsBody(cpSpace *space, cpBody *body);
00202 cpBool cpSpaceContainsConstraint(cpSpace *space, cpConstraint *constraint);
00203
00205 typedef void (*cpPostStepFunc)(cpSpace *space, void *key, void *data);
00210 cpBool cpSpaceAddPostStepCallback(cpSpace *space, cpPostStepFunc func, void *key, void *data);
00211
00213 typedef void (*cpSpacePointQueryFunc)(cpShape *shape, void *data);
00215 void cpSpacePointQuery(cpSpace *space, cpVect point, cpLayers layers, cpGroup group, cpSpacePointQueryFunc func, void *data);
00217 cpShape *cpSpacePointQueryFirst(cpSpace *space, cpVect point, cpLayers layers, cpGroup group);
00218
00220 typedef void (*cpSpaceNearestPointQueryFunc)(cpShape *shape, cpFloat distance, cpVect point, void *data);
00222 void cpSpaceNearestPointQuery(cpSpace *space, cpVect point, cpFloat maxDistance, cpLayers layers, cpGroup group, cpSpaceNearestPointQueryFunc func, void *data);
00224 cpShape *cpSpaceNearestPointQueryNearest(cpSpace *space, cpVect point, cpFloat maxDistance, cpLayers layers, cpGroup group, cpNearestPointQueryInfo *out);
00225
00227 typedef void (*cpSpaceSegmentQueryFunc)(cpShape *shape, cpFloat t, cpVect n, void *data);
00229 void cpSpaceSegmentQuery(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSpaceSegmentQueryFunc func, void *data);
00231 cpShape *cpSpaceSegmentQueryFirst(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSegmentQueryInfo *out);
00232
00234 typedef void (*cpSpaceBBQueryFunc)(cpShape *shape, void *data);
00237 void cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data);
00238
00240 typedef void (*cpSpaceShapeQueryFunc)(cpShape *shape, cpContactPointSet *points, void *data);
00242 cpBool cpSpaceShapeQuery(cpSpace *space, cpShape *shape, cpSpaceShapeQueryFunc func, void *data);
00243
00245 void cpSpaceActivateShapesTouchingShape(cpSpace *space, cpShape *shape);
00246
00247
00249 typedef void (*cpSpaceBodyIteratorFunc)(cpBody *body, void *data);
00251 void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIteratorFunc func, void *data);
00252
00254 typedef void (*cpSpaceShapeIteratorFunc)(cpShape *shape, void *data);
00256 void cpSpaceEachShape(cpSpace *space, cpSpaceShapeIteratorFunc func, void *data);
00257
00259 typedef void (*cpSpaceConstraintIteratorFunc)(cpConstraint *constraint, void *data);
00261 void cpSpaceEachConstraint(cpSpace *space, cpSpaceConstraintIteratorFunc func, void *data);
00262
00264 void cpSpaceReindexStatic(cpSpace *space);
00266 void cpSpaceReindexShape(cpSpace *space, cpShape *shape);
00268 void cpSpaceReindexShapesForBody(cpSpace *space, cpBody *body);
00269
00271 void cpSpaceUseSpatialHash(cpSpace *space, cpFloat dim, int count);
00272
00274 void cpSpaceStep(cpSpace *space, cpFloat dt);
00275