annotate trunk/chipmunkd/constraints/cpPinJoint.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.cpPinJoint;
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.cpBody;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10 import chipmunkd.constraints.util;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 //const cpConstraintClass *cpPinJointGetClass();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 struct cpPinJoint {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 cpConstraint constraint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 cpVect anchr1, anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 cpFloat dist;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 cpVect r1, r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 cpVect n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 cpFloat nMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 cpFloat jnAcc, jnMax;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 cpFloat bias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 //cpPinJoint *cpPinJointAlloc(void);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 //cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 //cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 //CP_DefineConstraintProperty(cpPinJoint, cpVect, anchr1, Anchr1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32 //CP_DefineConstraintProperty(cpPinJoint, cpVect, anchr2, Anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 //CP_DefineConstraintProperty(cpPinJoint, cpFloat, dist, Dist);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 // cpPinJoint.c -------------------------
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 preStep(cpPinJoint *joint, cpFloat dt, cpFloat dt_inv)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 mixin(CONSTRAINT_BEGIN!("joint", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 joint.r1 = cpvrotate(joint.anchr1, a.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 joint.r2 = cpvrotate(joint.anchr2, b.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 cpVect delta = cpvsub(cpvadd(b.p, joint.r2), cpvadd(a.p, joint.r1));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 cpFloat dist = cpvlength(delta);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 joint.n = cpvmult(delta, 1.0f/(dist ? dist : cast(cpFloat)INFINITY));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 // calculate mass normal
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 joint.nMass = 1.0f/k_scalar(a, b, joint.r1, joint.r2, joint.n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 // calculate bias velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 cpFloat maxBias = joint.constraint.maxBias;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 joint.bias = cpfclamp(-joint.constraint.biasCoef*dt_inv*(dist - joint.dist), -maxBias, maxBias);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 // compute max impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 joint.jnMax = mixin(J_MAX!("joint", "dt"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 // apply accumulated impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60 cpVect j = cpvmult(joint.n, joint.jnAcc);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 apply_impulses(a, b, joint.r1, joint.r2, j);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 applyImpulse(cpPinJoint *joint)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 mixin(CONSTRAINT_BEGIN!("joint", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 cpVect n = joint.n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 // compute relative velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 cpFloat vrn = normal_relative_velocity(a, b, joint.r1, joint.r2, n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 // compute normal impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 cpFloat jn = (joint.bias - vrn)*joint.nMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 cpFloat jnOld = joint.jnAcc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 joint.jnAcc = cpfclamp(jnOld + jn, -joint.jnMax, joint.jnMax);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 jn = joint.jnAcc - jnOld;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79 // apply impulse
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 apply_impulses(a, b, joint.r1, joint.r2, cpvmult(n, jn));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 getImpulse(cpPinJoint *joint)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 return cpfabs(joint.jnAcc);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 static /+const+/ cpConstraintClass klass = {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 cast(cpConstraintPreStepFunction)&preStep,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 cast(cpConstraintApplyImpulseFunction)&applyImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 cast(cpConstraintGetImpulseFunction)&getImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 mixin(CP_DefineClassGetter!("cpPinJoint"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 cpPinJoint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 cpPinJointAlloc()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 return cast(cpPinJoint *)cpmalloc(cpPinJoint.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 cpPinJoint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 cpConstraintInit(cast(cpConstraint *)joint, &klass, a, b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 joint.anchr1 = anchr1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 joint.anchr2 = anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 // STATIC_BODY_CHECK
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 cpVect p1 = (a ? cpvadd(a.p, cpvrotate(anchr1, a.rot)) : anchr1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 cpVect p2 = (b ? cpvadd(b.p, cpvrotate(anchr2, b.rot)) : anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 joint.dist = cpvlength(cpvsub(p2, p1));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 joint.jnAcc = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 return joint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 cpConstraint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 return cast(cpConstraint *)cpPinJointInit(cpPinJointAlloc(), a, b, anchr1, anchr2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 }