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

initial commit
author Extrawurst
date Thu, 02 Dec 2010 02:11:26 +0100
parents
children 4541ca17975b
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.cpDampedSpring;
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 alias cpFloat function(cpConstraint *spring, cpFloat dist) cpDampedSpringForceFunc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 //const cpConstraintClass *cpDampedSpringGetClass();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13 struct cpDampedSpring {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 cpConstraint constraint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 cpVect anchr1, anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 cpFloat restLength;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 cpFloat stiffness;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 cpFloat damping;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 cpDampedSpringForceFunc springForceFunc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 cpFloat target_vrn;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 cpFloat v_coef;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 cpVect r1, r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 cpFloat nMass;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26 cpVect n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 //cpDampedSpring *cpDampedSpringAlloc(void);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 //cpDampedSpring *cpDampedSpringInit(cpDampedSpring *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat restLength, cpFloat stiffness, cpFloat damping);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 //cpConstraint *cpDampedSpringNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat restLength, cpFloat stiffness, cpFloat damping);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpVect", "anchr1", "Anchr1"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpVect", "anchr2", "Anchr2"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpFloat", "restLength", "RestLength"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpFloat", "stiffness", "Stiffness"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpFloat", "damping", "Damping"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 mixin(CP_DefineConstraintProperty!("cpDampedSpring", "cpDampedSpringForceFunc", "springForceFunc", "SpringForceFunc"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41 defaultSpringForce(cpDampedSpring *spring, cpFloat dist){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 return (spring.restLength - dist)*spring.stiffness;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 preStep(cpDampedSpring *spring, cpFloat dt, cpFloat dt_inv)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 mixin(CONSTRAINT_BEGIN!("spring", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 spring.r1 = cpvrotate(spring.anchr1, a.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 spring.r2 = cpvrotate(spring.anchr2, b.rot);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 cpVect delta = cpvsub(cpvadd(b.p, spring.r2), cpvadd(a.p, spring.r1));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 cpFloat dist = cpvlength(delta);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 spring.n = cpvmult(delta, 1.0f/(dist ? dist : INFINITY));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 cpFloat k = k_scalar(a, b, spring.r1, spring.r2, spring.n);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 spring.nMass = 1.0f/k;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60 spring.target_vrn = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 spring.v_coef = 1.0f - cpfexp(-spring.damping*dt*k);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 // apply spring force
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 cpFloat f_spring = spring.springForceFunc(cast(cpConstraint *)spring, dist);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 apply_impulses(a, b, spring.r1, spring.r2, cpvmult(spring.n, f_spring*dt));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69 applyImpulse(cpDampedSpring *spring)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 mixin(CONSTRAINT_BEGIN!("spring", "a", "b"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 cpVect n = spring.n;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 cpVect r1 = spring.r1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 cpVect r2 = spring.r2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 // compute relative velocity
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 cpFloat vrn = normal_relative_velocity(a, b, r1, r2, n) - spring.target_vrn;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 // compute velocity loss from drag
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 // not 100% certain this is derived correctly, though it makes sense
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 cpFloat v_damp = -vrn*spring.v_coef;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 spring.target_vrn = vrn + v_damp;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 apply_impulses(a, b, spring.r1, spring.r2, cpvmult(spring.n, v_damp*spring.nMass));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 getImpulse(cpConstraint *constraint)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91 return 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 static /+const+/ cpConstraintClass klass = {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 cast(cpConstraintPreStepFunction)&preStep,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 cast(cpConstraintApplyImpulseFunction)&applyImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 cast(cpConstraintGetImpulseFunction)&getImpulse,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 mixin(CP_DefineClassGetter!("cpDampedSpring"));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 cpDampedSpring *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 cpDampedSpringAlloc()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 return cast(cpDampedSpring *)cpmalloc(cpDampedSpring.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 cpDampedSpring *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 cpDampedSpringInit(cpDampedSpring *spring, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat restLength, cpFloat stiffness, cpFloat damping)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 cpConstraintInit(cast(cpConstraint *)spring, cpDampedSpringGetClass(), a, b);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 spring.anchr1 = anchr1;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 spring.anchr2 = anchr2;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 spring.restLength = restLength;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 spring.stiffness = stiffness;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 spring.damping = damping;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 spring.springForceFunc = cast(cpDampedSpringForceFunc)&defaultSpringForce;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 return spring;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 cpConstraint *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 cpDampedSpringNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat restLength, cpFloat stiffness, cpFloat damping)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 return cast(cpConstraint *)cpDampedSpringInit(cpDampedSpringAlloc(), a, b, anchr1, anchr2, restLength, stiffness, damping);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 }