void psNewParticle(PSparticle* p, float dt) { if (type == PS_WATERFALL) { p->velocity[0] = -2*(drand48()-0.0); p->velocity[1] = 0; p->velocity[2] = 0.5*(drand48()-0.0); p->position[0] = 0; p->position[1] = 2; p->position[2] = 0; p->previous[0] = p->position[0]; p->previous[1] = p->position[1]; p->previous[2] = p->position[2]; p->dampening = 0.45*drand48(); p->alive = 1; } else if (type == PS_FOUNTAIN) { p->velocity[0] = 2*(drand48()-0.5); p->velocity[1] = 5; p->velocity[2] = 2*(drand48()-0.5); p->position[0] = -0.1; p->position[1] = 0.9; p->position[2] = 0; p->previous[0] = p->position[0]; p->previous[1] = p->position[1]; p->previous[2] = p->position[2]; p->dampening = 0.35*drand48(); p->alive = 1; } psTimeStep(p, 2*dt*drand48()); }
void idle(void) { static int i, j; static int living = 0; /* index to end of live particles */ static float dt; static float last = 0; dt = timedelta(); frame_time += dt; #if 1 /* slow the simulation if we can't keep the frame rate up around 10 fps */ if (dt > 0.1) { slow_down = 1.0/(100*dt); } else if (dt < 0.1) { slow_down = 1; } #endif dt *= slow_down; /* resurrect a few particles */ for (i = 0; i < flow*dt; i++) { psNewParticle(&particles[living], dt); living++; if (living >= num_particles) living = 0; } for (i = 0; i < num_particles; i++) { psTimeStep(&particles[i], dt); /* collision with sphere? */ if (draw_spheres) { for (j = 0; j < draw_spheres; j++) { psCollideSphere(&particles[i], &spheres[j]); } } /* collision with ground? */ if (particles[i].position[1] <= 0) { psBounce(&particles[i], dt); } /* dead particle? */ if (particles[i].position[1] < 0.1 && fequal(particles[i].velocity[1], 0)) { particles[i].alive = 0; } } glutPostRedisplay(); }
void psNewParticle(PSparticle* p, float dt) { if (type == PS_WATERFALL) { p->velocity[0] = -2*(drand48()-0.0); p->velocity[1] = 0; p->velocity[2] = 0.5*(drand48()-0.0); //presetting the particle with certain speed in x and z coods. Y cood is handled by gravity (above func) p->position[0] = 0; //setting arbitary position p->position[1] = 2; p->position[2] = 0; p->previous[0] = p->position[0]; p->previous[1] = p->position[1]; p->previous[2] = p->position[2]; p->dampening = 0.45*drand48(); p->alive = 1; } psTimeStep(p, 2*dt*drand48()); // giving "gravity" by specifying the gravity in Y cood }