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);
}
Beispiel #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);
}
Beispiel #3
0
void shadeVertex(const Uniforms* uniforms,
                 Vertex* vertex,
                 Varyings* varyings) {
    mat44MultVec3(varyings->loc,uniforms->modelViewProjection,
                                *vertex->loc);
    vec3Copy(varyings->color,*vertex->color);
}
Beispiel #4
0
void copyVaryings(Varyings* out,const Varyings* src) {
    vec4Copy(out->loc,src->loc);
    vec3Copy(out->color,src->color);
    unsigned i;
    for(i=0;i<out->numAttributes;++i) {
        unsigned n = out->attributes[i].numValues;
        vecNCopy(n,out->attributePtrs[i],src->attributePtrs[i]);
    }
}
Beispiel #5
0
void makeGrid(CustomVert** vertsOut,unsigned** indicesOut,unsigned* numEdgesOut,
              float x0,float z0,float x1,float z1,
              unsigned gridWidth, unsigned gridHeight) {
    float xStep = (x1-x0)/gridWidth,
          zStep = (z1-z0)/gridHeight;

    gridWidth  += 1;
    gridHeight += 1;

    unsigned vertexCount = 2*gridWidth+2*gridHeight;
    CustomVert* verts = malloc(sizeof(CustomVert)*vertexCount);

    Color3 white = { 1,1,1 };
    unsigned vertIndex = 0;
    float xLoc = x0,
          zLoc = z0;
    for(vertIndex=0;vertIndex<vertexCount;++vertIndex) {
        CustomVert* vert = verts+vertIndex;
        vert->loc[0] = xLoc;
        vert->loc[1] = 0;
        vert->loc[2] = zLoc;
        vec3Copy(vert->color,white);
        if(vertIndex < gridWidth) {
            xLoc += xStep;
        } else if(vertIndex >= gridWidth && 
                  vertIndex < gridWidth+gridHeight) {
            zLoc += zStep;
        } else if(vertIndex >= gridWidth+gridHeight &&
                  vertIndex <  gridWidth*2+gridHeight) {
            xLoc -= xStep;
        } else {
            zLoc -= zStep;
        }
    }

    unsigned  x,z;
    unsigned  numEdges = (gridWidth+1)+(gridHeight+1);
    unsigned* indices = malloc(sizeof(unsigned)*numEdges*2);
    unsigned  index = 0;
    for(x=0;x<=gridWidth;++x) {
        indices[index++] = x;
        indices[index++] = gridWidth*2+gridHeight-x;
    }
    for(z=0;z<=gridHeight;++z) {
        indices[index++] = gridWidth+z;
        if(z == 0) {
            indices[index++] = 0;
        } else {
            indices[index++] = gridWidth*2+gridHeight*2-z;
        }
    }

    *vertsOut    = verts;
    *indicesOut  = indices;
    *numEdgesOut = numEdges;
}
static void add(struct particle_emitter *emit, struct pool *pool)
{
	struct particle p;

	vec3Copy(emit->loc, p.loc);
	vec3Copy(emit->dir, p.dir);
	p.tex[0] = 0.0;
	p.tex[1] = 0.0;
	vec4Copy(emit->clr, p.clr);
// vec4Set(p.clr, 1.0, 2.0, 3.0, 4.0);
	vec3Set(p.acc, 0.0, 0.0, 0.0);
	vec3Set(p.vel, 0.0, 0.0, 0.0);
	p.life = emit->life;
	p.mass = emit->mass;

	poolAdd(pool, &p);
/*
fprintf(stderr, "EMIT %d\n", pool->id);
particlesDump(pool); */
}