annotate trunk/chipmunkd/cpBody.d @ 13:c03a41d47b60

- finished all constraints properties - implemented cpAssertWarn the mixin way
author Extrawurst
date Fri, 03 Dec 2010 21:38:01 +0100
parents 7ebbd4d05553
children d88862c82f06
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
1
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
2 // written in the D programming language
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
3
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
4 module chipmunkd.cpBody;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
5
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
7 import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
8 import chipmunkd.cpVect,chipmunkd.cpVect_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
9 import chipmunkd.cpShape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 alias void function(cpBody *_body, cpVect gravity, cpFloat damping, cpFloat dt)cpBodyVelocityFunc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 alias void function(cpBody *_body, cpFloat dt)cpBodyPositionFunc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 //extern cpBodyVelocityFunc cpBodyUpdateVelocityDefault;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 //extern cpBodyPositionFunc cpBodyUpdatePositionDefault;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 // Structure to hold information about the contact graph components
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 // when putting groups of objects to sleep.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 // No interesting user accessible fields.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 struct cpComponentNode {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 cpBody *parent;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 cpBody *next;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 int rank;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 cpFloat idleTime;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 struct cpBody{
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 // *** Integration Functions.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 // Function that is called to integrate the body's velocity. (Defaults to cpBodyUpdateVelocity)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 cpBodyVelocityFunc velocity_func;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 // Function that is called to integrate the body's position. (Defaults to cpBodyUpdatePosition)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 cpBodyPositionFunc position_func;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 // *** Mass Properties
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 // Mass and it's inverse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 // Always use cpBodySetMass() whenever changing the mass as these values must agree.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 cpFloat m, m_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 // Moment of inertia and it's inverse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 // Always use cpBodySetMoment() whenever changing the moment as these values must agree.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 cpFloat i, i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 // *** Positional Properties
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 // Linear components of motion (position, velocity, and force)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 cpVect p, v, f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 // Angular components of motion (angle, angular velocity, and torque)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 // Always use cpBodySetAngle() to set the angle of the body as a and rot must agree.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 cpFloat a, w, t;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 // Cached unit length vector representing the angle of the body.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 // Used for fast vector rotation using cpvrotate().
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 cpVect rot;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 // *** User Definable Fields
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 // User defined data pointer.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 cpDataPointer data;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 // *** Other Fields
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 // Maximum velocities this body can move at after integrating velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 cpFloat v_limit, w_limit;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69 // *** Internally Used Fields
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 // Velocity bias values used when solving penetrations and correcting constraints.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72 cpVect v_bias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 cpFloat w_bias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 // Space this body has been added to
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 cpSpace* space;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 // Pointer to the shape list.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79 // Shapes form a linked list using cpShape.next when added to a space.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 cpShape *shapesList;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 // Used by cpSpaceStep() to store contact graph information.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 cpComponentNode node;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 //// Basic allocation/destruction functions
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 //cpBody *cpBodyAlloc(void);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 //cpBody *cpBodyInit(cpBody *body, cpFloat m, cpFloat i);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 //cpBody *cpBodyNew(cpFloat m, cpFloat i);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 //void cpBodyDestroy(cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 //void cpBodyFree(cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 //// Wake up a sleeping or idle body. (defined in cpSpace.c)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 //void cpBodyActivate(cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 //// Force a body to sleep;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 //void cpBodySleep(cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 ////void cpBodySleepGroup(cpBody *body, ...);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 static cpBool
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 cpBodyIsSleeping(const cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 return (_body.node.next !is null);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 //cpBool cpBodyIsStatic(const cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 static cpBool
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 cpBodyIsRogue(const cpBody* _body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 return (_body.space is null);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
115 //TODO
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 //#define CP_DefineBodyGetter(type, member, name) \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 //static inline type cpBodyGet##name(const cpBody *body){return body.member;}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119 //#define CP_DefineBodySetter(type, member, name) \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 //static inline void \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 //cpBodySet##name(cpBody *body, const type value){ \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 // cpBodyActivate(body); \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 // body.member = value; \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 //} \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 //#define CP_DefineBodyProperty(type, member, name) \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 //CP_DefineBodyGetter(type, member, name) \
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128 //CP_DefineBodySetter(type, member, name)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
129
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
130
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
131 //// Accessors for cpBody struct members
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
132 //CP_DefineBodyGetter(cpFloat, m, Mass);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
133 //void cpBodySetMass(cpBody *body, cpFloat m);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
134 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
135 //CP_DefineBodyGetter(cpFloat, i, Moment);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
136 //void cpBodySetMoment(cpBody *body, cpFloat i);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
137 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
138 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
139 //CP_DefineBodyProperty(cpVect, p, Pos);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
140 //CP_DefineBodyProperty(cpVect, v, Vel);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
141 //CP_DefineBodyProperty(cpVect, f, Force);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
142 static cpFloat cpBodyGetAngle(const cpBody *_body){return _body.a;}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
143 static cpFloat cpBodySetAngle(cpBody *_body, const cpFloat value){cpBodyActivate(_body); return _body.a = value;}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
144 //CP_DefineBodyProperty(cpFloat, w, AngVel);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
145 //CP_DefineBodyProperty(cpFloat, t, Torque);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
146 //CP_DefineBodyGetter(cpVect, rot, Rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
147 //CP_DefineBodyProperty(cpFloat, v_limit, VelLimit);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
148 //CP_DefineBodyProperty(cpFloat, w_limit, AngVelLimit);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
149
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
150 //// Modify the velocity of the body so that it will move to the specified absolute coordinates in the next timestep.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
151 //// Intended for objects that are moved manually with a custom velocity integration function.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
152 //void cpBodySlew(cpBody *body, cpVect pos, cpFloat dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
153 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
154 //// Default Integration functions.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
155 //void cpBodyUpdateVelocity(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
156 //void cpBodyUpdatePosition(cpBody *body, cpFloat dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
157
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
158 // Convert body local to world coordinates
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
159 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
160 cpBodyLocal2World(const cpBody *_body, const cpVect v)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
161 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
162 return cpvadd(_body.p, cpvrotate(v, _body.rot));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
163 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
164
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
165 // Convert world to body local coordinates
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
166 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
167 cpBodyWorld2Local(const cpBody *_body, const cpVect v)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
168 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
169 return cpvunrotate(cpvsub(v, _body.p), _body.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
170 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
171
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
172 // Apply an impulse (in world coordinates) to the body at a point relative to the center of gravity (also in world coordinates).
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
173 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
174 cpBodyApplyImpulse(cpBody *_body, const cpVect j, const cpVect r)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
175 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
176 _body.v = cpvadd(_body.v, cpvmult(j, _body.m_inv));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
177 _body.w += _body.i_inv*cpvcross(r, j);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
178 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
179
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
180 //// Zero the forces on a body.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
181 //void cpBodyResetForces(cpBody *body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
182 //// Apply a force (in world coordinates) to a body at a point relative to the center of gravity (also in world coordinates).
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
183 //void cpBodyApplyForce(cpBody *body, const cpVect f, const cpVect r);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
184
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
185 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
186 cpBodyKineticEnergy(const cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
187 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
188 // Need to do some fudging to avoid NaNs
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
189 cpFloat vsq = cpvdot(_body.v, _body.v);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
190 cpFloat wsq = _body.w*_body.w;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
191 return (vsq ? vsq*_body.m : 0.0f) + (wsq ? wsq*_body.i : 0.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
192 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
193
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
194 //// Apply a damped spring force between two bodies.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
195 //// Warning: Large damping values can be unstable. Use a cpDampedSpring constraint for this instead.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
196 //void cpApplyDampedSpring(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat rlen, cpFloat k, cpFloat dmp, cpFloat dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
197
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
198 // initialized in cpInitChipmunk()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
199 cpBody cpStaticBodySingleton;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
200
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
201 cpBody*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
202 cpBodyAlloc()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
203 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
204 return cast(cpBody *)cpmalloc(cpBody.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
205 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
206
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
207 cpBodyVelocityFunc cpBodyUpdateVelocityDefault = &cpBodyUpdateVelocity;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
208 cpBodyPositionFunc cpBodyUpdatePositionDefault = &cpBodyUpdatePosition;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
209
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
210 cpBody*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
211 cpBodyInit(cpBody *_body, cpFloat m, cpFloat i)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
212 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
213 _body.velocity_func = cpBodyUpdateVelocityDefault;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
214 _body.position_func = cpBodyUpdatePositionDefault;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
215
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
216 cpBodySetMass(_body, m);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
217 cpBodySetMoment(_body, i);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
218
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
219 _body.p = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
220 _body.v = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
221 _body.f = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
222
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
223 cpBodySetAngle(_body, 0.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
224 _body.w = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
225 _body.t = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
226
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
227 _body.v_bias = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
228 _body.w_bias = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
229
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
230 _body.data = null;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
231 _body.v_limit = INFINITY;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
232 _body.w_limit = INFINITY;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
233
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
234 _body.space = null;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
235 _body.shapesList = null;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
236
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
237 cpComponentNode node = {null, null, 0, 0.0f};
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
238 _body.node = node;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
239
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
240 return _body;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
241 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
242
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
243 cpBody*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
244 cpBodyNew(cpFloat m, cpFloat i)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
245 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
246 return cpBodyInit(cpBodyAlloc(), m, i);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
247 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
248
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
249 void cpBodyDestroy(cpBody *_body){}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
250
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
251 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
252 cpBodyFree(cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
253 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
254 if(_body){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
255 cpBodyDestroy(_body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
256 cpfree(_body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
257 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
258 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
259
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
260 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
261 cpBodySetMass(cpBody *_body, cpFloat mass)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
262 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
263 _body.m = mass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
264 _body.m_inv = 1.0f/mass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
265 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
266
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
267 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
268 cpBodySetMoment(cpBody *_body, cpFloat moment)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
269 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
270 _body.i = moment;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
271 _body.i_inv = 1.0f/moment;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
272 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
273
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
274 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
275 cpBodySetAngle(cpBody *_body, cpFloat angle)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
276 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
277 _body.a = angle;//fmod(a, (cpFloat)M_PI*2.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
278 _body.rot = cpvforangle(angle);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
279 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
280
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
281 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
282 cpBodySlew(cpBody *_body, cpVect pos, cpFloat dt)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
283 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
284 cpVect delta = cpvsub(pos, _body.p);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
285 _body.v = cpvmult(delta, 1.0f/dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
286 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
287
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
288 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
289 cpBodyUpdateVelocity(cpBody *_body, cpVect gravity, cpFloat damping, cpFloat dt)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
290 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
291 _body.v = cpvclamp(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
292 cpvadd(cpvmult(_body.v, damping), cpvmult(cpvadd(gravity, cpvmult(_body.f, _body.m_inv)), dt)),
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
293 _body.v_limit);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
294
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
295 cpFloat w_limit = _body.w_limit;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
296 _body.w = cpfclamp(_body.w*damping + _body.t*_body.i_inv*dt, -w_limit, w_limit);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
297 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
298
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
299 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
300 cpBodyUpdatePosition(cpBody *_body, cpFloat dt)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
301 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
302 _body.p = cpvadd(_body.p, cpvmult(cpvadd(_body.v, _body.v_bias), dt));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
303 cpBodySetAngle(_body, _body.a + (_body.w + _body.w_bias)*dt);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
304
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
305 _body.v_bias = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
306 _body.w_bias = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
307 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
308
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
309 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
310 cpBodyResetForces(cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
311 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
312 _body.f = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
313 _body.t = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
314 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
315
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
316 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
317 cpBodyApplyForce(cpBody *_body, cpVect force, cpVect r)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
318 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
319 _body.f = cpvadd(_body.f, force);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
320 _body.t += cpvcross(r, force);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
321 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
322
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
323 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
324 cpApplyDampedSpring(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat rlen, cpFloat k, cpFloat dmp, cpFloat dt)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
325 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
326 // Calculate the world space anchor coordinates.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
327 cpVect r1 = cpvrotate(anchr1, a.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
328 cpVect r2 = cpvrotate(anchr2, b.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
329
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
330 cpVect delta = cpvsub(cpvadd(b.p, r2), cpvadd(a.p, r1));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
331 cpFloat dist = cpvlength(delta);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
332 cpVect n = dist ? cpvmult(delta, 1.0f/dist) : cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
333
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
334 cpFloat f_spring = (dist - rlen)*k;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
335
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
336 // Calculate the world relative velocities of the anchor points.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
337 cpVect v1 = cpvadd(a.v, cpvmult(cpvperp(r1), a.w));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
338 cpVect v2 = cpvadd(b.v, cpvmult(cpvperp(r2), b.w));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
339
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
340 // Calculate the damping force.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
341 // This really should be in the impulse solver and can produce problems when using large damping values.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
342 cpFloat vrn = cpvdot(cpvsub(v2, v1), n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
343 cpFloat f_damp = vrn*cpfmin(dmp, 1.0f/(dt*(a.m_inv + b.m_inv)));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
344
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
345 // Apply!
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
346 cpVect f = cpvmult(n, f_spring + f_damp);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
347 cpBodyApplyForce(a, f, r1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
348 cpBodyApplyForce(b, cpvneg(f), r2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
349 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
350
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
351 cpBool
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
352 cpBodyIsStatic(/+const+/ cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
353 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
354 cpSpace *space = _body.space;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
355 return ( (space !is null) && (_body is &space.staticBody) );
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
356 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
357
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
358 //void cpSpaceSleepBody(cpSpace *space, cpBody *_body);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
359
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
360 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
361 cpBodySleep(cpBody *_body)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
362 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
363 if(cpBodyIsSleeping(_body)) return;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
364
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
365 assert(!cpBodyIsStatic(_body) && !cpBodyIsRogue(_body), "Rogue and static bodies cannot be put to sleep.");
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
366 cpSpaceSleepBody(_body.space, _body);
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
367 }