From: John Tsiombikas Date: Thu, 13 Sep 2018 02:00:34 +0000 (+0300) Subject: exhibit ui improvements, and exhibit repositioning fix X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=commitdiff_plain;h=2fd19c29d765f973a757807d4e051e09495b47b4 exhibit ui improvements, and exhibit repositioning fix --- diff --git a/src/app.cc b/src/app.cc index 91de3f4..047c1eb 100644 --- a/src/app.cc +++ b/src/app.cc @@ -180,6 +180,10 @@ bool app_init(int argc, char **argv) return false; } exui_setnode(&exslot_left.node); + if(have_handtracking) { + exui_scale(2); + exui_rotation(Vec3(-deg_to_rad(35), 0, 0)); + } if(!fb_srgb) { sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl"); @@ -278,7 +282,6 @@ static void update(float dt) mscn->update(dt); exman->update(dt); - exui_update(dt); // use goatvr sticks for joystick input int num_vr_sticks = goatvr_num_sticks(); @@ -399,7 +402,7 @@ static void update(float dt) for(int i=0; i<2; i++) { if(vrhand[i].valid) { exslot[i]->node.set_position(vrhand[i].pos); - exslot[i]->node.set_rotation(vrhand[i].rot * exslot[i]->rotation); + exslot[i]->node.set_rotation(vrhand[i].rot * exslot[i]->grab_rot); bool act_grab = goatvr_action(i, GOATVR_ACTION_GRAB) != 0; @@ -411,9 +414,9 @@ static void update(float dt) if(act_grab) { // grab an exhibit *exsel_grab[i] = sel; - exslot[i]->rotation = sel.ex->node->get_rotation(); - debug_log("Grabbing with rot: %f %f %f %f\n", exslot[i]->rotation.x, - exslot[i]->rotation.y, exslot[i]->rotation.z, exslot[i]->rotation.w); + //SceneNode *objnode = sel.ex->node->find_object_node(); + //exslot[i]->rotation = normalize(sel.ex->node->get_rotation()); + exslot[i]->grab_rot = inverse(vrhand[i].rot); exslot[i]->attach_exhibit(sel.ex, EXSLOT_ATTACH_TRANSIENT); if(exsel_active) { exsel_active = ExSelection::null; // cancel active on grab @@ -439,7 +442,8 @@ static void update(float dt) } if(slot) { - ex->node->set_rotation(exslot[i]->node.get_rotation()); + Quat rot = normalize(exslot[i]->node.get_rotation()); + ex->node->set_rotation(rot); slot->attach_exhibit(ex); } else { // nowhere to put it, stash it for later @@ -448,6 +452,7 @@ static void update(float dt) } *exsel_grab[i] = ExSelection::null; + exslot[i]->grab_rot = Quat::identity; } } } @@ -459,7 +464,7 @@ static void update(float dt) Ray ray; ray.origin = vrhand[1].pos; ray.dir = rotate(Vec3(0, 0, -1), vrhand[1].rot); - //exsel_active = exman->select(ray); + exsel_active = exman->select(ray); pointing = true; } else { exsel_active = ExSelection::null; @@ -478,11 +483,17 @@ static void update(float dt) // set the position of the left hand at a suitable position for the exhibit UI dir = rotate(Vec3(-0.46, -0.1, -1), Vec3(0, 1, 0), deg_to_rad(-avatar.body_rot)); exslot_left.node.set_position(avatar.pos + dir * 30); // magic: distance in front + Quat rot; + rot.set_rotation(Vec3(0, 1, 0), deg_to_rad(-avatar.body_rot)); + exslot_left.node.set_rotation(rot); } 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); + + // need to call this *after* we have updated the active exhibit (if any) + exui_update(dt); } void app_display() @@ -531,9 +542,11 @@ void app_display() glLoadMatrixf(view_matrix[0]); draw_scene(); + /* if(have_handtracking) { draw_vrhands(); } + */ if(debug_gui) { ImGui::Render(); @@ -595,15 +608,18 @@ static void draw_scene() glDisable(GL_LIGHTING); glBegin(GL_LINES); for(int i=0; i<2; i++) { + // skip drawing the left hand when we're showing the exhibit gui + if(exsel_active && i == 0) continue; + if(vrhand[i].valid) { glColor3f(i, 1 - i, i); } else { glColor3f(0.5, 0.5, 0.5); } Vec3 v = vrhand[i].pos; - Vec3 dir = rotate(Vec3(0, 0, -1), vrhand[i].rot) * 20.0f; - Vec3 up = rotate(Vec3(0, 1, 0), vrhand[i].rot) * 10.0f; - Vec3 right = rotate(Vec3(1, 0, 0), vrhand[i].rot) * 10.0f; + Vec3 dir = rotate(Vec3(0, 0, -1), vrhand[i].rot) * 10.0f; + Vec3 up = rotate(Vec3(0, 1, 0), vrhand[i].rot) * 5.0f; + Vec3 right = rotate(Vec3(1, 0, 0), vrhand[i].rot) * 5.0f; if(i == 1 && pointing) { dir *= 1000.0f; diff --git a/src/exman.h b/src/exman.h index d7d64fa..8b9b65a 100644 --- a/src/exman.h +++ b/src/exman.h @@ -17,7 +17,7 @@ private: Exhibit *ex; public: - Quat rotation; + Quat rotation, grab_rot; SceneNode node; ExhibitSlot(Exhibit *ex = 0); diff --git a/src/snode.cc b/src/snode.cc index 2484e6e..8305302 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -89,6 +89,18 @@ SceneNode *SceneNode::get_parent() const return parent; } +SceneNode *SceneNode::find_object_node() const +{ + if(!obj.empty()) return (SceneNode*)this; + + int numc = get_num_children(); + for(int i=0; ifind_object_node(); + if(n) return n; + } + return 0; +} + void SceneNode::add_object(Object *obj) { if(obj->node == this) return; diff --git a/src/snode.h b/src/snode.h index 6fa52ba..00e1798 100644 --- a/src/snode.h +++ b/src/snode.h @@ -47,6 +47,8 @@ public: SceneNode *get_parent() const; + SceneNode *find_object_node() const; + void add_object(Object *obj); bool remove_object(Object *obj); diff --git a/src/ui_exhibit.cc b/src/ui_exhibit.cc index 87fea01..438a52e 100644 --- a/src/ui_exhibit.cc +++ b/src/ui_exhibit.cc @@ -29,12 +29,15 @@ static unsigned int fontsdr; static float aspect; static int ui_width, ui_height; +static Mat4 tilt_matrix; + static RenderTarget *rtarg; static const SceneNode *parent; static Vec3 pos; static Vec2 size; static int text_padding; static float text_scale = 0.65f; +static float scale = 1.0f; static Exhibit *ex; static int vis_tab, num_tabs; static std::vector tab_names; @@ -64,10 +67,14 @@ bool exui_init() return false; } + tilt_matrix = Mat4::identity; + size.x = 15; size.y = 18; text_padding = 6; + scale = 1.0f; + aspect = size.x / size.y; ui_height = 512; ui_width = ui_height * aspect; @@ -92,6 +99,16 @@ void exui_setnode(const SceneNode *node) parent = node; } +void exui_rotation(const Vec3 &euler) +{ + tilt_matrix.rotation(euler); +} + +void exui_scale(float s) +{ + scale = s; +} + void exui_change_tab(int dir) { vis_tab = (vis_tab + dir) % num_tabs; @@ -205,6 +222,7 @@ void exui_draw() glMatrixMode(GL_MODELVIEW); glPushMatrix(); + /* Mat4 mvmat; glGetFloatv(GL_MODELVIEW_MATRIX, mvmat[0]); if(parent) { @@ -215,11 +233,20 @@ void exui_draw() mvmat[0][0] = mvmat[1][1] = mvmat[2][2] = 1.0f; mvmat[0][1] = mvmat[0][2] = mvmat[1][0] = mvmat[2][0] = mvmat[1][2] = mvmat[2][1] = 0.0f; glLoadMatrixf(mvmat[0]); + */ + Mat4 xform; + if(parent) { + xform = parent->get_matrix(); + } + xform = tilt_matrix * xform; + xform.pre_scale(scale, scale, scale); + glMultMatrixf(xform[0]); glPushAttrib(GL_ENABLE_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glEnable(GL_TEXTURE_2D); + glDisable(GL_CULL_FACE); glDepthMask(0); glUseProgram(0); diff --git a/src/ui_exhibit.h b/src/ui_exhibit.h index 335e23e..73e2947 100644 --- a/src/ui_exhibit.h +++ b/src/ui_exhibit.h @@ -8,6 +8,8 @@ class SceneNode; bool exui_init(); void exui_shutdown(); void exui_setnode(const SceneNode *node); +void exui_rotation(const Vec3 &euler); +void exui_scale(float s); void exui_change_tab(int dir); void exui_scroll(float delta);