X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fsnode.cc;h=eee5fcec02b26e266306b5eeaf36f23e1aa89f74;hp=bce8c0a4c42cbd995c91f8ee578d5702354fbf8e;hb=ad052fc67fe4e76d2f4a01b2381a738da1708cdb;hpb=215f16e2f26cc2acc79255bab06f13452ec06ae5 diff --git a/src/snode.cc b/src/snode.cc index bce8c0a..eee5fce 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -11,7 +11,7 @@ SceneNode::SceneNode() scene = 0; parent = 0; name = 0; - bvol_valid = false; + local_bvol_valid = false; } SceneNode::SceneNode(Object *obj) @@ -20,7 +20,7 @@ SceneNode::SceneNode(Object *obj) scene = 0; parent = 0; name = 0; - bvol_valid = false; + local_bvol_valid = false; add_object(obj); } @@ -55,8 +55,6 @@ 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) @@ -69,8 +67,6 @@ bool SceneNode::remove_child(SceneNode *node) node->parent = 0; node->scene = 0; children.erase(it); - - bvol_valid = false; return true; } return false; @@ -102,7 +98,7 @@ void SceneNode::add_object(Object *obj) this->obj.push_back(obj); obj->node = this; - bvol_valid = false; + local_bvol_valid = false; } bool SceneNode::remove_object(Object *o) @@ -118,7 +114,7 @@ bool SceneNode::remove_object(Object *o) } obj.erase(it); - bvol_valid = false; + local_bvol_valid = false; return true; } @@ -287,15 +283,54 @@ bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const return false; } -const Box &SceneNode::calc_bounds() +const AABox &SceneNode::calc_local_bounds() +{ + local_bvol = AABox(Vec3(FLT_MAX, FLT_MAX, FLT_MAX), Vec3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); + + // calculate the axis-aligned bounding box of all objects in this node + int nobj = obj.size(); + for(int i=0; iget_aabox(); + calc_bounding_aabox(&local_bvol, &local_bvol, &tmp); + } + + local_bvol_valid = true; + return local_bvol; +} + +const AABox &SceneNode::get_local_bounds() const { - // TODO + if(!local_bvol_valid) { + ((SceneNode*)this)->calc_local_bounds(); + } + return local_bvol; +} + +AABox SceneNode::get_node_bounds() const +{ + get_local_bounds(); // validate local_bvol + + // calculate the transformed local_bvol + Box node_bbox = Box(local_bvol, xform); + + // then calculate the axis-aligned bounding box + AABox aabox; + calc_bounding_aabox(&aabox, &node_bbox); + return aabox; } -const Box &SceneNode::get_bounds() const +AABox SceneNode::get_bounds() const { - if(!bvol_valid) { - return ((SceneNode*)this)->calc_bounds(); + AABox sub_aabb = AABox(Vec3(FLT_MAX, FLT_MAX, FLT_MAX), Vec3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); + + // calculate the bounding box of all children + int nchild = children.size(); + for(int i=0; iget_bounds(); + calc_bounding_aabox(&sub_aabb, &sub_aabb, &tmp); } - return bvol; + + AABox aabb; + calc_bounding_aabox(&aabb, &local_bvol, &sub_aabb); + return aabb; }