1 // #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
2
3 #include "GL\glut.h"
4 #include <iostream>
5
6 static GLfloat fSpin = 0.0;
7 static GLfloat fClearBlue = 0.2;
8 static bool bRotating = false;
9
10 void display(void)
11 {
12 // clear
13 glClear(GL_COLOR_BUFFER_BIT);
14
15 glPushMatrix();
16 glRotatef(-fSpin, 0.0, 0.0, 1.0);
17 glColor3f(1.0, 1.0, 1.0);
18 glRectf(-25.0, -25.0, 25.0, 25.0);
19
20 glColor3f(1.0, 0.0, 0.0);
21
22 glBegin(GL_POLYGON);
23 glVertex3i(-16, 18, 0);
24 glVertex3i(16, 18, 0);
25 glVertex3i(16, 10, 0);
26 glVertex3i(-16, 10, 0);
27 glEnd();
28
29 glBegin(GL_POLYGON);
30 glVertex3i(-4, 10, 0);
31 glVertex3i(4, 10, 0);
32 glVertex3i(4, 5, 0);
33 glVertex3i(-4, 5, 0);
34 glEnd();
35
36 glBegin(GL_POLYGON);
37 glVertex3i(-20, 5, 0);
38 glVertex3i(20, 5, 0);
39 glVertex3i(20, -3, 0);
40 glVertex3i(-20, -3, 0);
41 glEnd();
42
43 glBegin(GL_POLYGON);
44 glVertex3i(0, 2, 0);
45 glVertex3i(18, -16,0);
46 glVertex3i(13, -21,0);
47 glVertex3i(0, -8,0);
48 glEnd();
49
50 glBegin(GL_POLYGON);
51 glVertex3i(0, 2, 0);
52 glVertex3i(-18, -16,0);
53 glVertex3i(-13, -21,0);
54 glVertex3i(0, -8,0);
55 glEnd();
56
57 glPopMatrix();
58
59 glutSwapBuffers();
60 }
61
62 void spinDisplay(void)
63 {
64 // change the params for displaying the squre
65 fSpin += 0.05;
66 if (fSpin > 360.0) {
67 fSpin -= 360.0;
68 }
69 glutPostRedisplay();
70 }
71
72 void reshape(int w, int h)
73 {
74 glViewport(0, 0, (GLsizei) w, (GLsizei) h);
75 glMatrixMode(GL_PROJECTION);
76 glLoadIdentity();
77 glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
78 glMatrixMode(GL_MODELVIEW);
79 glLoadIdentity();
80 }
81
82 void mouse(int button, int state, int x, int y)
83 {
84 switch(button) {
85 case GLUT_LEFT_BUTTON:
86 // start or stop the rotating square
87 if (state == GLUT_DOWN && !bRotating) {
88 bRotating = true;
89 glutIdleFunc(&spinDisplay);
90 }
91 else if (state == GLUT_DOWN && bRotating) {
92 bRotating = false;
93 glutIdleFunc(NULL);
94 if ((GLint)(fSpin+0.5)%90 == 0) {
95 fClearBlue = 1.0 - fClearBlue;
96 glClearColor(0.0, 0.0, fClearBlue, 0.0);
97 }
98 }
99 break;
100 case GLUT_RIGHT_BUTTON:
101 break;
102 default:
103 break;
104 }
105 }
106
107 void init(void)
108 {
109 // select the clearing color
110 glClearColor(0.0, 0.0, fClearBlue, 0.0);
111
112 glShadeModel(GL_FLAT);
113 }
114
115 void idle(void)
116 {
117 if (glutGetWindow() == 0) {
118 exit(0);
119 }
120 }
121
122 /*
123 * Declare display mode, window size, position,
124 * open a window titled,
125 * call init routines,
126 * register display, reshape, mouse callback function
127 * enter main loop
128 */
129 int main( int argc, char * argv[] )
130 {
131 glutInit(&argc, argv);
132
133 // GLUT_DOUBLE - double buffer
134 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
135 glutInitWindowPosition(100, 100);
136 glutInitWindowSize(400, 400);
137 glutCreateWindow("DoNeY's first OpenGL app");
138
139 init();
140
141 glutDisplayFunc(&display);
142 glutReshapeFunc(&reshape);
143 glutMouseFunc(&mouse);
144 glutIdleFunc(&idle);
145
146 glutMainLoop();
147 return 0;
148 }
149