hand-tracking and exhibits part one
[laserbrain_demo] / src / exhibit.cc
index 8653343..b598b75 100644 (file)
@@ -1,41 +1,81 @@
 #include "exhibit.h"
 #include "snode.h"
+#include "scene.h"
 
+ExSelection ExSelection::null;
+
+
+// selection
+ExSelection::ExSelection(Exhibit *ex)
+{
+       this->ex = ex;
+       obj = data = 0;
+       validmask = 0;
+}
+
+ExSelection::operator bool() const
+{
+       return ex != 0;
+}
+
+// Exhibit data
+ExData::ExData()
+{
+       voice = 0;
+}
+
+ExData::~ExData()
+{
+       delete voice;
+}
+
+// exhibit class
 Exhibit::Exhibit()
 {
+       orig_parent = 0;
+       prev_slot = 0;
 }
 
-void *Exhibit::select(const Ray &ray) const
+Exhibit::~Exhibit()
 {
-       return 0;       // TODO
 }
 
-void *Exhibit::select(const Sphere &sph) const
+void Exhibit::set_node(SceneNode *node)
 {
-       return 0;       // TODO
+       this->node = node;
+       orig_parent = node->get_parent();
 }
 
-void Exhibit::update(float dt)
+ExSelection Exhibit::select(const Ray &ray) const
 {
+       ExSelection sel;
+       HitPoint hit;
+       if(get_aabox().intersect(ray, &hit)) {
+               sel.ex = (Exhibit*)this;
+               sel.selray = ray;
+               sel.dist = hit.dist;
+               sel.validmask = EXSEL_RAY;
+       }
+       return sel;
 }
 
-void Exhibit::pre_draw() const
+ExSelection Exhibit::select(const Sphere &sph) const
 {
-       if(node) {
-               glMatrixMode(GL_MODELVIEW);
-               glPushMatrix();
-               glMultMatrixf(node->get_matrix()[0]);
+       ExSelection sel;
+       if(collision_sphere_aabox(sph, get_aabox())) {
+               sel.ex = (Exhibit*)this;
+               sel.selsphere = sph;
+               sel.validmask = EXSEL_SPHERE;
        }
+       return sel;
 }
 
-void Exhibit::draw() const
+void Exhibit::update(float dt)
 {
 }
 
-void Exhibit::post_draw() const
+const AABox &Exhibit::get_aabox() const
 {
-       if(node) {
-               glMatrixMode(GL_MODELVIEW);
-               glPopMatrix();
-       }
+       aabb = node->get_bounds();
+       return aabb;
 }