physics library version update
[spacedolphin:spacedolphin.git] / lib / chipmunk / include / chipmunk / cpArbiter.h
1 /* Copyright (c) 2007 Scott Lembcke
2  * 
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to deal
5  * in the Software without restriction, including without limitation the rights
6  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7  * copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  * 
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  * 
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19  * SOFTWARE.
20  */
21
22 /// @defgroup cpArbiter cpArbiter
23 /// The cpArbiter struct controls pairs of colliding shapes.
24 /// They are also used in conjuction with collision handler callbacks
25 /// allowing you to retrieve information on the collision and control it.
26 /// @{
27
28 /// Collision begin event function callback type.
29 /// Returning false from a begin callback causes the collision to be ignored until
30 /// the the separate callback is called when the objects stop colliding.
31 typedef cpBool (*cpCollisionBeginFunc)(cpArbiter *arb, cpSpace *space, void *data);
32 /// Collision pre-solve event function callback type.
33 /// Returning false from a pre-step callback causes the collision to be ignored until the next step.
34 typedef cpBool (*cpCollisionPreSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
35 /// Collision post-solve event function callback type.
36 typedef void (*cpCollisionPostSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
37 /// Collision separate event function callback type.
38 typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, cpSpace *space, void *data);
39
40 /// @private
41 struct cpCollisionHandler {
42         cpCollisionType a;
43         cpCollisionType b;
44         cpCollisionBeginFunc begin;
45         cpCollisionPreSolveFunc preSolve;
46         cpCollisionPostSolveFunc postSolve;
47         cpCollisionSeparateFunc separate;
48         void *data;
49 };
50
51 typedef struct cpContact cpContact;
52
53 #define CP_MAX_CONTACTS_PER_ARBITER 4
54
55 /// @private
56 typedef enum cpArbiterState {
57         // Arbiter is active and its the first collision.
58         cpArbiterStateFirstColl,
59         // Arbiter is active and its not the first collision.
60         cpArbiterStateNormal,
61         // Collision has been explicitly ignored.
62         // Either by returning false from a begin collision handler or calling cpArbiterIgnore().
63         cpArbiterStateIgnore,
64         // Collison is no longer active. A space will cache an arbiter for up to cpSpace.collisionPersistence more steps.
65         cpArbiterStateCached,
66 } cpArbiterState;
67
68 /// @private
69 struct cpArbiterThread {
70         // Links to next and previous arbiters in the contact graph.
71         struct cpArbiter *next, *prev;
72 };
73
74 /// A colliding pair of shapes.
75 struct cpArbiter {
76         /// Calculated value to use for the elasticity coefficient.
77         /// Override in a pre-solve collision handler for custom behavior.
78         cpFloat e;
79         /// Calculated value to use for the friction coefficient.
80         /// Override in a pre-solve collision handler for custom behavior.
81         cpFloat u;
82          /// Calculated value to use for applying surface velocities.
83         /// Override in a pre-solve collision handler for custom behavior.
84         cpVect surface_vr;
85         
86         /// User definable data pointer.
87         /// The value will persist for the pair of shapes until the separate() callback is called.
88         /// NOTE: If you need to clean up this pointer, you should implement the separate() callback to do it.
89         cpDataPointer data;
90         
91         CP_PRIVATE(cpShape *a);
92         CP_PRIVATE(cpShape *b);
93         CP_PRIVATE(cpBody *body_a);
94         CP_PRIVATE(cpBody *body_b);
95         
96         CP_PRIVATE(struct cpArbiterThread thread_a);
97         CP_PRIVATE(struct cpArbiterThread thread_b);
98         
99         CP_PRIVATE(int numContacts);
100         CP_PRIVATE(cpContact *contacts);
101         
102         CP_PRIVATE(cpTimestamp stamp);
103         CP_PRIVATE(cpCollisionHandler *handler);
104         CP_PRIVATE(cpBool swappedColl);
105         CP_PRIVATE(cpArbiterState state);
106 };
107
108 #define CP_DefineArbiterStructGetter(type, member, name) \
109 static inline type cpArbiterGet##name(const cpArbiter *arb){return arb->member;}
110
111 #define CP_DefineArbiterStructSetter(type, member, name) \
112 static inline void cpArbiterSet##name(cpArbiter *arb, type value){arb->member = value;}
113
114 #define CP_DefineArbiterStructProperty(type, member, name) \
115 CP_DefineArbiterStructGetter(type, member, name) \
116 CP_DefineArbiterStructSetter(type, member, name)
117
118 CP_DefineArbiterStructProperty(cpFloat, e, Elasticity)
119 CP_DefineArbiterStructProperty(cpFloat, u, Friction)
120 CP_DefineArbiterStructProperty(cpVect, surface_vr, SurfaceVelocity)
121 CP_DefineArbiterStructProperty(cpDataPointer, data, UserData)
122
123 /// Calculate the total impulse that was applied by this arbiter.
124 /// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
125 cpVect cpArbiterTotalImpulse(const cpArbiter *arb);
126 /// Calculate the total impulse including the friction that was applied by this arbiter.
127 /// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
128 cpVect cpArbiterTotalImpulseWithFriction(const cpArbiter *arb);
129 /// Calculate the amount of energy lost in a collision including static, but not dynamic friction.
130 /// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
131 cpFloat cpArbiterTotalKE(const cpArbiter *arb);
132
133
134 /// Causes a collision pair to be ignored as if you returned false from a begin callback.
135 /// If called from a pre-step callback, you will still need to return false
136 /// if you want it to be ignored in the current step.
137 void cpArbiterIgnore(cpArbiter *arb);
138
139 /// Return the colliding shapes involved for this arbiter.
140 /// The order of their cpSpace.collision_type values will match
141 /// the order set when the collision handler was registered.
142 static inline void cpArbiterGetShapes(const cpArbiter *arb, cpShape **a, cpShape **b)
143 {
144         if(arb->CP_PRIVATE(swappedColl)){
145                 (*a) = arb->CP_PRIVATE(b), (*b) = arb->CP_PRIVATE(a);
146         } else {
147                 (*a) = arb->CP_PRIVATE(a), (*b) = arb->CP_PRIVATE(b);
148         }
149 }
150 /// A macro shortcut for defining and retrieving the shapes from an arbiter.
151 #define CP_ARBITER_GET_SHAPES(arb, a, b) cpShape *a, *b; cpArbiterGetShapes(arb, &a, &b);
152
153 /// Return the colliding bodies involved for this arbiter.
154 /// The order of the cpSpace.collision_type the bodies are associated with values will match
155 /// the order set when the collision handler was registered.
156 static inline void cpArbiterGetBodies(const cpArbiter *arb, cpBody **a, cpBody **b)
157 {
158         CP_ARBITER_GET_SHAPES(arb, shape_a, shape_b);
159         (*a) = shape_a->body;
160         (*b) = shape_b->body;
161 }
162 /// A macro shortcut for defining and retrieving the bodies from an arbiter.
163 #define CP_ARBITER_GET_BODIES(arb, a, b) cpBody *a, *b; cpArbiterGetBodies(arb, &a, &b);
164
165 /// A struct that wraps up the important collision data for an arbiter.
166 typedef struct cpContactPointSet {
167         /// The number of contact points in the set.
168         int count;
169         
170         /// The array of contact points.
171         struct {
172                 /// The position of the contact point.
173                 cpVect point;
174                 /// The normal of the contact point.
175                 cpVect normal;
176                 /// The depth of the contact point.
177                 cpFloat dist;
178         } points[CP_MAX_CONTACTS_PER_ARBITER];
179 } cpContactPointSet;
180 /// Return a contact set from an arbiter.
181 cpContactPointSet cpArbiterGetContactPointSet(const cpArbiter *arb);
182
183 /// Returns true if this is the first step a pair of objects started colliding.
184 cpBool cpArbiterIsFirstContact(const cpArbiter *arb);
185 /// Get the number of contact points for this arbiter.
186 int cpArbiterGetCount(const cpArbiter *arb);
187 /// Get the normal of the @c ith contact point.
188 cpVect cpArbiterGetNormal(const cpArbiter *arb, int i);
189 /// Get the position of the @c ith contact point.
190 cpVect cpArbiterGetPoint(const cpArbiter *arb, int i);
191 /// Get the depth of the @c ith contact point.
192 cpFloat cpArbiterGetDepth(const cpArbiter *arb, int i);
193
194 /// @}