| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 |
- /* Copyright (c) 2013 Scott Lembcke and Howling Moon Software
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
- // All of the struct definitions for Chipmunk should be considered part of the private API.
- // However, it is very valuable to know the struct sizes for preallocating memory.
- #ifndef CHIPMUNK_STRUCTS_H
- #define CHIPMUNK_STRUCTS_H
- #include "chipmunk/chipmunk.h"
- struct cpArray {
- int num, max;
- void **arr;
- };
- struct cpBody {
- // Integration functions
- cpBodyVelocityFunc velocity_func;
- cpBodyPositionFunc position_func;
-
- // mass and it's inverse
- cpFloat m;
- cpFloat m_inv;
-
- // moment of inertia and it's inverse
- cpFloat i;
- cpFloat i_inv;
-
- // center of gravity
- cpVect cog;
-
- // position, velocity, force
- cpVect p;
- cpVect v;
- cpVect f;
-
- // Angle, angular velocity, torque (radians)
- cpFloat a;
- cpFloat w;
- cpFloat t;
-
- cpTransform transform;
-
- cpDataPointer userData;
-
- // "pseudo-velocities" used for eliminating overlap.
- // Erin Catto has some papers that talk about what these are.
- cpVect v_bias;
- cpFloat w_bias;
-
- cpSpace *space;
-
- cpShape *shapeList;
- cpArbiter *arbiterList;
- cpConstraint *constraintList;
-
- struct {
- cpBody *root;
- cpBody *next;
- cpFloat idleTime;
- } sleeping;
- };
- enum cpArbiterState {
- // Arbiter is active and its the first collision.
- CP_ARBITER_STATE_FIRST_COLLISION,
- // Arbiter is active and its not the first collision.
- CP_ARBITER_STATE_NORMAL,
- // Collision has been explicitly ignored.
- // Either by returning false from a begin collision handler or calling cpArbiterIgnore().
- CP_ARBITER_STATE_IGNORE,
- // Collison is no longer active. A space will cache an arbiter for up to cpSpace.collisionPersistence more steps.
- CP_ARBITER_STATE_CACHED,
- // Collison arbiter is invalid because one of the shapes was removed.
- CP_ARBITER_STATE_INVALIDATED,
- };
- struct cpArbiterThread {
- struct cpArbiter *next, *prev;
- };
- struct cpContact {
- cpVect r1, r2;
-
- cpFloat nMass, tMass;
- cpFloat bounce; // TODO: look for an alternate bounce solution.
- cpFloat jnAcc, jtAcc, jBias;
- cpFloat bias;
-
- cpHashValue hash;
- };
- struct cpCollisionInfo {
- const cpShape *a, *b;
- cpCollisionID id;
-
- cpVect n;
-
- int count;
- // TODO Should this be a unique struct type?
- struct cpContact *arr;
- };
- struct cpArbiter {
- cpFloat e;
- cpFloat u;
- cpVect surface_vr;
-
- cpDataPointer data;
-
- const cpShape *a, *b;
- cpBody *body_a, *body_b;
- struct cpArbiterThread thread_a, thread_b;
-
- int count;
- struct cpContact *contacts;
- cpVect n;
-
- // Regular, wildcard A and wildcard B collision handlers.
- cpCollisionHandler *handler, *handlerA, *handlerB;
- cpBool swapped;
-
- cpTimestamp stamp;
- enum cpArbiterState state;
- };
- struct cpShapeMassInfo {
- cpFloat m;
- cpFloat i;
- cpVect cog;
- cpFloat area;
- };
- typedef enum cpShapeType{
- CP_CIRCLE_SHAPE,
- CP_SEGMENT_SHAPE,
- CP_POLY_SHAPE,
- CP_NUM_SHAPES
- } cpShapeType;
- typedef cpBB (*cpShapeCacheDataImpl)(cpShape *shape, cpTransform transform);
- typedef void (*cpShapeDestroyImpl)(cpShape *shape);
- typedef void (*cpShapePointQueryImpl)(const cpShape *shape, cpVect p, cpPointQueryInfo *info);
- typedef void (*cpShapeSegmentQueryImpl)(const cpShape *shape, cpVect a, cpVect b, cpFloat radius, cpSegmentQueryInfo *info);
- typedef struct cpShapeClass cpShapeClass;
- struct cpShapeClass {
- cpShapeType type;
-
- cpShapeCacheDataImpl cacheData;
- cpShapeDestroyImpl destroy;
- cpShapePointQueryImpl pointQuery;
- cpShapeSegmentQueryImpl segmentQuery;
- };
- struct cpShape {
- const cpShapeClass *klass;
-
- cpSpace *space;
- cpBody *body;
- struct cpShapeMassInfo massInfo;
- cpBB bb;
-
- cpBool sensor;
-
- cpFloat e;
- cpFloat u;
- cpVect surfaceV;
- cpDataPointer userData;
-
- cpCollisionType type;
- cpShapeFilter filter;
-
- cpShape *next;
- cpShape *prev;
-
- cpHashValue hashid;
- };
- struct cpCircleShape {
- cpShape shape;
-
- cpVect c, tc;
- cpFloat r;
- };
- struct cpSegmentShape {
- cpShape shape;
-
- cpVect a, b, n;
- cpVect ta, tb, tn;
- cpFloat r;
-
- cpVect a_tangent, b_tangent;
- };
- struct cpSplittingPlane {
- cpVect v0, n;
- };
- #define CP_POLY_SHAPE_INLINE_ALLOC 6
- struct cpPolyShape {
- cpShape shape;
-
- cpFloat r;
-
- int count;
- // The untransformed planes are appended at the end of the transformed planes.
- struct cpSplittingPlane *planes;
-
- // Allocate a small number of splitting planes internally for simple poly.
- struct cpSplittingPlane _planes[2*CP_POLY_SHAPE_INLINE_ALLOC];
- };
- typedef void (*cpConstraintPreStepImpl)(cpConstraint *constraint, cpFloat dt);
- typedef void (*cpConstraintApplyCachedImpulseImpl)(cpConstraint *constraint, cpFloat dt_coef);
- typedef void (*cpConstraintApplyImpulseImpl)(cpConstraint *constraint, cpFloat dt);
- typedef cpFloat (*cpConstraintGetImpulseImpl)(cpConstraint *constraint);
- typedef struct cpConstraintClass {
- cpConstraintPreStepImpl preStep;
- cpConstraintApplyCachedImpulseImpl applyCachedImpulse;
- cpConstraintApplyImpulseImpl applyImpulse;
- cpConstraintGetImpulseImpl getImpulse;
- } cpConstraintClass;
- struct cpConstraint {
- const cpConstraintClass *klass;
-
- cpSpace *space;
-
- cpBody *a, *b;
- cpConstraint *next_a, *next_b;
-
- cpFloat maxForce;
- cpFloat errorBias;
- cpFloat maxBias;
-
- cpBool collideBodies;
-
- cpConstraintPreSolveFunc preSolve;
- cpConstraintPostSolveFunc postSolve;
-
- cpDataPointer userData;
- };
- struct cpPinJoint {
- cpConstraint constraint;
- cpVect anchorA, anchorB;
- cpFloat dist;
-
- cpVect r1, r2;
- cpVect n;
- cpFloat nMass;
-
- cpFloat jnAcc;
- cpFloat bias;
- };
- struct cpSlideJoint {
- cpConstraint constraint;
- cpVect anchorA, anchorB;
- cpFloat min, max;
-
- cpVect r1, r2;
- cpVect n;
- cpFloat nMass;
-
- cpFloat jnAcc;
- cpFloat bias;
- };
- struct cpPivotJoint {
- cpConstraint constraint;
- cpVect anchorA, anchorB;
-
- cpVect r1, r2;
- cpMat2x2 k;
-
- cpVect jAcc;
- cpVect bias;
- };
- struct cpGrooveJoint {
- cpConstraint constraint;
- cpVect grv_n, grv_a, grv_b;
- cpVect anchorB;
-
- cpVect grv_tn;
- cpFloat clamp;
- cpVect r1, r2;
- cpMat2x2 k;
-
- cpVect jAcc;
- cpVect bias;
- };
- struct cpDampedSpring {
- cpConstraint constraint;
- cpVect anchorA, anchorB;
- cpFloat restLength;
- cpFloat stiffness;
- cpFloat damping;
- cpDampedSpringForceFunc springForceFunc;
-
- cpFloat target_vrn;
- cpFloat v_coef;
-
- cpVect r1, r2;
- cpFloat nMass;
- cpVect n;
-
- cpFloat jAcc;
- };
- struct cpDampedRotarySpring {
- cpConstraint constraint;
- cpFloat restAngle;
- cpFloat stiffness;
- cpFloat damping;
- cpDampedRotarySpringTorqueFunc springTorqueFunc;
-
- cpFloat target_wrn;
- cpFloat w_coef;
-
- cpFloat iSum;
- cpFloat jAcc;
- };
- struct cpRotaryLimitJoint {
- cpConstraint constraint;
- cpFloat min, max;
-
- cpFloat iSum;
-
- cpFloat bias;
- cpFloat jAcc;
- };
- struct cpRatchetJoint {
- cpConstraint constraint;
- cpFloat angle, phase, ratchet;
-
- cpFloat iSum;
-
- cpFloat bias;
- cpFloat jAcc;
- };
- struct cpGearJoint {
- cpConstraint constraint;
- cpFloat phase, ratio;
- cpFloat ratio_inv;
-
- cpFloat iSum;
-
- cpFloat bias;
- cpFloat jAcc;
- };
- struct cpSimpleMotor {
- cpConstraint constraint;
- cpFloat rate;
-
- cpFloat iSum;
-
- cpFloat jAcc;
- };
- typedef struct cpContactBufferHeader cpContactBufferHeader;
- typedef void (*cpSpaceArbiterApplyImpulseFunc)(cpArbiter *arb);
- struct cpSpace {
- int iterations;
-
- cpVect gravity;
- cpFloat damping;
-
- cpFloat idleSpeedThreshold;
- cpFloat sleepTimeThreshold;
-
- cpFloat collisionSlop;
- cpFloat collisionBias;
- cpTimestamp collisionPersistence;
-
- cpDataPointer userData;
-
- cpTimestamp stamp;
- cpFloat curr_dt;
- cpArray *dynamicBodies;
- cpArray *staticBodies;
- cpArray *rousedBodies;
- cpArray *sleepingComponents;
-
- cpHashValue shapeIDCounter;
- cpSpatialIndex *staticShapes;
- cpSpatialIndex *dynamicShapes;
-
- cpArray *constraints;
-
- cpArray *arbiters;
- cpContactBufferHeader *contactBuffersHead;
- cpHashSet *cachedArbiters;
- cpArray *pooledArbiters;
-
- cpArray *allocatedBuffers;
- unsigned int locked;
-
- cpBool usesWildcards;
- cpHashSet *collisionHandlers;
- cpCollisionHandler defaultHandler;
-
- cpBool skipPostStep;
- cpArray *postStepCallbacks;
-
- cpBody *staticBody;
- cpBody _staticBody;
- };
- typedef struct cpPostStepCallback {
- cpPostStepFunc func;
- void *key;
- void *data;
- } cpPostStepCallback;
- #endif
|