moving the first exhibit, no picking yet
[laserbrain_demo] / src / app.cc
index 1c27685..6c9f374 100644 (file)
@@ -26,6 +26,7 @@
 static void draw_scene();
 static void toggle_flight();
 static void calc_framerate();
+static Ray calc_pick_ray(int x, int y, const Mat4 &view_mat, const Mat4 &proj_mat);
 
 long time_msec;
 int win_width, win_height;
@@ -69,6 +70,8 @@ static ExhibitManager *exman;
 static BlobExhibit *blobs;
 static bool show_blobs;
 
+static ExSelection ex_sel;
+
 static Renderer *rend;
 
 
@@ -581,7 +584,6 @@ void app_keyboard(int key, bool pressed)
                        break;
 
                case 'x':
-                       exman->clear();
                        exman->load(mscn, "data/exhibits");
                        break;
                }
@@ -602,6 +604,17 @@ void app_mouse_button(int bn, bool pressed, int x, int y)
        prev_mx = x;
        prev_my = y;
        bnstate[bn] = pressed;
+
+       if(bn == 0) {
+               if(!pressed) {
+                       if(ex_sel.ex) {
+                               ex_sel.ex = 0;
+                       } else {
+                               Ray ray = calc_pick_ray(x, y, view_matrix, proj_matrix);
+                               ex_sel = exman->select(ray);
+                       }
+               }
+       }
 }
 
 static inline void mouse_look(float dx, float dy)
@@ -634,11 +647,15 @@ void app_mouse_motion(int x, int y)
 
        if(!dx && !dy) return;
 
-       if(bnstate[0]) {
-               mouse_look(dx, dy);
+       if(ex_sel.ex) {
+               Vec3 pos = ex_sel.ex->node->get_node_position();
+               Vec3 dir = transpose(view_matrix.upper3x3()) * Vec3(dx * 1.0, dy * -1.0, 0);
+
+               ex_sel.ex->node->set_position(pos + dir);
        }
+
        if(bnstate[2]) {
-               mouse_zoom(dx, dy);
+               mouse_look(dx, dy);
        }
 }
 
@@ -739,3 +756,8 @@ static void calc_framerate()
                ++nframes;
        }
 }
+
+static Ray calc_pick_ray(int x, int y, const Mat4 &view_mat, const Mat4 &proj_mat)
+{
+       return Ray();   // TODO
+}