Show
Ignore:
Timestamp:
06/04/08 19:59:39 (7 years ago)
Author:
robert
Message:

Further work on fleshing out basic classes

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp

    r8405 r8408  
    2323#include <osg/Notify> 
    2424#include <osg/io_utils> 
     25#include <osg/Geometry> 
    2526 
    2627#include <osgDB/ReadFile> 
     
    3435 
    3536#include <iostream> 
     37 
     38namespace osg 
     39{ 
    3640 
    3741class KDNode 
     
    6165}; 
    6266 
    63 class KDTree : public osg::Referenced 
     67class KDTree : public osg::Shape 
    6468{ 
    6569    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) 
    6678     
    6779        typedef std::vector< unsigned int > AxisStack; 
     
    6981        typedef std::vector< osg::ref_ptr<KDLeaf> > KDLeafList; 
    7082 
    71         osg::BoundingBox    _bb; 
     83        osg::observer_ptr<osg::Geometry> _geometry; 
    7284 
    73         AxisStack           _axisStack; 
    74         KDNodeList          _kdNodes; 
    75         KDLeafList          _kdLeaves;  
     85        osg::BoundingBox                _bb; 
     86 
     87        AxisStack                       _axisStack; 
     88        KDNodeList                      _kdNodes; 
     89        KDLeafList                      _kdLeaves;  
    7690}; 
    7791 
     
    8094    public: 
    8195     
    82         void traverse(KDTree& tree, KDNode::value_type nodeIndex) 
     96        void traverse(KDTree& tree, KDNode::value_type nodeIndex, unsigned int level) 
    8397        { 
     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             
    84104            if (nodeIndex>=0) 
    85105            {         
    86106                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); 
    89109            } 
    90110            else  
     
    93113                KDLeaf& leaf = *(tree._kdLeaves[leafIndex]); 
    94114            } 
     115 
     116            for(unsigned int i=0; i<level; ++i) 
     117            { 
     118                osg::notify(osg::NOTICE)<<"  "; 
     119            } 
     120            osg::notify(osg::NOTICE)<<"}"<<std::endl;; 
    95121        } 
    96122 
     
    98124        void traverse(KDTree& tree) 
    99125        { 
    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); 
    101128        } 
    102129     
    103130}; 
     131 
     132 
     133class 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 
     157KDTree* 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} 
    104169 
    105170int main(int argc, char **argv) 
     
    116181    } 
    117182     
     183    osg::KDTreeBuilder builder; 
     184    scene->accept(builder); 
     185     
     186     
    118187     
    119188    return 0;