Hi

I am trying to set the object transparency from 1.0 -> 0.0 and vice versa;
but when I start changing the alpha of the material the object becomes dark.

I have changed the material parameters but without success; when I look in
the loaded model (for example cow.osg) for material, the material is always
null.

I have modified the osgviewer example and attached it.

Could s.o. give me a hint what I am doing wrong ?


Thanks

Dieter



Unclassified Mail



Disclaimer:

This e-mail may contain confidential and/or privileged information. If you are
not the intended recipient (or have received this e-mail in error) please 
notify the sender and delete this e-mail. Any unauthorized copying, disclosure
or distribution of the material in this e-mail is strictly forbidden.

Considering the inherent risks of the use of e-mail communication, 
Thales Nederland BV shall not be liable for any damage derived from it. 

Thales Nederland BV is seated in Hengelo (Ov.), the Netherlands, 
and registered at the Chamber of Commerce under number 06061578.

/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 
 *
 * This application is open source and may be redistributed and/or modified   
 * freely and without restriction, both in commericial and non commericial 
applications,
 * as long as this copyright notice is maintained.
 * 
 * This application is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>

#include <osg/Switch>
#include <osgText/Text>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osg/Material>
#include <osg/BlendFunc> 
#include <iostream>


int doAlpha;
float currentAlpha;
osg::ref_ptr<osg::Node> loadedModel;

