exhibits
[laserbrain_demo] / src / app.cc
index 95f7a05..1c27685 100644 (file)
@@ -18,6 +18,7 @@
 #include "vrinput.h"
 #include "exman.h"
 #include "blob_exhibit.h"
+#include "dbg_gui.h"
 
 #define NEAR_CLIP      5.0
 #define FAR_CLIP       10000.0
@@ -101,6 +102,8 @@ bool app_init(int argc, char **argv)
                printf("Framebuffer %s sRGB-capable\n", srgb_capable ? "is" : "is not");
                if(srgb_capable) {
                        glEnable(GL_FRAMEBUFFER_SRGB);
+               } else {
+                       fb_srgb = 0;
                }
        }
 
@@ -110,6 +113,10 @@ bool app_init(int argc, char **argv)
        glEnable(GL_LIGHTING);
        glEnable(GL_NORMALIZE);
 
+       if(!init_debug_gui()) {
+               return false;
+       }
+
        Mesh::use_custom_sdr_attr = false;
 
        float ambient[] = {0.0, 0.0, 0.0, 0.0};
@@ -134,9 +141,11 @@ bool app_init(int argc, char **argv)
        avatar.body_rot = rad_to_deg(acos(dot(dir, Vec3(0, 0, 1))));
 
        exman = new ExhibitManager;
+       /*
        if(!exman->load(mscn, "data/exhibits")) {
                //return false;
        }
+       */
 
        blobs = new BlobExhibit;
        blobs->node = new SceneNode;
@@ -197,6 +206,8 @@ void app_cleanup()
 
        texman.clear();
        sceneman.clear();
+
+       cleanup_debug_gui();
 }
 
 static bool constrain_walk_mesh(const Vec3 &v, Vec3 *newv)
@@ -336,6 +347,13 @@ void app_display()
        float dt = (float)(time_msec - prev_msec) / 1000.0f;
        prev_msec = time_msec;
 
+       if(debug_gui) {
+               ImGui::GetIOPtr()->DeltaTime = dt;
+               ImGui::NewFrame();
+
+               ImGui::ShowTestWindow();
+       }
+
        if(opt.vr) {
                // VR mode
                goatvr_draw_start();
@@ -359,6 +377,10 @@ void app_display()
                        if(have_handtracking) {
                                draw_vrhands();
                        }
+
+                       if(debug_gui) {
+                               ImGui::Render();
+                       }
                }
                goatvr_draw_done();
 
@@ -385,6 +407,10 @@ void app_display()
                        slow_post(sdr_post_gamma);
                        glUseProgram(0);
                }
+
+               if(debug_gui) {
+                       ImGui::Render();
+               }
                app_swap_buffers();
        }
        assert(glGetError() == GL_NO_ERROR);
@@ -401,10 +427,7 @@ static void draw_scene()
        set_light(2, lpos[2], Vec3(0.8, 1.0, 0.8) * 0.3);
 
        rend->draw();
-
-       if(show_blobs) {
-               blobs->draw();
-       }
+       exman->draw();
 
        /*
        if(have_handtracking) {
@@ -467,12 +490,18 @@ void app_reshape(int x, int y)
 {
        glViewport(0, 0, x, y);
        goatvr_set_fb_size(x, y, 1.0f);
+       debug_gui_reshape(x, y);
 }
 
 void app_keyboard(int key, bool pressed)
 {
        unsigned int mod = app_get_modifiers();
 
+       if(debug_gui && !(pressed && (key == '`' || key == 27))) {
+               debug_gui_key(key, pressed, mod);
+               return; // ignore all keystrokes when GUI is visible
+       }
+
        if(pressed) {
                switch(key) {
                case 27:
@@ -487,6 +516,11 @@ void app_keyboard(int key, bool pressed)
                        break;
 
                case '`':
+                       debug_gui = !debug_gui;
+                       show_message("debug gui %s", debug_gui ? "enabled" : "disabled");
+                       break;
+
+               case 'm':
                        app_toggle_grab_mouse();
                        show_message("mouse %s", app_is_mouse_grabbed() ? "grabbed" : "released");
                        break;
@@ -545,6 +579,11 @@ void app_keyboard(int key, bool pressed)
                        goatvr_recenter();
                        show_message("VR recenter\n");
                        break;
+
+               case 'x':
+                       exman->clear();
+                       exman->load(mscn, "data/exhibits");
+                       break;
                }
        }
 
@@ -555,6 +594,11 @@ void app_keyboard(int key, bool pressed)
 
 void app_mouse_button(int bn, bool pressed, int x, int y)
 {
+       if(debug_gui) {
+               debug_gui_mbutton(bn, pressed, x, y);
+               return; // ignore mouse events while GUI is visible
+       }
+
        prev_mx = x;
        prev_my = y;
        bnstate[bn] = pressed;
@@ -578,6 +622,11 @@ static void mouse_zoom(float dx, float dy)
 
 void app_mouse_motion(int x, int y)
 {
+       if(debug_gui) {
+               debug_gui_mmotion(x, y);
+               return; // ignore mouse events while GUI is visible
+       }
+
        int dx = x - prev_mx;
        int dy = y - prev_my;
        prev_mx = x;
@@ -602,6 +651,13 @@ void app_mouse_delta(int dx, int dy)
        }
 }
 
+void app_mouse_wheel(int dir)
+{
+       if(debug_gui) {
+               debug_gui_wheel(dir);
+       }
+}
+
 void app_gamepad_axis(int axis, float val)
 {
        switch(axis) {