foo
[laserbrain_demo] / src / app.cc
index 8aaaee3..7f173f3 100644 (file)
@@ -21,6 +21,7 @@
 #include "blob_exhibit.h"
 #include "dbg_gui.h"
 #include "geomdraw.h"
+#include "ui_exhibit.h"
 
 #define NEAR_CLIP      5.0
 #define FAR_CLIP       10000.0
@@ -71,7 +72,6 @@ static unsigned int sdr_post_gamma;
 static long prev_msec;
 
 static ExhibitManager *exman;
-static BlobExhibit *blobs;
 static bool show_blobs;
 
 ExSelection exsel_active, exsel_hover;
@@ -147,8 +147,6 @@ bool app_init(int argc, char **argv)
        float ambient[] = {0.0, 0.0, 0.0, 0.0};
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
 
-       glClearColor(1, 1, 1, 1);
-
        init_audio();
 
        if(!init_vrhands()) {
@@ -171,15 +169,11 @@ bool app_init(int argc, char **argv)
                //return false;
        }
        */
-
-       blobs = new BlobExhibit;
-       blobs->node = new SceneNode;
-       blobs->init();
-       blobs->node->set_position(Vec3(-680, 160, -100));
-       blobs->node->set_scaling(Vec3(28, 28, 28));
-       blobs->node->update(0);
-
-       exman->add(blobs);
+       if(!exui_init()) {
+               error_log("failed to initialize exhibit ui system\n");
+               return false;
+       }
+       exui_setnode(&exslot_left.node);
 
        if(!(sdr_ltmap_notex = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-notex.p.glsl"))) {
                return false;
@@ -227,6 +221,8 @@ void app_cleanup()
 
        delete rend;
 
+       exui_shutdown();
+
        /* this must be destroyed before the scene graph to detach exhibit nodes
         * before the scene tries to delete them recursively
         */
@@ -263,6 +259,7 @@ static void update(float dt)
 
        mscn->update(dt);
        exman->update(dt);
+       exui_update(dt);
 
        float speed = walk_speed * dt;
        Vec3 dir;
@@ -361,13 +358,19 @@ static void update(float dt)
                exsel_hover = exman->select(ray);
        }
 
-       if(!exslot_left.empty()) exslot_left.node.update(dt);
-       if(!exslot_right.empty()) exslot_right.node.update(dt);
-
        // update hand-tracking
        if(have_handtracking) {
                update_vrhands(&avatar);
+       } else {
+               // TODO do this properly
+               // set the position of the left hand at a suitable position for the exhibit UI
+               dir = transpose(mouse_view_matrix.upper3x3()) * Vec3(-0.47, 0, -1);
+               exslot_left.node.set_position(avatar.pos + dir * 30); // magic: distance in front
        }
+
+       if(!exslot_right.empty()) exslot_right.node.update(dt);
+       // always update the left slot, because it's the anchor point of the exhibit ui
+       exslot_left.node.update(dt);
 }
 
 void app_display()
@@ -382,6 +385,8 @@ void app_display()
                ImGui::ShowTestWindow();
        }
 
+       glClearColor(1, 1, 1, 1);
+
        if(opt.vr) {
                // VR mode
                goatvr_draw_start();
@@ -508,6 +513,8 @@ static void draw_scene()
                glPopAttrib();
        }
 
+       exui_draw();
+
        print_text(Vec2(9 * win_width / 10, 20), Vec3(1, 1, 0), "fps: %.1f", framerate);
        draw_ui();
 }