static void applyForces(struct particle_system *ps, struct particle *p) { int i = 0; vec3 force; vec3 dir; float m, d, s; vec3Copy(p->dir, p->acc); do { switch(ps->forces[i].type) { case PARTICLE_FORCE_DIRECTIONAL: vec3Copy(ps->forces[i].dir, force); break; case PARTICLE_FORCE_FLUID: s = vec3Mag(p->acc); vec3Copy(p->acc, force); vec3Normalize(force, force); vec3Mul(force, -ps->forces[i].value*s*s, force); break; case PARTICLE_FORCE_ATTRACTION: vec3Sub(ps->forces[i].loc, p->loc, dir); d = vec3Mag(dir); vec3Normalize(dir, dir); m = 0.00001*ps->forces[i].value*p->mass / (d*d); vec3Mul(dir, m, force); break; } vec3Add(p->acc, force, p->acc); } while(++i < ps->nbforces); vec3Div(p->acc, p->mass, p->acc); vec3Add(p->vel, p->acc, p->vel); vec3Add(p->loc, p->vel, p->loc); }
void spherify(Solid* s) { unsigned n = s->nVerts; Vec3 centroid = { 0,0,0 }; unsigned i; for(i=0;i<n;++i) { vec3Add(centroid,centroid,s->verts[i].loc); } vec3Mult(centroid,centroid,1.0/n); Vec3* diffs = malloc(n*sizeof(Vec3)); float* dists = malloc(n*sizeof(float)); float maxR = 0; for(i=0;i<n;++i) { vec3Sub(diffs[i],s->verts[i].loc,centroid); float r = vec3Mag(diffs[i]); dists[i] = r; if(r > maxR) { maxR = r; } } for(i=0;i<n;++i) { vec3Mult(diffs[i],diffs[i],1.0/dists[i]); vec3Copy(s->verts[i].normal,diffs[i]); vec3Mult(diffs[i],diffs[i],maxR); vec3Add(s->verts[i].loc,centroid,diffs[i]); } free(dists); free(diffs); }