Changeset 8554

Show
Ignore:
Timestamp:
07/09/08 21:42:15
Author:
robert
Message:

Cleaned up KdTree? implementation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/src/osg/KdTree.cpp

    r8546 r8554  
    1515#include <osg/Geode> 
    1616#include <osg/TriangleIndexFunctor> 
     17#include <osg/Timer> 
    1718 
    1819#include <osg/io_utils> 
     
    6061KdTree::BuildOptions::BuildOptions(): 
    6162        _numVerticesProcessed(0), 
    62         _targetNumTrianglesPerLeaf(8), 
    63         _maxNumLevels(24
     63        _targetNumTrianglesPerLeaf(4), 
     64        _maxNumLevels(32
    6465{ 
    6566} 
     
    128129    osg::BoundingBox bb = _bb; 
    129130    int nodeNum = divide(options, bb, leafNum, 0); 
    130  
    131 #if 0     
    132     for(KdLeafList::iterator itr = _kdLeaves.begin(); 
    133         itr != _kdLeaves.end(); 
    134         ++itr) 
    135     { 
    136         KdLeaf& leaf = *itr; 
    137         leaf.bb.init(); 
    138         int iend = leaf.first+leaf.second; 
    139         for(int i=leaf.first; i<iend; ++i) 
    140         { 
    141             const Triangle& tri = _triangles[_primitiveIndices[i]]; 
    142             const osg::Vec3& v1 = (*_vertices)[tri._p1]; 
    143             const osg::Vec3& v2 = (*_vertices)[tri._p2]; 
    144             const osg::Vec3& v3 = (*_vertices)[tri._p3]; 
    145             leaf.bb.expandBy(v1); 
    146             leaf.bb.expandBy(v2); 
    147             leaf.bb.expandBy(v3); 
    148         } 
    149         // osg::notify(osg::NOTICE)<<"leaf.bb.min("<<leaf.bb._min<<") max("<<leaf.bb._max<<")"<<std::endl; 
    150  
    151     } 
    152 #endif 
    153131     
    154132#ifdef VERBOSE_OUTPUT     
     
    161139 
    162140 
    163     return true
     141    return !_kdNodes.empty()
    164142} 
    165143 
     
    602580            e = s+(e-s)*(bb.zMax()-s.z())/(e.z()-s.z()); 
    603581        } 
    604     } 
     582    }  
    605583    else 
    606584    { 
     
    630608bool KdTree::intersect(const osg::Vec3& start, const osg::Vec3& end, LineSegmentIntersections& intersections) const 
    631609{ 
    632     //osg::notify(osg::NOTICE)<<"KdTree::intersect("<<start<<","<<end<<")"<<std::endl; 
    633     bool intersects = false; 
    634      
    635     int option = 2; 
    636     switch(option) 
    637     { 
    638         case(0): 
    639         { 
    640             for(KdLeafList::const_iterator itr = _kdLeaves.begin(); 
    641                 itr != _kdLeaves.end(); 
    642                 ++itr) 
    643             { 
    644                 if (intersect(*itr, start, end, intersections)) intersects = true; 
    645             } 
    646             break; 
    647         } 
    648  
    649         case(1): 
    650         { 
    651             for(KdLeafList::const_iterator itr = _kdLeaves.begin(); 
    652                 itr != _kdLeaves.end(); 
    653                 ++itr) 
    654             { 
    655                 osg::Vec3 s(start), e(end); 
    656                 if (intersectAndClip(s,e,itr->bb)) 
    657                 { 
    658                     if (intersect(*itr, start, end, intersections)) intersects = true; 
    659                 } 
    660             } 
    661             break; 
    662         } 
    663  
    664         case(2): 
    665         { 
    666             //osg::notify(osg::NOTICE)<<"_kdNodes.size()="<<_kdNodes.size()<<std::endl; 
    667             osg::Vec3 s(start), e(end); 
    668             if (intersect(getNode(0), start, end, s,e, intersections)) intersects = true; 
    669             break; 
    670         } 
    671     } 
    672  
    673     return intersects; 
     610    osg::Vec3 s(start), e(end); 
     611    return intersect(getNode(0), start, end, s,e, intersections); 
    674612} 
    675613