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];
28 if(init_opengl() == -1) {
32 glEnable(GL_DEPTH_TEST);
33 glEnable(GL_CULL_FACE);
35 if(!(sdr_foo = create_program_load("sdr/foo.v.glsl", "sdr/foo.p.glsl"))) {
38 glBindAttribLocation(sdr_foo, MESH_ATTR_VERTEX, "apos");
39 glBindAttribLocation(sdr_foo, MESH_ATTR_NORMAL, "anorm");
40 glBindAttribLocation(sdr_foo, MESH_ATTR_TANGENT, "atang");
41 glBindAttribLocation(sdr_foo, MESH_ATTR_TEXCOORD, "atex");
42 link_program(sdr_foo);
44 if(load_level(&lvl, "data/test.lvl") == -1) {
57 void game_shutdown(void)
60 free_program(sdr_foo);
63 #define STEP_INTERVAL 128
67 static long prev_step;
69 int step[][2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
71 cgm_vec3 vdir = {0, 0, -1};
73 cgm_vmul_m3v3(&vdir, player.view_xform);
75 player.dir = (int)(2.0f * (-atan2(vdir.z, vdir.x) + M_PI) / M_PI + 0.5f) & 3;
77 if(time_msec - prev_step >= STEP_INTERVAL) {
78 if(input_state[INP_FWD]) {
79 player.cx += step[player.dir][0];
80 player.cy += step[player.dir][1];
81 prev_step = time_msec;
82 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
84 if(input_state[INP_BACK]) {
85 player.cx -= step[player.dir][0];
86 player.cy -= step[player.dir][1];
87 prev_step = time_msec;
88 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
90 if(input_state[INP_LEFT]) {
91 dir = (player.dir + 3) & 3;
92 player.cx += step[dir][0];
93 player.cy += step[dir][1];
94 prev_step = time_msec;
95 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
97 if(input_state[INP_RIGHT]) {
98 dir = (player.dir + 1) & 3;
99 player.cx += step[dir][0];
100 player.cy += step[dir][1];
101 prev_step = time_msec;
102 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
104 memset(input_state, 0, sizeof input_state);
107 upd_player_xform(&player);
110 void game_display(void)
113 static long prev_msec;
115 dt = (prev_msec - time_msec) / 1000.0f;
116 prev_msec = time_msec;
120 glClearColor(0.1, 0.1, 0.1, 1);
121 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
123 cgm_midentity(proj_matrix);
124 cgm_mperspective(proj_matrix, cgm_deg_to_rad(50), win_aspect, 0.5, 500.0);
125 glMatrixMode(GL_PROJECTION);
126 glLoadMatrixf(proj_matrix);
128 glMatrixMode(GL_MODELVIEW);
130 glTranslatef(0, 0, -cam_dist);
131 glMultMatrixf(player.view_xform);
136 assert(glGetError() == GL_NO_ERROR);
139 static void draw_level(void)
145 glUseProgram(sdr_foo);
148 for(i=0; i<lvl.height; i++) {
149 for(j=0; j<lvl.width; j++) {
150 cgm_mtranslation(xform, j * lvl.cell_size, 0, -i * lvl.cell_size);
153 glMultMatrixf(xform);
155 for(k=0; k<cell->num_mgrp; k++) {
156 draw_meshgroup(cell->mgrp + k);
167 void game_reshape(int x, int y)
169 glViewport(0, 0, x, y);
172 win_aspect = (float)x / (float)y;
175 void game_keyboard(int key, int press)
177 if(press && key == 27) {
184 input_state[INP_FWD] = press;
188 input_state[INP_LEFT] = press;
192 input_state[INP_BACK] = press;
196 input_state[INP_RIGHT] = press;
201 void game_mbutton(int bn, int press, int x, int y)
208 void game_mmotion(int x, int y)
210 int dx = x - mouse_x;
211 int dy = y - mouse_y;
215 if(!(dx | dy)) return;
218 player.theta -= cgm_deg_to_rad(dx * 0.5f);
219 player.phi -= cgm_deg_to_rad(dy * 0.5f);
220 if(player.phi < -M_PI/2) player.phi = -M_PI/2;
221 if(player.phi > M_PI/2) player.phi = M_PI/2;
224 cam_dist += dy * 0.1;
225 if(cam_dist < 0) cam_dist = 0;