]> git.mxchange.org Git - simgear.git/blob - simgear/scene/bvh/BVHNode.cxx
Initial commit of the bounding volume tree implementation.
[simgear.git] / simgear / scene / bvh / BVHNode.cxx
1 // Copyright (C) 2008 - 2009  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Library General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16 //
17
18 #include "BVHNode.hxx"
19
20 #include <algorithm>
21 #include <simgear/math/SGGeometry.hxx>
22
23 namespace simgear {
24
25 BVHNode::BVHNode() :
26     _dirtyBoundingSphere(true)
27 {
28 }
29
30 BVHNode::~BVHNode()
31 {
32 }
33
34 void
35 BVHNode::addParent(BVHNode* parent)
36 {
37     // should not happen, but be paranoid ...
38     ParentList::iterator i;
39     i = std::find(_parents.begin(), _parents.end(), parent);
40     if (i != _parents.end())
41         return;
42     // add to the parents list ...
43     _parents.push_back(parent);
44 }
45
46 void
47 BVHNode::removeParent(BVHNode* parent)
48 {
49     ParentList::iterator i;
50     i = std::find(_parents.begin(), _parents.end(), parent);
51     if (i == _parents.end())
52         return;
53     _parents.erase(i);
54 }
55
56 void
57 BVHNode::invalidateParentBound()
58 {
59     for (ParentList::iterator i = _parents.begin(); i != _parents.end(); ++i)
60         (*i)->invalidateBound();
61 }
62
63 void
64 BVHNode::invalidateBound()
65 {
66     if (_dirtyBoundingSphere)
67         return;
68     invalidateParentBound();
69     _dirtyBoundingSphere = true;
70 }
71
72 }