metadata, walk polygons, stuff...
[laserbrain_demo] / src / main.cc
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <GL/glew.h>
5 #ifdef __APPLE__
6 #include <GLUT/glut.h>
7 #else
8 #include <GL/glut.h>
9 #endif
10 #include "app.h"
11
12 static bool init();
13 static void display();
14 static void idle();
15 static void reshape(int x, int y);
16 static void key_press(unsigned char key, int x, int y);
17 static void key_release(unsigned char key, int x, int y);
18 static void mouse(int bn, int st, int x, int y);
19 static void proc_modkeys();
20
21 static unsigned int start_time;
22 static unsigned int modkeys;
23
24 int main(int argc, char **argv)
25 {
26         glutInitWindowSize(1024, 768);
27         glutInit(&argc, argv);
28         glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE);
29         glutCreateWindow("demo");
30
31         glutDisplayFunc(display);
32         glutIdleFunc(idle);
33         glutReshapeFunc(reshape);
34         glutKeyboardFunc(key_press);
35         glutKeyboardUpFunc(key_release);
36         glutMouseFunc(mouse);
37         glutMotionFunc(app_mouse_motion);
38         glutPassiveMotionFunc(app_mouse_motion);
39
40         if(!init()) {
41                 return 1;
42         }
43         atexit(app_cleanup);
44
45         glutMainLoop();
46         return 0;
47 }
48
49 void app_swap_buffers()
50 {
51         glutSwapBuffers();
52 }
53
54 void app_quit()
55 {
56         exit(0);
57 }
58
59 unsigned int app_get_modifiers()
60 {
61         return modkeys;
62 }
63
64 static bool init()
65 {
66         glewInit();
67
68         if(!app_init()) {
69                 return false;
70         }
71
72         start_time = glutGet(GLUT_ELAPSED_TIME);
73         return true;
74 }
75
76 static void display()
77 {
78         time_msec = glutGet(GLUT_ELAPSED_TIME) - start_time;
79         app_display();
80 }
81
82 static void idle()
83 {
84         glutPostRedisplay();
85 }
86
87 static void reshape(int x, int y)
88 {
89         win_width = x;
90         win_height = y;
91
92         app_reshape(x, y);
93 }
94
95 static void key_press(unsigned char key, int x, int y)
96 {
97         proc_modkeys();
98         app_keyboard(key, true);
99 }
100
101 static void key_release(unsigned char key, int x, int y)
102 {
103         proc_modkeys();
104         app_keyboard(key, false);
105 }
106
107 static void mouse(int bn, int st, int x, int y)
108 {
109         int bidx = bn - GLUT_LEFT_BUTTON;
110         bool down = st == GLUT_DOWN;
111
112         proc_modkeys();
113         app_mouse_button(bidx, down, x, y);
114 }
115
116 static void proc_modkeys()
117 {
118         int glutmod = glutGetModifiers();
119
120         modkeys = 0;
121         if(glutmod & GLUT_ACTIVE_SHIFT) {
122                 modkeys |= MOD_SHIFT;
123         }
124         if(glutmod & GLUT_ACTIVE_CTRL) {
125                 modkeys |= MOD_CTRL;
126         }
127         if(glutmod & GLUT_ACTIVE_ALT) {
128                 modkeys |= MOD_ALT;
129         }
130 }