3 #include "cgmath/cgmath.h"
11 static void draw_level(void);
16 int win_width, win_height;
22 float view_matrix[16], proj_matrix[16];
26 static long prev_step, prev_turn;
30 if(init_opengl() == -1) {
34 glEnable(GL_DEPTH_TEST);
35 glEnable(GL_CULL_FACE);
37 if(!(sdr_foo = create_program_load("sdr/foo.v.glsl", "sdr/foo.p.glsl"))) {
40 glBindAttribLocation(sdr_foo, MESH_ATTR_VERTEX, "apos");
41 glBindAttribLocation(sdr_foo, MESH_ATTR_NORMAL, "anorm");
42 glBindAttribLocation(sdr_foo, MESH_ATTR_TANGENT, "atang");
43 glBindAttribLocation(sdr_foo, MESH_ATTR_TEXCOORD, "atex");
44 link_program(sdr_foo);
46 if(load_level(&lvl, "data/test.lvl") == -1) {
58 void game_shutdown(void)
61 free_program(sdr_foo);
64 #define STEP_INTERVAL 250
65 #define TURN_INTERVAL 500
69 int fwd = 0, right = 0, turn = 0;
72 cgm_vec3 vdir = {0, 0, -1};
74 cgm_vmul_m3v3(&vdir, player.view_xform);
76 player.dir = (int)(2.0f * (-atan2(vdir.z, vdir.x) + M_PI) / M_PI + 0.5f) & 3;
79 if(time_msec - prev_turn >= TURN_INTERVAL) {
80 if(input_state[INP_LTURN]) turn--;
81 if(input_state[INP_RTURN]) turn++;
84 turn_player(&player, turn);
85 prev_turn = time_msec;
89 if(time_msec - prev_step >= STEP_INTERVAL) {
90 if(input_state[INP_FWD]) fwd++;
91 if(input_state[INP_BACK]) fwd--;
92 if(input_state[INP_LEFT]) right--;
93 if(input_state[INP_RIGHT]) right++;
96 move_player(&player, right, fwd);
97 prev_step = time_msec;
101 upd_player_xform(&player);
104 void game_display(void)
107 static long prev_msec;
109 dt = (prev_msec - time_msec) / 1000.0f;
110 prev_msec = time_msec;
114 glClearColor(0.1, 0.1, 0.1, 1);
115 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
117 cgm_midentity(proj_matrix);
118 cgm_mperspective(proj_matrix, cgm_deg_to_rad(80), win_aspect, 0.5, 500.0);
119 glMatrixMode(GL_PROJECTION);
120 glLoadMatrixf(proj_matrix);
122 glMatrixMode(GL_MODELVIEW);
124 glTranslatef(0, 0, -cam_dist);
125 glMultMatrixf(player.view_xform);
130 assert(glGetError() == GL_NO_ERROR);
133 static void draw_level(void)
139 glUseProgram(sdr_foo);
142 for(i=0; i<lvl.height; i++) {
143 for(j=0; j<lvl.width; j++) {
144 cgm_mtranslation(xform, j * lvl.cell_size, 0, -i * lvl.cell_size);
147 glMultMatrixf(xform);
150 cgm_mrotation_y(xform, cell->tilerot * M_PI / 2.0f);
153 glMultMatrixf(xform);
154 draw_meshgroup(&cell->tile->mgrp);
158 for(k=0; k<cell->num_mgrp; k++) {
159 draw_meshgroup(cell->mgrp + k);
170 void game_reshape(int x, int y)
172 glViewport(0, 0, x, y);
175 win_aspect = (float)x / (float)y;
178 void game_keyboard(int key, int press)
180 if(press && key == 27) {
185 /* TODO key remapping */
188 input_state[INP_FWD] = press;
190 move_player(&player, 0, 1);
191 prev_step = time_msec;
196 input_state[INP_LEFT] = press;
198 move_player(&player, -1, 0);
199 prev_step = time_msec;
204 input_state[INP_BACK] = press;
206 move_player(&player, 0, -1);
207 prev_step = time_msec;
212 input_state[INP_RIGHT] = press;
214 move_player(&player, 1, 0);
215 prev_step = time_msec;
220 input_state[INP_LTURN] = press;
222 turn_player(&player, -1);
223 prev_turn = time_msec;
224 player.dir = (player.dir + 3) & 3;
229 input_state[INP_RTURN] = press;
231 turn_player(&player, 1);
232 prev_turn = time_msec;
233 player.dir = (player.dir + 1) & 3;
239 void game_mbutton(int bn, int press, int x, int y)
246 void game_mmotion(int x, int y)
248 int dx = x - mouse_x;
249 int dy = y - mouse_y;
253 if(!(dx | dy)) return;
256 player.theta -= cgm_deg_to_rad(dx * 0.5f);
257 player.phi -= cgm_deg_to_rad(dy * 0.5f);
258 if(player.phi < -M_PI/2) player.phi = -M_PI/2;
259 if(player.phi > M_PI/2) player.phi = M_PI/2;
262 cam_dist += dy * 0.1;
263 if(cam_dist < 0) cam_dist = 0;