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 #ifndef BVHNode_hxx 19 #define BVHNode_hxx 20 21 #include <vector> 22 #include <simgear/math/SGGeometry.hxx> 23 #include <simgear/structure/SGReferenced.hxx> 24 25 namespace simgear { 26 27 class BVHGroup; 28 class BVHVisitor; 29 class BVHPageNode; 30 31 // Base for the tree nodes 32 class BVHNode : public SGReferenced { 33 public: 34 BVHNode(); 35 virtual ~BVHNode(); 36 37 // visitors ... 38 virtual void accept(BVHVisitor& visitor) = 0; 39 getBoundingSphere() const40 const SGSphered& getBoundingSphere() const 41 { 42 if (_dirtyBoundingSphere) { 43 _boundingSphere = computeBoundingSphere(); 44 _dirtyBoundingSphere = false; 45 } 46 return _boundingSphere; 47 } 48 virtual SGSphered computeBoundingSphere() const = 0; 49 50 /// A unique id for some kind of BVHNodes. 51 /// Currently only motions transforms. 52 typedef unsigned Id; 53 54 // Factory to get a new id 55 static Id getNewId(); 56 57 protected: 58 friend class BVHGroup; 59 friend class BVHPageNode; 60 void addParent(BVHNode* parent); 61 void removeParent(BVHNode* parent); 62 63 void invalidateParentBound(); 64 virtual void invalidateBound(); 65 66 private: 67 mutable bool _dirtyBoundingSphere; 68 mutable SGSphered _boundingSphere; 69 70 typedef std::vector<BVHNode*> ParentList; 71 ParentList _parents; 72 }; 73 74 } 75 76 #endif 77