+ mouse_look(dx * mouse_speed, dy * mouse_speed);
+ }
+}
+
+void app_gamepad_axis(int axis, float val)
+{
+ switch(axis) {
+ case 0:
+ joy_move.x = val;
+ break;
+ case 1:
+ joy_move.y = val;
+ break;
+
+ case 2:
+ joy_look.x = val;
+ break;
+ case 3:
+ joy_look.y = val;
+ break;
+ }
+}
+
+void app_gamepad_button(int bn, bool pressed)
+{
+ gpad_bnstate[bn] = pressed;
+
+ if(pressed) {
+ switch(bn) {
+ case GPAD_LSTICK:
+ toggle_flight();
+ break;
+
+ case GPAD_X:
+ show_blobs = !show_blobs;
+ show_message("blobs: %s\n", show_blobs ? "on" : "off");
+ break;
+
+ case GPAD_START:
+ goatvr_recenter();
+ show_message("VR recenter\n");
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+static void toggle_flight()
+{
+ static float prev_walk_speed = -1.0;
+ if(prev_walk_speed < 0.0) {
+ noclip = true;
+ prev_walk_speed = walk_speed;
+ walk_speed = 1000.0;
+ show_message("fly mode\n");
+ } else {
+ noclip = false;
+ walk_speed = prev_walk_speed;
+ prev_walk_speed = -1.0;
+ show_message("walk mode\n");
+ }
+}
+
+static void calc_framerate()
+{
+ static int ncalc;
+ static int nframes;
+ static long prev_upd;
+
+ long elapsed = time_msec - prev_upd;
+ if(elapsed >= 1000) {
+ framerate = (float)nframes / (float)(elapsed * 0.001);
+ nframes = 1;
+ prev_upd = time_msec;
+
+ /*if(++ncalc >= 5) {
+ printf("fps: %f\n", framerate);
+ ncalc = 0;
+ }*/
+ } else {
+ ++nframes;