X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=tools%2Fropesim%2Fsrc%2Fropesim.c;h=869d4e9caed09b83df4c874233b57d34871cf9d1;hp=12c70c437931e7cb3bfcf2c8f933dad2e98d40e4;hb=2ee531a10bad1036d2279f9b626da72e345a3b37;hpb=1ae209a77434dcdf7266d2cf95d3f20c0de7a0e9 diff --git a/tools/ropesim/src/ropesim.c b/tools/ropesim/src/ropesim.c index 12c70c4..869d4e9 100644 --- a/tools/ropesim/src/ropesim.c +++ b/tools/ropesim/src/ropesim.c @@ -35,15 +35,11 @@ static void step(struct rsim_world *rsim, struct rsim_rope *rope, float dt) { int i; float len, fmag; - cgm_vec3 npos, force, dir; + cgm_vec3 npos, faccel, dir; float inv_damp = rsim->damping == 0.0f ? 1.0f : (1.0f - rsim->damping); struct rsim_mass *mass = rope->masses; struct rsim_spring *spr = rope->springs; - force.x = rsim->grav.x + rsim->extforce.x; - force.y = rsim->grav.y + rsim->extforce.y; - force.z = rsim->grav.z + rsim->extforce.z; - /* accumulate forces from springs */ for(i=0; inum_springs; i++) { dir = spr->mass[1]->p; @@ -58,9 +54,13 @@ static void step(struct rsim_world *rsim, struct rsim_rope *rope, float dt) } 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->mass[0]->f.x += dir.x * fmag / spr->mass[0]->m; + spr->mass[0]->f.y += dir.y * fmag / spr->mass[0]->m; + spr->mass[0]->f.z += dir.z * fmag / spr->mass[0]->m; + + spr->mass[1]->f.x -= dir.x * fmag / spr->mass[1]->m; + spr->mass[1]->f.y -= dir.y * fmag / spr->mass[1]->m; + spr->mass[1]->f.z -= dir.z * fmag / spr->mass[1]->m; spr++; } @@ -73,7 +73,11 @@ static void step(struct rsim_world *rsim, struct rsim_rope *rope, float dt) } /* add constant forces to accumulated mass force */ - cgm_vadd(&mass->f, &force); + cgm_vadd(&mass->f, &rsim->grav); + + faccel = rsim->extforce; + cgm_vscale(&faccel, 1.0f / mass->m); + cgm_vadd(&mass->f, &rsim->extforce); mass->v.x = (mass->v.x - mass->v.x * inv_damp * dt) + mass->f.x * dt; mass->v.y = (mass->v.y - mass->v.y * inv_damp * dt) + mass->f.y * dt;