diff --git a/examples/osgkdtree/osgkdtree.cpp b/examples/osgkdtree/osgkdtree.cpp index a4d36d224..b5676dcd2 100644 --- a/examples/osgkdtree/osgkdtree.cpp +++ b/examples/osgkdtree/osgkdtree.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -34,6 +35,9 @@ #include +namespace osg +{ + class KDNode { public: @@ -60,48 +64,109 @@ class KDLeaf : public osg::Referenced virtual ~KDLeaf() {} }; -class KDTree : public osg::Referenced +class KDTree : public osg::Shape { public: + + KDTree() {} + + KDTree(const KDTree& rhs, const CopyOp& copyop=CopyOp::SHALLOW_COPY): + Shape(rhs,copyop) {} + + META_Shape(osg, KDTree) + typedef std::vector< unsigned int > AxisStack; typedef std::vector< KDNode > KDNodeList; typedef std::vector< osg::ref_ptr > KDLeafList; - osg::BoundingBox _bb; + osg::observer_ptr _geometry; - AxisStack _axisStack; - KDNodeList _kdNodes; - KDLeafList _kdLeaves; + osg::BoundingBox _bb; + + AxisStack _axisStack; + KDNodeList _kdNodes; + KDLeafList _kdLeaves; }; class KDTreeTraverser { public: - void traverse(KDTree& tree, KDNode::value_type nodeIndex) + void traverse(KDTree& tree, KDNode::value_type nodeIndex, unsigned int level) { + for(unsigned int i=0; i=0) { KDNode& node = tree._kdNodes[nodeIndex]; - traverse(tree,node._leftChild); - traverse(tree,node._rightChild); + traverse(tree,node._leftChild,level+1); + traverse(tree,node._rightChild,level+1); } else { KDNode::value_type leafIndex = -nodeIndex-1; KDLeaf& leaf = *(tree._kdLeaves[leafIndex]); } + + for(unsigned int i=0; iasGeometry(); + if (geom) + { + geom->setShape(createKDTree(geom)); + } + } + } + + KDTree* createKDTree(osg::Geometry* geometry); +}; + + +KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) +{ + KDTree* kdTree = new KDTree; + kdTree->_geometry = geometry; + kdTree->_bb = kdTree->_geometry->getBound(); + + osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree()"<accept(builder); + + return 0; }