int main( int argc, char** argv )
{
    osg::ArgumentParser arguments( &argc, argv );
    
    bool shadowed = false;
    if ( arguments.read("--shadowed") ) shadowed = true;
    
    osg::Node* model = osgDB::readNodeFiles( arguments );
    if ( !model ) model = osgDB::readNodeFile( "lz.osg" );
    
    osg::ref_ptr<osg::LightSource> ls = new osg::LightSource;
    ls->getLight()->setLightNum( 0 );
	ls->getLight()->setPosition( osg::Vec4(0.5f, 0.5f, 0.5f, 0.0f) );
	ls->getLight()->setAmbient( osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f) );
	ls->getLight()->setDiffuse( osg::Vec4(0.49f, 0.465f, 0.494f, 1.0f) );
    ls->getLight()->setSpecular( osg::Vec4(1.0f, 0.98f, 0.95f, 1.0f) );
    
    osg::ref_ptr<SilverLiningNode> silverLining = new MySilverLiningNode( "Your user name", "Your license code" );
    silverLining->setGlobalLight( ls->getLight() );  // The light will be changed on the fly by SilverLining
    
    osg::ref_ptr<osg::MatrixTransform> scene = new osg::MatrixTransform;
    scene->addChild( shadowed ? createShadowedScene(model, ls.get()) : model );
    scene->addChild( silverLining.get() );
    
    osgViewer::Viewer viewer;
#if 0
    // With correct sky/cloud bound, we don't need to disable near/far computation now
    viewer.getCamera()->setComputeNearFarMode( osg::Camera::DO_NOT_COMPUTE_NEAR_FAR );
#endif
    viewer.getCamera()->setClearMask( GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT );  // No need for OSG to clear the color buffer now
    viewer.addEventHandler( new SilverLiningTester(silverLining.get()) );
    viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
    viewer.addEventHandler( new osgViewer::StatsHandler );
    viewer.addEventHandler( new osgViewer::WindowSizeHandler );
    viewer.setSceneData( scene.get() );
    viewer.setUpViewOnSingleScreen( 0 );
    return viewer.run();
}
int main( int argc, char** argv )
{
    osg::ArgumentParser arguments( &argc, argv );
    
    int displayMode = 1;
    if ( arguments.read("--simple-mode") ) displayMode = 0;
    else if ( arguments.read("--analysis-mode") ) displayMode = 1;
    else if ( arguments.read("--compare-mode") ) displayMode = 2;
    
    std::string effectFile("test.xml");
    arguments.read( "--effect", effectFile );
    
    bool shadowed = false;
    if ( arguments.read("--shadowed") ) shadowed = true;
    
    float lodscale = 1.0f;
    arguments.read( "--lod-scale", lodscale );
    
    std::string normalSceneFile;
    arguments.read( "--normal-scene", normalSceneFile );
    
    // Create the scene
    osg::Node* model = osgDB::readNodeFiles( arguments );
    if ( !model ) model = osgDB::readNodeFile( "lz.osg" );
    
    osg::ref_ptr<osg::Group> scene = new osg::Group;
    scene->addChild( createSkyBox() );
    scene->addChild( shadowed ? createShadowedScene(model) : model );
    
    // Create the effect compositor from XML file
#ifdef HAVE_SILVERLINING
    osg::ref_ptr<osgDB::XmlNode> xmlRoot = osgDB::readXmlFile( effectFile );
    if ( !xmlRoot )
    {
        OSG_WARN << "Effect file " << effectFile << " can't be loaded!" << std::endl;
        return 1;
    }
    
    // FIXME: SilverLining seems to be uncomfortable with default FBO settings?
    //        I'm not sure if this is a SilverLining bug or mine
    osgFX::EffectCompositor::XmlTemplateMap templateMap;
    osgFX::EffectCompositor* compositor = new osgFX::EffectCompositor;
    //compositor->setRenderTargetImplementation( osg::Camera::PIXEL_BUFFER );  // FIXME: PIXEL_BUFFER can't work with NVIDIA 310.70 driver?
    compositor->loadFromXML( xmlRoot.get(), templateMap, NULL );
#else
    osgFX::EffectCompositor* compositor = osgFX::readEffectFile( effectFile );
    if ( !compositor )
    {
        OSG_WARN << "Effect file " << effectFile << " can't be loaded!" << std::endl;
        return 1;
    }
#endif
    
    // For the fastest and simplest effect use, this is enough!
    compositor->addChild( scene.get() );
    
    // Add all to the root node of the viewer
    osg::ref_ptr<osg::Group> root = new osg::Group;
    root->addChild( compositor );
    
    if ( !normalSceneFile.empty() )
    {
        // 
        root->addChild( osgDB::readNodeFile(normalSceneFile) );
    }
    
    osgViewer::Viewer viewer;
    viewer.getCamera()->setLODScale( lodscale );
    viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
    viewer.addEventHandler( new osgViewer::StatsHandler );
    viewer.addEventHandler( new osgViewer::WindowSizeHandler );
    viewer.setSceneData( root.get() );
    
    if ( displayMode>0 )
        configureViewerForMode( viewer, compositor, scene.get(), displayMode );
    viewer.setUpViewOnSingleScreen( 0 );
    return viewer.run();
}