/* October 2001 * Brian J.Ross * Brock University, Dept of Computer Science * COSC 3P98 Midterm solution B * * This solution resets the IdleFunc callback according to one of * 3 modes: triangle, rectangle, or freeze. */ #if !defined(Linux) #include //Not Linux must be windows #endif #include #include #include #include #define FALSE 0 #define TRIANGLE 0 #define RECTANGLE 1 #define MINDIM 0 #define MAXDIM 500 #define MYRANDOM ((float) rand()/RAND_MAX) struct glob { int mode; int freeze; }; struct glob global = {TRIANGLE, FALSE}; void clearwin(void) { glClear(GL_COLOR_BUFFER_BIT); glFlush(); } void triangle(void) { glColor3f(MYRANDOM, MYRANDOM, MYRANDOM); glBegin(GL_POLYGON); glVertex2i((int)(MYRANDOM*MAXDIM), (int)(MYRANDOM*MAXDIM)); glVertex2i((int)(MYRANDOM*MAXDIM), (int)(MYRANDOM*MAXDIM)); glVertex2i((int)(MYRANDOM*MAXDIM), (int)(MYRANDOM*MAXDIM)); glEnd(); glFlush(); } void rectangle(void) { int x1, y1, x2, y2; x1 = (int) (MYRANDOM * MAXDIM); y1 = (int) (MYRANDOM * MAXDIM); x2 = (int) (MYRANDOM * MAXDIM); y2 = (int) (MYRANDOM * MAXDIM); glBegin(GL_POLYGON); glColor3f(MYRANDOM, MYRANDOM, MYRANDOM); glVertex2i(x1, y1); glColor3f(MYRANDOM, MYRANDOM, MYRANDOM); glVertex2i(x2, y1); glColor3f(MYRANDOM, MYRANDOM, MYRANDOM); glVertex2i(x2, y2); glColor3f(MYRANDOM, MYRANDOM, MYRANDOM); glVertex2i(x1, y2); glEnd(); glFlush(); } void keybd(unsigned char key, int x, int y) { switch (key) { case 't': case 'T': global.mode = TRIANGLE; glutIdleFunc(triangle); global.freeze = FALSE; break; case 's': case 'S': global.mode = RECTANGLE; glutIdleFunc(rectangle); global.freeze = FALSE; break; case 'f': case 'F': global.freeze = !global.freeze; if (global.freeze == FALSE) { // toggle freeze effect (global.mode == TRIANGLE) ? glutIdleFunc(triangle) : glutIdleFunc(rectangle); } else { glutIdleFunc(NULL); } break; case 'r': case 'R': clearwin(); break; case 'q': case 'Q': exit(0); break; } } int main(argc, argv) int argc; char **argv; { glutInit(&argc, argv); glutInitWindowSize(MAXDIM, MAXDIM); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("window"); glutDisplayFunc(clearwin); glutIdleFunc(triangle); glutKeyboardFunc(keybd); glMatrixMode(GL_PROJECTION); gluOrtho2D(MINDIM, MAXDIM, MINDIM, MAXDIM); glClearColor (1.0, 1.0, 1.0, 1.0); glutMainLoop(); return 0; }