00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "BVHNode.hxx"
00019
00020 #include <algorithm>
00021 #include <simgear/structure/SGAtomic.hxx>
00022 #include <simgear/math/SGGeometry.hxx>
00023
00024 namespace simgear {
00025
00026 BVHNode::BVHNode() :
00027 _dirtyBoundingSphere(true)
00028 {
00029 }
00030
00031 BVHNode::~BVHNode()
00032 {
00033 }
00034
00035 BVHNode::Id
00036 BVHNode::getNewId()
00037 {
00038 static SGAtomic id(0);
00039 return ++id;
00040 }
00041
00042 void
00043 BVHNode::addParent(BVHNode* parent)
00044 {
00045
00046 ParentList::iterator i;
00047 i = std::find(_parents.begin(), _parents.end(), parent);
00048 if (i != _parents.end())
00049 return;
00050
00051 _parents.push_back(parent);
00052 }
00053
00054 void
00055 BVHNode::removeParent(BVHNode* parent)
00056 {
00057 ParentList::iterator i;
00058 i = std::find(_parents.begin(), _parents.end(), parent);
00059 if (i == _parents.end())
00060 return;
00061 _parents.erase(i);
00062 }
00063
00064 void
00065 BVHNode::invalidateParentBound()
00066 {
00067 for (ParentList::iterator i = _parents.begin(); i != _parents.end(); ++i)
00068 (*i)->invalidateBound();
00069 }
00070
00071 void
00072 BVHNode::invalidateBound()
00073 {
00074 if (_dirtyBoundingSphere)
00075 return;
00076 invalidateParentBound();
00077 _dirtyBoundingSphere = true;
00078 }
00079
00080 }