diff --git a/examples/osgkdtree/osgkdtree.cpp b/examples/osgkdtree/osgkdtree.cpp index 9e5de038e..d3715fab5 100644 --- a/examples/osgkdtree/osgkdtree.cpp +++ b/examples/osgkdtree/osgkdtree.cpp @@ -19,8 +19,6 @@ #include -#define _GLIBCXX_DEBUG - #include #include #include @@ -47,50 +45,10 @@ namespace osg typedef int value_type; typedef std::vector< value_type > Indices; -//#define LEAF_OBJECT //#define VERBOSE_OUTPUT -#ifdef LEAF_OBJECT -class KDNode -{ - public: - - KDNode(): - first(0), - second(0) {} - - KDNode(const KDNode& rhs): - first(rhs.first), - second(rhs.second) {} - - KDNode& operator = (const KDNode& rhs) - { - first = rhs.first; - second = rhs.second; - return *this; - } - - value_type first; - value_type second; -}; - -class KDLeaf : public osg::Referenced -{ - public: - - KDLeaf() {} - - Indices _vertexIndices; - - protected: - - virtual ~KDLeaf() {} -}; - -#else - typedef std::pair< value_type, value_type> KDNode; - typedef std::pair< value_type, value_type> KDLeaf; -#endif +typedef std::pair< value_type, value_type> KDNode; +typedef std::pair< value_type, value_type> KDLeaf; class KDTree : public osg::Shape @@ -109,39 +67,6 @@ class KDTree : public osg::Shape typedef std::vector< unsigned int > AxisStack; typedef std::vector< KDNode > KDNodeList; -#ifdef LEAF_OBJECT - typedef std::vector< osg::ref_ptr > KDLeafList; - - /// note, leafNum is negative to distinguish from nodeNum - int addLeaf(KDLeaf* leaf) { int num = _kdLeaves.size(); _kdLeaves.push_back(leaf); return -(num+1); } - - int replaceLeaf(int leafNum, KDLeaf* leaf) - { - int num = -leafNum-1; - - if (num>_kdLeaves.size()-1) - { - osg::notify(osg::NOTICE)<<"Warning: replaceChild("<size(); -#ifdef LEAF_OBJECT - // create initial leaf list - KDLeaf* leaf = new KDLeaf; - leaf->_vertexIndices.reserve(vertices->size()); - for(unsigned int i=0; isize(); ++i) - { - leaf->_vertexIndices.push_back(i); - } -#else - kdTree->_vertexIndices.reserve(vertices->size()); for(unsigned int i=0; isize(); ++i) { kdTree->_vertexIndices.push_back(i); } + KDLeaf leaf(0, kdTree->_vertexIndices.size()); -#endif - int leafNum = kdTree->addLeaf(leaf); osg::BoundingBox bb = kdTree->_bb; int nodeNum = divide(*kdTree, bb, leafNum, 0); @@ -459,11 +358,8 @@ int KDTreeBuilder::divide(KDTree& kdTree, osg::BoundingBox& bb, int nodeIndex, u else { -#ifdef LEAF_OBJECT - if (kdTree.getLeaf(nodeIndex)->_vertexIndices.size()<=_targetNumVerticesPerLeaf) return nodeIndex; -#else if (kdTree.getLeaf(nodeIndex).second<=_targetNumVerticesPerLeaf) return nodeIndex; -#endif + //osg::notify(osg::NOTICE)<<" divide leaf"< leaf = kdTree.getLeaf(nodeIndex); - - // create new node, and add two leaves to it. - osg::ref_ptr leftLeaf = new KDLeaf; - osg::ref_ptr rightLeaf = new KDLeaf; - - - osg::Vec3Array* vertices = dynamic_cast(kdTree._geometry->getVertexArray()); - - //osg::notify(osg::NOTICE)<<" divide leaf->_vertexIndices.size()="<_vertexIndices.size()<_vertexIndices.size(); - leftLeaf->_vertexIndices.reserve(estimatedSize); - rightLeaf->_vertexIndices.reserve(estimatedSize); - - for(unsigned int i=0; i_vertexIndices.size(); ++i) - { - unsigned int vi = leaf->_vertexIndices[i]; - osg::Vec3& v = (*vertices)[vi]; - if (v[axis] <= mid) leftLeaf->_vertexIndices.push_back(vi); - else rightLeaf->_vertexIndices.push_back(vi); - } - - if (leftLeaf->_vertexIndices.empty()) - { - //osg::notify(osg::NOTICE)<<"LeftLeaf empty"<_vertexIndices.empty()) - { - //osg::notify(osg::NOTICE)<<"RightLeaf empty"<