#include #include #include #include #include typedef struct Vec3f { float x, y, z; }; Vec3f * particle_pos; Vec3f * particle_color; Vec3f * particle_dir; int num_particles; void renderProcDraw (); void appProcCompute (); void main (int argc, char ** argv) { num_particles = 100; CAVEConfigure (&argc, argv, NULL); if (argc == 2) { num_particles = atof(argv[1]); } fprintf(stdout, "simulating firework with %d particles\n", num_particles); // Allocate and initialize shared memory variables. particle_pos = (Vec3f *) CAVEMalloc (num_particles * sizeof (Vec3f)); particle_color = (Vec3f *) CAVEMalloc (num_particles * sizeof (Vec3f)); for (int i = 0; i < num_particles; i++) { particle_pos[i].x = 0; particle_pos[i].y = 4; particle_pos[i].z = -3; particle_color[i].x = drand48(); particle_color[i].y = drand48(); particle_color[i].z = drand48(); } CAVEInit (); // fork! CAVEDisplay (renderProcDraw, 0); // initialize particle directions - only needed by particle_dir = (Vec3f *) malloc(num_particles * sizeof (Vec3f)); for (i = 0; i < num_particles; i++) { ///// pick direction at random //particle_dir[i].x = 2 * drand48() - 1; //particle_dir[i].y = 2 * drand48() - 1; //particle_dir[i].z = 2 * drand48() - 1; //// or based on color of particle; particle_dir[i].x = 2 * particle_color[i].x - 1; particle_dir[i].y = 2 * particle_color[i].y - 1; particle_dir[i].z = 2 * particle_color[i].z - 1; } while (!CAVEgetbutton (CAVE_ESCKEY)) { //block until all drawing processes have completed current frame //CAVEDisplaySync(); appProcCompute (); sginap (10); } // clean up (explicitly) CAVEFree(particle_pos); CAVEFree(particle_color); free(particle_dir); CAVEExit (); } #define SPEED 0.2; void appProcCompute () { static int nCalls = 0; static float prev_t = 0; float t, dt; t = CAVEGetTime (); dt = t - prev_t; prev_t = t; fprintf(stdout, "(%d) COMPUTE: %d", getpid(), nCalls++); fflush(stdout); for (int i = 0; i < num_particles; i++) { particle_pos[i].x += particle_dir[i].x * dt * SPEED; particle_pos[i].y += particle_dir[i].y * dt * SPEED; particle_pos[i].z += particle_dir[i].z * dt * SPEED; } fprintf(stdout, "...COMPUTE DONE\n"); } void renderProcDraw () { static int nCalls = 0; glClearColor (0.2, 0.2, 0.8, 1.0); glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); fprintf (stdout, "(%d) render: %d", getpid(), nCalls++); fflush(stdout); glBegin(GL_POINTS); for (int i = 0; i < num_particles; i++) { glColor3f (particle_color[i].x, particle_color[i].y, particle_color[i].z); glVertex3f(particle_pos[i].x, particle_pos[i].y, particle_pos[i].z); } glEnd(); fprintf(stdout, "...render done\n"); }