void  setAlpha()
{
        if ( doAlpha == 1)
                 currentAlpha +=.01;
        if  ( doAlpha == 2)
                 currentAlpha -=.01;
         
        if (loadedModel.valid())
        {
                osg::StateSet *ss = loadedModel ->getOrCreateStateSet();
 
                osg::Material* blendMaterial = 0;
 
                blendMaterial = 
(osg::Material*)(ss->getAttribute(osg::StateAttribute::MATERIAL));

                if(blendMaterial ==0)
                {
                        blendMaterial = new osg::Material();
                  
                }
                 
                if (doAlpha == 1)
                {
                        if (currentAlpha <1.0)
                        {
                                blendMaterial->setAlpha( 
osg::Material::FRONT_AND_BACK, currentAlpha);
                                 
                        }
                        else
                        {
                                blendMaterial->setAlpha( 
osg::Material::FRONT_AND_BACK, 1.0);
                                doAlpha = 0;
                        }
                }
                else if (doAlpha == 2)
                {
                        if (currentAlpha  > .0)
                        {
                                blendMaterial->setAlpha( 
osg::Material::FRONT_AND_BACK, currentAlpha);
                        }
                        else
                        {
                                blendMaterial->setAlpha( 
osg::Material::FRONT_AND_BACK, 0.0);
                                doAlpha = 0;
                        }
                }
                osg::BlendFunc *bl = new osg::BlendFunc();
        bl->setFunction(osg::BlendFunc::SRC_ALPHA, 
osg::BlendFunc::ONE_MINUS_SRC_ALPHA); 
                 
                ss->setAttributeAndModes(bl, osg::StateAttribute::ON 
|osg::StateAttribute::OVERRIDE);
                 
                ss->setMode(GL_BLEND, osg::StateAttribute::ON 
|osg::StateAttribute::OVERRIDE);
                ss->setAttributeAndModes(blendMaterial ,osg::StateAttribute::ON 
|osg::StateAttribute::OVERRIDE);
                ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

                loadedModel->setStateSet( ss );  // not neccessary
                 
                if (currentAlpha >=1 )
                {
             doAlpha = 0;

                         ss->setMode(GL_BLEND, osg::StateAttribute::OFF);
                         
ss->setAttributeAndModes(blendMaterial,osg::StateAttribute::OFF);
                }
                if (currentAlpha < 0)
                         doAlpha = 1;
 
        }
}
int main(int argc, char** argv)
{
    // use an ArgumentParser object to manage the program arguments.
    osg::ArgumentParser arguments(&argc,argv);

    
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
    
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
 is the standard OpenSceneGraph example which loads and visualises 3d models.");
    
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
 [options] filename ...");
    arguments.getApplicationUsage()->addCommandLineOption("--image 
<filename>","Load an image and render it on a quad");
    arguments.getApplicationUsage()->addCommandLineOption("--dem 
<filename>","Load an image/DEM and render it on a HeightField");
    arguments.getApplicationUsage()->addCommandLineOption("-h or 
--help","Display command line parameters");
    arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display 
environmental variables available");
    
arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display 
keyboard & mouse bindings available");
    arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display 
all command line, env vars and keyboard & mouse bindings.");
    
arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select
 SingleThreaded threading model for viewer.");
    
arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select
 CullDrawThreadPerContext threading model for viewer.");
    
arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select
 DrawThreadPerContext threading model for viewer.");
    
arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select
 CullThreadPerCameraDrawThreadPerContext threading model for viewer.");

    // if user request help write it out to cout.
    bool helpAll = arguments.read("--help-all");
    unsigned int helpType = ((helpAll || arguments.read("-h") || 
arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
                            ((helpAll ||  arguments.read("--help-env"))? 
osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) |
                            ((helpAll ||  arguments.read("--help-keys"))? 
osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 );
    if (helpType)
    {
        arguments.getApplicationUsage()->write(std::cout, helpType);
        return 1;
    }

    osgViewer::Viewer viewer(arguments);
    
    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }
    
    if (arguments.argc()<=1)
    {
        
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
        return 1;
    }

    // set up the camera manipulators.
    {
        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = 
new osgGA::KeySwitchMatrixManipulator;

        keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new 
osgGA::TrackballManipulator() );
        keyswitchManipulator->addMatrixManipulator( '2', "Flight", new 
osgGA::FlightManipulator() );
        keyswitchManipulator->addMatrixManipulator( '3', "Drive", new 
osgGA::DriveManipulator() );
        keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new 
osgGA::TerrainManipulator() );

        std::string pathfile;
        char keyForAnimationPath = '5';
        while (arguments.read("-p",pathfile))
        {
            osgGA::AnimationPathManipulator* apm = new 
osgGA::AnimationPathManipulator(pathfile);
            if (apm || !apm->valid()) 
            {
                unsigned int num = 
keyswitchManipulator->getNumMatrixManipulators();
                keyswitchManipulator->addMatrixManipulator( 
keyForAnimationPath, "Path", apm );
                keyswitchManipulator->selectMatrixManipulator(num);
                ++keyForAnimationPath;
            }
        }

        viewer.setCameraManipulator( keyswitchManipulator.get() );
    }

    // add the state manipulator
    viewer.addEventHandler( new 
osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
    
    // add the thread model handler
    viewer.addEventHandler(new osgViewer::ThreadingHandler);

    // add the window size toggle handler
    viewer.addEventHandler(new osgViewer::WindowSizeHandler);
        
    // add the stats handler
    viewer.addEventHandler(new osgViewer::StatsHandler);

    // add the help handler
    viewer.addEventHandler(new 
osgViewer::HelpHandler(arguments.getApplicationUsage()));

    // add the record camera path handler
    viewer.addEventHandler(new osgViewer::RecordCameraPathHandler);

    // add the LOD Scale handler
    viewer.addEventHandler(new osgViewer::LODScaleHandler);

    // load the data
     loadedModel = osgDB::readNodeFiles(arguments);
    if (!loadedModel) 
    {
        std::cout << arguments.getApplicationName() <<": No data loaded" << 
std::endl;
        return 1;
    }

    // any option left unread are converted into errors to write out later.
    arguments.reportRemainingOptionsAsUnrecognized();

    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }


    // optimize the scene graph, remove redundant nodes and state etc.
    osgUtil::Optimizer optimizer;
    optimizer.optimize(loadedModel.get());

    viewer.setSceneData( loadedModel.get() );

    
    viewer.realize();

        doAlpha = 2;
        currentAlpha = 1.0;

        osg::Timer_t start_tick=osg::Timer::instance()->tick();
 
        while(!viewer.done()  )
    {
                osg::Timer_t end_tick=osg::Timer::instance()->tick();
        
                // starts after 5 sec - only to see the difference
                if (osg::Timer::instance()->delta_s(start_tick,end_tick) > 5.)
                        setAlpha();

                viewer.frame();
                
        }
    //return viewer.run();

}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to