2003-03-15 04:35:45 +08:00
# include <osg/GL>
# include <osgProducer/Viewer>
# include <osg/Transform>
# include <osg/Billboard>
# include <osg/Geode>
# include <osg/Group>
2003-04-02 18:50:15 +08:00
# include <osg/ShapeDrawable>
2003-03-15 04:35:45 +08:00
# include <osg/Notify>
# include <osgDB/Registry>
# include <osgDB/ReadFile>
# include <osgUtil/Optimizer>
# include <osgSim/LightPointNode>
# define INTERPOLATE(member) lp.member = start.member*rstart + end.member*rend;
void addToLightPointNode ( osgSim : : LightPointNode & lpn , osgSim : : LightPoint & start , osgSim : : LightPoint & end , unsigned int noSteps )
{
if ( noSteps < = 1 )
{
lpn . addLightPoint ( start ) ;
return ;
}
float rend = 0.0f ;
float rdelta = 1.0f / ( ( float ) noSteps - 1.0f ) ;
2003-04-02 18:50:15 +08:00
lpn . getLightPointList ( ) . reserve ( noSteps ) ;
2003-03-15 04:35:45 +08:00
for ( unsigned int i = 0 ; i < noSteps ; + + i , rend + = rdelta )
{
float rstart = 1.0f - rend ;
osgSim : : LightPoint lp ( start ) ;
INTERPOLATE ( _position )
INTERPOLATE ( _intensity ) ;
INTERPOLATE ( _color ) ;
INTERPOLATE ( _radius ) ;
lpn . addLightPoint ( lp ) ;
}
}
# undef INTERPOLATE
osg : : Node * createLightPointsDatabase ( )
{
osgSim : : LightPoint start ;
osgSim : : LightPoint end ;
start . _position . set ( 0.0f , 0.0f , 0.0f ) ;
start . _color . set ( 1.0f , 0.0f , 0.0f , 1.0f ) ;
end . _position . set ( 1000.0f , 0.0f , 0.0f ) ;
end . _color . set ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
osg : : Transform * transform = new osg : : Transform ;
osg : : Vec3 start_delta ( 0.0f , 10.0f , 0.0f ) ;
osg : : Vec3 end_delta ( 0.0f , 10.0f , 1.0f ) ;
int noStepsX = 100 ;
int noStepsY = 100 ;
// osgSim::BlinkSequence* bs = new osgSim::BlinkSequence;
// bs->addPulse(1.0,osg::Vec4(1.0f,0.0f,0.0f,1.0f));
// bs->addPulse(0.5,osg::Vec4(0.0f,0.0f,0.0f,0.0f)); // off
// bs->addPulse(1.5,osg::Vec4(1.0f,1.0f,0.0f,1.0f));
// bs->addPulse(0.5,osg::Vec4(0.0f,0.0f,0.0f,0.0f)); // off
// bs->addPulse(1.0,osg::Vec4(1.0f,1.0f,1.0f,1.0f));
// bs->addPulse(0.5,osg::Vec4(0.0f,0.0f,0.0f,0.0f)); // off
// osgSim::Sector* sector = new osgSim::ConeSector(osg::Vec3(0.0f,0.0f,1.0f),osg::inDegrees(45.0),osg::inDegrees(45.0));
// osgSim::Sector* sector = new osgSim::ElevationSector(-osg::inDegrees(45.0),osg::inDegrees(45.0),osg::inDegrees(45.0));
// osgSim::Sector* sector = new osgSim::AzimSector(-osg::inDegrees(45.0),osg::inDegrees(45.0),osg::inDegrees(90.0));
// osgSim::Sector* sector = new osgSim::AzimElevationSector(osg::inDegrees(180),osg::inDegrees(90), // azim range
// osg::inDegrees(0.0),osg::inDegrees(90.0), // elevation range
// osg::inDegrees(5.0));
for ( int i = 0 ; i < noStepsY ; + + i )
{
// osgSim::BlinkSequence* local_bs = new osgSim::BlinkSequence(*bs);
// local_bs->setSequenceGroup(new osgSim::BlinkSequence::SequenceGroup((double)i*0.1));
// start._blinkSequence = local_bs;
// start._sector = sector;
osgSim : : LightPointNode * lpn = new osgSim : : LightPointNode ;
addToLightPointNode ( * lpn , start , end , noStepsX ) ;
start . _position + = start_delta ;
end . _position + = end_delta ;
transform - > addChild ( lpn ) ;
}
osg : : Group * group = new osg : : Group ;
group - > addChild ( transform ) ;
return group ;
}
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.
2003-04-09 19:44:32 +08:00
arguments . getApplicationUsage ( ) - > setDescription ( arguments . getApplicationName ( ) + " is the example which demonstrates use high quality light point, typically used for naviagional lights. " ) ;
2003-04-07 05:32:44 +08:00
arguments . getApplicationUsage ( ) - > setCommandLineUsage ( arguments . getApplicationName ( ) + " [options] filename ... " ) ;
2003-03-15 04:35:45 +08:00
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " -h or --help " , " Display this information " ) ;
// construct the viewer.
osgProducer : : Viewer viewer ( arguments ) ;
// set up the value with sensible default event handlers.
viewer . setUpViewer ( osgProducer : : Viewer : : STANDARD_SETTINGS ) ;
// get details on keyboard and mouse bindings used by the viewer.
viewer . getUsage ( * arguments . getApplicationUsage ( ) ) ;
// if user request help write it out to cout.
if ( arguments . read ( " -h " ) | | arguments . read ( " --help " ) )
{
arguments . getApplicationUsage ( ) - > write ( std : : cout ) ;
return 1 ;
}
// any option left unread are converted into errors to write out later.
arguments . reportRemainingOptionsAsUnrecognized ( ) ;
// report any errors if they have occured when parsing the program aguments.
if ( arguments . errors ( ) )
{
arguments . writeErrorMessages ( std : : cout ) ;
return 1 ;
}
2003-04-07 05:32:44 +08:00
2003-03-15 04:35:45 +08:00
osg : : Group * rootnode = new osg : : Group ;
// load the nodes from the commandline arguments.
rootnode - > addChild ( osgDB : : readNodeFiles ( arguments ) ) ;
rootnode - > addChild ( createLightPointsDatabase ( ) ) ;
2003-04-02 18:50:15 +08:00
2003-03-15 04:35:45 +08:00
// run optimization over the scene graph
osgUtil : : Optimizer optimzer ;
optimzer . optimize ( rootnode ) ;
// add a viewport to the viewer and attach the scene graph.
viewer . setSceneData ( rootnode ) ;
// create the windows and run the threads.
2003-04-08 23:18:45 +08:00
viewer . realize ( ) ;
2003-03-15 04:35:45 +08:00
while ( ! viewer . done ( ) )
{
// wait for all cull and draw threads to complete.
viewer . sync ( ) ;
// update the scene by traversing it with the the update visitor which will
// call all node update callbacks and animations.
viewer . update ( ) ;
// fire off the cull and draw traversals of the scene.
viewer . frame ( ) ;
}
2003-03-25 18:05:09 +08:00
// wait for all cull and draw threads to complete before exit.
viewer . sync ( ) ;
2003-03-15 04:35:45 +08:00
return 0 ;
}