hand-tracking and exhibits part one
[laserbrain_demo] / src / app.cc
index 0ac331b..63e7cd7 100644 (file)
@@ -349,19 +349,36 @@ static void update(float dt)
        mouse_view_matrix.pre_rotate_y(deg_to_rad(avatar.body_rot));
        mouse_view_matrix.pre_translate(-avatar.pos.x, -avatar.pos.y, -avatar.pos.z);
 
-       // check if an exhibit is hovered-over by mouse or 6dof (only if we don't have one grabbed)
-       if(!exsel_grab_mouse) {
-               // XXX note: using previous view/proj matrix lattency shouldn't be an issue but
-               //           make sure state-creep doesn't get us
-               // XXX also this mouse-picking probably should only be active in non-VR mode
-               Ray ray = calc_pick_ray(prev_mx, prev_my);
-               exsel_hover = exman->select(ray);
-       }
 
        // update hand-tracking
        if(have_handtracking) {
                update_vrhands(&avatar);
+
+               if(vrhand[0].valid) {
+                       exslot_left.node.set_position(vrhand[0].pos);
+                       exslot_left.node.set_rotation(vrhand[0].rot);
+
+                       // right hand takes precedence for hover
+                       if(!exsel_grab_left && !exsel_hover) {
+                               exsel_hover = exman->select(Sphere(vrhand[0].pos, 5));
+                       }
+               }
+               if(vrhand[1].valid) {
+                       exslot_right.node.set_position(vrhand[1].pos);
+                       exslot_right.node.set_rotation(vrhand[1].rot);
+
+                       if(!exsel_grab_right) {
+                               exsel_hover = exman->select(Sphere(vrhand[1].pos, 5));
+                       }
+               }
+
        } else {
+               // check if an exhibit is hovered-over by mouse (only if we don't have one grabbed)
+               if(!exsel_grab_mouse) {
+                       Ray ray = calc_pick_ray(prev_mx, prev_my);
+                       exsel_hover = exman->select(ray);
+               }
+
                // TODO do this properly
                // 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));
@@ -457,7 +474,6 @@ static void draw_scene()
        rend->draw();
        exman->draw();
 
-       /*
        if(have_handtracking) {
                Mat4 head_xform = inverse(mouse_view_matrix);//goatvr_head_matrix();
                Mat4 head_dir_xform = head_xform.upper3x3();
@@ -467,15 +483,15 @@ static void draw_scene()
                glDisable(GL_LIGHTING);
                glBegin(GL_LINES);
                for(int i=0; i<2; i++) {
-                       if(hand[i].valid) {
+                       if(vrhand[i].valid) {
                                glColor3f(i, 1 - i, i);
                        } else {
                                glColor3f(0.5, 0.5, 0.5);
                        }
-                       Vec3 v = head_xform * hand[i].pos;
-                       Vec3 dir = head_dir_xform * rotate(Vec3(0, 0, -1), hand[i].rot) * 20.0f;
-                       Vec3 up = head_dir_xform * rotate(Vec3(0, 1, 0), hand[i].rot) * 10.0f;
-                       Vec3 right = head_dir_xform * rotate(Vec3(1, 0, 0), hand[i].rot) * 10.0f;
+                       Vec3 v = head_xform * vrhand[i].pos;
+                       Vec3 dir = head_dir_xform * rotate(Vec3(0, 0, -1), vrhand[i].rot) * 20.0f;
+                       Vec3 up = head_dir_xform * rotate(Vec3(0, 1, 0), vrhand[i].rot) * 10.0f;
+                       Vec3 right = head_dir_xform * rotate(Vec3(1, 0, 0), vrhand[i].rot) * 10.0f;
 
                        glVertex3f(v.x, v.y, v.z);
                        glVertex3f(v.x + dir.x, v.y + dir.y, v.z + dir.z);
@@ -487,7 +503,6 @@ static void draw_scene()
                glEnd();
                glPopAttrib();
        }
-       */
 
        if(debug_gui && dbg_sel_node) {
                AABox bvol = dbg_sel_node->get_bounds();