00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027
00031 typedef cpBool (*cpCollisionBeginFunc)(cpArbiter *arb, cpSpace *space, void *data);
00034 typedef cpBool (*cpCollisionPreSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
00036 typedef void (*cpCollisionPostSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
00038 typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, cpSpace *space, void *data);
00039
00041 struct cpCollisionHandler {
00042 cpCollisionType a;
00043 cpCollisionType b;
00044 cpCollisionBeginFunc begin;
00045 cpCollisionPreSolveFunc preSolve;
00046 cpCollisionPostSolveFunc postSolve;
00047 cpCollisionSeparateFunc separate;
00048 void *data;
00049 };
00050
00051 typedef struct cpContact cpContact;
00052
00053 #define CP_MAX_CONTACTS_PER_ARBITER 4
00054
00056 typedef enum cpArbiterState {
00057
00058 cpArbiterStateFirstColl,
00059
00060 cpArbiterStateNormal,
00061
00062
00063 cpArbiterStateIgnore,
00064
00065 cpArbiterStateCached,
00066 } cpArbiterState;
00067
00069 struct cpArbiterThread {
00070
00071 struct cpArbiter *next, *prev;
00072 };
00073
00075 struct cpArbiter {
00078 cpFloat e;
00081 cpFloat u;
00084 cpVect surface_vr;
00085
00086 CP_PRIVATE(cpShape *a);
00087 CP_PRIVATE(cpShape *b);
00088 CP_PRIVATE(cpBody *body_a);
00089 CP_PRIVATE(cpBody *body_b);
00090
00091 CP_PRIVATE(struct cpArbiterThread thread_a);
00092 CP_PRIVATE(struct cpArbiterThread thread_b);
00093
00094 CP_PRIVATE(int numContacts);
00095 CP_PRIVATE(cpContact *contacts);
00096
00097 CP_PRIVATE(cpTimestamp stamp);
00098 CP_PRIVATE(cpCollisionHandler *handler);
00099 CP_PRIVATE(cpBool swappedColl);
00100 CP_PRIVATE(cpArbiterState state);
00101 };
00102
00103 #define CP_DefineArbiterStructGetter(type, member, name) \
00104 static inline type cpArbiterGet##name(const cpArbiter *arb){return arb->member;}
00105
00106 #define CP_DefineArbiterStructSetter(type, member, name) \
00107 static inline void cpArbiterSet##name(cpArbiter *arb, type value){arb->member = value;}
00108
00109 #define CP_DefineArbiterStructProperty(type, member, name) \
00110 CP_DefineArbiterStructGetter(type, member, name) \
00111 CP_DefineArbiterStructSetter(type, member, name)
00112
00113 CP_DefineArbiterStructProperty(cpFloat, e, Elasticity);
00114 CP_DefineArbiterStructProperty(cpFloat, u, Friction);
00115 CP_DefineArbiterStructProperty(cpVect, surface_vr, SurfaceVelocity);
00116
00119 cpVect cpArbiterTotalImpulse(const cpArbiter *arb);
00122 cpVect cpArbiterTotalImpulseWithFriction(const cpArbiter *arb);
00125 cpFloat cpArbiterTotalKE(const cpArbiter *arb);
00126
00127
00131 void cpArbiterIgnore(cpArbiter *arb);
00132
00136 static inline void cpArbiterGetShapes(const cpArbiter *arb, cpShape **a, cpShape **b)
00137 {
00138 if(arb->CP_PRIVATE(swappedColl)){
00139 (*a) = arb->CP_PRIVATE(b), (*b) = arb->CP_PRIVATE(a);
00140 } else {
00141 (*a) = arb->CP_PRIVATE(a), (*b) = arb->CP_PRIVATE(b);
00142 }
00143 }
00145 #define CP_ARBITER_GET_SHAPES(arb, a, b) cpShape *a, *b; cpArbiterGetShapes(arb, &a, &b);
00146
00150 static inline void cpArbiterGetBodies(const cpArbiter *arb, cpBody **a, cpBody **b)
00151 {
00152 CP_ARBITER_GET_SHAPES(arb, shape_a, shape_b);
00153 (*a) = shape_a->body;
00154 (*b) = shape_b->body;
00155 }
00157 #define CP_ARBITER_GET_BODIES(arb, a, b) cpBody *a, *b; cpArbiterGetBodies(arb, &a, &b);
00158
00160 static inline cpBool cpArbiterIsFirstContact(const cpArbiter *arb)
00161 {
00162 return arb->CP_PRIVATE(state) == cpArbiterStateFirstColl;
00163 }
00164
00166 static inline int cpArbiterGetCount(const cpArbiter *arb)
00167 {
00168 return arb->CP_PRIVATE(numContacts);
00169 }
00170
00172 typedef struct cpContactPointSet {
00174 int count;
00175
00177 struct {
00179 cpVect point;
00181 cpVect normal;
00183 cpFloat dist;
00184 } points[CP_MAX_CONTACTS_PER_ARBITER];
00185 } cpContactPointSet;
00187 cpContactPointSet cpArbiterGetContactPointSet(const cpArbiter *arb);
00188
00190 cpVect cpArbiterGetNormal(const cpArbiter *arb, int i);
00192 cpVect cpArbiterGetPoint(const cpArbiter *arb, int i);
00194 cpFloat cpArbiterGetDepth(const cpArbiter *arb, int i);
00195