Changeset 8417 for OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
- Timestamp:
- 06/06/08 16:10:20 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
r8415 r8417 20 20 #include <osgDB/ReadFile> 21 21 22 #define _GLIBCXX_DEBUG23 24 22 #include <osg/ArgumentParser> 25 23 #include <osg/ApplicationUsage> … … 48 46 typedef std::vector< value_type > Indices; 49 47 50 //#define LEAF_OBJECT51 48 //#define VERBOSE_OUTPUT 52 49 53 #ifdef LEAF_OBJECT 54 class KDNode 55 { 56 public: 57 58 KDNode(): 59 first(0), 60 second(0) {} 61 62 KDNode(const KDNode& rhs): 63 first(rhs.first), 64 second(rhs.second) {} 65 66 KDNode& operator = (const KDNode& rhs) 67 { 68 first = rhs.first; 69 second = rhs.second; 70 return *this; 71 } 72 73 value_type first; 74 value_type second; 75 }; 76 77 class KDLeaf : public osg::Referenced 78 { 79 public: 80 81 KDLeaf() {} 82 83 Indices _vertexIndices; 84 85 protected: 86 87 virtual ~KDLeaf() {} 88 }; 89 90 #else 91 typedef std::pair< value_type, value_type> KDNode; 92 typedef std::pair< value_type, value_type> KDLeaf; 93 #endif 50 typedef std::pair< value_type, value_type> KDNode; 51 typedef std::pair< value_type, value_type> KDLeaf; 94 52 95 53 … … 110 68 typedef std::vector< KDNode > KDNodeList; 111 69 112 #ifdef LEAF_OBJECT 113 typedef std::vector< osg::ref_ptr<KDLeaf> > KDLeafList; 70 typedef std::vector< KDLeaf > KDLeafList; 114 71 115 72 /// note, leafNum is negative to distinguish from nodeNum 116 int addLeaf( KDLeaf*leaf) { int num = _kdLeaves.size(); _kdLeaves.push_back(leaf); return -(num+1); }117 118 int replaceLeaf(int leafNum, KDLeaf*leaf)73 int addLeaf(const KDLeaf& leaf) { int num = _kdLeaves.size(); _kdLeaves.push_back(leaf); return -(num+1); } 74 75 int replaceLeaf(int leafNum, const KDLeaf& leaf) 119 76 { 120 77 int num = -leafNum-1; … … 130 87 131 88 /// note, leafNum is negative to distinguish from nodeNum 132 KDLeaf *getLeaf(int leafNum)89 KDLeaf& getLeaf(int leafNum) 133 90 { 134 91 int num = -leafNum-1; … … 136 93 { 137 94 osg::notify(osg::NOTICE)<<"Warning: getLeaf("<<leafNum<<", num = "<<num<<") _kdLeaves.size()="<<_kdLeaves.size()<<std::endl; 138 return 0;139 }140 141 return _kdLeaves[num].get();142 }143 144 #else145 typedef std::vector< KDLeaf > KDLeafList;146 147 /// note, leafNum is negative to distinguish from nodeNum148 int addLeaf(const KDLeaf& leaf) { int num = _kdLeaves.size(); _kdLeaves.push_back(leaf); return -(num+1); }149 150 int replaceLeaf(int leafNum, const KDLeaf& leaf)151 {152 int num = -leafNum-1;153 154 if (num>_kdLeaves.size()-1)155 {156 osg::notify(osg::NOTICE)<<"Warning: replaceChild("<<leafNum<<", leaf), num = "<<num<<" _kdLeaves.size()="<<_kdLeaves.size()<<std::endl;157 return leafNum;158 }159 160 _kdLeaves[num] = leaf; return leafNum;161 }162 163 /// note, leafNum is negative to distinguish from nodeNum164 KDLeaf& getLeaf(int leafNum)165 {166 int num = -leafNum-1;167 if (num<0 || num>_kdLeaves.size()-1)168 {169 osg::notify(osg::NOTICE)<<"Warning: getLeaf("<<leafNum<<", num = "<<num<<") _kdLeaves.size()="<<_kdLeaves.size()<<std::endl;170 95 } 171 96 172 97 return _kdLeaves[num]; 173 98 } 174 #endif175 176 99 177 100 int addNode(const KDNode& node) … … 222 145 output(level)<<"leaf("<<level<<") { "; 223 146 224 #ifdef LEAF_OBJECT225 for(unsigned int i=0; i<leaf._vertexIndices.size(); ++i)226 {227 if (i==0) osg::notify(osg::NOTICE)<<leaf._vertexIndices[i];228 else osg::notify(osg::NOTICE)<<", "<<leaf._vertexIndices[i];229 }230 #else231 147 unsigned int end = leaf.first+leaf.second; 232 148 for(unsigned int i=leaf.first; i<end; ++i) … … 235 151 else osg::notify(osg::NOTICE)<<", "<<tree._vertexIndices[i]; 236 152 } 237 #endif 153 238 154 osg::notify(osg::NOTICE)<<"}"<<std::endl;; 239 155 … … 256 172 { 257 173 value_type leafIndex = -nodeIndex-1; 258 #ifdef LEAF_OBJECT 259 KDLeaf& leaf = *(tree._kdLeaves[leafIndex]); 260 #else 174 261 175 KDLeaf& leaf = tree._kdLeaves[leafIndex]; 262 #endif 176 263 177 traverse(tree, leaf, level); 264 178 } … … 277 191 else if (!tree._kdLeaves.empty()) 278 192 { 279 #ifdef LEAF_OBJECT280 traverse(tree, *tree._kdLeaves.front(), 0);281 #else282 193 traverse(tree, tree._kdLeaves.front(), 0); 283 #endif284 194 } 285 195 } … … 355 265 _numVerticesProcessed += vertices->size(); 356 266 357 #ifdef LEAF_OBJECT358 // create initial leaf list359 KDLeaf* leaf = new KDLeaf;360 leaf->_vertexIndices.reserve(vertices->size());361 for(unsigned int i=0; i<vertices->size(); ++i)362 {363 leaf->_vertexIndices.push_back(i);364 }365 #else366 367 267 kdTree->_vertexIndices.reserve(vertices->size()); 368 268 for(unsigned int i=0; i<vertices->size(); ++i) … … 370 270 kdTree->_vertexIndices.push_back(i); 371 271 } 272 372 273 KDLeaf leaf(0, kdTree->_vertexIndices.size()); 373 374 #endif375 274 376 275 int leafNum = kdTree->addLeaf(leaf); … … 460 359 { 461 360 462 #ifdef LEAF_OBJECT463 if (kdTree.getLeaf(nodeIndex)->_vertexIndices.size()<=_targetNumVerticesPerLeaf) return nodeIndex;464 #else465 361 if (kdTree.getLeaf(nodeIndex).second<=_targetNumVerticesPerLeaf) return nodeIndex; 466 #endif 362 467 363 //osg::notify(osg::NOTICE)<<" divide leaf"<<std::endl; 468 364 … … 474 370 float mid = (original_min+original_max)*0.5f; 475 371 476 #ifdef LEAF_OBJECT477 {478 osg::ref_ptr<KDLeaf> leaf = kdTree.getLeaf(nodeIndex);479 480 // create new node, and add two leaves to it.481 osg::ref_ptr<KDLeaf> leftLeaf = new KDLeaf;482 osg::ref_ptr<KDLeaf> rightLeaf = new KDLeaf;483 484 485 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(kdTree._geometry->getVertexArray());486 487 //osg::notify(osg::NOTICE)<<" divide leaf->_vertexIndices.size()="<<leaf->_vertexIndices.size()<<std::endl;488 489 unsigned int estimatedSize = leaf->_vertexIndices.size();490 leftLeaf->_vertexIndices.reserve(estimatedSize);491 rightLeaf->_vertexIndices.reserve(estimatedSize);492 493 for(unsigned int i=0; i<leaf->_vertexIndices.size(); ++i)494 {495 unsigned int vi = leaf->_vertexIndices[i];496 osg::Vec3& v = (*vertices)[vi];497 if (v[axis] <= mid) leftLeaf->_vertexIndices.push_back(vi);498 else rightLeaf->_vertexIndices.push_back(vi);499 }500 501 if (leftLeaf->_vertexIndices.empty())502 {503 //osg::notify(osg::NOTICE)<<"LeftLeaf empty"<<std::endl;504 kdTree.getNode(nodeNum).first = 0;505 kdTree.getNode(nodeNum).second = kdTree.replaceLeaf(nodeIndex, rightLeaf.get());506 }507 else if (rightLeaf->_vertexIndices.empty())508 {509 //osg::notify(osg::NOTICE)<<"RightLeaf empty"<<std::endl;510 kdTree.getNode(nodeNum).first = kdTree.replaceLeaf(nodeIndex, leftLeaf.get());511 kdTree.getNode(nodeNum).second = 0;512 }513 else514 {515 kdTree.getNode(nodeNum).first = kdTree.replaceLeaf(nodeIndex, leftLeaf.get());516 kdTree.getNode(nodeNum).second = kdTree.addLeaf(rightLeaf.get());517 }518 }519 #else520 372 { 521 373 KDLeaf& leaf = kdTree.getLeaf(nodeIndex); … … 591 443 } 592 444 } 593 #endif 445 594 446 595 447 int originalLeftChildIndex = kdTree.getNode(nodeNum).first;
