00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifdef HAVE_CONFIG_H
00019 # include <simgear_config.h>
00020 #endif
00021
00022 #include "BVHGroup.hxx"
00023
00024 #include <algorithm>
00025
00026 namespace simgear {
00027
00028 BVHGroup::BVHGroup()
00029 {
00030 }
00031
00032 BVHGroup::~BVHGroup()
00033 {
00034 ChildList::iterator i;
00035 for (i = _children.begin(); i != _children.end(); ++i) {
00036 (*i)->removeParent(this);
00037 *i = 0;
00038 }
00039 }
00040
00041 void
00042 BVHGroup::accept(BVHVisitor& visitor)
00043 {
00044 visitor.apply(*this);
00045 }
00046
00047 void
00048 BVHGroup::clear()
00049 {
00050 _children.clear();
00051 invalidateBound();
00052 }
00053
00054 void
00055 BVHGroup::addChild(BVHNode* child)
00056 {
00057 if (!child)
00058 return;
00059 ChildList::iterator i;
00060 i = std::find(_children.begin(), _children.end(), child);
00061 if (i != _children.end())
00062 return;
00063 invalidateBound();
00064 child->addParent(this);
00065 _children.push_back(child);
00066 }
00067
00068 void
00069 BVHGroup::removeChild(BVHNode* child)
00070 {
00071 if (!child)
00072 return;
00073 ChildList::iterator i;
00074 i = std::find(_children.begin(), _children.end(), child);
00075 if (i == _children.end())
00076 return;
00077 invalidateBound();
00078 child->removeParent(this);
00079 _children.erase(i);
00080 }
00081
00082 SGSphered
00083 BVHGroup::computeBoundingSphere() const
00084 {
00085 SGSphered sphere;
00086 ChildList::const_iterator i;
00087 for (i = _children.begin(); i != _children.end(); ++i)
00088 sphere.expandBy((*i)->getBoundingSphere());
00089 return sphere;
00090 }
00091
00092 }