rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@1
|
3 #include <string.h>
|
nuclear@0
|
4 #include <assert.h>
|
nuclear@8
|
5 #include "opengl.h"
|
nuclear@1
|
6 #include "vr.h"
|
nuclear@0
|
7 #include "camera.h"
|
nuclear@0
|
8
|
nuclear@0
|
9 static bool init();
|
nuclear@0
|
10 static void cleanup();
|
nuclear@0
|
11 static void disp();
|
nuclear@9
|
12 static void draw_scene();
|
nuclear@12
|
13 static void draw_teapot();
|
nuclear@13
|
14 static void draw_squares();
|
nuclear@12
|
15 static void draw_grid(float size, float spacing);
|
nuclear@0
|
16 static void idle();
|
nuclear@0
|
17 static void reshape(int x, int y);
|
nuclear@0
|
18 static void keyb(unsigned char key, int x, int y);
|
nuclear@8
|
19 static void keyup(unsigned char key, int x, int y);
|
nuclear@8
|
20 static void mouse(int bn, int st, int x, int y);
|
nuclear@8
|
21 static void motion(int x, int y);
|
nuclear@8
|
22 static void passive(int x, int y);
|
nuclear@0
|
23 static void sball_rotate(int rx, int ry, int rz);
|
nuclear@1
|
24 static bool parse_args(int argc, char **argv);
|
nuclear@0
|
25
|
nuclear@10
|
26 static VRFpsCamera cam;
|
nuclear@0
|
27 static int width, height;
|
nuclear@1
|
28 static bool use_vr = false;
|
nuclear@8
|
29 static bool mouselook = false;
|
nuclear@8
|
30
|
nuclear@8
|
31 static bool keystate[256];
|
nuclear@8
|
32
|
nuclear@12
|
33 static int rtarg_width, rtarg_height;
|
nuclear@12
|
34 static unsigned int fbo, tex[2], zbuf;
|
nuclear@12
|
35
|
nuclear@0
|
36 int main(int argc, char **argv)
|
nuclear@0
|
37 {
|
nuclear@3
|
38 glutInitWindowSize(1280, 800);
|
nuclear@0
|
39 glutInit(&argc, argv);
|
nuclear@1
|
40
|
nuclear@1
|
41 if(!parse_args(argc, argv)) {
|
nuclear@1
|
42 return 1;
|
nuclear@1
|
43 }
|
nuclear@1
|
44
|
nuclear@12
|
45 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
nuclear@12
|
46 glutCreateWindow("oculus vr test 01");
|
nuclear@12
|
47
|
nuclear@12
|
48 width = glutGet(GLUT_WINDOW_WIDTH);
|
nuclear@12
|
49 height = glutGet(GLUT_WINDOW_HEIGHT);
|
nuclear@0
|
50
|
nuclear@0
|
51 glutDisplayFunc(disp);
|
nuclear@0
|
52 glutIdleFunc(idle);
|
nuclear@0
|
53 glutReshapeFunc(reshape);
|
nuclear@0
|
54 glutKeyboardFunc(keyb);
|
nuclear@8
|
55 glutKeyboardUpFunc(keyup);
|
nuclear@8
|
56 glutMouseFunc(mouse);
|
nuclear@8
|
57 glutMotionFunc(motion);
|
nuclear@0
|
58 glutSpaceballRotateFunc(sball_rotate);
|
nuclear@0
|
59
|
nuclear@0
|
60 if(!init()) {
|
nuclear@0
|
61 return 1;
|
nuclear@0
|
62 }
|
nuclear@0
|
63 atexit(cleanup);
|
nuclear@0
|
64
|
nuclear@0
|
65 glutMainLoop();
|
nuclear@0
|
66 return 0;
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 static bool init()
|
nuclear@0
|
70 {
|
nuclear@9
|
71 glewInit(); // this must be first
|
nuclear@9
|
72
|
nuclear@0
|
73 glEnable(GL_DEPTH_TEST);
|
nuclear@0
|
74 glEnable(GL_LIGHTING);
|
nuclear@0
|
75 glEnable(GL_CULL_FACE);
|
nuclear@0
|
76
|
nuclear@0
|
77 glEnable(GL_LIGHT0);
|
nuclear@0
|
78 glEnable(GL_LIGHTING);
|
nuclear@0
|
79
|
nuclear@11
|
80 // y = height of neck
|
nuclear@11
|
81 cam.input_move(0, 1.65, 0);
|
nuclear@9
|
82
|
nuclear@12
|
83 if(use_vr) {
|
nuclear@12
|
84 if(vr_init(VR_INIT_OCULUS) == -1) {
|
nuclear@12
|
85 return false;
|
nuclear@12
|
86 }
|
nuclear@12
|
87
|
nuclear@12
|
88 // reshape to the size of the VR display
|
nuclear@12
|
89 int xsz = vr_get_width();
|
nuclear@12
|
90 int ysz = vr_get_height();
|
nuclear@12
|
91
|
nuclear@12
|
92 glutReshapeWindow(xsz, ysz);
|
nuclear@12
|
93
|
nuclear@12
|
94 rtarg_width = (xsz + xsz / 2) / 2;
|
nuclear@12
|
95 rtarg_height = ysz + ysz / 2;
|
nuclear@12
|
96 } else {
|
nuclear@12
|
97 rtarg_width = width;
|
nuclear@12
|
98 rtarg_height = height;
|
nuclear@0
|
99 }
|
nuclear@12
|
100
|
nuclear@13
|
101 printf("render target: %dx%d\n", rtarg_width, rtarg_height);
|
nuclear@13
|
102
|
nuclear@12
|
103 // create render targets for each eye
|
nuclear@12
|
104 GLenum wrap_mode = GL_CLAMP_TO_EDGE;
|
nuclear@12
|
105 if(!GLEW_SGIS_texture_edge_clamp) {
|
nuclear@12
|
106 wrap_mode = GL_CLAMP;
|
nuclear@12
|
107 }
|
nuclear@12
|
108
|
nuclear@12
|
109 glGenTextures(2, tex);
|
nuclear@12
|
110 for(int i=0; i<2; i++) {
|
nuclear@12
|
111 glBindTexture(GL_TEXTURE_2D, tex[i]);
|
nuclear@12
|
112 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
nuclear@12
|
113 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
nuclear@12
|
114 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_mode);
|
nuclear@12
|
115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode);
|
nuclear@12
|
116 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, rtarg_width, rtarg_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
|
nuclear@12
|
117 }
|
nuclear@12
|
118
|
nuclear@12
|
119 // create the depth render buffer
|
nuclear@12
|
120 glGenRenderbuffers(1, &zbuf);
|
nuclear@12
|
121 glBindRenderbuffer(GL_RENDERBUFFER, zbuf);
|
nuclear@12
|
122 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, rtarg_width, rtarg_height);
|
nuclear@12
|
123
|
nuclear@12
|
124 // create the FBO
|
nuclear@12
|
125 glGenFramebuffers(1, &fbo);
|
nuclear@12
|
126 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
nuclear@12
|
127 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
|
nuclear@12
|
128 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, zbuf);
|
nuclear@12
|
129
|
nuclear@0
|
130 return true;
|
nuclear@0
|
131 }
|
nuclear@0
|
132
|
nuclear@0
|
133 static void cleanup()
|
nuclear@0
|
134 {
|
nuclear@12
|
135 glDeleteTextures(2, tex);
|
nuclear@12
|
136 glDeleteRenderbuffers(1, &zbuf);
|
nuclear@12
|
137 glDeleteFramebuffers(1, &fbo);
|
nuclear@1
|
138 vr_shutdown();
|
nuclear@0
|
139 }
|
nuclear@0
|
140
|
nuclear@0
|
141 static void disp()
|
nuclear@0
|
142 {
|
nuclear@4
|
143 unsigned int msec = glutGet(GLUT_ELAPSED_TIME);
|
nuclear@4
|
144
|
nuclear@12
|
145 cam.track_vr();
|
nuclear@0
|
146
|
nuclear@13
|
147 /*glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
148 glLoadIdentity();
|
nuclear@13
|
149 float fov = RAD_TO_DEG(vr_get_fov());
|
nuclear@13
|
150 gluPerspective(fov, (float)rtarg_width / (float)rtarg_height, 0.25, 500.0);*/
|
nuclear@13
|
151 float proj_matrix[16];
|
nuclear@13
|
152
|
nuclear@13
|
153 float eye_dist = vr_get_eyedist();
|
nuclear@12
|
154
|
nuclear@12
|
155 glViewport(0, 0, rtarg_width, rtarg_height);
|
nuclear@12
|
156
|
nuclear@12
|
157 glClearColor(0.1, 0.1, 0.1, 1.0);
|
nuclear@12
|
158
|
nuclear@12
|
159 // draw left view
|
nuclear@12
|
160 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
nuclear@12
|
161 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
|
nuclear@12
|
162
|
nuclear@12
|
163 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
164
|
nuclear@13
|
165 glMatrixMode(GL_PROJECTION);
|
nuclear@13
|
166 vr_get_proj_matrix(proj_matrix, VR_EYE_LEFT);
|
nuclear@13
|
167 glLoadTransposeMatrixf(proj_matrix);
|
nuclear@13
|
168
|
nuclear@0
|
169 glMatrixMode(GL_MODELVIEW);
|
nuclear@9
|
170 glLoadIdentity();
|
nuclear@13
|
171 glTranslatef(eye_dist / 2.0, 0, 0);
|
nuclear@12
|
172 cam.use_inverse();
|
nuclear@12
|
173 draw_scene();
|
nuclear@0
|
174
|
nuclear@12
|
175
|
nuclear@12
|
176 // draw right view
|
nuclear@12
|
177 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
nuclear@12
|
178 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[1], 0);
|
nuclear@12
|
179
|
nuclear@12
|
180 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@12
|
181
|
nuclear@13
|
182 glMatrixMode(GL_PROJECTION);
|
nuclear@13
|
183 vr_get_proj_matrix(proj_matrix, VR_EYE_RIGHT);
|
nuclear@13
|
184 glLoadTransposeMatrixf(proj_matrix);
|
nuclear@13
|
185
|
nuclear@12
|
186 glMatrixMode(GL_MODELVIEW);
|
nuclear@12
|
187 glLoadIdentity();
|
nuclear@13
|
188 glTranslatef(-eye_dist / 2.0, 0, 0);
|
nuclear@9
|
189 cam.use_inverse();
|
nuclear@12
|
190 draw_scene();
|
nuclear@9
|
191
|
nuclear@12
|
192 // return to the regular window framebuffer
|
nuclear@12
|
193 glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
nuclear@12
|
194 glViewport(0, 0, width, height);
|
nuclear@12
|
195
|
nuclear@12
|
196 glClearColor(0, 0, 0, 0);
|
nuclear@12
|
197 glClear(GL_COLOR_BUFFER_BIT);
|
nuclear@12
|
198
|
nuclear@12
|
199 vr_draw_eye(tex[0], VR_EYE_LEFT);
|
nuclear@12
|
200 vr_draw_eye(tex[1], VR_EYE_RIGHT);
|
nuclear@9
|
201
|
nuclear@9
|
202 glutSwapBuffers();
|
nuclear@9
|
203 assert(glGetError() == GL_NO_ERROR);
|
nuclear@13
|
204
|
nuclear@13
|
205 glFinish();
|
nuclear@9
|
206 }
|
nuclear@9
|
207
|
nuclear@12
|
208
|
nuclear@12
|
209 static void draw_scene()
|
nuclear@12
|
210 {
|
nuclear@12
|
211 float lpos[] = {0, 60, 0, 1};
|
nuclear@12
|
212 glLightfv(GL_LIGHT0, GL_POSITION, lpos);
|
nuclear@12
|
213
|
nuclear@13
|
214 draw_grid(100.0, 2.5);
|
nuclear@13
|
215
|
nuclear@12
|
216 static Vector2 teapos[] = {
|
nuclear@12
|
217 Vector2(-8, 8), Vector2(8, 8), Vector2(8, -8), Vector2(-8, -8)
|
nuclear@12
|
218 };
|
nuclear@12
|
219
|
nuclear@12
|
220 for(int i=0; i<4; i++) {
|
nuclear@12
|
221 glPushMatrix();
|
nuclear@12
|
222 glTranslatef(teapos[i].x, 0, teapos[i].y);
|
nuclear@12
|
223 draw_teapot();
|
nuclear@12
|
224 glPopMatrix();
|
nuclear@12
|
225 }
|
nuclear@12
|
226
|
nuclear@13
|
227 draw_squares();
|
nuclear@12
|
228 }
|
nuclear@12
|
229
|
nuclear@9
|
230 static void draw_teapot()
|
nuclear@9
|
231 {
|
nuclear@9
|
232 static int tealist;
|
nuclear@9
|
233
|
nuclear@9
|
234 if(!tealist) {
|
nuclear@9
|
235 tealist = glGenLists(1);
|
nuclear@9
|
236 glNewList(tealist, GL_COMPILE);
|
nuclear@9
|
237 glutSolidTeapot(1.0);
|
nuclear@9
|
238 glEndList();
|
nuclear@9
|
239 }
|
nuclear@9
|
240
|
nuclear@9
|
241 glFrontFace(GL_CW);
|
nuclear@9
|
242 glCallList(tealist);
|
nuclear@9
|
243 glFrontFace(GL_CCW);
|
nuclear@9
|
244 }
|
nuclear@9
|
245
|
nuclear@13
|
246 static void draw_squares()
|
nuclear@13
|
247 {
|
nuclear@13
|
248 static const int num_sq = 4;
|
nuclear@13
|
249
|
nuclear@13
|
250 glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
|
nuclear@13
|
251 glDisable(GL_LIGHTING);
|
nuclear@13
|
252
|
nuclear@13
|
253 glMatrixMode(GL_MODELVIEW);
|
nuclear@13
|
254 glPushMatrix();
|
nuclear@13
|
255 glTranslatef(0, 1, 0);
|
nuclear@13
|
256
|
nuclear@13
|
257
|
nuclear@13
|
258 glLineWidth(3.0);
|
nuclear@13
|
259 glColor3f(1.0, 0.7, 0.2);
|
nuclear@13
|
260
|
nuclear@13
|
261 float zdist = 2.0;
|
nuclear@13
|
262 for(int i=0; i<num_sq; i++) {
|
nuclear@13
|
263 glBegin(GL_LINE_LOOP);
|
nuclear@13
|
264 glVertex3f(-1, -1, -zdist);
|
nuclear@13
|
265 glVertex3f(1, -1, -zdist);
|
nuclear@13
|
266 glVertex3f(1, 1, -zdist);
|
nuclear@13
|
267 glVertex3f(-1, 1, -zdist);
|
nuclear@13
|
268 glEnd();
|
nuclear@13
|
269
|
nuclear@13
|
270 zdist += 1.0;
|
nuclear@13
|
271 }
|
nuclear@13
|
272
|
nuclear@13
|
273 glPopMatrix();
|
nuclear@13
|
274 glPopAttrib();
|
nuclear@13
|
275 }
|
nuclear@13
|
276
|
nuclear@12
|
277 static void draw_grid(float size, float spacing)
|
nuclear@9
|
278 {
|
nuclear@9
|
279 int num_lines = size / spacing;
|
nuclear@9
|
280 float dist = size / 2.0;
|
nuclear@9
|
281
|
nuclear@9
|
282 glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
|
nuclear@9
|
283 glDisable(GL_LIGHTING);
|
nuclear@9
|
284
|
nuclear@9
|
285 glLineWidth(1.0);
|
nuclear@9
|
286
|
nuclear@9
|
287 glBegin(GL_LINES);
|
nuclear@9
|
288 glColor3f(0.4, 0.4, 0.4);
|
nuclear@9
|
289
|
nuclear@9
|
290 float x = -dist;
|
nuclear@9
|
291 for(int i=0; i<=num_lines; i++) {
|
nuclear@9
|
292 if(i != num_lines / 2) {
|
nuclear@9
|
293 glVertex3f(-dist, 0, x);
|
nuclear@9
|
294 glVertex3f(dist, 0, x);
|
nuclear@9
|
295 glVertex3f(x, 0, -dist);
|
nuclear@9
|
296 glVertex3f(x, 0, dist);
|
nuclear@9
|
297 }
|
nuclear@9
|
298 x += spacing;
|
nuclear@9
|
299 }
|
nuclear@9
|
300 glEnd();
|
nuclear@9
|
301
|
nuclear@9
|
302 glLineWidth(2.0);
|
nuclear@9
|
303
|
nuclear@9
|
304 glBegin(GL_LINES);
|
nuclear@9
|
305 glColor3f(1.0, 0, 0);
|
nuclear@9
|
306 glVertex3f(-dist, 0, 0);
|
nuclear@9
|
307 glVertex3f(dist, 0, 0);
|
nuclear@9
|
308 glColor3f(0, 1.0, 0);
|
nuclear@9
|
309 glVertex3f(0, 0, -dist);
|
nuclear@9
|
310 glVertex3f(0, 0, dist);
|
nuclear@9
|
311 glEnd();
|
nuclear@9
|
312
|
nuclear@9
|
313 glPopAttrib();
|
nuclear@9
|
314 }
|
nuclear@9
|
315
|
nuclear@0
|
316 static void idle()
|
nuclear@0
|
317 {
|
nuclear@0
|
318 glutPostRedisplay();
|
nuclear@0
|
319 }
|
nuclear@0
|
320
|
nuclear@0
|
321
|
nuclear@0
|
322 static void reshape(int x, int y)
|
nuclear@0
|
323 {
|
nuclear@0
|
324 width = x;
|
nuclear@0
|
325 height = y;
|
nuclear@12
|
326
|
nuclear@12
|
327 if(!use_vr) {
|
nuclear@12
|
328 rtarg_width = width;
|
nuclear@12
|
329 rtarg_height = height;
|
nuclear@12
|
330 }
|
nuclear@0
|
331 }
|
nuclear@0
|
332
|
nuclear@0
|
333 static void keyb(unsigned char key, int x, int y)
|
nuclear@0
|
334 {
|
nuclear@0
|
335 switch(key) {
|
nuclear@0
|
336 case 27:
|
nuclear@0
|
337 exit(0);
|
nuclear@8
|
338
|
nuclear@8
|
339 case 'm':
|
nuclear@8
|
340 mouselook = !mouselook;
|
nuclear@8
|
341 if(mouselook) {
|
nuclear@8
|
342 glutPassiveMotionFunc(passive);
|
nuclear@8
|
343 glutSetCursor(GLUT_CURSOR_NONE);
|
nuclear@8
|
344 glutWarpPointer(width / 2, height / 2);
|
nuclear@8
|
345 } else {
|
nuclear@8
|
346 glutPassiveMotionFunc(0);
|
nuclear@8
|
347 glutSetCursor(GLUT_CURSOR_INHERIT);
|
nuclear@8
|
348 }
|
nuclear@8
|
349 break;
|
nuclear@12
|
350
|
nuclear@12
|
351 case 'f':
|
nuclear@12
|
352 {
|
nuclear@12
|
353 static bool fullscreen;
|
nuclear@12
|
354 static int prev_xsz, prev_ysz;
|
nuclear@12
|
355
|
nuclear@12
|
356 fullscreen = !fullscreen;
|
nuclear@12
|
357
|
nuclear@12
|
358 if(fullscreen) {
|
nuclear@12
|
359 prev_xsz = width;
|
nuclear@12
|
360 prev_ysz = height;
|
nuclear@12
|
361 glutFullScreen();
|
nuclear@12
|
362 } else {
|
nuclear@12
|
363 glutReshapeWindow(prev_xsz, prev_ysz);
|
nuclear@12
|
364 }
|
nuclear@12
|
365 glutPostRedisplay();
|
nuclear@12
|
366 }
|
nuclear@12
|
367 break;
|
nuclear@0
|
368 }
|
nuclear@8
|
369
|
nuclear@8
|
370 keystate[key] = true;
|
nuclear@8
|
371 glutPostRedisplay();
|
nuclear@8
|
372 }
|
nuclear@8
|
373
|
nuclear@8
|
374 static void keyup(unsigned char key, int x, int y)
|
nuclear@8
|
375 {
|
nuclear@8
|
376 keystate[key] = false;
|
nuclear@8
|
377 glutPostRedisplay();
|
nuclear@8
|
378 }
|
nuclear@8
|
379
|
nuclear@8
|
380 static bool bnstate[32];
|
nuclear@8
|
381 static int prev_x, prev_y;
|
nuclear@8
|
382
|
nuclear@8
|
383 static void mouse(int bn, int st, int x, int y)
|
nuclear@8
|
384 {
|
nuclear@8
|
385 prev_x = x;
|
nuclear@8
|
386 prev_y = y;
|
nuclear@8
|
387 bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN;
|
nuclear@8
|
388 }
|
nuclear@8
|
389
|
nuclear@8
|
390 static void motion(int x, int y)
|
nuclear@8
|
391 {
|
nuclear@8
|
392 if(mouselook) {
|
nuclear@8
|
393 // just call passive, it does what we need
|
nuclear@8
|
394 passive(x, y);
|
nuclear@8
|
395 }
|
nuclear@8
|
396 }
|
nuclear@8
|
397
|
nuclear@8
|
398 static void passive(int x, int y)
|
nuclear@8
|
399 {
|
nuclear@8
|
400 // no need to test mouselook; this callback is only set when mouselook is enabled
|
nuclear@8
|
401 int center_x = width / 2;
|
nuclear@8
|
402 int center_y = height / 2;
|
nuclear@8
|
403
|
nuclear@8
|
404 int dx = x - center_x;
|
nuclear@8
|
405 int dy = y - center_y;
|
nuclear@8
|
406
|
nuclear@8
|
407 if(!dx && !dy) {
|
nuclear@8
|
408 return;
|
nuclear@8
|
409 }
|
nuclear@8
|
410
|
nuclear@9
|
411 float dtheta_deg = dy * 0.1;
|
nuclear@9
|
412 float dphi_deg = dx * 0.1;
|
nuclear@9
|
413
|
nuclear@9
|
414 cam.input_rotate(DEG_TO_RAD(dtheta_deg), DEG_TO_RAD(dphi_deg), 0);
|
nuclear@9
|
415
|
nuclear@8
|
416 glutPostRedisplay();
|
nuclear@8
|
417 glutWarpPointer(center_x, center_y);
|
nuclear@0
|
418 }
|
nuclear@0
|
419
|
nuclear@0
|
420 static void sball_rotate(int rx, int ry, int rz)
|
nuclear@0
|
421 {
|
nuclear@0
|
422 }
|
nuclear@1
|
423
|
nuclear@1
|
424 static bool parse_args(int argc, char **argv)
|
nuclear@1
|
425 {
|
nuclear@1
|
426 for(int i=1; i<argc; i++) {
|
nuclear@1
|
427 if(argv[i][0] == '-') {
|
nuclear@1
|
428 if(strcmp(argv[i], "-vr") == 0) {
|
nuclear@1
|
429 use_vr = true;
|
nuclear@1
|
430 } else if(strcmp(argv[i], "-novr") == 0) {
|
nuclear@1
|
431 use_vr = false;
|
nuclear@1
|
432 } else {
|
nuclear@1
|
433 fprintf(stderr, "invalid option: %s\n", argv[i]);
|
nuclear@1
|
434 return false;
|
nuclear@1
|
435 }
|
nuclear@1
|
436 } else {
|
nuclear@1
|
437 fprintf(stderr, "unexpected argument: %s\n", argv[i]);
|
nuclear@1
|
438 return false;
|
nuclear@1
|
439 }
|
nuclear@1
|
440 }
|
nuclear@1
|
441 return true;
|
nuclear@1
|
442 }
|