From ae440bfaef8dbabb6ab410de4177f880cfbf5380 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sat, 10 Oct 2009 09:53:10 +0000 Subject: [PATCH] From Wojciech Lewandowski, "ref_ptr usage changes made on 9th of June broke VirtualProgram used in osgShaderCompositor example. Taking the opportunity I modified the code a little to use earth sphere as default model. Cow.osg used previously was not looking good in advanced example. I also changed default to advanced example, because its more informative with labels describing virtual programs used to render the objects." --- .../CreateAdvancedHierachy.cpp | 64 +------------- .../CreateSimpleHierachy.cpp | 4 +- .../osgshadercompositor/VirtualProgram.cpp | 2 +- .../osgshadercompositor.cpp | 84 +++++++++++++++---- 4 files changed, 72 insertions(+), 82 deletions(-) diff --git a/examples/osgshadercompositor/CreateAdvancedHierachy.cpp b/examples/osgshadercompositor/CreateAdvancedHierachy.cpp index d67c4f437..edece33a1 100644 --- a/examples/osgshadercompositor/CreateAdvancedHierachy.cpp +++ b/examples/osgshadercompositor/CreateAdvancedHierachy.cpp @@ -1,17 +1,11 @@ #include #include #include -#include #include #include -#include #include #include #include -#include -#include -#include -#include #include "VirtualProgram.h" @@ -139,61 +133,6 @@ char PerFragmentDirectionalLightingFragmentShaderSource[] = " pow( NdotHV, gl_FrontMaterial.shininess ); \n" //17 "} \n";//18 -//////////////////////////////////////////////////////////////////////////////// -osg::Node * CreateModel( const char * file ) -{ - if ( file ) { - osg::Node * node = NULL; - node = osgDB::readNodeFile( file ); - if( node ) - return node; - } - - // File not found - create textured sphere - osg::Geode * geode = new osg::Geode; - osg::ref_ptr hints = new osg::TessellationHints; - hints->setDetailRatio( 0.3 ); - -#if 1 - osg::ref_ptr shape = new osg::ShapeDrawable - ( new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 4.0 ), hints.get() ); -#else - osg::ref_ptr shape = new osg::ShapeDrawable - ( new osg::Box( osg::Vec3(-1.0f, -1.0f, -1.0f), 2.0, 2.0, 2.0 ) ); -#endif - - shape->setColor(osg::Vec4(0.8f, 0.8f, 0.8f, 1.0f)); - - geode->addDrawable( shape.get() ); - - osg::StateSet * stateSet = new osg::StateSet; - - osg::Texture2D * texture = new osg::Texture2D( - osgDB::readImageFile("Images/land_shallow_topo_2048.jpg") - ); - - osg::Material * material = new osg::Material; - - material->setAmbient - ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.9, 0.9, 0.9, 1.0 ) ); - - material->setDiffuse - ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.9, 0.9, 0.9, 1.0 ) ); - -#if 1 - material->setSpecular - ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.7, 0.3, 0.3, 1.0 ) ); - - material->setShininess( osg::Material::FRONT_AND_BACK, 25 ); - -#endif - - stateSet->setAttributeAndModes( material ); - stateSet->setTextureAttributeAndModes( 0,texture, osg::StateAttribute::ON ); - - geode->setStateSet( stateSet ); - return geode; -} //////////////////////////////////////////////////////////////////////////////// // Convenience method to simplify code a little ... void SetVirtualProgramShader( VirtualProgram * virtualProgram, @@ -240,9 +179,8 @@ void AddLabel( osg::Group * group, const std::string & label, float offset ) text->setText( label ); } //////////////////////////////////////////////////////////////////////////////// -osg::Node * CreateAdvancedHierarchy( const char * file = NULL ) +osg::Node * CreateAdvancedHierarchy( osg::Node * model ) { - osg::Node * model = CreateModel( file ); if( !model ) return NULL; float offset = model->getBound().radius() * 1.3; // diameter diff --git a/examples/osgshadercompositor/CreateSimpleHierachy.cpp b/examples/osgshadercompositor/CreateSimpleHierachy.cpp index f89dda133..a001efe87 100644 --- a/examples/osgshadercompositor/CreateSimpleHierachy.cpp +++ b/examples/osgshadercompositor/CreateSimpleHierachy.cpp @@ -11,12 +11,10 @@ using osgCandidate::VirtualProgram; //////////////////////////////////////////////////////////////////////////////// -osg::Node * CreateSimpleHierarchy( const char * file ) +osg::Node * CreateSimpleHierarchy( osg::Node * node ) { - 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(); diff --git a/examples/osgshadercompositor/VirtualProgram.cpp b/examples/osgshadercompositor/VirtualProgram.cpp index 2a6623596..3185bb86f 100644 --- a/examples/osgshadercompositor/VirtualProgram.cpp +++ b/examples/osgshadercompositor/VirtualProgram.cpp @@ -68,7 +68,7 @@ osg::Shader * VirtualProgram::setShader shaderCurrent = shaderNew; } - return shaderCurrent.release(); + return shaderCurrent.get(); } //////////////////////////////////////////////////////////////////////////////// void VirtualProgram::apply( osg::State & state ) const diff --git a/examples/osgshadercompositor/osgshadercompositor.cpp b/examples/osgshadercompositor/osgshadercompositor.cpp index 16149d7a7..b138ed528 100644 --- a/examples/osgshadercompositor/osgshadercompositor.cpp +++ b/examples/osgshadercompositor/osgshadercompositor.cpp @@ -5,33 +5,87 @@ #include #include #include +#include +#include -extern osg::Node * CreateSimpleHierarchy( const char * file ); -extern osg::Node * CreateAdvancedHierarchy( const char * file ); +extern osg::Node * CreateSimpleHierarchy( osg::Node * model ); +extern osg::Node * CreateAdvancedHierarchy( osg::Node * model ); +//////////////////////////////////////////////////////////////////////////////// +osg::Node * CreateGlobe( void ) +{ + // File not found - create textured sphere + osg::Geode * geode = new osg::Geode; + osg::ref_ptr hints = new osg::TessellationHints; + hints->setDetailRatio( 0.3 ); + +#if 1 + osg::ref_ptr shape = new osg::ShapeDrawable + ( new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 4.0 ), hints.get() ); +#else + osg::ref_ptr shape = new osg::ShapeDrawable + ( new osg::Box( osg::Vec3(-1.0f, -1.0f, -1.0f), 2.0, 2.0, 2.0 ) ); +#endif + + shape->setColor(osg::Vec4(0.8f, 0.8f, 0.8f, 1.0f)); + + geode->addDrawable( shape.get() ); + + osg::StateSet * stateSet = new osg::StateSet; + + osg::Texture2D * texture = new osg::Texture2D( + osgDB::readImageFile("Images/land_shallow_topo_2048.jpg") + ); + + osg::Material * material = new osg::Material; + + material->setAmbient + ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.9, 0.9, 0.9, 1.0 ) ); + + material->setDiffuse + ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.9, 0.9, 0.9, 1.0 ) ); + +#if 1 + material->setSpecular + ( osg::Material::FRONT_AND_BACK, osg::Vec4( 0.7, 0.3, 0.3, 1.0 ) ); + + material->setShininess( osg::Material::FRONT_AND_BACK, 25 ); + +#endif + + stateSet->setAttributeAndModes( material ); + stateSet->setTextureAttributeAndModes( 0,texture, osg::StateAttribute::ON ); + + geode->setStateSet( stateSet ); + return geode; +} +//////////////////////////////////////////////////////////////////////////////// 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") ; + bool useSimpleExample = arguments.read("-s") || arguments.read("--simple") ; - if (arguments.argc()>1) - { - if (!arguments.isOption(1)) filename = arguments[1]; + osg::Node * model = NULL; + + if (arguments.argc()>1 && !arguments.isOption(1) ) { + std::string filename = arguments[1]; + model = osgDB::readNodeFile( filename ); + if ( !model ) { + osg::notify( osg::NOTICE ) + << "Error, cannot read " << filename + << ". Loading default earth model instead." << std::endl; + } } - // osg::Node * node = CreateSimpleHierarchy( file ); - osg::Node * node = useAdvancedTechnique ? - CreateAdvancedHierarchy( filename.c_str() ) : - CreateSimpleHierarchy( filename.c_str() ); + if( model == NULL ) + model = CreateGlobe( ); - if ( !node ) { - osg::notify( osg::NOTICE ) << "Error, cannot read " << filename << std::endl; - return 1; - } + osg::Node * node = useSimpleExample ? + CreateSimpleHierarchy( model ): + CreateAdvancedHierarchy( model ); viewer.setSceneData( node ); viewer.realize( );