+ /* accumulate forces from springs */
+ for(i=0; i<rope->num_springs; i++) {
+ dir = spr->mass[1]->p;
+ cgm_vsub(&dir, &spr->mass[0]->p);
+
+ len = cgm_vlength(&dir);
+ if(len != 0.0f) {
+ float s = 1.0f / len;
+ dir.x *= s;
+ dir.y *= s;
+ dir.z *= s;
+ }
+ fmag = (len - spr->rest_len) * spr->k;
+
+ cgm_vscale(&dir, fmag);
+ cgm_vadd(&spr->mass[0]->f, &dir);
+ cgm_vsub(&spr->mass[1]->f, &dir);
+
+ spr++;
+ }
+
+ /* update masses */