annotate trunk/chipmunkd/cpArbiter.d @ 28:4541ca17975b

use __gshared as chipmunk heavily relies on globals and D would otherwise make them TLS
author Extrawurst
date Mon, 13 Dec 2010 21:40:56 +0100
parents 4ceef5833c8c
children
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.cpArbiter;
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.constraints.util;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
8
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
9 // Determines how fast penetrations resolve themselves.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10 //extern cpFloat cp_bias_coef;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 // Amount of allowed penetration. Used to reduce vibrating contacts.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 //extern cpFloat cp_collision_slop;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 // Data structure for contact points.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 struct cpContact {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 // Contact point and normal.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 cpVect p, n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 // Penetration distance.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 cpFloat dist;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 // Calculated by cpArbiterPreStep().
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 cpVect r1, r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 cpFloat nMass, tMass, bounce;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 // Persistant contact information.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26 cpFloat jnAcc, jtAcc, jBias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 cpFloat bias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 // Hash value used to (mostly) uniquely identify a contact.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 cpHashValue hash;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 //// Contacts are always allocated in groups.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 //cpContact* cpContactInit(cpContact *con, cpVect p, cpVect n, cpFloat dist, cpHashValue hash);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 //// Sum the contact impulses. (Can be used after cpSpaceStep() returns)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 //cpVect cpContactsSumImpulses(cpContact *contacts, int numContacts);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 //cpVect cpContactsSumImpulsesWithFriction(cpContact *contacts, int numContacts);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
40 enum CP_MAX_CONTACTS_PER_ARBITER = 6;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
41
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 enum cpArbiterState {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 cpArbiterStateNormal,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 cpArbiterStateFirstColl,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 cpArbiterStateIgnore,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 cpArbiterStateSleep,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 cpArbiterStateCached,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 // Data structure for tracking collisions between shapes.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 struct cpArbiter {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 // Information on the contact points between the objects.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 int numContacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 cpContact *contacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 // The two shapes and bodies involved in the collision.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 // These variables are NOT in the order defined by the collision handler.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 // Using CP_ARBITER_GET_SHAPES and CP_ARBITER_GET_BODIES will save you from
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 // many headaches
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
60 cpShape* a;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
61 cpShape* b;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 // Calculated before calling the pre-solve collision handler
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 // Override them with custom values if you want specialized behavior
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 cpFloat e;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 cpFloat u;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 // Used for surface_v calculations, implementation may change
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 cpVect surface_vr;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 // Time stamp of the arbiter. (from cpSpace)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 cpTimestamp stamp;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 cpCollisionHandler *handler;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 // Are the shapes swapped in relation to the collision handler?
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 cpBool swappedColl;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 cpArbiterState state;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 //// Arbiters are allocated in large buffers by the space and don't require a destroy function
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 //cpArbiter* cpArbiterInit(cpArbiter *arb, cpShape *a, cpShape *b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 //// These functions are all intended to be used internally.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 //// Inject new contact points into the arbiter while preserving contact history.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 //void cpArbiterUpdate(cpArbiter *arb, cpContact *contacts, int numContacts, struct cpCollisionHandler *handler, cpShape *a, cpShape *b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 //// Precalculate values used by the solver.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 //void cpArbiterPreStep(cpArbiter *arb, cpFloat dt_inv);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 //void cpArbiterApplyCachedImpulse(cpArbiter *arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 //// Run an iteration of the solver on the arbiter.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 //void cpArbiterApplyImpulse(cpArbiter *arb, cpFloat eCoef);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 //// Arbiter Helper Functions
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 //cpVect cpArbiterTotalImpulse(cpArbiter *arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 //cpVect cpArbiterTotalImpulseWithFriction(cpArbiter *arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 //void cpArbiterIgnore(cpArbiter *arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 cpArbiterGetShapes(/+const+/ cpArbiter *arb, cpShape **a, cpShape **b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 if(arb.swappedColl){
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
102 (*a) = arb.b, (*b) = arb.a;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 } else {
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
104 (*a) = arb.a, (*b) = arb.b;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106 }
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
107
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 template CP_ARBITER_GET_SHAPES(string arb,string a,string b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 enum CP_ARBITER_GET_SHAPES = "cpShape* "~a~", "~b~";"~
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 "cpArbiterGetShapes("~arb~", &"~a~", &"~b~");";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 cpArbiterGetBodies(/+const+/ cpArbiter *arb, cpBody **a, cpBody **b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 //CP_ARBITER_GET_SHAPES(arb, shape_a, shape_b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 cpShape *shape_a, shape_b; cpArbiterGetShapes(arb, &shape_a, &shape_b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119 (*a) = shape_a._body;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 (*b) = shape_b._body;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 //#define CP_ARBITER_GET_BODIES(arb, a, b) cpBody *a, *b; cpArbiterGetBodies(arb, &a, &b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 static cpBool
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125 cpArbiterIsFirstContact(const cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 return arb.state == cpArbiterState.cpArbiterStateFirstColl;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
129
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
130 static int
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
131 cpArbiterGetCount(const cpArbiter *arb)
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
132 {
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
133 return arb.numContacts;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
134 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
135
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
136 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
137 cpArbiterGetNormal(const cpArbiter *arb, int i)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
138 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
139 cpVect n = arb.contacts[i].n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
140 return arb.swappedColl ? cpvneg(n) : n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
141 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
142
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
143 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
144 cpArbiterGetPoint(const cpArbiter *arb, int i)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
145 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
146 return arb.contacts[i].p;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
147 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
148
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
149
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
150 static cpFloat
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
151 cpArbiteGetDepth(const cpArbiter *arb, int i)
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
152 {
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
153 return arb.contacts[i].dist;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
154 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
155
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
156 struct cpContactPointSet {
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
157 int count;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
158
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
159 struct TPoint
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
160 {
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
161 cpVect point, normal;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
162 cpFloat dist = 0;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
163 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
164
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
165 TPoint[CP_MAX_CONTACTS_PER_ARBITER] points;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
166 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
167
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
168 static cpContactPointSet
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
169 cpArbiterGetContactPointSet(const cpArbiter *arb)
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
170 {
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
171 cpContactPointSet set;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
172 set.count = cpArbiterGetCount(arb);
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
173
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
174 int i;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
175 for(i=0; i<set.count; i++){
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
176 set.points[i].point = arb.contacts[i].p;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
177 set.points[i].normal = arb.contacts[i].p;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
178 set.points[i].dist = arb.contacts[i].dist;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
179 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
180
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
181 return set;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
182 }
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
183
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
184 // cpArbiter.c --------------------------
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
185
28
4541ca17975b use __gshared as chipmunk heavily relies on globals and D would otherwise make them TLS
Extrawurst
parents: 23
diff changeset
186 __gshared cpFloat cp_bias_coef = 0.1f;
4541ca17975b use __gshared as chipmunk heavily relies on globals and D would otherwise make them TLS
Extrawurst
parents: 23
diff changeset
187 __gshared cpFloat cp_collision_slop = 0.1f;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
188
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
189 cpContact*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
190 cpContactInit(cpContact *con, cpVect p, cpVect n, cpFloat dist, cpHashValue hash)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
191 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
192 con.p = p;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
193 con.n = n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
194 con.dist = dist;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
195
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
196 con.jnAcc = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
197 con.jtAcc = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
198 con.jBias = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
199
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
200 con.hash = hash;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
201
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
202 return con;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
203 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
204
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
205 cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
206 cpArbiterTotalImpulse(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
207 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
208 cpContact *contacts = arb.contacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
209 cpVect sum = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
210
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
211 for(int i=0, count=arb.numContacts; i<count; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
212 cpContact *con = &contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
213 sum = cpvadd(sum, cpvmult(con.n, con.jnAcc));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
214 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
215
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
216 return sum;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
217 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
218
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
219 cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
220 cpArbiterTotalImpulseWithFriction(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
221 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
222 cpContact *contacts = arb.contacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
223 cpVect sum = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
224
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
225 for(int i=0, count=arb.numContacts; i<count; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
226 cpContact *con = &contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
227 sum = cpvadd(sum, cpvrotate(con.n, cpv(con.jnAcc, con.jtAcc)));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
228 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
229
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
230 return sum;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
231 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
232
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
233 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
234 cpContactsEstimateCrushingImpulse(cpContact *contacts, int numContacts)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
235 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
236 cpFloat fsum = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
237 cpVect vsum = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
238
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
239 for(int i=0; i<numContacts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
240 cpContact *con = &contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
241 cpVect j = cpvrotate(con.n, cpv(con.jnAcc, con.jtAcc));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
242
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
243 fsum += cpvlength(j);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
244 vsum = cpvadd(vsum, j);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
245 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
246
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
247 cpFloat vmag = cpvlength(vsum);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
248 return (1.0f - vmag/fsum);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
249 }
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 cpArbiterIgnore(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
253 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
254 arb.state = cpArbiterState.cpArbiterStateIgnore;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
255 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
256
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
257 cpArbiter*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
258 cpArbiterAlloc()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
259 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
260 return cast(cpArbiter *)cpcalloc(1, cpArbiter.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
261 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
262
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
263 cpArbiter*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
264 cpArbiterInit(cpArbiter *arb, cpShape *a, cpShape *b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
265 {
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
266 arb.handler = null;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
267 arb.swappedColl = cpFalse;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
268
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
269 arb.e = 0.0f;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
270 arb.u = 0.0f;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
271 arb.surface_vr = cpvzero;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
272
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
273 arb.numContacts = 0;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
274 arb.contacts = null;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
275
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
276 arb.a = a;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
277 arb.b = b;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
278
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
279 arb.stamp = 0;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
280 arb.state = cpArbiterState.cpArbiterStateFirstColl;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
281
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
282 return arb;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
283 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
284
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
285 cpArbiter*
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
286 cpArbiterNew(cpShape *a, cpShape *b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
287 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
288 return cpArbiterInit(cpArbiterAlloc(), a, b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
289 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
290
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
291 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
292 cpArbiterDestroy(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
293 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
294 // if(arb.contacts) cpfree(arb.contacts);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
295 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
296
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
297 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
298 cpArbiterFree(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
299 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
300 if(arb){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
301 cpArbiterDestroy(arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
302 cpfree(arb);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
303 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
304 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
305
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
306 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
307 cpArbiterUpdate(cpArbiter *arb, cpContact *contacts, int numContacts, cpCollisionHandler *handler, cpShape *a, cpShape *b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
308 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
309 // Arbiters without contact data may exist if a collision function rejected the collision.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
310 if(arb.contacts){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
311 // Iterate over the possible pairs to look for hash value matches.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
312 for(int i=0; i<arb.numContacts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
313 cpContact *old = &arb.contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
314
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
315 for(int j=0; j<numContacts; j++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
316 cpContact *new_contact = &contacts[j];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
317
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
318 // This could trigger false positives, but is fairly unlikely nor serious if it does.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
319 if(new_contact.hash == old.hash){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
320 // Copy the persistant contact information.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
321 new_contact.jnAcc = old.jnAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
322 new_contact.jtAcc = old.jtAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
323 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
324 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
325 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
326 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
327
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
328 arb.contacts = contacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
329 arb.numContacts = numContacts;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
330
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
331 arb.handler = handler;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
332 arb.swappedColl = (a.collision_type != handler.a);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
333
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
334 arb.e = a.e * b.e;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
335 arb.u = a.u * b.u;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
336 arb.surface_vr = cpvsub(a.surface_v, b.surface_v);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
337
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
338 // For collisions between two similar primitive types, the order could have been swapped.
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
339 arb.a = a;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
340 arb.b = b;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
341
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
342 // mark it as new if it's been cached
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
343 if(arb.state == cpArbiterState.cpArbiterStateCached) arb.state = cpArbiterState.cpArbiterStateFirstColl;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
344 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
345
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
346 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
347 cpArbiterPreStep(cpArbiter *arb, cpFloat dt_inv)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
348 {
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
349 cpBody *a = arb.a._body;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
350 cpBody *b = arb.b._body;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
351
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
352 for(int i=0; i<arb.numContacts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
353 cpContact *con = &arb.contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
354
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
355 // Calculate the offsets.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
356 con.r1 = cpvsub(con.p, a.p);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
357 con.r2 = cpvsub(con.p, b.p);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
358
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
359 // Calculate the mass normal and mass tangent.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
360 con.nMass = 1.0f/k_scalar(a, b, con.r1, con.r2, con.n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
361 con.tMass = 1.0f/k_scalar(a, b, con.r1, con.r2, cpvperp(con.n));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
362
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
363 // Calculate the target bias velocity.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
364 con.bias = -cp_bias_coef*dt_inv*cpfmin(0.0f, con.dist + cp_collision_slop);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
365 con.jBias = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
366
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
367 // Calculate the target bounce velocity.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
368 con.bounce = normal_relative_velocity(a, b, con.r1, con.r2, con.n)*arb.e;//cpvdot(con.n, cpvsub(v2, v1))*e;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
369 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
370 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
371
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
372 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
373 cpArbiterApplyCachedImpulse(cpArbiter *arb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
374 {
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
375 cpShape *shapea = arb.a;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
376 cpShape *shapeb = arb.b;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
377
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
378 arb.u = shapea.u * shapeb.u;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
379 arb.surface_vr = cpvsub(shapeb.surface_v, shapea.surface_v);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
380
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
381 cpBody *a = shapea._body;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
382 cpBody *b = shapeb._body;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
383
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
384 for(int i=0; i<arb.numContacts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
385 cpContact *con = &arb.contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
386 apply_impulses(a, b, con.r1, con.r2, cpvrotate(con.n, cpv(con.jnAcc, con.jtAcc)));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
387 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
388 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
389
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
390 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
391 cpArbiterApplyImpulse(cpArbiter *arb, cpFloat eCoef)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
392 {
23
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
393 cpBody *a = arb.a._body;
4ceef5833c8c updated to chipmunk 5.3.3
Extrawurst
parents: 15
diff changeset
394 cpBody *b = arb.b._body;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
395
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
396 for(int i=0; i<arb.numContacts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
397 cpContact *con = &arb.contacts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
398 cpVect n = con.n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
399 cpVect r1 = con.r1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
400 cpVect r2 = con.r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
401
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
402 // Calculate the relative bias velocities.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
403 cpVect vb1 = cpvadd(a.v_bias, cpvmult(cpvperp(r1), a.w_bias));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
404 cpVect vb2 = cpvadd(b.v_bias, cpvmult(cpvperp(r2), b.w_bias));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
405 cpFloat vbn = cpvdot(cpvsub(vb2, vb1), n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
406
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
407 // Calculate and clamp the bias impulse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
408 cpFloat jbn = (con.bias - vbn)*con.nMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
409 cpFloat jbnOld = con.jBias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
410 con.jBias = cpfmax(jbnOld + jbn, 0.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
411 jbn = con.jBias - jbnOld;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
412
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
413 // Apply the bias impulse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
414 apply_bias_impulses(a, b, r1, r2, cpvmult(n, jbn));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
415
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
416 // Calculate the relative velocity.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
417 cpVect vr = relative_velocity(a, b, r1, r2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
418 cpFloat vrn = cpvdot(vr, n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
419
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
420 // Calculate and clamp the normal impulse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
421 cpFloat jn = -(con.bounce*eCoef + vrn)*con.nMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
422 cpFloat jnOld = con.jnAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
423 con.jnAcc = cpfmax(jnOld + jn, 0.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
424 jn = con.jnAcc - jnOld;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
425
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
426 // Calculate the relative tangent velocity.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
427 cpFloat vrt = cpvdot(cpvadd(vr, arb.surface_vr), cpvperp(n));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
428
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
429 // Calculate and clamp the friction impulse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
430 cpFloat jtMax = arb.u*con.jnAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
431 cpFloat jt = -vrt*con.tMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
432 cpFloat jtOld = con.jtAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
433 con.jtAcc = cpfclamp(jtOld + jt, -jtMax, jtMax);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
434 jt = con.jtAcc - jtOld;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
435
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
436 // Apply the final impulse.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
437 apply_impulses(a, b, r1, r2, cpvrotate(n, cpv(jn, jt)));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
438 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
439 }