player movement (to be cont.)
[vrlugburz] / src / game.c
index 42a95f9..a997b69 100644 (file)
@@ -1,20 +1,24 @@
+#include <stdio.h>
 #include <assert.h>
 #include "cgmath/cgmath.h"
 #include "game.h"
 #include "opengl.h"
 #include "level.h"
+#include "player.h"
 #include "scenefile.h"
 #include "sdr.h"
 
+static void draw_level(void);
+
 struct level lvl;
-struct scenefile scn;
+struct player player;
 
 int win_width, win_height;
 float win_aspect;
 int mouse_x, mouse_y;
 int bnstate[8];
 
-float cam_theta, cam_phi, cam_dist = 10;
+float cam_dist = 10;
 float view_matrix[16], proj_matrix[16];
 
 unsigned int sdr_foo;
@@ -40,11 +44,12 @@ int game_init(void)
        if(load_level(&lvl, "data/test.lvl") == -1) {
                return -1;
        }
+       gen_level_geom(&lvl);
 
-       /* DBG */
-       if(load_scenefile(&scn, "data/dwall1.obj") == -1) {
-               return -1;
-       }
+       init_player(&player);
+       player.lvl = &lvl;
+       player.cx = lvl.px;
+       player.cy = lvl.py;
 
        return 0;
 }
@@ -55,9 +60,37 @@ void game_shutdown(void)
        free_program(sdr_foo);
 }
 
+#define STEP_INTERVAL  1000
+
+void update(float dt)
+{
+       static long prev_step;
+       int step[][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
+
+       cgm_vec3 vdir = {0, 0, -1};
+
+       upd_player_xform(&player);
+       cgm_vmul_m3v3(&vdir, player.view_xform);
+
+       player.dir = (int)(2.0f * (atan2(vdir.z, vdir.x) + M_PI) / M_PI + 0.5f);
+
+       /*
+       if(time_msec - prev_step >= STEP_INTERVAL) {
+               if(input[INP_FWD]) {
+               }
+       }
+       */
+}
+
 void game_display(void)
 {
-       struct mesh *mesh;
+       float dt;
+       static long prev_msec;
+
+       dt = (prev_msec - time_msec) / 1000.0f;
+       prev_msec = time_msec;
+
+       update(dt);
 
        glClearColor(0.1, 0.1, 0.1, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -67,25 +100,41 @@ void game_display(void)
        glMatrixMode(GL_PROJECTION);
        glLoadMatrixf(proj_matrix);
 
-       cgm_midentity(view_matrix);
-       cgm_mpretranslate(view_matrix, 0, 1.5, -cam_dist);
-       cgm_mprerotate(view_matrix, cam_phi, 1, 0, 0);
-       cgm_mprerotate(view_matrix, cam_theta, 0, 1, 0);
        glMatrixMode(GL_MODELVIEW);
-       glLoadMatrixf(view_matrix);
+       glLoadMatrixf(player.view_xform);
+
+       draw_level();
+
+       game_swap_buffers();
+       assert(glGetError() == GL_NO_ERROR);
+}
+
+static void draw_level(void)
+{
+       int i, j, k;
+       struct cell *cell;
+       float xform[16];
 
        glUseProgram(sdr_foo);
 
-       mesh = scn.meshlist;
-       while(mesh) {
-               draw_mesh(mesh);
-               mesh = mesh->next;
+       cell = lvl.cells;
+       for(i=0; i<lvl.height; i++) {
+               for(j=0; j<lvl.width; j++) {
+                       cgm_mtranslation(xform, j * lvl.cell_size, 0, i * lvl.cell_size);
+
+                       glPushMatrix();
+                       glMultMatrixf(xform);
+
+                       for(k=0; k<cell->num_mgrp; k++) {
+                               draw_meshgroup(cell->mgrp + k);
+                       }
+                       cell++;
+
+                       glPopMatrix();
+               }
        }
 
        glUseProgram(0);
-
-       game_swap_buffers();
-       assert(glGetError() == GL_NO_ERROR);
 }
 
 void game_reshape(int x, int y)
@@ -121,10 +170,10 @@ void game_mmotion(int x, int y)
        if(!(dx | dy)) return;
 
        if(bnstate[0]) {
-               cam_theta += cgm_deg_to_rad(dx * 0.5f);
-               cam_phi += cgm_deg_to_rad(dy * 0.5f);
-               if(cam_phi < -M_PI/2) cam_phi = -M_PI/2;
-               if(cam_phi > M_PI/2) cam_phi = M_PI/2;
+               player.theta -= cgm_deg_to_rad(dx * 0.5f);
+               player.phi -= cgm_deg_to_rad(dy * 0.5f);
+               if(player.phi < -M_PI/2) player.phi = -M_PI/2;
+               if(player.phi > M_PI/2) player.phi = M_PI/2;
        }
        if(bnstate[2]) {
                cam_dist += dy * 0.1;