adding mirror plane options other than auto
[laserbrain_demo] / src / app.cc
index 9a46f4a..b61b0e7 100644 (file)
@@ -84,6 +84,8 @@ static Renderer *rend;
 
 static Ray last_pick_ray;
 
+static bool post_scene_init_pending = true;
+
 
 bool app_init(int argc, char **argv)
 {
@@ -206,6 +208,14 @@ bool app_init(int argc, char **argv)
        return true;
 }
 
+static void post_scene_init()
+{
+       int num_mir = mscn->calc_mirror_planes();
+       info_log("found %d mirror planes\n", num_mir);
+
+       exman->load(mscn, "data/exhibits");
+}
+
 void app_cleanup()
 {
        if(mscn->music) {
@@ -257,6 +267,11 @@ static void update(float dt)
        texman.update();
        sceneman.update();
 
+       if(post_scene_init_pending && !sceneman.pending()) {
+               post_scene_init_pending = false;
+               post_scene_init();
+       }
+
        mscn->update(dt);
        exman->update(dt);
        exui_update(dt);
@@ -349,19 +364,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 +489,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 +498,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 +518,6 @@ static void draw_scene()
                glEnd();
                glPopAttrib();
        }
-       */
 
        if(debug_gui && dbg_sel_node) {
                AABox bvol = dbg_sel_node->get_bounds();
@@ -614,8 +644,20 @@ void app_keyboard(int key, bool pressed)
                        show_message("VR recenter\n");
                        break;
 
-               case 'x':
-                       exman->load(mscn, "data/exhibits");
+               case KEY_UP:
+                       exui_scroll(-1);
+                       break;
+
+               case KEY_DOWN:
+                       exui_scroll(1);
+                       break;
+
+               case KEY_LEFT:
+                       exui_change_tab(-1);
+                       break;
+
+               case KEY_RIGHT:
+                       exui_change_tab(1);
                        break;
                }
        }