5 static void step(struct rsim_world *rsim, struct rsim_rope *rope, float dt);
7 int rsim_init(struct rsim_world *rsim)
10 cgm_vcons(&rsim->grav, 0, -9.807, 0);
11 rsim->damping = 0.995;
15 void rsim_destroy(struct rsim_world *rsim)
18 struct rsim_rope *rope = rsim->ropes;
19 rsim->ropes = rsim->ropes->next;
24 int rsim_add_rope(struct rsim_world *rsim, struct rsim_rope *rope)
26 rope->next = rsim->ropes;
31 /* actual step function, called by rsim_step in a loop to microstep or once if
32 * microstepping is disabled
34 static void step(struct rsim_world *rsim, struct rsim_rope *rope, float dt)
37 cgm_vec3 npos, f, force;
38 float inv_damp = rsim->damping == 0.0f ? 1.0f : 1.0f / rsim->damping;
39 struct rsim_mass *mass = rope->masses;
41 force.x = rsim->grav.x + rsim->extforce.x;
42 force.y = rsim->grav.y + rsim->extforce.y;
43 force.z = rsim->grav.z + rsim->extforce.z;
45 for(i=0; i<rope->num_masses; i++) {
53 npos.x = mass->p.x + mass->v.x * dt;
54 npos.y = mass->p.y + mass->v.y * dt;
55 npos.z = mass->p.z + mass->v.z * dt;
57 f.x = force.x;/* + spring forces */
61 mass->v.x = ((mass->v.x - mass->v.x * inv_damp) + f.x) * dt;
62 mass->v.y = ((mass->v.y - mass->v.y * inv_damp) + f.y) * dt;
63 mass->v.z = ((mass->v.z - mass->v.z * inv_damp) + f.z) * dt;
72 void rsim_step(struct rsim_world *rsim, float dt)
74 struct rsim_rope *rope = rsim->ropes;
76 if(rsim->udt > 0.0f) {
78 float dt_acc = rsim->udelta_acc;
82 step(rsim, rope, rsim->udt);
87 rsim->udelta_acc = dt_acc - dt;
96 struct rsim_rope *rsim_alloc_rope(int nmasses, int nsprings)
98 struct rsim_rope *rope;
100 if(!(rope = malloc(sizeof *rope))) {
103 if(rsim_init_rope(rope, nmasses, nsprings) == -1) {
110 void rsim_free_rope(struct rsim_rope *rope)
112 rsim_destroy_rope(rope);
116 int rsim_init_rope(struct rsim_rope *rope, int nmasses, int nsprings)
118 memset(rope, 0, sizeof *rope);
120 if(!(rope->masses = calloc(nmasses, sizeof *rope->masses))) {
123 if(!(rope->springs = calloc(nsprings, sizeof *rope->springs))) {
127 rope->num_masses = nmasses;
128 rope->num_springs = nsprings;
132 void rsim_destroy_rope(struct rsim_rope *rope)
138 int rsim_freeze_rope_mass(struct rsim_rope *rope, struct rsim_mass *m)
140 if(m->fixed) return -1;
143 m->next = rope->fixedlist;
148 int rsim_unfreeze_rope_mass(struct rsim_rope *rope, struct rsim_mass *m)
150 struct rsim_mass *it, dummy;
152 if(!m->fixed) return -1;
154 dummy.next = rope->fixedlist;
165 rope->fixedlist = dummy.next;
167 return m->fixed ? -1 : 0;