Chipmunk2D Pro API Reference  6.2.1
 All Classes Functions Variables Typedefs Properties Groups Pages
cpBody.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 
27 
29 typedef void (*cpBodyVelocityFunc)(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt);
31 typedef void (*cpBodyPositionFunc)(cpBody *body, cpFloat dt);
32 
35 typedef struct cpComponentNode {
36  cpBody *root;
37  cpBody *next;
38  cpFloat idleTime;
40 
42 struct cpBody {
45 
48 
54 
60 
67 
75 
79 
84 
89 
90  CP_PRIVATE(cpVect v_bias);
91  CP_PRIVATE(cpFloat w_bias);
92 
93  CP_PRIVATE(cpSpace *space);
94 
95  CP_PRIVATE(cpShape *shapeList);
96  CP_PRIVATE(cpArbiter *arbiterList);
97  CP_PRIVATE(cpConstraint *constraintList);
98 
99  CP_PRIVATE(cpComponentNode node);
100 };
101 
103 cpBody* cpBodyAlloc(void);
105 cpBody* cpBodyInit(cpBody *body, cpFloat m, cpFloat i);
108 
112 cpBody* cpBodyNewStatic(void);
113 
115 void cpBodyDestroy(cpBody *body);
117 void cpBodyFree(cpBody *body);
118 
120 #ifdef NDEBUG
121  #define cpBodyAssertSane(body)
122 #else
123  void cpBodySanityCheck(cpBody *body);
124  #define cpBodyAssertSane(body) cpBodySanityCheck(body)
125 #endif
126 
127 // Defined in cpSpace.c
129 void cpBodyActivate(cpBody *body);
131 void cpBodyActivateStatic(cpBody *body, cpShape *filter);
132 
134 void cpBodySleep(cpBody *body);
136 void cpBodySleepWithGroup(cpBody *body, cpBody *group);
137 
139 static inline cpBool cpBodyIsSleeping(const cpBody *body)
140 {
141  return (CP_PRIVATE(body->node).root != ((cpBody*)0));
142 }
143 
145 static inline cpBool cpBodyIsStatic(const cpBody *body)
146 {
147  return CP_PRIVATE(body->node).idleTime == INFINITY;
148 }
149 
152 static inline cpBool cpBodyIsRogue(const cpBody *body)
153 {
154  return (body->CP_PRIVATE(space) == ((cpSpace*)0));
155 }
156 
157 
158 #define CP_DefineBodyStructGetter(type, member, name) \
159 static inline type cpBodyGet##name(const cpBody *body){return body->member;}
160 
161 #define CP_DefineBodyStructSetter(type, member, name) \
162 static inline void cpBodySet##name(cpBody *body, const type value){ \
163  cpBodyActivate(body); \
164  body->member = value; \
165  cpBodyAssertSane(body); \
166 }
167 
168 #define CP_DefineBodyStructProperty(type, member, name) \
169 CP_DefineBodyStructGetter(type, member, name) \
170 CP_DefineBodyStructSetter(type, member, name)
171 
172 // TODO add to docs
173 CP_DefineBodyStructGetter(cpSpace*, CP_PRIVATE(space), Space)
174 
175 CP_DefineBodyStructGetter(cpFloat, m, Mass)
177 void cpBodySetMass(cpBody *body, cpFloat m);
178 
179 CP_DefineBodyStructGetter(cpFloat, i, Moment)
181 void cpBodySetMoment(cpBody *body, cpFloat i);
182 
183 CP_DefineBodyStructGetter(cpVect, p, Pos)
185 void cpBodySetPos(cpBody *body, cpVect pos);
186 CP_DefineBodyStructProperty(cpVect, v, Vel)
187 CP_DefineBodyStructProperty(cpVect, f, Force)
188 CP_DefineBodyStructGetter(cpFloat, a, Angle)
190 void cpBodySetAngle(cpBody *body, cpFloat a);
191 CP_DefineBodyStructProperty(cpFloat, w, AngVel)
192 CP_DefineBodyStructProperty(cpFloat, t, Torque)
193 CP_DefineBodyStructGetter(cpVect, rot, Rot)
194 CP_DefineBodyStructProperty(cpFloat, v_limit, VelLimit)
195 CP_DefineBodyStructProperty(cpFloat, w_limit, AngVelLimit)
196 CP_DefineBodyStructProperty(cpDataPointer, data, UserData)
197 
199 void cpBodyUpdateVelocity(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt);
200 void cpBodyUpdatePosition(cpBody *body, cpFloat dt);
201 
203 static inline cpVect cpBodyLocal2World(const cpBody *body, const cpVect v)
204 {
205  return cpvadd(body->p, cpvrotate(v, body->rot));
206 }
207 
209 static inline cpVect cpBodyWorld2Local(const cpBody *body, const cpVect v)
210 {
211  return cpvunrotate(cpvsub(v, body->p), body->rot);
212 }
213 
215 void cpBodyResetForces(cpBody *body);
217 void cpBodyApplyForce(cpBody *body, const cpVect f, const cpVect r);
219 void cpBodyApplyImpulse(cpBody *body, const cpVect j, const cpVect r);
220 
225 
226 
228 static inline cpFloat cpBodyKineticEnergy(const cpBody *body)
229 {
230  // Need to do some fudging to avoid NaNs
231  cpFloat vsq = cpvdot(body->v, body->v);
232  cpFloat wsq = body->w*body->w;
233  return (vsq ? vsq*body->m : 0.0f) + (wsq ? wsq*body->i : 0.0f);
234 }
235 
237 typedef void (*cpBodyShapeIteratorFunc)(cpBody *body, cpShape *shape, void *data);
239 void cpBodyEachShape(cpBody *body, cpBodyShapeIteratorFunc func, void *data);
240 
242 typedef void (*cpBodyConstraintIteratorFunc)(cpBody *body, cpConstraint *constraint, void *data);
244 void cpBodyEachConstraint(cpBody *body, cpBodyConstraintIteratorFunc func, void *data);
245 
247 typedef void (*cpBodyArbiterIteratorFunc)(cpBody *body, cpArbiter *arbiter, void *data);
249 void cpBodyEachArbiter(cpBody *body, cpBodyArbiterIteratorFunc func, void *data);
250