Show
Ignore:
Timestamp:
09/06/11 16:13:13 (3 years ago)
Author:
robert
Message:

Added optimization of the mutliple cessna shadow model to address peformance issues when rendering 100 cessna's.

Files:
1 modified

Legend:

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

    r12779 r12780  
    4646#include <osgShadow/ViewDependentShadowMap> 
    4747 
     48#include <osgUtil/Optimizer> 
     49 
    4850#include <osgDB/ReadFile> 
    4951#include <osgDB/WriteFile> 
     
    585587namespace ModelFive 
    586588{ 
     589    struct UseVBOVisitor : public osg::NodeVisitor 
     590    { 
     591        UseVBOVisitor(): 
     592            osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}             
     593 
     594        virtual void apply(osg::Geode& geode) 
     595        { 
     596            for(unsigned int i=0; i<geode.getNumDrawables(); ++i) 
     597            { 
     598                osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(geode.getDrawable(i)); 
     599                if (geometry) 
     600                { 
     601                    OSG_NOTICE<<"geometry->setUseVertexBufferObjects(true);"<<std::endl; 
     602                    geometry->setUseVertexBufferObjects(true); 
     603                } 
     604            } 
     605        } 
     606    }; 
     607 
     608     
    587609    osg::AnimationPathCallback* createAnimationPathCallback( float radius, float time ) 
    588610    { 
     
    608630    osg::Group* createModel(osg::ArgumentParser& arguments) 
    609631    { 
    610         unsigned int rcvShadowMask = 0x1; 
    611         unsigned int castShadowMask = 0x2; 
    612  
    613632        // Set the ground (only receives shadow) 
    614633        osg::ref_ptr<osg::MatrixTransform> groundNode = new osg::MatrixTransform; 
    615634        groundNode->addChild( osgDB::readNodeFile("lz.osg") ); 
    616635        groundNode->setMatrix( osg::Matrix::translate(200.0f, 200.0f,-200.0f) ); 
    617         //groundNode->setNodeMask( rcvShadowMask ); 
     636        groundNode->setNodeMask( ReceivesShadowTraversalMask ); 
    618637 
    619638        // Set the cessna (only casts shadow) 
     
    621640        cessnaNode->addChild( osgDB::readNodeFile("cessna.osg.0,0,90.rot") ); 
    622641        cessnaNode->addUpdateCallback( createAnimationPathCallback(50.0f, 6.0f) ); 
    623         //cessnaNode->setNodeMask( castShadowMask ); 
     642        cessnaNode->setNodeMask( CastsShadowTraversalMask ); 
    624643 
    625644        osg::ref_ptr<osg::Group> shadowRoot = new osg::Group; 
     
    635654            } 
    636655        } 
     656 
     657        // cessna is really poorly optimized so fix this by optimizing the mesh and use VBO's. 
     658        osgUtil::Optimizer optimizer; 
     659        optimizer.optimize(shadowRoot.get(), osgUtil::Optimizer::INDEX_MESH | 
     660                                             osgUtil::Optimizer::VERTEX_POSTTRANSFORM | 
     661                                             osgUtil::Optimizer::VERTEX_PRETRANSFORM); 
     662 
     663        UseVBOVisitor useVBOVisitor; 
     664        shadowRoot->accept(useVBOVisitor); 
    637665 
    638666        return shadowRoot.release();