/* Author: Adam Hewgill (November 2002) COSC 3P98 example: pointbounce.c: Three polygons bounce on the screen. Alpha causes their colours to interact when they are on top of each other. */ #if !defined(Linux) #include //Not Linux must be windows #endif #include #include #include #define X 0 #define Y 1 #define XMAX 500 #define YMAX 500 struct global { int r, vel; int p1[2], p2[2], p3[2]; int m1[2], m2[2], m3[2]; float c1[4], c2[4], c3[4]; }g = {100, 3, {0, 0}, {XMAX, YMAX}, {123, 452}, {1, 1}, {-1, -1}, {1, 2}, {1, 1, 0, 0.5}, {0, 1, 1, 0.5}, {0, 0, 1, 0.5}}; void draw(void) { // Draw the particles glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor4fv(g.c1); glVertex2i(g.p1[X]-g.r, g.p1[Y]-g.r); glVertex2i(g.p1[X]+g.r, g.p1[Y]-g.r); glVertex2i(g.p1[X]+g.r, g.p1[Y]+g.r); glVertex2i(g.p1[X]-g.r, g.p1[Y]+g.r); glColor4fv(g.c2); glVertex2i(g.p2[X]-g.r, g.p2[Y]-g.r); glVertex2i(g.p2[X]+g.r, g.p2[Y]-g.r); glVertex2i(g.p2[X]+g.r, g.p2[Y]+g.r); glVertex2i(g.p2[X]-g.r, g.p2[Y]+g.r); glColor4fv(g.c3); glVertex2i(g.p3[X]-g.r, g.p3[Y]-g.r); glVertex2i(g.p3[X]+g.r, g.p3[Y]-g.r); glVertex2i(g.p3[X]+g.r, g.p3[Y]+g.r); glVertex2i(g.p3[X]-g.r, g.p3[Y]+g.r); glEnd(); glutSwapBuffers(); glFlush(); // Move the particles g.p1[X] += g.m1[X] * g.vel; g.p1[Y] += g.m1[Y] * g.vel; g.p2[X] += g.m2[X] * g.vel; g.p2[Y] += g.m2[Y] * g.vel; g.p3[X] += g.m3[X] * g.vel; g.p3[Y] += g.m3[Y] * g.vel; // Bounce point 1 if (g.p1[X] > XMAX || g.p1[X] < 0) g.m1[X] *= -1; if (g.p1[Y] > YMAX || g.p1[Y] < 0) g.m1[Y] *= -1; // Bounce point 2 if (g.p2[X] > XMAX || g.p2[X] < 0) g.m2[X] *= -1; if (g.p2[Y] > YMAX || g.p2[Y] < 0) g.m2[Y] *= -1; // Bounce point 3 if (g.p3[X] > XMAX || g.p3[X] < 0) g.m3[X] *= -1; if (g.p3[Y] > YMAX || g.p3[Y] < 0) g.m3[Y] *= -1; } void keyboard(unsigned char key, int x, int y) { switch (key){ case 0x1B: case 'q': case 'Q': return; break; } } main(int argc, char **argv) { // Initialize OpenGL glutInit(&argc, argv); glutInitWindowSize(XMAX, YMAX); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow("Particle Bounce"); // Register Callbacks glutKeyboardFunc(keyboard); glutDisplayFunc(draw); glutIdleFunc(draw); // Setup view glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, XMAX, 0, YMAX, 0, 1); glClearColor(0.0, 0.0, 0.0, 1.0); //Enable alpha blending glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Start OpenGL glutMainLoop(); }