rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <assert.h>
|
nuclear@0
|
4 #include <vector>
|
nuclear@0
|
5 #include "opengl.h"
|
nuclear@0
|
6 #include "camera.h"
|
nuclear@0
|
7
|
nuclear@0
|
8 static bool init();
|
nuclear@0
|
9 static void cleanup();
|
nuclear@0
|
10 static void handle_input(float dt);
|
nuclear@0
|
11 static void disp();
|
nuclear@0
|
12 static void idle();
|
nuclear@0
|
13 static void reshape(int x, int y);
|
nuclear@0
|
14 static void keypress(unsigned char key, int x, int y);
|
nuclear@0
|
15 static void keyrelease(unsigned char key, int x, int y);
|
nuclear@0
|
16 static void mouse(int bn, int st, int x, int y);
|
nuclear@0
|
17 static void motion(int x, int y);
|
nuclear@0
|
18
|
nuclear@0
|
19 static goatgfx::VRFpsCamera cam;
|
nuclear@0
|
20 static std::vector<bool> keystate(256);
|
nuclear@0
|
21
|
nuclear@0
|
22 int main(int argc, char **argv)
|
nuclear@0
|
23 {
|
nuclear@0
|
24 glutInitWindowSize(800, 600);
|
nuclear@0
|
25 glutInit(&argc, argv);
|
nuclear@0
|
26 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
nuclear@0
|
27 glutCreateWindow("symmetry");
|
nuclear@0
|
28
|
nuclear@0
|
29 glutDisplayFunc(disp);
|
nuclear@0
|
30 glutIdleFunc(idle);
|
nuclear@0
|
31 glutReshapeFunc(reshape);
|
nuclear@0
|
32 glutKeyboardFunc(keypress);
|
nuclear@0
|
33 glutKeyboardUpFunc(keyrelease);
|
nuclear@0
|
34 glutMouseFunc(mouse);
|
nuclear@0
|
35 glutMotionFunc(motion);
|
nuclear@0
|
36
|
nuclear@0
|
37 if(!init()) {
|
nuclear@0
|
38 return 1;
|
nuclear@0
|
39 }
|
nuclear@0
|
40 atexit(cleanup);
|
nuclear@0
|
41
|
nuclear@0
|
42 glutMainLoop();
|
nuclear@0
|
43 return 0;
|
nuclear@0
|
44 }
|
nuclear@0
|
45
|
nuclear@0
|
46
|
nuclear@0
|
47 static bool init()
|
nuclear@0
|
48 {
|
nuclear@0
|
49 glewInit();
|
nuclear@0
|
50
|
nuclear@0
|
51 glEnable(GL_DEPTH_TEST);
|
nuclear@0
|
52 glEnable(GL_CULL_FACE);
|
nuclear@0
|
53
|
nuclear@0
|
54 glEnable(GL_LIGHTING);
|
nuclear@0
|
55 glEnable(GL_LIGHT0);
|
nuclear@0
|
56
|
nuclear@0
|
57 cam.input_move(0, 1.65, 0);
|
nuclear@0
|
58
|
nuclear@0
|
59 return true;
|
nuclear@0
|
60 }
|
nuclear@0
|
61
|
nuclear@0
|
62 static void cleanup()
|
nuclear@0
|
63 {
|
nuclear@0
|
64 }
|
nuclear@0
|
65
|
nuclear@0
|
66 static void disp()
|
nuclear@0
|
67 {
|
nuclear@0
|
68 unsigned int msec = glutGet(GLUT_ELAPSED_TIME);
|
nuclear@0
|
69 static unsigned int prev_msec;
|
nuclear@0
|
70 float dt = (float)(msec - prev_msec) / 1000.0f;
|
nuclear@0
|
71
|
nuclear@0
|
72 handle_input(dt);
|
nuclear@0
|
73
|
nuclear@0
|
74 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
75
|
nuclear@0
|
76 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
77 glLoadIdentity();
|
nuclear@0
|
78 cam.use_inverse();
|
nuclear@0
|
79
|
nuclear@0
|
80 glBegin(GL_QUADS);
|
nuclear@0
|
81 glNormal3f(0, 1, 0);
|
nuclear@0
|
82 glVertex3f(-5, 0, 5);
|
nuclear@0
|
83 glVertex3f(5, 0, 5);
|
nuclear@0
|
84 glVertex3f(5, 0, -5);
|
nuclear@0
|
85 glVertex3f(-5, 0, -5);
|
nuclear@0
|
86 glEnd();
|
nuclear@0
|
87
|
nuclear@0
|
88 glFrontFace(GL_CW);
|
nuclear@0
|
89 glutSolidTeapot(1.0);
|
nuclear@0
|
90 glFrontFace(GL_CCW);
|
nuclear@0
|
91
|
nuclear@0
|
92 glutSwapBuffers();
|
nuclear@0
|
93 assert(glGetError() == GL_NO_ERROR);
|
nuclear@0
|
94 }
|
nuclear@0
|
95
|
nuclear@0
|
96
|
nuclear@0
|
97 static void handle_input(float dt)
|
nuclear@0
|
98 {
|
nuclear@0
|
99 Vector3 inpv;
|
nuclear@0
|
100 float offs = dt * 2.0;
|
nuclear@0
|
101
|
nuclear@0
|
102 if(keystate['w'] || keystate['W']) {
|
nuclear@0
|
103 inpv.z -= offs;
|
nuclear@0
|
104 }
|
nuclear@0
|
105 if(keystate['s'] || keystate['S']) {
|
nuclear@0
|
106 inpv.z += offs;
|
nuclear@0
|
107 }
|
nuclear@0
|
108 if(keystate['d'] || keystate['D']) {
|
nuclear@0
|
109 inpv.x += offs;
|
nuclear@0
|
110 }
|
nuclear@0
|
111 if(keystate['a'] || keystate['A']) {
|
nuclear@0
|
112 inpv.x -= offs;
|
nuclear@0
|
113 }
|
nuclear@0
|
114
|
nuclear@0
|
115 cam.input_move(inpv.x, inpv.y, inpv.z);
|
nuclear@0
|
116 }
|
nuclear@0
|
117
|
nuclear@0
|
118 static void idle()
|
nuclear@0
|
119 {
|
nuclear@0
|
120 glutPostRedisplay();
|
nuclear@0
|
121 }
|
nuclear@0
|
122
|
nuclear@0
|
123 static void reshape(int x, int y)
|
nuclear@0
|
124 {
|
nuclear@0
|
125 glViewport(0, 0, x, y);
|
nuclear@0
|
126
|
nuclear@0
|
127 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
128 glLoadIdentity();
|
nuclear@0
|
129 gluPerspective(45.0, (float)x / (float)y, 0.5, 500.0);
|
nuclear@0
|
130 }
|
nuclear@0
|
131
|
nuclear@0
|
132 static void keypress(unsigned char key, int x, int y)
|
nuclear@0
|
133 {
|
nuclear@0
|
134 keystate[key] = true;
|
nuclear@0
|
135
|
nuclear@0
|
136 switch(key) {
|
nuclear@0
|
137 case 27:
|
nuclear@0
|
138 exit(0);
|
nuclear@0
|
139 }
|
nuclear@0
|
140 }
|
nuclear@0
|
141
|
nuclear@0
|
142 static void keyrelease(unsigned char key, int x, int y)
|
nuclear@0
|
143 {
|
nuclear@0
|
144 keystate[key] = false;
|
nuclear@0
|
145 }
|
nuclear@0
|
146
|
nuclear@0
|
147 static int prev_x, prev_y;
|
nuclear@0
|
148 static bool bnstate[32];
|
nuclear@0
|
149
|
nuclear@0
|
150 static void mouse(int bn, int st, int x, int y)
|
nuclear@0
|
151 {
|
nuclear@0
|
152 prev_x = x;
|
nuclear@0
|
153 prev_y = y;
|
nuclear@0
|
154 bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN;
|
nuclear@0
|
155 }
|
nuclear@0
|
156
|
nuclear@0
|
157 static void motion(int x, int y)
|
nuclear@0
|
158 {
|
nuclear@0
|
159 int dx = x - prev_x;
|
nuclear@0
|
160 int dy = y - prev_y;
|
nuclear@0
|
161 prev_x = x;
|
nuclear@0
|
162 prev_y = y;
|
nuclear@0
|
163
|
nuclear@0
|
164 if(!dx && !dy) {
|
nuclear@0
|
165 return;
|
nuclear@0
|
166 }
|
nuclear@0
|
167
|
nuclear@0
|
168 if(bnstate[0]) {
|
nuclear@0
|
169 float dtheta_deg = dy * 0.5;
|
nuclear@0
|
170 float dphi_deg = dx * 0.5;
|
nuclear@0
|
171
|
nuclear@0
|
172 cam.input_rotate(DEG_TO_RAD(dtheta_deg), DEG_TO_RAD(dphi_deg), 0);
|
nuclear@0
|
173 }
|
nuclear@0
|
174 }
|