From f26ef2d9e0c00b59e40d034b4408bd276f4feaba Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 6 Sep 2011 14:13:13 +0000 Subject: [PATCH] Added optimization of the mutliple cessna shadow model to address peformance issues when rendering 100 cessna's. --- examples/osgshadow/osgshadow.cpp | 38 +++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/examples/osgshadow/osgshadow.cpp b/examples/osgshadow/osgshadow.cpp index ed11621c7..8675e4c35 100644 --- a/examples/osgshadow/osgshadow.cpp +++ b/examples/osgshadow/osgshadow.cpp @@ -45,6 +45,8 @@ #include #include +#include + #include #include @@ -584,6 +586,26 @@ namespace ModelThree namespace ModelFive { + struct UseVBOVisitor : public osg::NodeVisitor + { + UseVBOVisitor(): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {} + + virtual void apply(osg::Geode& geode) + { + for(unsigned int i=0; i(geode.getDrawable(i)); + if (geometry) + { + OSG_NOTICE<<"geometry->setUseVertexBufferObjects(true);"<setUseVertexBufferObjects(true); + } + } + } + }; + + osg::AnimationPathCallback* createAnimationPathCallback( float radius, float time ) { osg::ref_ptr path = new osg::AnimationPath; @@ -607,20 +629,17 @@ namespace ModelFive osg::Group* createModel(osg::ArgumentParser& arguments) { - unsigned int rcvShadowMask = 0x1; - unsigned int castShadowMask = 0x2; - // Set the ground (only receives shadow) osg::ref_ptr groundNode = new osg::MatrixTransform; groundNode->addChild( osgDB::readNodeFile("lz.osg") ); groundNode->setMatrix( osg::Matrix::translate(200.0f, 200.0f,-200.0f) ); - //groundNode->setNodeMask( rcvShadowMask ); + groundNode->setNodeMask( ReceivesShadowTraversalMask ); // Set the cessna (only casts shadow) osg::ref_ptr cessnaNode = new osg::MatrixTransform; cessnaNode->addChild( osgDB::readNodeFile("cessna.osg.0,0,90.rot") ); cessnaNode->addUpdateCallback( createAnimationPathCallback(50.0f, 6.0f) ); - //cessnaNode->setNodeMask( castShadowMask ); + cessnaNode->setNodeMask( CastsShadowTraversalMask ); osg::ref_ptr shadowRoot = new osg::Group; shadowRoot->addChild( groundNode.get() ); @@ -635,6 +654,15 @@ namespace ModelFive } } + // cessna is really poorly optimized so fix this by optimizing the mesh and use VBO's. + osgUtil::Optimizer optimizer; + optimizer.optimize(shadowRoot.get(), osgUtil::Optimizer::INDEX_MESH | + osgUtil::Optimizer::VERTEX_POSTTRANSFORM | + osgUtil::Optimizer::VERTEX_PRETRANSFORM); + + UseVBOVisitor useVBOVisitor; + shadowRoot->accept(useVBOVisitor); + return shadowRoot.release(); } }