2007-06-12 22:20:16 +08:00
/* OpenSceneGraph example, osgpoints.
*
* 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 .
2003-06-25 05:57:13 +08:00
*/
# include <osgDB/ReadFile>
# include <osgUtil/Optimizer>
2007-01-10 21:52:22 +08:00
# include <osgViewer/Viewer>
2003-06-25 05:57:13 +08:00
# include <osg/Point>
2005-07-01 17:10:37 +08:00
# include <osg/BlendFunc>
# include <osg/Texture2D>
# include <osg/PointSprite>
2009-01-06 01:06:09 +08:00
# include <osg/PolygonMode>
2003-06-25 05:57:13 +08:00
2007-01-10 21:52:22 +08:00
# include <iostream>
2003-06-25 05:57:13 +08:00
class KeyboardEventHandler : public osgGA : : GUIEventHandler
{
public :
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
KeyboardEventHandler ( osg : : StateSet * stateset ) :
_stateset ( stateset )
{
_point = new osg : : Point ;
2005-06-27 22:28:29 +08:00
_point - > setDistanceAttenuation ( osg : : Vec3 ( 0.0 , 0.0000 , 0.05f ) ) ;
2003-06-25 05:57:13 +08:00
_stateset - > setAttribute ( _point . get ( ) ) ;
}
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
virtual bool handle ( const osgGA : : GUIEventAdapter & ea , osgGA : : GUIActionAdapter & )
{
switch ( ea . getEventType ( ) )
{
case ( osgGA : : GUIEventAdapter : : KEYDOWN ) :
{
if ( ea . getKey ( ) = = ' + ' | | ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_KP_Add )
{
changePointSize ( 1.0f ) ;
return true ;
}
else if ( ea . getKey ( ) = = ' - ' | | ea . getKey ( ) = = osgGA : : GUIEventAdapter : : KEY_KP_Subtract )
{
changePointSize ( - 1.0f ) ;
return true ;
}
2005-07-01 17:10:37 +08:00
else if ( ea . getKey ( ) = = ' < ' )
2005-06-27 22:28:29 +08:00
{
changePointAttenuation ( 1.1f ) ;
return true ;
}
2005-07-01 17:10:37 +08:00
else if ( ea . getKey ( ) = = ' > ' )
2005-06-27 22:28:29 +08:00
{
changePointAttenuation ( 1.0f / 1.1f ) ;
return true ;
}
2003-06-25 05:57:13 +08:00
break ;
}
default :
break ;
}
return false ;
}
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
float getPointSize ( ) const
{
return _point - > getSize ( ) ;
}
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
void setPointSize ( float psize )
{
if ( psize > 0.0 )
{
_point - > setSize ( psize ) ;
}
std : : cout < < " Point size " < < psize < < std : : endl ;
}
void changePointSize ( float delta )
{
setPointSize ( getPointSize ( ) + delta ) ;
}
2005-06-27 22:28:29 +08:00
void changePointAttenuation ( float scale )
{
_point - > setDistanceAttenuation ( _point - > getDistanceAttenuation ( ) * scale ) ;
}
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
osg : : ref_ptr < osg : : StateSet > _stateset ;
osg : : ref_ptr < osg : : Point > _point ;
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
} ;
int main ( int argc , char * * argv )
{
// use an ArgumentParser object to manage the program arguments.
osg : : ArgumentParser arguments ( & argc , argv ) ;
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
// set up the usage document, in case we need to print out how to use this program.
arguments . getApplicationUsage ( ) - > setApplicationName ( arguments . getApplicationName ( ) ) ;
2005-11-16 06:07:54 +08:00
arguments . getApplicationUsage ( ) - > setDescription ( arguments . getApplicationName ( ) + " example provides an interactive viewer for visualising point clouds.. " ) ;
2003-06-25 05:57:13 +08:00
arguments . getApplicationUsage ( ) - > setCommandLineUsage ( arguments . getApplicationName ( ) + " [options] filename ... " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " -h or --help " , " Display this information " ) ;
2005-07-01 17:10:37 +08:00
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --sprites " , " Point sprites. " ) ;
2009-01-06 01:06:09 +08:00
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --points " , " Sets the polygon mode to GL_POINT for front and back faces. " ) ;
2003-06-25 05:57:13 +08:00
// construct the viewer.
2007-01-10 21:52:22 +08:00
osgViewer : : Viewer viewer ;
2003-06-25 05:57:13 +08:00
2005-07-20 00:30:55 +08:00
bool shader = false ;
while ( arguments . read ( " --shader " ) ) shader = true ;
2003-06-25 05:57:13 +08:00
// if user request help write it out to cout.
if ( arguments . read ( " -h " ) | | arguments . read ( " --help " ) )
{
arguments . getApplicationUsage ( ) - > write ( std : : cout ) ;
return 1 ;
}
2015-10-22 22:14:53 +08:00
2005-07-01 17:10:37 +08:00
bool usePointSprites = false ;
while ( arguments . read ( " --sprites " ) ) { usePointSprites = true ; } ;
2003-06-25 05:57:13 +08:00
2009-01-06 01:06:09 +08:00
bool forcePointMode = false ;
while ( arguments . read ( " --points " ) ) { forcePointMode = true ; } ;
2003-06-25 05:57:13 +08:00
if ( arguments . argc ( ) < = 1 )
{
arguments . getApplicationUsage ( ) - > write ( std : : cout , osg : : ApplicationUsage : : COMMAND_LINE_OPTION ) ;
return 1 ;
}
// read the scene from the list of file specified commandline args.
2015-10-22 22:14:53 +08:00
osg : : ref_ptr < osg : : Node > loadedModel = osgDB : : readRefNodeFiles ( arguments ) ;
2003-06-25 05:57:13 +08:00
// if no model has been successfully loaded report failure.
2015-10-22 22:14:53 +08:00
if ( ! loadedModel )
2003-06-25 05:57:13 +08:00
{
std : : cout < < arguments . getApplicationName ( ) < < " : No data loaded " < < std : : endl ;
return 1 ;
}
2007-12-11 01:30:18 +08:00
// optimize the scene graph, remove redundant nodes and state etc.
2003-06-25 05:57:13 +08:00
osgUtil : : Optimizer optimizer ;
optimizer . optimize ( loadedModel . get ( ) ) ;
// set the scene to render
viewer . setSceneData ( loadedModel . get ( ) ) ;
2015-10-22 22:14:53 +08:00
2005-07-01 17:10:37 +08:00
2009-01-06 01:06:09 +08:00
osg : : StateSet * stateset = loadedModel - > getOrCreateStateSet ( ) ;
2015-10-22 22:14:53 +08:00
if ( usePointSprites )
2005-07-01 17:10:37 +08:00
{
/// Setup cool blending
osg : : BlendFunc * fn = new osg : : BlendFunc ( ) ;
stateset - > setAttributeAndModes ( fn , osg : : StateAttribute : : ON ) ;
/// Setup the point sprites
osg : : PointSprite * sprite = new osg : : PointSprite ( ) ;
stateset - > setTextureAttributeAndModes ( 0 , sprite , osg : : StateAttribute : : ON ) ;
/// The texture for the sprites
osg : : Texture2D * tex = new osg : : Texture2D ( ) ;
2015-10-22 22:14:53 +08:00
tex - > setImage ( osgDB : : readRefImageFile ( " Images/particle.rgb " ) ) ;
2005-07-01 17:10:37 +08:00
stateset - > setTextureAttributeAndModes ( 0 , tex , osg : : StateAttribute : : ON ) ;
}
2009-01-06 01:06:09 +08:00
if ( forcePointMode )
{
/// Set polygon mode to GL_POINT
osg : : PolygonMode * pm = new osg : : PolygonMode (
osg : : PolygonMode : : FRONT_AND_BACK , osg : : PolygonMode : : POINT ) ;
stateset - > setAttributeAndModes ( pm , osg : : StateAttribute : : ON | osg : : StateAttribute : : OVERRIDE ) ;
}
2015-10-22 22:14:53 +08:00
2003-06-25 05:57:13 +08:00
// register the handler for modifying the point size
2007-01-10 21:52:22 +08:00
viewer . addEventHandler ( new KeyboardEventHandler ( viewer . getCamera ( ) - > getOrCreateStateSet ( ) ) ) ;
2003-06-25 05:57:13 +08:00
2005-07-20 00:30:55 +08:00
if ( shader )
{
osg : : StateSet * stateset = loadedModel - > getOrCreateStateSet ( ) ;
2015-10-22 22:14:53 +08:00
2005-07-20 00:30:55 +08:00
///////////////////////////////////////////////////////////////////
// vertex shader using just Vec4 coefficients
2015-10-22 22:14:53 +08:00
char vertexShaderSource [ ] =
2005-07-20 00:30:55 +08:00
" void main(void) \n "
" { \n "
" \n "
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n "
" } \n " ;
2005-10-24 21:46:31 +08:00
osg : : Program * program = new osg : : Program ;
stateset - > setAttribute ( program ) ;
osg : : Shader * vertex_shader = new osg : : Shader ( osg : : Shader : : VERTEX , vertexShaderSource ) ;
program - > addShader ( vertex_shader ) ;
#if 0
2005-07-20 00:30:55 +08:00
//////////////////////////////////////////////////////////////////
// fragment shader
//
2015-10-22 22:14:53 +08:00
char fragmentShaderSource [ ] =
2005-07-20 00:30:55 +08:00
" void main(void) \n "
" { \n "
" gl_FragColor = gl_Color; \n "
" } \n " ;
2005-10-24 21:46:31 +08:00
osg : : Shader * fragment_shader = new osg : : Shader ( osg : : Shader : : FRAGMENT , fragmentShaderSource ) ;
program - > addShader ( fragment_shader ) ;
# endif
2005-07-20 00:30:55 +08:00
}
2007-01-10 21:52:22 +08:00
return viewer . run ( ) ;
2003-06-25 05:57:13 +08:00
}