+ free_program(sdr_foo);
+}
+
+#define STEP_INTERVAL 128
+
+void update(float dt)
+{
+ static long prev_step;
+ int dir;
+ int step[][2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
+
+ cgm_vec3 vdir = {0, 0, -1};
+
+ cgm_vmul_m3v3(&vdir, player.view_xform);
+
+ player.dir = (int)(2.0f * (-atan2(vdir.z, vdir.x) + M_PI) / M_PI + 0.5f) & 3;
+
+ if(time_msec - prev_step >= STEP_INTERVAL) {
+ if(input_state[INP_FWD]) {
+ player.cx += step[player.dir][0];
+ player.cy += step[player.dir][1];
+ prev_step = time_msec;
+ printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
+ }
+ if(input_state[INP_BACK]) {
+ player.cx -= step[player.dir][0];
+ player.cy -= step[player.dir][1];
+ prev_step = time_msec;
+ printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
+ }
+ if(input_state[INP_LEFT]) {
+ dir = (player.dir + 3) & 3;
+ player.cx += step[dir][0];
+ player.cy += step[dir][1];
+ prev_step = time_msec;
+ printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
+ }
+ if(input_state[INP_RIGHT]) {
+ dir = (player.dir + 1) & 3;
+ player.cx += step[dir][0];
+ player.cy += step[dir][1];
+ prev_step = time_msec;
+ printf("step[%d] %d,%d\n", player.dir, player.cx, player.cy);
+ }
+ memset(input_state, 0, sizeof input_state);
+ }
+
+ upd_player_xform(&player);