Changeset 8408 for OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
- Timestamp:
- 06/04/08 19:59:39 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp
r8405 r8408 23 23 #include <osg/Notify> 24 24 #include <osg/io_utils> 25 #include <osg/Geometry> 25 26 26 27 #include <osgDB/ReadFile> … … 34 35 35 36 #include <iostream> 37 38 namespace osg 39 { 36 40 37 41 class KDNode … … 61 65 }; 62 66 63 class KDTree : public osg:: Referenced67 class KDTree : public osg::Shape 64 68 { 65 69 public: 70 71 72 KDTree() {} 73 74 KDTree(const KDTree& rhs, const CopyOp& copyop=CopyOp::SHALLOW_COPY): 75 Shape(rhs,copyop) {} 76 77 META_Shape(osg, KDTree) 66 78 67 79 typedef std::vector< unsigned int > AxisStack; … … 69 81 typedef std::vector< osg::ref_ptr<KDLeaf> > KDLeafList; 70 82 71 osg:: BoundingBox _bb;83 osg::observer_ptr<osg::Geometry> _geometry; 72 84 73 AxisStack _axisStack; 74 KDNodeList _kdNodes; 75 KDLeafList _kdLeaves; 85 osg::BoundingBox _bb; 86 87 AxisStack _axisStack; 88 KDNodeList _kdNodes; 89 KDLeafList _kdLeaves; 76 90 }; 77 91 … … 80 94 public: 81 95 82 void traverse(KDTree& tree, KDNode::value_type nodeIndex )96 void traverse(KDTree& tree, KDNode::value_type nodeIndex, unsigned int level) 83 97 { 98 for(unsigned int i=0; i<level; ++i) 99 { 100 osg::notify(osg::NOTICE)<<" "; 101 } 102 osg::notify(osg::NOTICE)<<"traverse("<<nodeIndex<<", "<< level<<") { "<<std::endl; 103 84 104 if (nodeIndex>=0) 85 105 { 86 106 KDNode& node = tree._kdNodes[nodeIndex]; 87 traverse(tree,node._leftChild );88 traverse(tree,node._rightChild );107 traverse(tree,node._leftChild,level+1); 108 traverse(tree,node._rightChild,level+1); 89 109 } 90 110 else … … 93 113 KDLeaf& leaf = *(tree._kdLeaves[leafIndex]); 94 114 } 115 116 for(unsigned int i=0; i<level; ++i) 117 { 118 osg::notify(osg::NOTICE)<<" "; 119 } 120 osg::notify(osg::NOTICE)<<"}"<<std::endl;; 95 121 } 96 122 … … 98 124 void traverse(KDTree& tree) 99 125 { 100 if (!tree._kdNodes.empty()) traverse(tree,0); 126 osg::notify(osg::NOTICE)<<"traverse(tree)"<<std::endl; 127 if (!tree._kdNodes.empty()) traverse(tree,0,0); 101 128 } 102 129 103 130 }; 131 132 133 class KDTreeBuilder : public osg::NodeVisitor 134 { 135 public: 136 137 KDTreeBuilder(): 138 osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {} 139 140 141 void apply(osg::Geode& geode) 142 { 143 for(unsigned int i=0; i<geode.getNumDrawables(); ++i) 144 { 145 osg::Geometry* geom = geode.getDrawable(i)->asGeometry(); 146 if (geom) 147 { 148 geom->setShape(createKDTree(geom)); 149 } 150 } 151 } 152 153 KDTree* createKDTree(osg::Geometry* geometry); 154 }; 155 156 157 KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) 158 { 159 KDTree* kdTree = new KDTree; 160 kdTree->_geometry = geometry; 161 kdTree->_bb = kdTree->_geometry->getBound(); 162 163 osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree()"<<std::endl; 164 165 return kdTree; 166 } 167 168 } 104 169 105 170 int main(int argc, char **argv) … … 116 181 } 117 182 183 osg::KDTreeBuilder builder; 184 scene->accept(builder); 185 186 118 187 119 188 return 0;
