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) {
54 printf("start pos: %d,%d\n", player.cx, player.cy);
59 void game_shutdown(void)
62 free_program(sdr_foo);
65 void game_display(void)
67 glClearColor(0.1, 0.1, 0.1, 1);
68 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
70 cgm_midentity(proj_matrix);
71 cgm_mperspective(proj_matrix, cgm_deg_to_rad(50), win_aspect, 0.5, 500.0);
72 glMatrixMode(GL_PROJECTION);
73 glLoadMatrixf(proj_matrix);
75 upd_player_xform(&player);
76 glMatrixMode(GL_MODELVIEW);
77 glLoadMatrixf(player.view_xform);
82 assert(glGetError() == GL_NO_ERROR);
85 static void draw_level(void)
91 glUseProgram(sdr_foo);
94 for(i=0; i<lvl.height; i++) {
95 for(j=0; j<lvl.width; j++) {
96 cgm_mtranslation(xform, j * lvl.cell_size, 0, i * lvl.cell_size);
101 for(k=0; k<cell->num_mgrp; k++) {
102 draw_meshgroup(cell->mgrp + k);
113 void game_reshape(int x, int y)
115 glViewport(0, 0, x, y);
118 win_aspect = (float)x / (float)y;
121 void game_keyboard(int key, int press)
123 if(press && key == 27) {
129 void game_mbutton(int bn, int press, int x, int y)
136 void game_mmotion(int x, int y)
138 int dx = x - mouse_x;
139 int dy = y - mouse_y;
143 if(!(dx | dy)) return;
146 player.theta -= cgm_deg_to_rad(dx * 0.5f);
147 player.phi -= cgm_deg_to_rad(dy * 0.5f);
148 if(player.phi < -M_PI/2) player.phi = -M_PI/2;
149 if(player.phi > M_PI/2) player.phi = M_PI/2;
152 cam_dist += dy * 0.1;
153 if(cam_dist < 0) cam_dist = 0;