2007-06-12 22:20:16 +08:00
/* OpenSceneGraph example, osgblendequation.
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
2005-01-04 00:42:27 +08:00
# include <osg/Geode>
# include <osg/Group>
# include <osg/Notify>
# include <osg/BlendEquation>
# include <osgDB/Registry>
# include <osgDB/ReadFile>
# include <osgUtil/Optimizer>
2007-01-06 00:00:28 +08:00
# include <osgViewer/Viewer>
# include <iostream>
2005-11-11 04:04:16 +08:00
const int _eq_nb = 8 ;
const osg : : BlendEquation : : Equation _equations [ _eq_nb ] =
{
2005-11-18 04:22:55 +08:00
osg : : BlendEquation : : FUNC_ADD ,
osg : : BlendEquation : : FUNC_SUBTRACT ,
osg : : BlendEquation : : FUNC_REVERSE_SUBTRACT ,
osg : : BlendEquation : : RGBA_MIN ,
osg : : BlendEquation : : RGBA_MAX ,
osg : : BlendEquation : : ALPHA_MIN ,
osg : : BlendEquation : : ALPHA_MAX ,
osg : : BlendEquation : : LOGIC_OP
2005-11-11 04:04:16 +08:00
} ;
const char * _equations_name [ _eq_nb ] =
{
2005-11-18 04:22:55 +08:00
" osg::BlendEquation::FUNC_ADD " ,
" osg::BlendEquation::FUNC_SUBTRACT " ,
" osg::BlendEquation::FUNC_REVERSE_SUBTRACT " ,
" osg::BlendEquation::RGBA_MIN " ,
" osg::BlendEquation::RGBA_MAX " ,
" osg::BlendEquation::ALPHA_MIN " ,
" osg::BlendEquation::ALPHA_MAX " ,
" osg::BlendEquation::LOGIC_OP "
2005-11-11 04:04:16 +08:00
} ;
2005-01-04 00:42:27 +08:00
2005-03-18 18:45:18 +08:00
class TechniqueEventHandler : public osgGA : : GUIEventHandler
2005-01-04 00:42:27 +08:00
{
public :
TechniqueEventHandler ( osg : : BlendEquation * blendEq ) { _blendEq = blendEq ; _eq_index = 0 ; }
TechniqueEventHandler ( ) { std : : cerr < < " Error, can't initialize it! " ; }
META_Object ( osgBlendEquationApp , TechniqueEventHandler ) ;
virtual bool handle ( const osgGA : : GUIEventAdapter & ea , osgGA : : GUIActionAdapter & ) ;
virtual void getUsage ( osg : : ApplicationUsage & usage ) const ;
protected :
~ TechniqueEventHandler ( ) { }
TechniqueEventHandler ( const TechniqueEventHandler & , const osg : : CopyOp & ) { }
2005-11-18 04:22:55 +08:00
osg : : BlendEquation * _blendEq ;
2005-01-04 00:42:27 +08:00
2005-11-18 04:22:55 +08:00
int _eq_index ;
2005-01-04 00:42:27 +08:00
} ;
2005-11-11 04:04:16 +08:00
2005-01-04 00:42:27 +08:00
2005-11-18 04:22:55 +08:00
2005-01-04 00:42:27 +08:00
bool TechniqueEventHandler : : handle ( const osgGA : : GUIEventAdapter & ea , osgGA : : GUIActionAdapter & )
{
switch ( ea . getEventType ( ) )
{
case ( osgGA : : GUIEventAdapter : : KEYDOWN ) :
{
if ( ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_Right | |
ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_KP_Right )
{
2005-11-18 04:22:55 +08:00
_eq_index + + ;
if ( _eq_index > = _eq_nb ) _eq_index = 0 ;
_blendEq - > setEquation ( _equations [ _eq_index ] ) ;
std : : cout < < " Equation name = " < < _equations_name [ _eq_index ] < < std : : endl ;
2005-01-04 00:42:27 +08:00
return true ;
}
else if ( ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_Left | |
ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_KP_Left )
{
2005-11-18 04:22:55 +08:00
_eq_index - - ;
if ( _eq_index < 0 ) _eq_index = _eq_nb - 1 ;
_blendEq - > setEquation ( _equations [ _eq_index ] ) ;
std : : cout < < " Operation name = " < < _equations_name [ _eq_index ] < < std : : endl ;
2005-01-04 00:42:27 +08:00
return true ;
}
return false ;
}
default :
return false ;
}
}
void TechniqueEventHandler : : getUsage ( osg : : ApplicationUsage & usage ) const
{
usage . addKeyboardMouseBinding ( " Left Arrow " , " Advance to next equation " ) ;
usage . addKeyboardMouseBinding ( " Right Array " , " Move to previous equation " ) ;
}
int main ( int argc , char * * argv )
{
// use an ArgumentParser object to manage the program arguments.
osg : : ArgumentParser arguments ( & argc , argv ) ;
// set up the usage document, in case we need to print out how to use this program.
arguments . getApplicationUsage ( ) - > setDescription ( arguments . getApplicationName ( ) + " is the example which demonstrates how to use glBlendEquation for mixing rendered scene and the frame-buffer. " ) ;
arguments . getApplicationUsage ( ) - > setCommandLineUsage ( arguments . getApplicationName ( ) + " [options] filename ... " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " -h or --help " , " Display this information " ) ;
// construct the viewer.
2007-01-06 00:00:28 +08:00
osgViewer : : Viewer viewer ;
2005-01-04 00:42:27 +08:00
// load the nodes from the commandline arguments.
osg : : Node * loadedModel = osgDB : : readNodeFiles ( arguments ) ;
2007-06-08 20:13:33 +08:00
// if not loaded assume no arguments passed in, try use default mode instead.
if ( ! loadedModel ) loadedModel = osgDB : : readNodeFile ( " cessnafire.osg " ) ;
2005-01-04 00:42:27 +08:00
if ( ! loadedModel )
{
2005-10-28 22:02:37 +08:00
std : : cout < < arguments . getApplicationName ( ) < < " : No data loaded " < < std : : endl ;
2005-01-04 00:42:27 +08:00
return 1 ;
}
2007-06-08 20:13:33 +08:00
2005-01-04 00:42:27 +08:00
osg : : Group * root = new osg : : Group ;
root - > addChild ( loadedModel ) ;
2007-02-13 17:38:07 +08:00
osg : : StateSet * stateset = new osg : : StateSet ;
stateset - > setDataVariance ( osg : : Object : : DYNAMIC ) ;
2005-11-18 04:22:55 +08:00
osg : : BlendEquation * blendEquation = new osg : : BlendEquation ( osg : : BlendEquation : : FUNC_ADD ) ;
2007-02-13 17:38:07 +08:00
blendEquation - > setDataVariance ( osg : : Object : : DYNAMIC ) ;
2005-11-18 04:22:55 +08:00
2005-01-04 00:42:27 +08:00
stateset - > setAttributeAndModes ( blendEquation , osg : : StateAttribute : : OVERRIDE | osg : : StateAttribute : : ON ) ;
2005-11-18 04:22:55 +08:00
2005-01-04 00:42:27 +08:00
//tell to sort the mesh before displaying it
2007-01-06 00:00:28 +08:00
stateset - > setRenderingHint ( osg : : StateSet : : TRANSPARENT_BIN ) ;
2005-01-04 00:42:27 +08:00
loadedModel - > setStateSet ( stateset ) ;
2007-01-06 00:00:28 +08:00
viewer . addEventHandler ( new TechniqueEventHandler ( blendEquation ) ) ;
2005-01-04 00:42:27 +08:00
// add a viewport to the viewer and attach the scene graph.
viewer . setSceneData ( root ) ;
2007-01-06 00:00:28 +08:00
return viewer . run ( ) ;
2005-01-04 00:42:27 +08:00
}