00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027
00029 typedef void (*cpBodyVelocityFunc)(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt);
00031 typedef void (*cpBodyPositionFunc)(cpBody *body, cpFloat dt);
00032
00035 typedef struct cpComponentNode {
00036 cpBody *root;
00037 cpBody *next;
00038 cpFloat idleTime;
00039 } cpComponentNode;
00040
00042 struct cpBody {
00044 cpBodyVelocityFunc velocity_func;
00045
00047 cpBodyPositionFunc position_func;
00048
00051 cpFloat m;
00053 cpFloat m_inv;
00054
00057 cpFloat i;
00059 cpFloat i_inv;
00060
00062 cpVect p;
00064 cpVect v;
00066 cpVect f;
00067
00070 cpFloat a;
00072 cpFloat w;
00074 cpFloat t;
00075
00078 cpVect rot;
00079
00083 cpDataPointer data;
00084
00086 cpFloat v_limit;
00088 cpFloat w_limit;
00089
00090 CP_PRIVATE(cpVect v_bias);
00091 CP_PRIVATE(cpFloat w_bias);
00092
00093 CP_PRIVATE(cpSpace *space);
00094
00095 CP_PRIVATE(cpShape *shapeList);
00096 CP_PRIVATE(cpArbiter *arbiterList);
00097 CP_PRIVATE(cpConstraint *constraintList);
00098
00099 CP_PRIVATE(cpComponentNode node);
00100 };
00101
00103 cpBody* cpBodyAlloc(void);
00105 cpBody* cpBodyInit(cpBody *body, cpFloat m, cpFloat i);
00107 cpBody* cpBodyNew(cpFloat m, cpFloat i);
00108
00110 cpBody* cpBodyInitStatic(cpBody *body);
00112 cpBody* cpBodyNewStatic(void);
00113
00115 void cpBodyDestroy(cpBody *body);
00117 void cpBodyFree(cpBody *body);
00118
00120 #ifdef NDEBUG
00121 #define cpBodyAssertSane(body)
00122 #else
00123 void cpBodySanityCheck(cpBody *body);
00124 #define cpBodyAssertSane(body) cpBodySanityCheck(body)
00125 #endif
00126
00127
00129 void cpBodyActivate(cpBody *body);
00131 void cpBodyActivateStatic(cpBody *body, cpShape *filter);
00132
00134 void cpBodySleep(cpBody *body);
00136 void cpBodySleepWithGroup(cpBody *body, cpBody *group);
00137
00139 static inline cpBool cpBodyIsSleeping(const cpBody *body)
00140 {
00141 return (CP_PRIVATE(body->node).root != ((cpBody*)0));
00142 }
00143
00145 static inline cpBool cpBodyIsStatic(const cpBody *body)
00146 {
00147 return CP_PRIVATE(body->node).idleTime == INFINITY;
00148 }
00149
00151 static inline cpBool cpBodyIsRogue(const cpBody *body)
00152 {
00153 return (body->CP_PRIVATE(space) == ((cpSpace*)0));
00154 }
00155
00156
00157 #define CP_DefineBodyStructGetter(type, member, name) \
00158 static inline type cpBodyGet##name(const cpBody *body){return body->member;}
00159
00160 #define CP_DefineBodyStructSetter(type, member, name) \
00161 static inline void cpBodySet##name(cpBody *body, const type value){ \
00162 cpBodyActivate(body); \
00163 cpBodyAssertSane(body); \
00164 body->member = value; \
00165 }
00166
00167 #define CP_DefineBodyStructProperty(type, member, name) \
00168 CP_DefineBodyStructGetter(type, member, name) \
00169 CP_DefineBodyStructSetter(type, member, name)
00170
00171 CP_DefineBodyStructGetter(cpFloat, m, Mass);
00173 void cpBodySetMass(cpBody *body, cpFloat m);
00174
00175 CP_DefineBodyStructGetter(cpFloat, i, Moment);
00177 void cpBodySetMoment(cpBody *body, cpFloat i);
00178
00179 CP_DefineBodyStructGetter(cpVect, p, Pos);
00181 void cpBodySetPos(cpBody *body, cpVect pos);
00182 CP_DefineBodyStructProperty(cpVect, v, Vel);
00183 CP_DefineBodyStructProperty(cpVect, f, Force);
00184 CP_DefineBodyStructGetter(cpFloat, a, Angle);
00186 void cpBodySetAngle(cpBody *body, cpFloat a);
00187 CP_DefineBodyStructProperty(cpFloat, w, AngVel);
00188 CP_DefineBodyStructProperty(cpFloat, t, Torque);
00189 CP_DefineBodyStructGetter(cpVect, rot, Rot);
00190 CP_DefineBodyStructProperty(cpFloat, v_limit, VelLimit);
00191 CP_DefineBodyStructProperty(cpFloat, w_limit, AngVelLimit);
00192 CP_DefineBodyStructProperty(cpDataPointer, data, UserData);
00193
00195 void cpBodyUpdateVelocity(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt);
00196 void cpBodyUpdatePosition(cpBody *body, cpFloat dt);
00197
00199 static inline cpVect cpBodyLocal2World(const cpBody *body, const cpVect v)
00200 {
00201 return cpvadd(body->p, cpvrotate(v, body->rot));
00202 }
00203
00205 static inline cpVect cpBodyWorld2Local(const cpBody *body, const cpVect v)
00206 {
00207 return cpvunrotate(cpvsub(v, body->p), body->rot);
00208 }
00209
00211 void cpBodyResetForces(cpBody *body);
00213 void cpBodyApplyForce(cpBody *body, const cpVect f, const cpVect r);
00215 void cpBodyApplyImpulse(cpBody *body, const cpVect j, const cpVect r);
00216
00218 cpVect cpBodyGetVelAtWorldPoint(cpBody *body, cpVect point);
00220 cpVect cpBodyGetVelAtLocalPoint(cpBody *body, cpVect point);
00221
00222
00224 static inline cpFloat cpBodyKineticEnergy(const cpBody *body)
00225 {
00226
00227 cpFloat vsq = cpvdot(body->v, body->v);
00228 cpFloat wsq = body->w*body->w;
00229 return (vsq ? vsq*body->m : 0.0f) + (wsq ? wsq*body->i : 0.0f);
00230 }
00231
00233 typedef void (*cpBodyShapeIteratorFunc)(cpBody *body, cpShape *shape, void *data);
00235 void cpBodyEachShape(cpBody *body, cpBodyShapeIteratorFunc func, void *data);
00236
00238 typedef void (*cpBodyConstraintIteratorFunc)(cpBody *body, cpConstraint *constraint, void *data);
00240 void cpBodyEachConstraint(cpBody *body, cpBodyConstraintIteratorFunc func, void *data);
00241
00243 typedef void (*cpBodyArbiterIteratorFunc)(cpBody *body, cpArbiter *arbiter, void *data);
00245 void cpBodyEachArbiter(cpBody *body, cpBodyArbiterIteratorFunc func, void *data);
00246