vrfileman

annotate src/app.cc @ 5:d487181ee1d9

fixed movement
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 03 Feb 2015 03:35:14 +0200
parents 85e26116ba5a
children
rev   line source
nuclear@0 1 #include <assert.h>
nuclear@0 2 #include "opengl.h"
nuclear@0 3 #include "app.h"
nuclear@2 4 #include "user.h"
nuclear@3 5 #include "timer.h"
nuclear@2 6
nuclear@2 7 static void draw_grid(int num, float sep);
nuclear@2 8
nuclear@2 9 static User user;
nuclear@2 10 static float eye_level = 1.6;
nuclear@0 11
nuclear@5 12 static const float walk_speed = 5.0;
nuclear@4 13
nuclear@3 14 static int win_width, win_height;
nuclear@3 15 static bool keystate[256];
nuclear@3 16 static bool bnstate[16];
nuclear@3 17 static int prev_x, prev_y, click_x, click_y;
nuclear@4 18 static unsigned int prev_upd;
nuclear@3 19
nuclear@0 20 bool app_init()
nuclear@0 21 {
nuclear@0 22 if(!init_opengl()) {
nuclear@0 23 return false;
nuclear@0 24 }
nuclear@0 25 return true;
nuclear@0 26 }
nuclear@0 27
nuclear@0 28 void app_shutdown()
nuclear@0 29 {
nuclear@0 30 }
nuclear@0 31
nuclear@3 32 static void update(unsigned int msec)
nuclear@3 33 {
nuclear@3 34 float dt = (float)(msec - prev_upd) / 1000.0f;
nuclear@3 35 prev_upd = msec;
nuclear@3 36
nuclear@3 37 float fwd = 0.0f, right = 0.0f;
nuclear@3 38
nuclear@3 39 if(keystate['w'] || keystate['W']) {
nuclear@3 40 fwd += walk_speed * dt;
nuclear@3 41 redisplay();
nuclear@3 42 }
nuclear@3 43 if(keystate['s'] || keystate['S']) {
nuclear@3 44 fwd -= walk_speed * dt;
nuclear@3 45 redisplay();
nuclear@3 46 }
nuclear@3 47 if(keystate['d'] || keystate['D']) {
nuclear@5 48 right += walk_speed * 0.7 * dt;
nuclear@3 49 redisplay();
nuclear@3 50 }
nuclear@3 51 if(keystate['a'] || keystate['A']) {
nuclear@5 52 right -= walk_speed * 0.7 * dt;
nuclear@3 53 redisplay();
nuclear@3 54 }
nuclear@3 55
nuclear@5 56 user.move(fwd, right);
nuclear@3 57 }
nuclear@3 58
nuclear@0 59 void app_display()
nuclear@0 60 {
nuclear@3 61 unsigned int msec = get_time_msec();
nuclear@3 62 update(msec);
nuclear@3 63
nuclear@0 64 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
nuclear@0 65
nuclear@2 66 glMatrixMode(GL_MODELVIEW);
nuclear@2 67 glLoadIdentity();
nuclear@2 68
nuclear@2 69 Matrix4x4 viewmat;
nuclear@5 70 user.calc_inv_matrix(&viewmat);
nuclear@2 71 glLoadTransposeMatrixf(viewmat.m[0]);
nuclear@2 72 glTranslatef(0, -eye_level, 0);
nuclear@2 73
nuclear@2 74 draw_grid(20, 1.0);
nuclear@0 75
nuclear@0 76 swap_buffers();
nuclear@0 77 assert(glGetError() == GL_NO_ERROR);
nuclear@0 78 }
nuclear@0 79
nuclear@0 80 void app_reshape(int x, int y)
nuclear@0 81 {
nuclear@3 82 win_width = x;
nuclear@3 83 win_height = y;
nuclear@3 84
nuclear@0 85 glViewport(0, 0, x, y);
nuclear@0 86
nuclear@0 87 glMatrixMode(GL_PROJECTION);
nuclear@0 88 glLoadIdentity();
nuclear@0 89 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
nuclear@0 90 }
nuclear@0 91
nuclear@0 92 void app_keyboard(int key, bool pressed, int x, int y)
nuclear@0 93 {
nuclear@0 94 if(pressed) {
nuclear@0 95 switch(key) {
nuclear@0 96 case 27:
nuclear@0 97 quit();
nuclear@4 98
nuclear@4 99 case 'w':
nuclear@4 100 case 'W':
nuclear@4 101 case 'd':
nuclear@4 102 case 'D':
nuclear@4 103 case 's':
nuclear@4 104 case 'S':
nuclear@4 105 case 'a':
nuclear@4 106 case 'A':
nuclear@4 107 prev_upd = get_time_msec();
nuclear@4 108 redisplay();
nuclear@0 109 }
nuclear@0 110 }
nuclear@3 111
nuclear@3 112 if(key < 256) {
nuclear@3 113 keystate[key] = pressed;
nuclear@3 114 }
nuclear@0 115 }
nuclear@0 116
nuclear@0 117 void app_mouse_button(int bn, bool pressed, int x, int y)
nuclear@0 118 {
nuclear@3 119 bnstate[bn] = pressed;
nuclear@3 120 prev_x = x;
nuclear@3 121 prev_y = y;
nuclear@3 122
nuclear@3 123 if(bn == 0 && pressed) {
nuclear@3 124 click_x = x;
nuclear@3 125 click_y = y;
nuclear@3 126 }
nuclear@0 127 }
nuclear@0 128
nuclear@0 129 void app_mouse_motion(int x, int y)
nuclear@0 130 {
nuclear@5 131 static const float rot_speed = 250.0;
nuclear@3 132
nuclear@4 133 float dx = (float)(x - prev_x) / (float)win_width;
nuclear@4 134 float dy = (float)(y - prev_y) / (float)win_height;
nuclear@3 135 prev_x = x;
nuclear@3 136 prev_y = y;
nuclear@3 137
nuclear@3 138 if(bnstate[0]) {
nuclear@5 139 user.rotate(dx * rot_speed, dy * rot_speed);
nuclear@3 140 redisplay();
nuclear@3 141 }
nuclear@0 142 }
nuclear@2 143
nuclear@2 144 void app_sball_motion(float x, float y, float z)
nuclear@2 145 {
nuclear@2 146 }
nuclear@2 147
nuclear@2 148 void app_sball_rotate(float x, float y, float z)
nuclear@2 149 {
nuclear@2 150 }
nuclear@2 151
nuclear@2 152 void app_sball_button(int bn, bool pressed)
nuclear@2 153 {
nuclear@2 154 }
nuclear@2 155
nuclear@2 156 static void draw_grid(int num, float sep)
nuclear@2 157 {
nuclear@2 158 int hnum = num / 2;
nuclear@5 159 float max_dist = (hnum - 1) * sep;
nuclear@2 160
nuclear@2 161 glBegin(GL_LINES);
nuclear@3 162 glColor3f(0.4, 0.4, 0.4);
nuclear@2 163 glVertex3f(0, 0, -max_dist);
nuclear@2 164 glVertex3f(0, 0, max_dist);
nuclear@2 165 glVertex3f(-max_dist, 0, 0);
nuclear@2 166 glVertex3f(max_dist, 0, 0);
nuclear@2 167
nuclear@2 168 for(int i=1; i<hnum; i++) {
nuclear@2 169 float x = i * sep;
nuclear@2 170
nuclear@2 171 glVertex3f(-x, 0, -max_dist);
nuclear@2 172 glVertex3f(-x, 0, max_dist);
nuclear@2 173 glVertex3f(x, 0, -max_dist);
nuclear@2 174 glVertex3f(x, 0, max_dist);
nuclear@2 175 glVertex3f(-max_dist, 0, -x);
nuclear@2 176 glVertex3f(max_dist, 0, -x);
nuclear@2 177 glVertex3f(-max_dist, 0, x);
nuclear@2 178 glVertex3f(max_dist, 0, x);
nuclear@2 179 }
nuclear@2 180 glEnd();
nuclear@2 181 }