minor changes (bounds lazy eval state)
authorJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 8 Jan 2018 05:11:25 +0000 (07:11 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 8 Jan 2018 05:11:25 +0000 (07:11 +0200)
src/snode.cc
src/snode.h

index a1d41ae..bce8c0a 100644 (file)
@@ -11,6 +11,7 @@ SceneNode::SceneNode()
        scene = 0;
        parent = 0;
        name = 0;
+       bvol_valid = false;
 }
 
 SceneNode::SceneNode(Object *obj)
@@ -19,6 +20,7 @@ SceneNode::SceneNode(Object *obj)
        scene = 0;
        parent = 0;
        name = 0;
+       bvol_valid = false;
        add_object(obj);
 }
 
@@ -53,6 +55,8 @@ void SceneNode::add_child(SceneNode *node)
        children.push_back(node);
        node->parent = this;
        node->scene = scene;
+
+       bvol_valid = false;
 }
 
 bool SceneNode::remove_child(SceneNode *node)
@@ -65,6 +69,8 @@ bool SceneNode::remove_child(SceneNode *node)
                node->parent = 0;
                node->scene = 0;
                children.erase(it);
+
+               bvol_valid = false;
                return true;
        }
        return false;
@@ -95,6 +101,8 @@ void SceneNode::add_object(Object *obj)
 
        this->obj.push_back(obj);
        obj->node = this;
+
+       bvol_valid = false;
 }
 
 bool SceneNode::remove_object(Object *o)
@@ -109,6 +117,8 @@ bool SceneNode::remove_object(Object *o)
                return false;
        }
        obj.erase(it);
+
+       bvol_valid = false;
        return true;
 }
 
@@ -276,3 +286,16 @@ bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const
        }
        return false;
 }
+
+const Box &SceneNode::calc_bounds()
+{
+       // TODO
+}
+
+const Box &SceneNode::get_bounds() const
+{
+       if(!bvol_valid) {
+               return ((SceneNode*)this)->calc_bounds();
+       }
+       return bvol;
+}
index 5af02f4..b88c1ae 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <vector>
 #include "object.h"
+#include "geom.h"
 #include "gmath/gmath.h"
 
 class Scene;
@@ -23,6 +24,9 @@ private:
        Mat4 xform;
        Mat4 inv_xform;
 
+       mutable bool bvol_valid;
+       mutable Box bvol;
+
 public:
        Scene *scene;   // scene to which this node belongs
        Mat4 dbg_xform;
@@ -69,6 +73,9 @@ public:
        void apply_xform();
 
        bool intersect(const Ray &ray, HitPoint *hit) const;
+
+       const Box &calc_bounds();
+       const Box &get_bounds() const;
 };
 
 #endif // SNODE_H_