/* October 2001 * Brian J.Ross * Brock University, Dept of Computer Science * COSC 3P98 Midterm solution A * * This solution uses mode flags within a single drawing/idle func callback * to either draw triangles, rectangles, or nothing (freeze mode). */ #if !defined(Linux) #include //Not Linux must be windows #endif #include #include #include #include #define FALSE 0 #define TRUE 1 #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 keybd(unsigned char key, int x, int y) { switch (key) { case 't': case 'T': global.mode = TRIANGLE; global.freeze = FALSE; break; case 's': case 'S': global.mode = RECTANGLE; global.freeze = FALSE; break; case 'f': case 'F': global.freeze = !global.freeze; break; case 'r': case 'R': glClear(GL_COLOR_BUFFER_BIT); glFlush(); break; case 'q': case 'Q': exit(0); break; } } void draw(void) { int x1, y1, x2, y2; if (global.freeze) return; switch (global.mode) { case TRIANGLE: 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(); break; case RECTANGLE: 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(); break; } } int main(argc, argv) int argc; char **argv; { glutInit(&argc, argv); glutInitWindowSize(MAXDIM, MAXDIM); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("window"); glutDisplayFunc(draw); glutIdleFunc(draw); glutKeyboardFunc(keybd); glMatrixMode(GL_PROJECTION); gluOrtho2D(MINDIM, MAXDIM, MINDIM, MAXDIM); glClearColor (1.0, 1.0, 1.0, 1.0); glutMainLoop(); return 0; }