X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fapp.cc;h=7f173f35a1fafea2fafa93ee75334371ded9a4dc;hp=88650127400fac125079e63d9cee5ec0467529a5;hb=a65c61e066fecc441ebf651987dc56deb78a4247;hpb=91c5d07b779f24afec373047afe401b8811811c7 diff --git a/src/app.cc b/src/app.cc index 8865012..7f173f3 100644 --- a/src/app.cc +++ b/src/app.cc @@ -20,6 +20,8 @@ #include "exman.h" #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 @@ -70,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; @@ -146,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()) { @@ -170,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; @@ -226,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 */ @@ -262,6 +259,7 @@ static void update(float dt) mscn->update(dt); exman->update(dt); + exui_update(dt); float speed = walk_speed * dt; Vec3 dir; @@ -360,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() @@ -381,6 +385,8 @@ void app_display() ImGui::ShowTestWindow(); } + glClearColor(1, 1, 1, 1); + if(opt.vr) { // VR mode goatvr_draw_start(); @@ -483,6 +489,11 @@ static void draw_scene() } */ + if(debug_gui && dbg_sel_node) { + AABox bvol = dbg_sel_node->get_bounds(); + draw_geom_object(&bvol); + } + if(show_walk_mesh && mscn->walk_mesh) { glPushAttrib(GL_ENABLE_BIT); glEnable(GL_BLEND); @@ -502,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(); } @@ -648,17 +661,19 @@ void app_mouse_button(int bn, bool pressed, int x, int y) } else { if(exsel_grab_mouse) { // cancel grab on mouse release - debug_log("releasing...\n"); Exhibit *ex = exsel_grab_mouse.ex; Vec3 pos = exslot_mouse.node.get_position(); - debug_log("release location: %g %g %g\n", pos.x, pos.y, pos.z); - ExhibitSlot *slot = exman->nearest_empty_slot(pos); + debug_log("releasing at %g %g %g ...\n", pos.x, pos.y, pos.z); + + exslot_mouse.detach_exhibit(); + + ExhibitSlot *slot = exman->nearest_empty_slot(pos, 100); if(!slot) { - debug_log("no nearby slot\n"); + debug_log("no empty slot nearby\n"); if(ex->prev_slot && ex->prev_slot->empty()) { slot = ex->prev_slot; - debug_log("previous slot available though\n"); + debug_log("using previous slot"); } }