From: John Tsiombikas Date: Mon, 8 Jan 2018 05:11:25 +0000 (+0200) Subject: minor changes (bounds lazy eval state) X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=commitdiff_plain;h=82a1d96d9a18e94ccdc13b4bda0c470e81e70768 minor changes (bounds lazy eval state) --- diff --git a/src/snode.cc b/src/snode.cc index a1d41ae..bce8c0a 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -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; +} diff --git a/src/snode.h b/src/snode.h index 5af02f4..b88c1ae 100644 --- a/src/snode.h +++ b/src/snode.h @@ -3,6 +3,7 @@ #include #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_