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) {
56 void game_shutdown(void)
59 free_program(sdr_foo);
62 #define STEP_INTERVAL 128
66 static long prev_step;
68 int step[][2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
70 cgm_vec3 vdir = {0, 0, -1};
72 cgm_vmul_m3v3(&vdir, player.view_xform);
74 player.dir = (int)(2.0f * (-atan2(vdir.z, vdir.x) + M_PI) / M_PI + 0.5f) & 3;
76 if(time_msec - prev_step >= STEP_INTERVAL) {
77 if(input_state[INP_FWD]) {
78 player.cx += step[player.dir][0];
79 player.cy += step[player.dir][1];
80 prev_step = time_msec;
81 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
83 if(input_state[INP_BACK]) {
84 player.cx -= step[player.dir][0];
85 player.cy -= step[player.dir][1];
86 prev_step = time_msec;
87 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
89 if(input_state[INP_LEFT]) {
90 dir = (player.dir + 3) & 3;
91 player.cx += step[dir][0];
92 player.cy += step[dir][1];
93 prev_step = time_msec;
94 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
96 if(input_state[INP_RIGHT]) {
97 dir = (player.dir + 1) & 3;
98 player.cx += step[dir][0];
99 player.cy += step[dir][1];
100 prev_step = time_msec;
101 printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
103 memset(input_state, 0, sizeof input_state);
106 upd_player_xform(&player);
109 void game_display(void)
112 static long prev_msec;
114 dt = (prev_msec - time_msec) / 1000.0f;
115 prev_msec = time_msec;
119 glClearColor(0.1, 0.1, 0.1, 1);
120 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
122 cgm_midentity(proj_matrix);
123 cgm_mperspective(proj_matrix, cgm_deg_to_rad(50), win_aspect, 0.5, 500.0);
124 glMatrixMode(GL_PROJECTION);
125 glLoadMatrixf(proj_matrix);
127 glMatrixMode(GL_MODELVIEW);
129 glTranslatef(0, 0, -cam_dist);
130 glMultMatrixf(player.view_xform);
135 assert(glGetError() == GL_NO_ERROR);
138 static void draw_level(void)
144 glUseProgram(sdr_foo);
147 for(i=0; i<lvl.height; i++) {
148 for(j=0; j<lvl.width; j++) {
149 cgm_mtranslation(xform, j * lvl.cell_size, 0, -i * lvl.cell_size);
152 glMultMatrixf(xform);
155 cgm_mrotation_y(xform, cell->tilerot * M_PI / 2.0f);
158 glMultMatrixf(xform);
159 draw_meshgroup(&cell->tile->mgrp);
163 for(k=0; k<cell->num_mgrp; k++) {
164 draw_meshgroup(cell->mgrp + k);
175 void game_reshape(int x, int y)
177 glViewport(0, 0, x, y);
180 win_aspect = (float)x / (float)y;
183 void game_keyboard(int key, int press)
185 if(press && key == 27) {
192 input_state[INP_FWD] = press;
196 input_state[INP_LEFT] = press;
200 input_state[INP_BACK] = press;
204 input_state[INP_RIGHT] = press;
209 void game_mbutton(int bn, int press, int x, int y)
216 void game_mmotion(int x, int y)
218 int dx = x - mouse_x;
219 int dy = y - mouse_y;
223 if(!(dx | dy)) return;
226 player.theta -= cgm_deg_to_rad(dx * 0.5f);
227 player.phi -= cgm_deg_to_rad(dy * 0.5f);
228 if(player.phi < -M_PI/2) player.phi = -M_PI/2;
229 if(player.phi > M_PI/2) player.phi = M_PI/2;
232 cam_dist += dy * 0.1;
233 if(cam_dist < 0) cam_dist = 0;