annotate trunk/chipmunkd/constraints/util.d @ 15:df4ebc8add66

rename/refactoring
author Extrawurst
date Sat, 04 Dec 2010 00:51:29 +0100
parents 7ebbd4d05553
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.constraints.util;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
5
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
6 import chipmunkd.cpBody;
15
df4ebc8add66 rename/refactoring
Extrawurst
parents: 4
diff changeset
7 import chipmunkd.chipmunk_types;
df4ebc8add66 rename/refactoring
Extrawurst
parents: 4
diff changeset
8 import chipmunkd.cpVect;
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
9
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10 template CP_DefineClassGetter(string t)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 enum CP_DefineClassGetter =
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13 "cpConstraintClass* "~t~"GetClass(){return cast(cpConstraintClass *)&klass;}";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 template J_MAX(string constraint,string dt)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 enum J_MAX = "((cast(cpConstraint *)"~constraint~").maxForce*("~dt~"))";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 template CONSTRAINT_BEGIN(string constraint,string a_var,string b_var)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 enum CONSTRAINT_BEGIN = "cpBody *"~a_var~"; cpBody *"~b_var~";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 "~a_var~" = (cast(cpConstraint *)"~constraint~")."~a_var~";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 "~b_var~" = (cast(cpConstraint *)"~constraint~")."~b_var~";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26 if(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 (cpBodyIsSleeping("~a_var~") || cpBodyIsStatic("~a_var~")) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 (cpBodyIsSleeping("~b_var~") || cpBodyIsStatic("~b_var~"))
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 ) return;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 ";
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 relative_velocity(cpBody *a, cpBody *b, cpVect r1, cpVect r2){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 cpVect v1_sum = cpvadd(a.v, cpvmult(cpvperp(r1), a.w));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 cpVect v2_sum = cpvadd(b.v, cpvmult(cpvperp(r2), b.w));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 return cpvsub(v2_sum, v1_sum);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 normal_relative_velocity(cpBody *a, cpBody *b, cpVect r1, cpVect r2, cpVect n){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 return cpvdot(relative_velocity(a, b, r1, r2), n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 apply_impulses(cpBody *a , cpBody *b, cpVect r1, cpVect r2, cpVect j)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 cpBodyApplyImpulse(a, cpvneg(j), r1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 cpBodyApplyImpulse(b, j, r2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 apply_bias_impulse(cpBody *_body, cpVect j, cpVect r)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 _body.v_bias = cpvadd(_body.v_bias, cpvmult(j, _body.m_inv));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 _body.w_bias += _body.i_inv*cpvcross(r, j);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 apply_bias_impulses(cpBody *a , cpBody *b, cpVect r1, cpVect r2, cpVect j)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 apply_bias_impulse(a, cpvneg(j), r1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 apply_bias_impulse(b, j, r2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 clamp_vect(cpVect v, cpFloat len)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 return cpvclamp(v, len);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 // return (cpvdot(v,v) > len*len) ? cpvmult(cpvnormalize(v), len) : v;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 k_scalar(cpBody *a, cpBody *b, cpVect r1, cpVect r2, cpVect n)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 cpFloat mass_sum = a.m_inv + b.m_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 cpFloat r1cn = cpvcross(r1, n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79 cpFloat r2cn = cpvcross(r2, n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 cpFloat value = mass_sum + a.i_inv*r1cn*r1cn + b.i_inv*r2cn*r2cn;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 assert(value != 0.0, "Unsolvable collision or constraint.");
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 return value;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 k_tensor(cpBody *a, cpBody *b, cpVect r1, cpVect r2, cpVect *k1, cpVect *k2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 // calculate mass matrix
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 // If I wasn't lazy and wrote a proper matrix class, this wouldn't be so gross...
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 cpFloat k11, k12, k21, k22;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 cpFloat m_sum = a.m_inv + b.m_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 // start with I*m_sum
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 k11 = m_sum; k12 = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 k21 = 0.0f; k22 = m_sum;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 // add the influence from r1
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 cpFloat a_i_inv = a.i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 cpFloat r1xsq = r1.x * r1.x * a_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 cpFloat r1ysq = r1.y * r1.y * a_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 cpFloat r1nxy = -r1.x * r1.y * a_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 k11 += r1ysq; k12 += r1nxy;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 k21 += r1nxy; k22 += r1xsq;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 // add the influnce from r2
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 cpFloat b_i_inv = b.i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 cpFloat r2xsq = r2.x * r2.x * b_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 cpFloat r2ysq = r2.y * r2.y * b_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 cpFloat r2nxy = -r2.x * r2.y * b_i_inv;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 k11 += r2ysq; k12 += r2nxy;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 k21 += r2nxy; k22 += r2xsq;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 // invert
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 cpFloat determinant = k11*k22 - k12*k21;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 assert(determinant != 0.0, "Unsolvable constraint.");
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119 cpFloat det_inv = 1.0f/determinant;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 *k1 = cpv( k22*det_inv, -k12*det_inv);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 *k2 = cpv(-k21*det_inv, k11*det_inv);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 static cpVect
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125 mult_k(cpVect vr, cpVect k1, cpVect k2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 return cpv(cpvdot(vr, k1), cpvdot(vr, k2));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128 }