- int i;
- cgm_vec3 npos, f, force;
- float inv_damp = rsim->damping == 0.0f ? 1.0f : 1.0f / rsim->damping;
- struct rsim_mass *mass = rope->masses;
+ int i, j;
+ float len, fmag;
+ cgm_vec3 npos, faccel, dir;
+ float inv_damp = rsim->damping == 0.0f ? 1.0f : (1.0f - rsim->damping);
+ struct rsim_mass *mass;
+ struct rsim_spring *spr;
+
+ /* for each mass, add spring forces to every other mass it's connected to */
+ for(i=0; i<rope->num_masses; i++) {
+ for(j=0; j<rope->num_masses; j++) {
+ if(i == j || !(spr = getspring(rope, i, j))) {
+ continue;
+ }
+
+ dir = rope->masses[i].p;
+ cgm_vsub(&dir, &rope->masses[j].p);
+
+ len = cgm_vlength(&dir);
+ if(len > 100.0f) {
+ abort();
+ }
+ if(len != 0.0f) {
+ float s = 1.0f / len;
+ cgm_vscale(&dir, s);
+ }
+ fmag = (len - spr->rest_len) * spr->k;
+ if(i == 5) {
+ printf("%d-%d fmag: %f\n", i, j, fmag);
+ if(fmag > 20) asm volatile("int $3");
+ }