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);
}
Exemple #2
0
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);
}