Show
Ignore:
Timestamp:
11/23/06 18:29:43 (7 years ago)
Author:
robert
Message:

Add compute of tight bounding box to enable better placement of the base plane.

Files:
1 modified

Legend:

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

    r5746 r5747  
    66 
    77#include <osgDB/ReadFile> 
     8 
     9 
     10class ComputeBoundingBoxVisitor : public osg::NodeVisitor 
     11{ 
     12public: 
     13    ComputeBoundingBoxVisitor(): 
     14        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) 
     15    { 
     16    } 
     17     
     18    virtual void reset() 
     19    { 
     20        _matrixStack.clear(); 
     21        _bb.init(); 
     22    } 
     23     
     24    osg::BoundingBox& getBoundingBox() { return _bb; } 
     25         
     26    void apply(osg::Node& node) 
     27    { 
     28        traverse(node); 
     29    } 
     30     
     31    void apply(osg::Transform& transform) 
     32    { 
     33        osg::Matrix matrix; 
     34        if (!_matrixStack.empty()) matrix = _matrixStack.back(); 
     35         
     36        transform.computeLocalToWorldMatrix(matrix,this); 
     37         
     38        pushMatrix(matrix); 
     39         
     40        traverse(transform); 
     41         
     42        popMatrix(); 
     43    } 
     44     
     45    void apply(osg::Geode& geode) 
     46    { 
     47        for(unsigned int i=0; i<geode.getNumDrawables(); ++i) 
     48        { 
     49            apply(geode.getDrawable(i)); 
     50        } 
     51    } 
     52     
     53    void pushMatrix(osg::Matrix& matrix) 
     54    { 
     55        _matrixStack.push_back(matrix); 
     56    } 
     57     
     58    void popMatrix() 
     59    { 
     60        _matrixStack.pop_back(); 
     61    } 
     62 
     63    void apply(osg::Drawable* drawable) 
     64    { 
     65        if (_matrixStack.empty()) _bb.expandBy(drawable->getBound()); 
     66        else 
     67        { 
     68            osg::Matrix& matrix = _matrixStack.back(); 
     69            const osg::BoundingBox& dbb = drawable->getBound(); 
     70            if (dbb.valid()) 
     71            { 
     72                _bb.expandBy(dbb.corner(0) * matrix); 
     73                _bb.expandBy(dbb.corner(1) * matrix); 
     74                _bb.expandBy(dbb.corner(2) * matrix); 
     75                _bb.expandBy(dbb.corner(3) * matrix); 
     76                _bb.expandBy(dbb.corner(4) * matrix); 
     77                _bb.expandBy(dbb.corner(5) * matrix); 
     78                _bb.expandBy(dbb.corner(6) * matrix); 
     79                _bb.expandBy(dbb.corner(7) * matrix); 
     80            } 
     81        } 
     82    } 
     83     
     84protected: 
     85     
     86    typedef std::vector<osg::Matrix> MatrixStack; 
     87 
     88    MatrixStack         _matrixStack; 
     89    osg::BoundingBox    _bb; 
     90}; 
     91 
    892 
    993 
     
    54138    } 
    55139     
    56     const osg::BoundingSphere& bs = model->getBound(); 
    57     osg::Plane basePlane(0.0, 0.0, 1.0, -( bs.center().z() - bs.radius() ) ); 
     140    ComputeBoundingBoxVisitor cbbv; 
     141    model->accept(cbbv); 
     142    const osg::BoundingBox& bb = cbbv.getBoundingBox(); 
     143    osg::Plane basePlane(0.0, 0.0, 1.0, -bb.zMin() ); 
    58144     
    59145    osg::ref_ptr<osg::Geode> geode = new osg::Geode; 
     
    65151     
    66152    osg::ref_ptr<osgShadow::ShadowVolumeGeometry> shadowVolume = new osgShadow::ShadowVolumeGeometry; 
    67     occluder->comptueShadowVolumeGeometry(osg::Vec4(0.0f,-.5f,-1.0f,0.0f), *shadowVolume); 
     153    occluder->comptueShadowVolumeGeometry(osg::Vec4(0.5f,-.5f,-1.0f,0.0f), *shadowVolume); 
    68154    geode->addDrawable(shadowVolume.get()); 
    69155