rev |
line source |
nuclear@0
|
1 #include <assert.h>
|
nuclear@0
|
2 #include "opengl.h"
|
nuclear@0
|
3 #include "app.h"
|
nuclear@2
|
4 #include "user.h"
|
nuclear@3
|
5 #include "timer.h"
|
nuclear@2
|
6
|
nuclear@2
|
7 static void draw_grid(int num, float sep);
|
nuclear@2
|
8
|
nuclear@2
|
9 static User user;
|
nuclear@2
|
10 static float eye_level = 1.6;
|
nuclear@0
|
11
|
nuclear@5
|
12 static const float walk_speed = 5.0;
|
nuclear@4
|
13
|
nuclear@3
|
14 static int win_width, win_height;
|
nuclear@3
|
15 static bool keystate[256];
|
nuclear@3
|
16 static bool bnstate[16];
|
nuclear@3
|
17 static int prev_x, prev_y, click_x, click_y;
|
nuclear@4
|
18 static unsigned int prev_upd;
|
nuclear@3
|
19
|
nuclear@0
|
20 bool app_init()
|
nuclear@0
|
21 {
|
nuclear@0
|
22 if(!init_opengl()) {
|
nuclear@0
|
23 return false;
|
nuclear@0
|
24 }
|
nuclear@0
|
25 return true;
|
nuclear@0
|
26 }
|
nuclear@0
|
27
|
nuclear@0
|
28 void app_shutdown()
|
nuclear@0
|
29 {
|
nuclear@0
|
30 }
|
nuclear@0
|
31
|
nuclear@3
|
32 static void update(unsigned int msec)
|
nuclear@3
|
33 {
|
nuclear@3
|
34 float dt = (float)(msec - prev_upd) / 1000.0f;
|
nuclear@3
|
35 prev_upd = msec;
|
nuclear@3
|
36
|
nuclear@3
|
37 float fwd = 0.0f, right = 0.0f;
|
nuclear@3
|
38
|
nuclear@3
|
39 if(keystate['w'] || keystate['W']) {
|
nuclear@3
|
40 fwd += walk_speed * dt;
|
nuclear@3
|
41 redisplay();
|
nuclear@3
|
42 }
|
nuclear@3
|
43 if(keystate['s'] || keystate['S']) {
|
nuclear@3
|
44 fwd -= walk_speed * dt;
|
nuclear@3
|
45 redisplay();
|
nuclear@3
|
46 }
|
nuclear@3
|
47 if(keystate['d'] || keystate['D']) {
|
nuclear@5
|
48 right += walk_speed * 0.7 * dt;
|
nuclear@3
|
49 redisplay();
|
nuclear@3
|
50 }
|
nuclear@3
|
51 if(keystate['a'] || keystate['A']) {
|
nuclear@5
|
52 right -= walk_speed * 0.7 * dt;
|
nuclear@3
|
53 redisplay();
|
nuclear@3
|
54 }
|
nuclear@3
|
55
|
nuclear@5
|
56 user.move(fwd, right);
|
nuclear@3
|
57 }
|
nuclear@3
|
58
|
nuclear@0
|
59 void app_display()
|
nuclear@0
|
60 {
|
nuclear@3
|
61 unsigned int msec = get_time_msec();
|
nuclear@3
|
62 update(msec);
|
nuclear@3
|
63
|
nuclear@0
|
64 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
65
|
nuclear@2
|
66 glMatrixMode(GL_MODELVIEW);
|
nuclear@2
|
67 glLoadIdentity();
|
nuclear@2
|
68
|
nuclear@2
|
69 Matrix4x4 viewmat;
|
nuclear@5
|
70 user.calc_inv_matrix(&viewmat);
|
nuclear@2
|
71 glLoadTransposeMatrixf(viewmat.m[0]);
|
nuclear@2
|
72 glTranslatef(0, -eye_level, 0);
|
nuclear@2
|
73
|
nuclear@2
|
74 draw_grid(20, 1.0);
|
nuclear@0
|
75
|
nuclear@0
|
76 swap_buffers();
|
nuclear@0
|
77 assert(glGetError() == GL_NO_ERROR);
|
nuclear@0
|
78 }
|
nuclear@0
|
79
|
nuclear@0
|
80 void app_reshape(int x, int y)
|
nuclear@0
|
81 {
|
nuclear@3
|
82 win_width = x;
|
nuclear@3
|
83 win_height = y;
|
nuclear@3
|
84
|
nuclear@0
|
85 glViewport(0, 0, x, y);
|
nuclear@0
|
86
|
nuclear@0
|
87 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
88 glLoadIdentity();
|
nuclear@0
|
89 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
|
nuclear@0
|
90 }
|
nuclear@0
|
91
|
nuclear@0
|
92 void app_keyboard(int key, bool pressed, int x, int y)
|
nuclear@0
|
93 {
|
nuclear@0
|
94 if(pressed) {
|
nuclear@0
|
95 switch(key) {
|
nuclear@0
|
96 case 27:
|
nuclear@0
|
97 quit();
|
nuclear@4
|
98
|
nuclear@4
|
99 case 'w':
|
nuclear@4
|
100 case 'W':
|
nuclear@4
|
101 case 'd':
|
nuclear@4
|
102 case 'D':
|
nuclear@4
|
103 case 's':
|
nuclear@4
|
104 case 'S':
|
nuclear@4
|
105 case 'a':
|
nuclear@4
|
106 case 'A':
|
nuclear@4
|
107 prev_upd = get_time_msec();
|
nuclear@4
|
108 redisplay();
|
nuclear@0
|
109 }
|
nuclear@0
|
110 }
|
nuclear@3
|
111
|
nuclear@3
|
112 if(key < 256) {
|
nuclear@3
|
113 keystate[key] = pressed;
|
nuclear@3
|
114 }
|
nuclear@0
|
115 }
|
nuclear@0
|
116
|
nuclear@0
|
117 void app_mouse_button(int bn, bool pressed, int x, int y)
|
nuclear@0
|
118 {
|
nuclear@3
|
119 bnstate[bn] = pressed;
|
nuclear@3
|
120 prev_x = x;
|
nuclear@3
|
121 prev_y = y;
|
nuclear@3
|
122
|
nuclear@3
|
123 if(bn == 0 && pressed) {
|
nuclear@3
|
124 click_x = x;
|
nuclear@3
|
125 click_y = y;
|
nuclear@3
|
126 }
|
nuclear@0
|
127 }
|
nuclear@0
|
128
|
nuclear@0
|
129 void app_mouse_motion(int x, int y)
|
nuclear@0
|
130 {
|
nuclear@5
|
131 static const float rot_speed = 250.0;
|
nuclear@3
|
132
|
nuclear@4
|
133 float dx = (float)(x - prev_x) / (float)win_width;
|
nuclear@4
|
134 float dy = (float)(y - prev_y) / (float)win_height;
|
nuclear@3
|
135 prev_x = x;
|
nuclear@3
|
136 prev_y = y;
|
nuclear@3
|
137
|
nuclear@3
|
138 if(bnstate[0]) {
|
nuclear@5
|
139 user.rotate(dx * rot_speed, dy * rot_speed);
|
nuclear@3
|
140 redisplay();
|
nuclear@3
|
141 }
|
nuclear@0
|
142 }
|
nuclear@2
|
143
|
nuclear@2
|
144 void app_sball_motion(float x, float y, float z)
|
nuclear@2
|
145 {
|
nuclear@2
|
146 }
|
nuclear@2
|
147
|
nuclear@2
|
148 void app_sball_rotate(float x, float y, float z)
|
nuclear@2
|
149 {
|
nuclear@2
|
150 }
|
nuclear@2
|
151
|
nuclear@2
|
152 void app_sball_button(int bn, bool pressed)
|
nuclear@2
|
153 {
|
nuclear@2
|
154 }
|
nuclear@2
|
155
|
nuclear@2
|
156 static void draw_grid(int num, float sep)
|
nuclear@2
|
157 {
|
nuclear@2
|
158 int hnum = num / 2;
|
nuclear@5
|
159 float max_dist = (hnum - 1) * sep;
|
nuclear@2
|
160
|
nuclear@2
|
161 glBegin(GL_LINES);
|
nuclear@3
|
162 glColor3f(0.4, 0.4, 0.4);
|
nuclear@2
|
163 glVertex3f(0, 0, -max_dist);
|
nuclear@2
|
164 glVertex3f(0, 0, max_dist);
|
nuclear@2
|
165 glVertex3f(-max_dist, 0, 0);
|
nuclear@2
|
166 glVertex3f(max_dist, 0, 0);
|
nuclear@2
|
167
|
nuclear@2
|
168 for(int i=1; i<hnum; i++) {
|
nuclear@2
|
169 float x = i * sep;
|
nuclear@2
|
170
|
nuclear@2
|
171 glVertex3f(-x, 0, -max_dist);
|
nuclear@2
|
172 glVertex3f(-x, 0, max_dist);
|
nuclear@2
|
173 glVertex3f(x, 0, -max_dist);
|
nuclear@2
|
174 glVertex3f(x, 0, max_dist);
|
nuclear@2
|
175 glVertex3f(-max_dist, 0, -x);
|
nuclear@2
|
176 glVertex3f(max_dist, 0, -x);
|
nuclear@2
|
177 glVertex3f(-max_dist, 0, x);
|
nuclear@2
|
178 glVertex3f(max_dist, 0, x);
|
nuclear@2
|
179 }
|
nuclear@2
|
180 glEnd();
|
nuclear@2
|
181 }
|