+int rsim_set_rope_spring(struct rsim_rope *rope, int ma, int mb, float k, float rlen)
+{
+ cgm_vec3 dir;
+ struct rsim_spring *spr;
+
+ if(ma == mb || ma < 0 || ma >= rope->num_masses || mb < 0 || mb >= rope->num_masses) {
+ return -1;
+ }
+
+ if(rlen == RSIM_RLEN_DEFAULT) {
+ dir = rope->masses[ma].p;
+ cgm_vsub(&dir, &rope->masses[mb].p);
+ rlen = cgm_vlength(&dir);
+ }
+
+ spr = rope->springs + ma * rope->num_masses + mb;
+ spr->k = fabs(k);
+ spr->rest_len = rlen;
+ return 0;
+}
+
+int rsim_have_spring(struct rsim_rope *rope, int ma, int mb)
+{
+ return getspring(rope, ma, mb) ? 1 : 0;
+}
+