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
00089 cpDataPointer data;
00090
00091 CP_PRIVATE(cpShape *a);
00092 CP_PRIVATE(cpShape *b);
00093 CP_PRIVATE(cpBody *body_a);
00094 CP_PRIVATE(cpBody *body_b);
00095
00096 CP_PRIVATE(struct cpArbiterThread thread_a);
00097 CP_PRIVATE(struct cpArbiterThread thread_b);
00098
00099 CP_PRIVATE(int numContacts);
00100 CP_PRIVATE(cpContact *contacts);
00101
00102 CP_PRIVATE(cpTimestamp stamp);
00103 CP_PRIVATE(cpCollisionHandler *handler);
00104 CP_PRIVATE(cpBool swappedColl);
00105 CP_PRIVATE(cpArbiterState state);
00106 };
00107
00108 #define CP_DefineArbiterStructGetter(type, member, name) \
00109 static inline type cpArbiterGet##name(const cpArbiter *arb){return arb->member;}
00110
00111 #define CP_DefineArbiterStructSetter(type, member, name) \
00112 static inline void cpArbiterSet##name(cpArbiter *arb, type value){arb->member = value;}
00113
00114 #define CP_DefineArbiterStructProperty(type, member, name) \
00115 CP_DefineArbiterStructGetter(type, member, name) \
00116 CP_DefineArbiterStructSetter(type, member, name)
00117
00118 CP_DefineArbiterStructProperty(cpFloat, e, Elasticity)
00119 CP_DefineArbiterStructProperty(cpFloat, u, Friction)
00120 CP_DefineArbiterStructProperty(cpVect, surface_vr, SurfaceVelocity)
00121 CP_DefineArbiterStructProperty(cpDataPointer, data, UserData)
00122
00125 cpVect cpArbiterTotalImpulse(const cpArbiter *arb);
00128 cpVect cpArbiterTotalImpulseWithFriction(const cpArbiter *arb);
00131 cpFloat cpArbiterTotalKE(const cpArbiter *arb);
00132
00133
00137 void cpArbiterIgnore(cpArbiter *arb);
00138
00142 static inline void cpArbiterGetShapes(const cpArbiter *arb, cpShape **a, cpShape **b)
00143 {
00144 if(arb->CP_PRIVATE(swappedColl)){
00145 (*a) = arb->CP_PRIVATE(b), (*b) = arb->CP_PRIVATE(a);
00146 } else {
00147 (*a) = arb->CP_PRIVATE(a), (*b) = arb->CP_PRIVATE(b);
00148 }
00149 }
00151 #define CP_ARBITER_GET_SHAPES(arb, a, b) cpShape *a, *b; cpArbiterGetShapes(arb, &a, &b);
00152
00156 static inline void cpArbiterGetBodies(const cpArbiter *arb, cpBody **a, cpBody **b)
00157 {
00158 CP_ARBITER_GET_SHAPES(arb, shape_a, shape_b);
00159 (*a) = shape_a->body;
00160 (*b) = shape_b->body;
00161 }
00163 #define CP_ARBITER_GET_BODIES(arb, a, b) cpBody *a, *b; cpArbiterGetBodies(arb, &a, &b);
00164
00166 typedef struct cpContactPointSet {
00168 int count;
00169
00171 struct {
00173 cpVect point;
00175 cpVect normal;
00177 cpFloat dist;
00178 } points[CP_MAX_CONTACTS_PER_ARBITER];
00179 } cpContactPointSet;
00181 cpContactPointSet cpArbiterGetContactPointSet(const cpArbiter *arb);
00182
00184 cpBool cpArbiterIsFirstContact(const cpArbiter *arb);
00186 int cpArbiterGetCount(const cpArbiter *arb);
00188 cpVect cpArbiterGetNormal(const cpArbiter *arb, int i);
00190 cpVect cpArbiterGetPoint(const cpArbiter *arb, int i);
00192 cpFloat cpArbiterGetDepth(const cpArbiter *arb, int i);
00193