annotate trunk/chipmunkd/constraints/cpPivotJoint.d @ 4:7ebbd4d05553

initial commit
author Extrawurst
date Thu, 02 Dec 2010 02:11:26 +0100
parents
children b68f10432182
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.cpPivotJoint;
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 //const cpConstraintClass *cpPivotJointGetClass();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 struct cpPivotJoint {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 cpConstraint constraint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13 cpVect anchr1, anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 cpVect r1, r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 cpVect k1, k2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 cpVect jAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 cpFloat jMaxLen;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 cpVect bias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 //cpPivotJoint *cpPivotJointAlloc(void);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 //cpPivotJoint *cpPivotJointInit(cpPivotJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 //cpConstraint *cpPivotJointNew(cpBody *a, cpBody *b, cpVect pivot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26 //cpConstraint *cpPivotJointNew2(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 //CP_DefineConstraintProperty(cpPivotJoint, cpVect, anchr1, Anchr1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 //CP_DefineConstraintProperty(cpPivotJoint, cpVect, anchr2, Anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32 preStep(cpPivotJoint *joint, cpFloat dt, cpFloat dt_inv)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 mixin(CONSTRAINT_BEGIN!("joint", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 joint.r1 = cpvrotate(joint.anchr1, a.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 joint.r2 = cpvrotate(joint.anchr2, b.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 // Calculate mass tensor
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 k_tensor(a, b, joint.r1, joint.r2, &joint.k1, &joint.k2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 // compute max impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 joint.jMaxLen = mixin(J_MAX!("joint", "dt"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 // calculate bias velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 cpVect delta = cpvsub(cpvadd(b.p, joint.r2), cpvadd(a.p, joint.r1));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 joint.bias = cpvclamp(cpvmult(delta, -joint.constraint.biasCoef*dt_inv), joint.constraint.maxBias);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 // apply accumulated impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 apply_impulses(a, b, joint.r1, joint.r2, joint.jAcc);
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 applyImpulse(cpPivotJoint *joint)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 mixin(CONSTRAINT_BEGIN!("joint", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 cpVect r1 = joint.r1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 cpVect r2 = joint.r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 // compute relative velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 cpVect vr = relative_velocity(a, b, r1, r2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 // compute normal impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 cpVect j = mult_k(cpvsub(joint.bias, vr), joint.k1, joint.k2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 cpVect jOld = joint.jAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 joint.jAcc = cpvclamp(cpvadd(joint.jAcc, j), joint.jMaxLen);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 j = cpvsub(joint.jAcc, jOld);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 // apply impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 apply_impulses(a, b, joint.r1, joint.r2, j);
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 getImpulse(cpConstraint *joint)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 return cpvlength((cast(cpPivotJoint *)joint).jAcc);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 static /+const+/ cpConstraintClass klass = {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 cast(cpConstraintPreStepFunction)&preStep,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 cast(cpConstraintApplyImpulseFunction)&applyImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 cast(cpConstraintGetImpulseFunction)&getImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 mixin(CP_DefineClassGetter!("cpPivotJoint"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 cpPivotJoint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 cpPivotJointAlloc()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 return cast(cpPivotJoint *)cpmalloc(cpPivotJoint.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 cpPivotJoint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 cpPivotJointInit(cpPivotJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 cpConstraintInit(cast(cpConstraint *)joint, &klass, a, b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 joint.anchr1 = anchr1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 joint.anchr2 = anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 joint.jAcc = cpvzero;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 return joint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106 cpConstraint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 cpPivotJointNew2(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 return cast(cpConstraint *)cpPivotJointInit(cpPivotJointAlloc(), a, b, anchr1, anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 cpConstraint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 cpPivotJointNew(cpBody *a, cpBody *b, cpVect pivot)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 cpVect anchr1 = (a ? cpBodyWorld2Local(a, pivot) : pivot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 cpVect anchr2 = (b ? cpBodyWorld2Local(b, pivot) : pivot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 return cpPivotJointNew2(a, b, anchr1, anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 }