Mercurial > projects > chipmunkd
comparison trunk/chipmunkd/constraints/cpDampedRotarySpring.d @ 6:707dd4e10c28
ported rest of the constraints (chipmunk 5.3.2)
author | Extrawurst |
---|---|
date | Thu, 02 Dec 2010 22:26:04 +0100 |
parents | |
children | b68f10432182 |
comparison
equal
deleted
inserted
replaced
5:6dd4bcf20f03 | 6:707dd4e10c28 |
---|---|
1 | |
2 // written in the D programming language | |
3 | |
4 module chipmunkd.constraints.cpDampedRotarySpring; | |
5 | |
6 import chipmunkd.chipmunk; | |
7 import chipmunkd.constraints.util; | |
8 | |
9 alias cpFloat function(cpConstraint *spring, cpFloat relativeAngle) cpDampedRotarySpringTorqueFunc; | |
10 | |
11 //const cpConstraintClass *cpDampedRotarySpringGetClass(); | |
12 | |
13 struct cpDampedRotarySpring { | |
14 cpConstraint constraint; | |
15 cpFloat restAngle; | |
16 cpFloat stiffness; | |
17 cpFloat damping; | |
18 cpDampedRotarySpringTorqueFunc springTorqueFunc; | |
19 | |
20 cpFloat target_wrn; | |
21 cpFloat w_coef; | |
22 | |
23 cpFloat iSum; | |
24 } | |
25 | |
26 //cpDampedRotarySpring *cpDampedRotarySpringAlloc(void); | |
27 //cpDampedRotarySpring *cpDampedRotarySpringInit(cpDampedRotarySpring *joint, cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping); | |
28 //cpConstraint *cpDampedRotarySpringNew(cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping); | |
29 // | |
30 //CP_DefineConstraintProperty(cpDampedRotarySpring, cpFloat, restAngle, RestAngle); | |
31 //CP_DefineConstraintProperty(cpDampedRotarySpring, cpFloat, stiffness, Stiffness); | |
32 //CP_DefineConstraintProperty(cpDampedRotarySpring, cpFloat, damping, Damping); | |
33 //CP_DefineConstraintProperty(cpDampedRotarySpring, cpDampedRotarySpringTorqueFunc, springTorqueFunc, SpringTorqueFunc); | |
34 | |
35 // cpDampedRotarySpring.c --------------------------------- | |
36 | |
37 static cpFloat | |
38 defaultSpringTorque(cpDampedRotarySpring *spring, cpFloat relativeAngle){ | |
39 return (relativeAngle - spring.restAngle)*spring.stiffness; | |
40 } | |
41 | |
42 static void | |
43 preStep(cpDampedRotarySpring *spring, cpFloat dt, cpFloat dt_inv) | |
44 { | |
45 mixin(CONSTRAINT_BEGIN!("spring", "a", "b")); | |
46 | |
47 cpFloat moment = a.i_inv + b.i_inv; | |
48 spring.iSum = 1.0f/moment; | |
49 | |
50 spring.w_coef = 1.0f - cpfexp(-spring.damping*dt*moment); | |
51 spring.target_wrn = 0.0f; | |
52 | |
53 // apply spring torque | |
54 cpFloat j_spring = spring.springTorqueFunc(cast(cpConstraint *)spring, a.a - b.a)*dt; | |
55 a.w -= j_spring*a.i_inv; | |
56 b.w += j_spring*b.i_inv; | |
57 } | |
58 | |
59 static void | |
60 applyImpulse(cpDampedRotarySpring *spring) | |
61 { | |
62 mixin(CONSTRAINT_BEGIN!("spring", "a", "b")); | |
63 | |
64 // compute relative velocity | |
65 cpFloat wrn = a.w - b.w;//normal_relative_velocity(a, b, r1, r2, n) - spring.target_vrn; | |
66 | |
67 // compute velocity loss from drag | |
68 // not 100% certain this is derived correctly, though it makes sense | |
69 cpFloat w_damp = wrn*spring.w_coef; | |
70 spring.target_wrn = wrn - w_damp; | |
71 | |
72 //apply_impulses(a, b, spring.r1, spring.r2, cpvmult(spring.n, v_damp*spring.nMass)); | |
73 cpFloat j_damp = w_damp*spring.iSum; | |
74 a.w -= j_damp*a.i_inv; | |
75 b.w += j_damp*b.i_inv; | |
76 } | |
77 | |
78 static cpFloat | |
79 getImpulse(cpConstraint *constraint) | |
80 { | |
81 return 0.0f; | |
82 } | |
83 | |
84 static /+const+/ cpConstraintClass klass = { | |
85 cast(cpConstraintPreStepFunction)&preStep, | |
86 cast(cpConstraintApplyImpulseFunction)&applyImpulse, | |
87 cast(cpConstraintGetImpulseFunction)&getImpulse, | |
88 }; | |
89 mixin(CP_DefineClassGetter!("cpDampedRotarySpring")); | |
90 | |
91 cpDampedRotarySpring * | |
92 cpDampedRotarySpringAlloc() | |
93 { | |
94 return cast(cpDampedRotarySpring *)cpmalloc(cpDampedRotarySpring.sizeof); | |
95 } | |
96 | |
97 cpDampedRotarySpring * | |
98 cpDampedRotarySpringInit(cpDampedRotarySpring *spring, cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping) | |
99 { | |
100 cpConstraintInit(cast(cpConstraint *)spring, &klass, a, b); | |
101 | |
102 spring.restAngle = restAngle; | |
103 spring.stiffness = stiffness; | |
104 spring.damping = damping; | |
105 spring.springTorqueFunc = cast(cpDampedRotarySpringTorqueFunc)&defaultSpringTorque; | |
106 | |
107 return spring; | |
108 } | |
109 | |
110 cpConstraint * | |
111 cpDampedRotarySpringNew(cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping) | |
112 { | |
113 return cast(cpConstraint *)cpDampedRotarySpringInit(cpDampedRotarySpringAlloc(), a, b, restAngle, stiffness, damping); | |
114 } |