From aaee56cbde414f850a8da3e866e76205848db977 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 29 May 2009 08:24:52 +0000 Subject: [PATCH] Ran dos2unx of files --- .../CreateSimpleHierachy.cpp | 298 +++++++------- .../osgshadercompositor/VirtualProgram.cpp | 368 +++++++++--------- .../osgshadercompositor.cpp | 82 ++-- 3 files changed, 374 insertions(+), 374 deletions(-) diff --git a/examples/osgshadercompositor/CreateSimpleHierachy.cpp b/examples/osgshadercompositor/CreateSimpleHierachy.cpp index e4e136ebf..f89dda133 100644 --- a/examples/osgshadercompositor/CreateSimpleHierachy.cpp +++ b/examples/osgshadercompositor/CreateSimpleHierachy.cpp @@ -1,149 +1,149 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "VirtualProgram.h" - -using osgCandidate::VirtualProgram; - -//////////////////////////////////////////////////////////////////////////////// -osg::Node * CreateSimpleHierarchy( const char * file ) -{ - osg::Node * node = osgDB::readNodeFile( file ); - if( !node ) return NULL; - float r = node->getBound().radius(); // diameter - - osg::Group * root = new osg::Group(); - osg::Group * group = new osg::Group(); - - // Create four matrices for translated instances of the cow - osg::MatrixTransform * transform0 = new osg::MatrixTransform( ); - transform0->setMatrix( osg::Matrix::translate( 0,0,r ) ); - - osg::MatrixTransform * transform1 = new osg::MatrixTransform( ); - transform1->setMatrix( osg::Matrix::translate( 0,0,0 ) ); - - osg::MatrixTransform * transform2 = new osg::MatrixTransform( ); - transform2->setMatrix( osg::Matrix::translate( -r,0,-r ) ); - - osg::MatrixTransform * transform3 = new osg::MatrixTransform( ); - transform3->setMatrix( osg::Matrix::translate( r,0,-r ) ); - - root->addChild( transform0 ); - root->addChild( group ); - group->addChild( transform1 ); - group->addChild( transform2 ); - group->addChild( transform3 ); - - transform0->addChild( node ); - transform1->addChild( node ); - transform2->addChild( node ); - transform3->addChild( node ); - - // At the scene root apply standard program - if( 1 ) - { - osg::Program * program = new osg::Program; - osg::Shader * main = new osg::Shader( osg::Shader::FRAGMENT ); - - main->setShaderSource( - "uniform sampler2D base; \n" - "void main(void) \n" - "{\n" - " gl_FragColor = gl_Color * texture2DProj( base, gl_TexCoord[0] );\n" - " gl_FragColor *= vec4( 1.0, 1.0, 1.0, 0.5 ); \n" - "}\n" - ); - program->addShader( main ); - - main->setName( "White" ); - - root->getOrCreateStateSet( )->setAttributeAndModes( program ); - } - - // Now override root program with default VirtualProgram for three bottom cows - if( 1 ) - { - VirtualProgram * virtualProgram = new VirtualProgram( ); - - // Create main shader which declares and calls ColorFilter function - osg::Shader * main = new osg::Shader( osg::Shader::FRAGMENT ); - - main->setShaderSource( - "vec4 ColorFilter( in vec4 color ); \n" - "uniform sampler2D base; \n" - "void main(void) \n" - "{ \n" - " gl_FragColor = gl_Color * texture2DProj( base, gl_TexCoord[0] ); \n" - " gl_FragColor = ColorFilter( gl_FragColor ); \n" - "}\n" - ); - - virtualProgram->setShader( "main", main ); - - main->setName( "Virtual Main" ); - - // Create filter shader which implements greem ColorFilter function - osg::Shader * colorFilter = new osg::Shader( osg::Shader::FRAGMENT ); - - colorFilter->setShaderSource( - "vec4 ColorFilter( in vec4 color ) \n" - "{ \n" - " return color * vec4( 0.0, 1.0, 0.0, 1.0 ); \n" - "}\n" - ); - - colorFilter->setName( "Virtual Green" ); - - virtualProgram->setShader( "ColorFilter", colorFilter ); - - group->getOrCreateStateSet( )->setAttributeAndModes( virtualProgram ); - } - - // Create "incomplete" VirtualProgram overriding ColorFilter function - // Lower left cow drawn will be red - if( 1 ) - { - VirtualProgram * virtualProgram = new VirtualProgram(); - - osg::Shader * redFilter = new osg::Shader( osg::Shader::FRAGMENT ); - redFilter->setShaderSource( - "vec4 ColorFilter( in vec4 color ) \n" - "{ \n" - " return color * vec4( 1, 0, 0, 1 ); \n" - "}\n" - ); - virtualProgram->setShader( "ColorFilter", redFilter ); - - redFilter->setName( "Virtual Red" ); - - transform2->getOrCreateStateSet( )->setAttribute( virtualProgram ); - } - - // Create "incomplete" VirtualProgram overriding ColorFilter function - // Lower right cow will be drawn with grid pattern on yellow background - if( 1 ) - { - VirtualProgram * virtualProgram = new VirtualProgram(); - - osg::Shader * gridFilter = new osg::Shader( osg::Shader::FRAGMENT ); - gridFilter->setShaderSource( - "vec4 ColorFilter( in vec4 color ) \n" - "{ \n" - " vec2 grid = clamp( mod( gl_FragCoord.xy, 16.0 ), 0.0, 1.0 ); \n" - " return color * vec4( grid, 0.0, 1.0 ); \n" - "}\n" - ); - virtualProgram->setShader( "ColorFilter", gridFilter ); - - gridFilter->setName( "Virtual Grid" ); - - transform3->getOrCreateStateSet( )->setAttribute( virtualProgram ); - } - - return root; -}////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include + +#include "VirtualProgram.h" + +using osgCandidate::VirtualProgram; + +//////////////////////////////////////////////////////////////////////////////// +osg::Node * CreateSimpleHierarchy( const char * file ) +{ + osg::Node * node = osgDB::readNodeFile( file ); + if( !node ) return NULL; + float r = node->getBound().radius(); // diameter + + osg::Group * root = new osg::Group(); + osg::Group * group = new osg::Group(); + + // Create four matrices for translated instances of the cow + osg::MatrixTransform * transform0 = new osg::MatrixTransform( ); + transform0->setMatrix( osg::Matrix::translate( 0,0,r ) ); + + osg::MatrixTransform * transform1 = new osg::MatrixTransform( ); + transform1->setMatrix( osg::Matrix::translate( 0,0,0 ) ); + + osg::MatrixTransform * transform2 = new osg::MatrixTransform( ); + transform2->setMatrix( osg::Matrix::translate( -r,0,-r ) ); + + osg::MatrixTransform * transform3 = new osg::MatrixTransform( ); + transform3->setMatrix( osg::Matrix::translate( r,0,-r ) ); + + root->addChild( transform0 ); + root->addChild( group ); + group->addChild( transform1 ); + group->addChild( transform2 ); + group->addChild( transform3 ); + + transform0->addChild( node ); + transform1->addChild( node ); + transform2->addChild( node ); + transform3->addChild( node ); + + // At the scene root apply standard program + if( 1 ) + { + osg::Program * program = new osg::Program; + osg::Shader * main = new osg::Shader( osg::Shader::FRAGMENT ); + + main->setShaderSource( + "uniform sampler2D base; \n" + "void main(void) \n" + "{\n" + " gl_FragColor = gl_Color * texture2DProj( base, gl_TexCoord[0] );\n" + " gl_FragColor *= vec4( 1.0, 1.0, 1.0, 0.5 ); \n" + "}\n" + ); + program->addShader( main ); + + main->setName( "White" ); + + root->getOrCreateStateSet( )->setAttributeAndModes( program ); + } + + // Now override root program with default VirtualProgram for three bottom cows + if( 1 ) + { + VirtualProgram * virtualProgram = new VirtualProgram( ); + + // Create main shader which declares and calls ColorFilter function + osg::Shader * main = new osg::Shader( osg::Shader::FRAGMENT ); + + main->setShaderSource( + "vec4 ColorFilter( in vec4 color ); \n" + "uniform sampler2D base; \n" + "void main(void) \n" + "{ \n" + " gl_FragColor = gl_Color * texture2DProj( base, gl_TexCoord[0] ); \n" + " gl_FragColor = ColorFilter( gl_FragColor ); \n" + "}\n" + ); + + virtualProgram->setShader( "main", main ); + + main->setName( "Virtual Main" ); + + // Create filter shader which implements greem ColorFilter function + osg::Shader * colorFilter = new osg::Shader( osg::Shader::FRAGMENT ); + + colorFilter->setShaderSource( + "vec4 ColorFilter( in vec4 color ) \n" + "{ \n" + " return color * vec4( 0.0, 1.0, 0.0, 1.0 ); \n" + "}\n" + ); + + colorFilter->setName( "Virtual Green" ); + + virtualProgram->setShader( "ColorFilter", colorFilter ); + + group->getOrCreateStateSet( )->setAttributeAndModes( virtualProgram ); + } + + // Create "incomplete" VirtualProgram overriding ColorFilter function + // Lower left cow drawn will be red + if( 1 ) + { + VirtualProgram * virtualProgram = new VirtualProgram(); + + osg::Shader * redFilter = new osg::Shader( osg::Shader::FRAGMENT ); + redFilter->setShaderSource( + "vec4 ColorFilter( in vec4 color ) \n" + "{ \n" + " return color * vec4( 1, 0, 0, 1 ); \n" + "}\n" + ); + virtualProgram->setShader( "ColorFilter", redFilter ); + + redFilter->setName( "Virtual Red" ); + + transform2->getOrCreateStateSet( )->setAttribute( virtualProgram ); + } + + // Create "incomplete" VirtualProgram overriding ColorFilter function + // Lower right cow will be drawn with grid pattern on yellow background + if( 1 ) + { + VirtualProgram * virtualProgram = new VirtualProgram(); + + osg::Shader * gridFilter = new osg::Shader( osg::Shader::FRAGMENT ); + gridFilter->setShaderSource( + "vec4 ColorFilter( in vec4 color ) \n" + "{ \n" + " vec2 grid = clamp( mod( gl_FragCoord.xy, 16.0 ), 0.0, 1.0 ); \n" + " return color * vec4( grid, 0.0, 1.0 ); \n" + "}\n" + ); + virtualProgram->setShader( "ColorFilter", gridFilter ); + + gridFilter->setName( "Virtual Grid" ); + + transform3->getOrCreateStateSet( )->setAttribute( virtualProgram ); + } + + return root; +}////////////////////////////////////////// diff --git a/examples/osgshadercompositor/VirtualProgram.cpp b/examples/osgshadercompositor/VirtualProgram.cpp index b11d0f93e..57fb5a0e5 100644 --- a/examples/osgshadercompositor/VirtualProgram.cpp +++ b/examples/osgshadercompositor/VirtualProgram.cpp @@ -1,184 +1,184 @@ -//////////////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////// -#include "VirtualProgram.h" - -using namespace osg; - -// If graphics board has program linking problems set MERGE_SHADERS to 1 -// Merge shaders can be used to merge shaders strings into one shader. -#define MERGE_SHADERS 0 -#define NOTIFICATION_MESSAGES 0 - -namespace osgCandidate { -//////////////////////////////////////////////////////////////////////////////// -VirtualProgram::VirtualProgram( unsigned int mask ) : _mask( mask ) -{ -} -//////////////////////////////////////////////////////////////////////////////// -VirtualProgram::VirtualProgram - ( const VirtualProgram& VirtualProgram, const osg::CopyOp& copyop ): - osg::Program( VirtualProgram, copyop ), - _shaderMap( VirtualProgram._shaderMap ), - _mask( VirtualProgram._mask ) -{ -} -//////////////////////////////////////////////////////////////////////////////// -VirtualProgram::~VirtualProgram( void ) -{ -} -//////////////////////////////////////////////////////////////////////////////// -osg::Shader * VirtualProgram::getShader - ( const std::string & shaderSemantic, osg::Shader::Type type ) -{ - ShaderMap::key_type key( shaderSemantic, type ); - - return _shaderMap[ key ].get(); -} -//////////////////////////////////////////////////////////////////////////////// -osg::Shader * VirtualProgram::setShader -( const std::string & shaderSemantic, osg::Shader * shader ) -{ - if( shader->getType() == osg::Shader::UNDEFINED ) - return NULL; - - ShaderMap::key_type key( shaderSemantic, shader->getType() ); - - ref_ptr< osg::Shader > shaderNew = shader; - ref_ptr< osg::Shader > & shaderCurrent = _shaderMap[ key ]; - -#if 0 // Good for debugging of shader linking problems. - // Don't do it - User could use the name for its own purposes - shaderNew->setName( shaderSemantic ); -#endif - - if( shaderCurrent != shaderNew ) { -#if 0 - if( shaderCurrent.valid() ) - Program::removeShader( shaderCurrent.get() ); - - if( shaderNew.valid() ) - Program::addShader( shaderNew.get() ); -#endif - shaderCurrent = shaderNew; - } - - return shaderCurrent; -} -//////////////////////////////////////////////////////////////////////////////// -void VirtualProgram::apply( osg::State & state ) const -{ - if( _shaderMap.empty() ) // Virtual Program works as normal Program - return Program::apply( state ); - - State::AttributeVec *av = &state.getAttributeVec(this); - -#if NOTIFICATION_MESSAGES - std::ostream &os = osg::notify( osg::NOTICE ); - os << "VirtualProgram cumulate Begin" << std::endl; -#endif - - ShaderMap shaderMap; - for( State::AttributeVec::iterator i = av->begin(); i != av->end(); ++i ) - { - const osg::StateAttribute * sa = i->first; - const VirtualProgram * vp = dynamic_cast< const VirtualProgram *>( sa ); - if( vp && ( vp->_mask & _mask ) ) { - -#if NOTIFICATION_MESSAGES - if( vp->getName().empty() ) - os << "VirtualProgram cumulate [ Unnamed VP ] apply" << std::endl; - else - os << "VirtualProgram cumulate ["<< vp->getName() << "] apply" << std::endl; -#endif - - for( ShaderMap::const_iterator i = vp->_shaderMap.begin(); - i != vp->_shaderMap.end(); ++i ) - { - shaderMap[ i->first ] = i->second; - } - - } else { -#if NOTIFICATION_MESSAGES - os << "VirtualProgram cumulate ( not VP or mask not match ) ignored" << std::endl; -#endif - continue; // ignore osg::Programs - } - } - - for( ShaderMap::const_iterator i = this->_shaderMap.begin(); - i != this->_shaderMap.end(); ++i ) - shaderMap[ i->first ] = i->second; - -#if NOTIFICATION_MESSAGES - os << "VirtualProgram cumulate End" << std::endl; -#endif - - if( shaderMap.size() ) { - - ShaderList sl; - for( ShaderMap::iterator i = shaderMap.begin(); i != shaderMap.end(); ++i ) - sl.push_back( i->second ); - - osg::ref_ptr< osg::Program > & program = _programMap[ sl ]; - - if( !program.valid() ) { - program = new osg::Program; -#if !MERGE_SHADERS - for( ShaderList::iterator i = sl.begin(); i != sl.end(); ++i ) - program->addShader( i->get() ); -#else - std::string strFragment; - std::string strVertex; - std::string strGeometry; - - for( ShaderList::iterator i = sl.begin(); i != sl.end(); ++i ) - { - if( i->get()->getType() == osg::Shader::FRAGMENT ) - strFragment += i->get()->getShaderSource(); - else if ( i->get()->getType() == osg::Shader::VERTEX ) - strVertex += i->get()->getShaderSource(); - else if ( i->get()->getType() == osg::Shader::GEOMETRY ) - strGeometry += i->get()->getShaderSource(); - } - - if( strFragment.length() > 0 ) { - program->addShader( new osg::Shader( osg::Shader::FRAGMENT, strFragment ) ); -#if NOTIFICATION_MESSAGES - os << "====VirtualProgram merged Fragment Shader:" << std::endl << strFragment << "====" << std::endl; -#endif - } - - if( strVertex.length() > 0 ) { - program->addShader( new osg::Shader( osg::Shader::VERTEX, strVertex ) ); -#if NOTIFICATION_MESSAGES - os << "VirtualProgram merged Vertex Shader:" << std::endl << strVertex << "====" << std::endl; -#endif - } - - if( strGeometry.length() > 0 ) { - program->addShader( new osg::Shader( osg::Shader::GEOMETRY, strGeometry ) ); -#if NOTIFICATION_MESSAGES - os << "VirtualProgram merged Geometry Shader:" << std::endl << strGeometry << "====" << std::endl; -#endif - } -#endif - } - - state.applyAttribute( program ); - } else { - Program::apply( state ); - } - -#if NOTIFICATION_MESSAGES - os << "VirtualProgram Apply" << std::endl; -#endif - -} -//////////////////////////////////////////////////////////////////////////////// -} // namespace osgExt +//////////////////////////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +#include "VirtualProgram.h" + +using namespace osg; + +// If graphics board has program linking problems set MERGE_SHADERS to 1 +// Merge shaders can be used to merge shaders strings into one shader. +#define MERGE_SHADERS 0 +#define NOTIFICATION_MESSAGES 0 + +namespace osgCandidate { +//////////////////////////////////////////////////////////////////////////////// +VirtualProgram::VirtualProgram( unsigned int mask ) : _mask( mask ) +{ +} +//////////////////////////////////////////////////////////////////////////////// +VirtualProgram::VirtualProgram + ( const VirtualProgram& VirtualProgram, const osg::CopyOp& copyop ): + osg::Program( VirtualProgram, copyop ), + _shaderMap( VirtualProgram._shaderMap ), + _mask( VirtualProgram._mask ) +{ +} +//////////////////////////////////////////////////////////////////////////////// +VirtualProgram::~VirtualProgram( void ) +{ +} +//////////////////////////////////////////////////////////////////////////////// +osg::Shader * VirtualProgram::getShader + ( const std::string & shaderSemantic, osg::Shader::Type type ) +{ + ShaderMap::key_type key( shaderSemantic, type ); + + return _shaderMap[ key ].get(); +} +//////////////////////////////////////////////////////////////////////////////// +osg::Shader * VirtualProgram::setShader +( const std::string & shaderSemantic, osg::Shader * shader ) +{ + if( shader->getType() == osg::Shader::UNDEFINED ) + return NULL; + + ShaderMap::key_type key( shaderSemantic, shader->getType() ); + + ref_ptr< osg::Shader > shaderNew = shader; + ref_ptr< osg::Shader > & shaderCurrent = _shaderMap[ key ]; + +#if 0 // Good for debugging of shader linking problems. + // Don't do it - User could use the name for its own purposes + shaderNew->setName( shaderSemantic ); +#endif + + if( shaderCurrent != shaderNew ) { +#if 0 + if( shaderCurrent.valid() ) + Program::removeShader( shaderCurrent.get() ); + + if( shaderNew.valid() ) + Program::addShader( shaderNew.get() ); +#endif + shaderCurrent = shaderNew; + } + + return shaderCurrent; +} +//////////////////////////////////////////////////////////////////////////////// +void VirtualProgram::apply( osg::State & state ) const +{ + if( _shaderMap.empty() ) // Virtual Program works as normal Program + return Program::apply( state ); + + State::AttributeVec *av = &state.getAttributeVec(this); + +#if NOTIFICATION_MESSAGES + std::ostream &os = osg::notify( osg::NOTICE ); + os << "VirtualProgram cumulate Begin" << std::endl; +#endif + + ShaderMap shaderMap; + for( State::AttributeVec::iterator i = av->begin(); i != av->end(); ++i ) + { + const osg::StateAttribute * sa = i->first; + const VirtualProgram * vp = dynamic_cast< const VirtualProgram *>( sa ); + if( vp && ( vp->_mask & _mask ) ) { + +#if NOTIFICATION_MESSAGES + if( vp->getName().empty() ) + os << "VirtualProgram cumulate [ Unnamed VP ] apply" << std::endl; + else + os << "VirtualProgram cumulate ["<< vp->getName() << "] apply" << std::endl; +#endif + + for( ShaderMap::const_iterator i = vp->_shaderMap.begin(); + i != vp->_shaderMap.end(); ++i ) + { + shaderMap[ i->first ] = i->second; + } + + } else { +#if NOTIFICATION_MESSAGES + os << "VirtualProgram cumulate ( not VP or mask not match ) ignored" << std::endl; +#endif + continue; // ignore osg::Programs + } + } + + for( ShaderMap::const_iterator i = this->_shaderMap.begin(); + i != this->_shaderMap.end(); ++i ) + shaderMap[ i->first ] = i->second; + +#if NOTIFICATION_MESSAGES + os << "VirtualProgram cumulate End" << std::endl; +#endif + + if( shaderMap.size() ) { + + ShaderList sl; + for( ShaderMap::iterator i = shaderMap.begin(); i != shaderMap.end(); ++i ) + sl.push_back( i->second ); + + osg::ref_ptr< osg::Program > & program = _programMap[ sl ]; + + if( !program.valid() ) { + program = new osg::Program; +#if !MERGE_SHADERS + for( ShaderList::iterator i = sl.begin(); i != sl.end(); ++i ) + program->addShader( i->get() ); +#else + std::string strFragment; + std::string strVertex; + std::string strGeometry; + + for( ShaderList::iterator i = sl.begin(); i != sl.end(); ++i ) + { + if( i->get()->getType() == osg::Shader::FRAGMENT ) + strFragment += i->get()->getShaderSource(); + else if ( i->get()->getType() == osg::Shader::VERTEX ) + strVertex += i->get()->getShaderSource(); + else if ( i->get()->getType() == osg::Shader::GEOMETRY ) + strGeometry += i->get()->getShaderSource(); + } + + if( strFragment.length() > 0 ) { + program->addShader( new osg::Shader( osg::Shader::FRAGMENT, strFragment ) ); +#if NOTIFICATION_MESSAGES + os << "====VirtualProgram merged Fragment Shader:" << std::endl << strFragment << "====" << std::endl; +#endif + } + + if( strVertex.length() > 0 ) { + program->addShader( new osg::Shader( osg::Shader::VERTEX, strVertex ) ); +#if NOTIFICATION_MESSAGES + os << "VirtualProgram merged Vertex Shader:" << std::endl << strVertex << "====" << std::endl; +#endif + } + + if( strGeometry.length() > 0 ) { + program->addShader( new osg::Shader( osg::Shader::GEOMETRY, strGeometry ) ); +#if NOTIFICATION_MESSAGES + os << "VirtualProgram merged Geometry Shader:" << std::endl << strGeometry << "====" << std::endl; +#endif + } +#endif + } + + state.applyAttribute( program ); + } else { + Program::apply( state ); + } + +#if NOTIFICATION_MESSAGES + os << "VirtualProgram Apply" << std::endl; +#endif + +} +//////////////////////////////////////////////////////////////////////////////// +} // namespace osgExt diff --git a/examples/osgshadercompositor/osgshadercompositor.cpp b/examples/osgshadercompositor/osgshadercompositor.cpp index 9096ba1e2..16149d7a7 100644 --- a/examples/osgshadercompositor/osgshadercompositor.cpp +++ b/examples/osgshadercompositor/osgshadercompositor.cpp @@ -1,41 +1,41 @@ -#include -#include -#include -#include -#include -#include -#include - -extern osg::Node * CreateSimpleHierarchy( const char * file ); -extern osg::Node * CreateAdvancedHierarchy( const char * file ); - -int main( int argc, char **argv ) -{ - // construct the viewer. - osg::ArgumentParser arguments( &argc, argv ); - osgViewer::Viewer viewer( arguments ); - - std::string filename = "cow.osg"; - bool useAdvancedTechnique = arguments.read("-a") || arguments.read("--advanced") ; - - if (arguments.argc()>1) - { - if (!arguments.isOption(1)) filename = arguments[1]; - } - - // osg::Node * node = CreateSimpleHierarchy( file ); - osg::Node * node = useAdvancedTechnique ? - CreateAdvancedHierarchy( filename.c_str() ) : - CreateSimpleHierarchy( filename.c_str() ); - - if ( !node ) { - osg::notify( osg::NOTICE ) << "Error, cannot read " << filename << std::endl; - return 1; - } - - viewer.setSceneData( node ); - viewer.realize( ); - viewer.run(); - - return 0; -} +#include +#include +#include +#include +#include +#include +#include + +extern osg::Node * CreateSimpleHierarchy( const char * file ); +extern osg::Node * CreateAdvancedHierarchy( const char * file ); + +int main( int argc, char **argv ) +{ + // construct the viewer. + osg::ArgumentParser arguments( &argc, argv ); + osgViewer::Viewer viewer( arguments ); + + std::string filename = "cow.osg"; + bool useAdvancedTechnique = arguments.read("-a") || arguments.read("--advanced") ; + + if (arguments.argc()>1) + { + if (!arguments.isOption(1)) filename = arguments[1]; + } + + // osg::Node * node = CreateSimpleHierarchy( file ); + osg::Node * node = useAdvancedTechnique ? + CreateAdvancedHierarchy( filename.c_str() ) : + CreateSimpleHierarchy( filename.c_str() ); + + if ( !node ) { + osg::notify( osg::NOTICE ) << "Error, cannot read " << filename << std::endl; + return 1; + } + + viewer.setSceneData( node ); + viewer.realize( ); + viewer.run(); + + return 0; +}