diff --git a/examples/osgkdtree/osgkdtree.cpp b/examples/osgkdtree/osgkdtree.cpp index 2e860d85c..ec88197fa 100644 --- a/examples/osgkdtree/osgkdtree.cpp +++ b/examples/osgkdtree/osgkdtree.cpp @@ -62,7 +62,7 @@ class KDNode return *this; } - typedef int value_type; + typedef short value_type; value_type _leftChild; value_type _rightChild; @@ -233,7 +233,8 @@ class KDTreeBuilder : public osg::NodeVisitor KDTreeBuilder(): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), _maxNumLevels(24), - _targetNumVerticesPerLeaf(8) + _targetNumVerticesPerLeaf(8), + _numVerticesProcessed(0) { } @@ -257,14 +258,18 @@ class KDTreeBuilder : public osg::NodeVisitor int divide(KDTree& kdTree, osg::BoundingBox& bb, int nodeIndex, unsigned int level); unsigned int _maxNumLevels; - unsigned int _targetNumVerticesPerLeaf; + unsigned int _targetNumVerticesPerLeaf; + + unsigned int _numVerticesProcessed; }; KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) { +#if VERBOSE_OUTPUT osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree()"<(geometry->getVertexArray()); if (!vertices) return 0; @@ -276,15 +281,20 @@ KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) unsigned int estimatedSize = (unsigned int)(float(vertices->size())/float(_targetNumVerticesPerLeaf)*1.5); +#if VERBOSE_OUTPUT osg::notify(osg::NOTICE)<<"kdTree->_kdNodes.reserve()="<_kdNodes.reserve(estimatedSize); kdTree->_kdLeaves.reserve(estimatedSize); computeDivisions(*kdTree); + + _numVerticesProcessed += vertices->size(); + // create initial leaf list - osg::ref_ptr leaf = new KDLeaf; + KDLeaf* leaf = new KDLeaf; leaf->_vertexIndices.reserve(vertices->size()); for(unsigned int i=0; isize(); ++i) { @@ -293,11 +303,14 @@ KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) osg::BoundingBox bb = kdTree->_bb; - int leafNum = kdTree->addLeaf(leaf.get()); + int leafNum = kdTree->addLeaf(leaf); int nodeNum = divide(*kdTree, bb, leafNum, 0); +#if VERBOSE_OUTPUT osg::notify(osg::NOTICE)<<"Root nodeNum="<_kdLeaves.size()="<_kdLeaves.size()<_vertexIndices.size()<=_targetNumVerticesPerLeaf) return nodeIndex; - osg::notify(osg::NOTICE)<<" divide leaf"<(kdTree._geometry->getVertexArray()); - osg::notify(osg::NOTICE)<<" divide leaf->_vertexIndices.size()="<_vertexIndices.size()<_vertexIndices.size()="<_vertexIndices.size()<_vertexIndices.size(); leftLeaf->_vertexIndices.reserve(estimatedSize); @@ -397,13 +421,13 @@ int KDTreeBuilder::divide(KDTree& kdTree, osg::BoundingBox& bb, int nodeIndex, u if (leftLeaf->_vertexIndices.empty()) { - osg::notify(osg::NOTICE)<<"LeftLeaf empty"<_vertexIndices.empty()) { - osg::notify(osg::NOTICE)<<"RightLeaf empty"<tick(); osg::KDTreeBuilder builder; scene->accept(builder); + osg::Timer_t end = osg::Timer::instance()->tick(); + double time = osg::Timer::instance()->delta_s(start,end); + osg::notify(osg::NOTICE)<<"Time to build "<