moving the first exhibit, no picking yet
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 10 Jan 2018 04:51:37 +0000 (06:51 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 10 Jan 2018 04:51:37 +0000 (06:51 +0200)
src/app.cc
src/exman.cc

index 1c27685..6c9f374 100644 (file)
@@ -26,6 +26,7 @@
 static void draw_scene();
 static void toggle_flight();
 static void calc_framerate();
 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;
 
 long time_msec;
 int win_width, win_height;
@@ -69,6 +70,8 @@ static ExhibitManager *exman;
 static BlobExhibit *blobs;
 static bool show_blobs;
 
 static BlobExhibit *blobs;
 static bool show_blobs;
 
+static ExSelection ex_sel;
+
 static Renderer *rend;
 
 
 static Renderer *rend;
 
 
@@ -581,7 +584,6 @@ void app_keyboard(int key, bool pressed)
                        break;
 
                case 'x':
                        break;
 
                case 'x':
-                       exman->clear();
                        exman->load(mscn, "data/exhibits");
                        break;
                }
                        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;
        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)
 }
 
 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(!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]) {
        if(bnstate[2]) {
-               mouse_zoom(dx, dy);
+               mouse_look(dx, dy);
        }
 }
 
        }
 }
 
@@ -739,3 +756,8 @@ static void calc_framerate()
                ++nframes;
        }
 }
                ++nframes;
        }
 }
+
+static Ray calc_pick_ray(int x, int y, const Mat4 &view_mat, const Mat4 &proj_mat)
+{
+       return Ray();   // TODO
+}
index 28f3700..900d860 100644 (file)
@@ -84,18 +84,35 @@ bool ExhibitManager::load(MetaScene *mscn, const char *fname)
 
 ExSelection ExhibitManager::select(const Ray &ray) const
 {
 
 ExSelection ExhibitManager::select(const Ray &ray) const
 {
-       return ExSelection();   // TODO
+       ExSelection sel;
+       if(!items.empty()) {
+               sel.ex = items[0];
+               sel.selray = ray;
+               sel.validmask = EXSEL_RAY;
+       }
+       return sel;     // TODO
 }
 
 ExSelection ExhibitManager::select(const Sphere &sph) const
 {
 }
 
 ExSelection ExhibitManager::select(const Sphere &sph) const
 {
-       return ExSelection();   // TODO
+       ExSelection sel;
+       if(!items.empty()) {
+               sel.ex = items[0];
+               sel.selsphere = sph;
+               sel.validmask = EXSEL_SPHERE;
+       }
+       return sel;     // TODO
 }
 
 void ExhibitManager::update(float dt)
 {
        int num = items.size();
        for(int i=0; i<num; i++) {
 }
 
 void ExhibitManager::update(float dt)
 {
        int num = items.size();
        for(int i=0; i<num; i++) {
+               // if the exhibit is not part of a scene graph, first call its
+               // node's update function (otherwise it'll have been called recursively earlier)
+               if(!items[i]->node->get_parent()) {
+                       items[i]->node->update(dt);
+               }
                items[i]->update(dt);
        }
 }
                items[i]->update(dt);
        }
 }