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 CP_PRIVATE(cpHashSet *postStepCallbacks);
00102
00103 CP_PRIVATE(cpSpaceArbiterApplyImpulseFunc arbiterApplyImpulse);
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 *obj, void *data);
00208 void cpSpaceAddPostStepCallback(cpSpace *space, cpPostStepFunc func, void *obj, void *data);
00209
00211 typedef void (*cpSpacePointQueryFunc)(cpShape *shape, void *data);
00213 void cpSpacePointQuery(cpSpace *space, cpVect point, cpLayers layers, cpGroup group, cpSpacePointQueryFunc func, void *data);
00215 cpShape *cpSpacePointQueryFirst(cpSpace *space, cpVect point, cpLayers layers, cpGroup group);
00216
00218 typedef void (*cpSpaceSegmentQueryFunc)(cpShape *shape, cpFloat t, cpVect n, void *data);
00220 void cpSpaceSegmentQuery(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSpaceSegmentQueryFunc func, void *data);
00222 cpShape *cpSpaceSegmentQueryFirst(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSegmentQueryInfo *out);
00223
00225 typedef void (*cpSpaceBBQueryFunc)(cpShape *shape, void *data);
00228 void cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data);
00229
00231 typedef void (*cpSpaceShapeQueryFunc)(cpShape *shape, cpContactPointSet *points, void *data);
00233 cpBool cpSpaceShapeQuery(cpSpace *space, cpShape *shape, cpSpaceShapeQueryFunc func, void *data);
00234
00236 void cpSpaceActivateShapesTouchingShape(cpSpace *space, cpShape *shape);
00237
00238
00240 typedef void (*cpSpaceBodyIteratorFunc)(cpBody *body, void *data);
00242 void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIteratorFunc func, void *data);
00243
00245 typedef void (*cpSpaceShapeIteratorFunc)(cpShape *shape, void *data);
00247 void cpSpaceEachShape(cpSpace *space, cpSpaceShapeIteratorFunc func, void *data);
00248
00250 typedef void (*cpSpaceConstraintIteratorFunc)(cpConstraint *constraint, void *data);
00252 void cpSpaceEachConstraint(cpSpace *space, cpSpaceConstraintIteratorFunc func, void *data);
00253
00255 void cpSpaceReindexStatic(cpSpace *space);
00257 void cpSpaceReindexShape(cpSpace *space, cpShape *shape);
00259 void cpSpaceReindexShapesForBody(cpSpace *space, cpBody *body);
00260
00262 void cpSpaceUseSpatialHash(cpSpace *space, cpFloat dim, int count);
00263
00265 void cpSpaceStep(cpSpace *space, cpFloat dt);
00266