Changeset 8411 for OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
- Timestamp:
- 06/05/08 20:52:29 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
r8410 r8411 63 63 } 64 64 65 typedef int value_type;65 typedef short value_type; 66 66 67 67 value_type _leftChild; … … 234 234 osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), 235 235 _maxNumLevels(24), 236 _targetNumVerticesPerLeaf(8) 236 _targetNumVerticesPerLeaf(8), 237 _numVerticesProcessed(0) 237 238 { 238 239 } … … 258 259 259 260 unsigned int _maxNumLevels; 260 unsigned int _targetNumVerticesPerLeaf; 261 unsigned int _targetNumVerticesPerLeaf; 262 263 unsigned int _numVerticesProcessed; 261 264 262 265 }; … … 265 268 KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) 266 269 { 270 #if VERBOSE_OUTPUT 267 271 osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree()"<<std::endl; 272 #endif 268 273 269 274 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); … … 277 282 unsigned int estimatedSize = (unsigned int)(float(vertices->size())/float(_targetNumVerticesPerLeaf)*1.5); 278 283 284 #if VERBOSE_OUTPUT 279 285 osg::notify(osg::NOTICE)<<"kdTree->_kdNodes.reserve()="<<estimatedSize<<std::endl<<std::endl; 286 #endif 280 287 281 288 kdTree->_kdNodes.reserve(estimatedSize); … … 284 291 computeDivisions(*kdTree); 285 292 293 294 _numVerticesProcessed += vertices->size(); 295 286 296 // create initial leaf list 287 osg::ref_ptr<KDLeaf>leaf = new KDLeaf;297 KDLeaf* leaf = new KDLeaf; 288 298 leaf->_vertexIndices.reserve(vertices->size()); 289 299 for(unsigned int i=0; i<vertices->size(); ++i) … … 294 304 osg::BoundingBox bb = kdTree->_bb; 295 305 296 int leafNum = kdTree->addLeaf(leaf .get());306 int leafNum = kdTree->addLeaf(leaf); 297 307 int nodeNum = divide(*kdTree, bb, leafNum, 0); 298 308 309 #if VERBOSE_OUTPUT 299 310 osg::notify(osg::NOTICE)<<"Root nodeNum="<<nodeNum<<std::endl; 300 311 #endif 312 313 #if VERBOSE_OUTPUT 301 314 302 315 KDTreeTraverser traverser; … … 307 320 308 321 osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree() completed"<<std::endl<<std::endl; 322 #endif 309 323 310 324 return kdTree.release(); … … 319 333 kdTree._bb.zMax()-kdTree._bb.zMin()); 320 334 335 #if VERBOSE_OUTPUT 321 336 osg::notify(osg::NOTICE)<<"computeDivisions("<<_maxNumLevels<<") "<<dimensions<< " { "<<std::endl; 337 #endif 322 338 323 339 kdTree._axisStack.reserve(_maxNumLevels); … … 338 354 dimensions[axis] /= 2.0f; 339 355 356 #if VERBOSE_OUTPUT 340 357 osg::notify(osg::NOTICE)<<" "<<level<<", "<<dimensions<<", "<<axis<<std::endl; 358 #endif 341 359 } 342 360 361 #if VERBOSE_OUTPUT 343 362 osg::notify(osg::NOTICE)<<"}"<<std::endl; 363 #endif 344 364 } 345 365 … … 351 371 int axis = kdTree._axisStack[level]; 352 372 353 osg::notify(osg::NOTICE)<<"divide("<<nodeIndex<<", "<<level<< "), axis="<<axis<<std::endl; 373 #if VERBOSE_OUTPUT 374 //osg::notify(osg::NOTICE)<<"divide("<<nodeIndex<<", "<<level<< "), axis="<<axis<<std::endl; 375 #endif 354 376 355 377 if (nodeIndex>=0) 356 378 { 379 #if VERBOSE_OUTPUT 357 380 osg::notify(osg::NOTICE)<<" divide node"<<std::endl; 381 #endif 358 382 KDNode& node = kdTree.getNode(nodeIndex); 359 383 return nodeIndex; … … 363 387 if (kdTree.getLeaf(nodeIndex)->_vertexIndices.size()<=_targetNumVerticesPerLeaf) return nodeIndex; 364 388 365 osg::notify(osg::NOTICE)<<" divide leaf"<<std::endl;389 //osg::notify(osg::NOTICE)<<" divide leaf"<<std::endl; 366 390 367 391 int nodeNum = kdTree.addNode(KDNode()); … … 382 406 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(kdTree._geometry->getVertexArray()); 383 407 384 osg::notify(osg::NOTICE)<<" divide leaf->_vertexIndices.size()="<<leaf->_vertexIndices.size()<<std::endl;408 //osg::notify(osg::NOTICE)<<" divide leaf->_vertexIndices.size()="<<leaf->_vertexIndices.size()<<std::endl; 385 409 386 410 unsigned int estimatedSize = leaf->_vertexIndices.size(); … … 398 422 if (leftLeaf->_vertexIndices.empty()) 399 423 { 400 osg::notify(osg::NOTICE)<<"LeftLeaf empty"<<std::endl;424 //osg::notify(osg::NOTICE)<<"LeftLeaf empty"<<std::endl; 401 425 kdTree.getNode(nodeNum)._leftChild = 0; 402 426 kdTree.getNode(nodeNum)._rightChild = kdTree.replaceLeaf(nodeIndex, rightLeaf.get()); … … 404 428 else if (rightLeaf->_vertexIndices.empty()) 405 429 { 406 osg::notify(osg::NOTICE)<<"RightLeaf empty"<<std::endl;430 //osg::notify(osg::NOTICE)<<"RightLeaf empty"<<std::endl; 407 431 kdTree.getNode(nodeNum)._leftChild = kdTree.replaceLeaf(nodeIndex, leftLeaf.get()); 408 432 kdTree.getNode(nodeNum)._rightChild = 0; … … 424 448 bb._max[axis] = mid; 425 449 426 osg::notify(osg::NOTICE)<<" divide leftLeaf "<<kdTree.getNode(nodeNum)._leftChild<<std::endl;450 //osg::notify(osg::NOTICE)<<" divide leftLeaf "<<kdTree.getNode(nodeNum)._leftChild<<std::endl; 427 451 int leftChildIndex = divide(kdTree, bb, originalLeftChildIndex, level+1); 428 452 … … 432 456 bb._min[axis] = mid; 433 457 434 osg::notify(osg::NOTICE)<<" divide rightLeaf "<<kdTree.getNode(nodeNum)._rightChild<<std::endl;458 //osg::notify(osg::NOTICE)<<" divide rightLeaf "<<kdTree.getNode(nodeNum)._rightChild<<std::endl; 435 459 int rightChildIndex = divide(kdTree, bb, originalRightChildIndex, level+1); 436 460 … … 460 484 return 0; 461 485 } 486 487 488 osg::Timer_t start = osg::Timer::instance()->tick(); 462 489 463 490 osg::KDTreeBuilder builder; 464 491 scene->accept(builder); 465 492 493 osg::Timer_t end = osg::Timer::instance()->tick(); 494 double time = osg::Timer::instance()->delta_s(start,end); 495 osg::notify(osg::NOTICE)<<"Time to build "<<time*1000.0<<"ms "<<builder._numVerticesProcessed<<std::endl; 496 osg::notify(osg::NOTICE)<<"build speed "<<(double(builder._numVerticesProcessed)/time)/1000000.0<<"M vertices per second"<<std::endl; 466 497 467 498
