2003-01-22 00:45:36 +08:00
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield
*
* This library is open source and may be redistributed and / or modified under
* the terms of the OpenSceneGraph Public License ( OSGPL ) version 0.0 or
* ( at your option ) any later version . The full license is in LICENSE file
* included with this distribution , and on the openscenegraph . org website .
*
* This library 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 . See the
* OpenSceneGraph Public License for more details .
*/
2001-12-22 06:48:19 +08:00
# include <osg/DisplaySettings>
2003-02-19 05:10:42 +08:00
# include <osg/ArgumentParser>
2003-02-19 00:36:42 +08:00
# include <osg/ApplicationUsage>
2003-01-10 17:25:42 +08:00
# include <osg/ref_ptr>
2001-12-19 08:38:23 +08:00
# include <algorithm>
using namespace osg ;
2002-02-23 01:12:10 +08:00
using namespace std ;
2002-02-28 08:11:31 +08:00
DisplaySettings * DisplaySettings : : instance ( )
{
2003-01-10 17:25:42 +08:00
static ref_ptr < DisplaySettings > s_displaySettings = new DisplaySettings ;
2002-02-28 08:11:31 +08:00
return s_displaySettings . get ( ) ;
}
2001-12-22 06:48:19 +08:00
DisplaySettings : : DisplaySettings ( const DisplaySettings & vs ) : Referenced ( )
2001-12-19 08:38:23 +08:00
{
copy ( vs ) ;
}
2001-12-22 06:48:19 +08:00
DisplaySettings : : ~ DisplaySettings ( )
2001-12-19 08:38:23 +08:00
{
}
2002-02-28 08:11:31 +08:00
DisplaySettings & DisplaySettings : : operator = ( const DisplaySettings & vs )
2001-12-19 08:38:23 +08:00
{
if ( this = = & vs ) return * this ;
copy ( vs ) ;
return * this ;
}
2001-12-22 06:48:19 +08:00
void DisplaySettings : : copy ( const DisplaySettings & vs )
2001-12-19 08:38:23 +08:00
{
_stereoMode = vs . _stereoMode ;
2002-08-29 11:22:27 +08:00
_eyeSeparation = vs . _eyeSeparation ;
2001-12-19 08:38:23 +08:00
_screenDistance = vs . _screenDistance ;
2001-12-22 06:48:19 +08:00
_screenHeight = vs . _screenHeight ;
2001-12-19 08:38:23 +08:00
2002-04-15 06:21:59 +08:00
_splitStereoHorizontalEyeMapping = vs . _splitStereoHorizontalEyeMapping ;
2002-08-29 11:22:27 +08:00
_splitStereoHorizontalSeparation = vs . _splitStereoHorizontalSeparation ;
2002-04-15 06:21:59 +08:00
_splitStereoVerticalEyeMapping = vs . _splitStereoVerticalEyeMapping ;
2002-08-29 11:22:27 +08:00
_splitStereoVerticalSeparation = vs . _splitStereoVerticalSeparation ;
2002-04-15 06:21:59 +08:00
2001-12-19 08:38:23 +08:00
_doubleBuffer = vs . _doubleBuffer ;
_RGB = vs . _RGB ;
_depthBuffer = vs . _depthBuffer ;
_minimumNumberAlphaBits = vs . _minimumNumberAlphaBits ;
_minimumNumberStencilBits = vs . _minimumNumberStencilBits ;
2002-02-28 08:11:31 +08:00
_maxNumOfGraphicsContexts = vs . _maxNumOfGraphicsContexts ;
2001-12-19 08:38:23 +08:00
}
2001-12-22 06:48:19 +08:00
void DisplaySettings : : merge ( const DisplaySettings & vs )
2001-12-19 08:38:23 +08:00
{
if ( _stereo | | vs . _stereo ) _stereo = true ;
// need to think what to do about merging the stereo mode.
if ( _doubleBuffer | | vs . _doubleBuffer ) _doubleBuffer = true ;
if ( _RGB | | vs . _RGB ) _RGB = true ;
if ( _depthBuffer | | vs . _depthBuffer ) _depthBuffer = true ;
if ( vs . _minimumNumberAlphaBits > _minimumNumberAlphaBits ) _minimumNumberAlphaBits = vs . _minimumNumberAlphaBits ;
if ( vs . _minimumNumberStencilBits > _minimumNumberStencilBits ) _minimumNumberStencilBits = vs . _minimumNumberStencilBits ;
}
2001-12-22 06:48:19 +08:00
void DisplaySettings : : setDefaults ( )
2001-12-19 08:38:23 +08:00
{
_stereo = false ;
_stereoMode = ANAGLYPHIC ;
2002-08-29 11:22:27 +08:00
_eyeSeparation = 0.05f ;
2001-12-22 06:48:19 +08:00
_screenDistance = 0.5f ;
_screenHeight = 0.26f ;
2001-12-19 08:38:23 +08:00
2002-04-15 06:21:59 +08:00
_splitStereoHorizontalEyeMapping = LEFT_EYE_LEFT_VIEWPORT ;
2003-05-26 23:00:38 +08:00
_splitStereoHorizontalSeparation = 0 ;
2002-04-15 06:21:59 +08:00
_splitStereoVerticalEyeMapping = LEFT_EYE_TOP_VIEWPORT ;
2003-05-26 23:00:38 +08:00
_splitStereoVerticalSeparation = 0 ;
2002-04-15 06:21:59 +08:00
2001-12-19 08:38:23 +08:00
_doubleBuffer = true ;
_RGB = true ;
_depthBuffer = true ;
_minimumNumberAlphaBits = 0 ;
_minimumNumberStencilBits = 0 ;
2002-02-28 08:11:31 +08:00
2003-04-03 22:12:09 +08:00
_maxNumOfGraphicsContexts = 3 ;
2001-12-19 08:38:23 +08:00
}
2003-04-02 16:22:47 +08:00
static ApplicationUsageProxy DisplaySetting_e0 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_STEREO_MODE <mode> " , " QUAD_BUFFER | ANAGLYPHIC | HORIZONTAL_SPLIT | VERTICAL_SPLIT | LEFT_EYE | RIGHT_EYE " ) ;
static ApplicationUsageProxy DisplaySetting_e1 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_STEREO <mode> " , " OFF | ON " ) ;
static ApplicationUsageProxy DisplaySetting_e2 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_EYE_SEPARATION <float> " , " physical distance between eyes " ) ;
static ApplicationUsageProxy DisplaySetting_e3 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SCREEN_DISTANCE <float> " , " physical distance between eyes and screen " ) ;
static ApplicationUsageProxy DisplaySetting_e4 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SCREEN_HEIGHT <float> " , " physical screen height " ) ;
static ApplicationUsageProxy DisplaySetting_e5 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SPLIT_STEREO_HORIZONTAL_EYE_MAPPING <mode> " , " LEFT_EYE_LEFT_VIEWPORT | LEFT_EYE_RIGHT_VIEWPORT " ) ;
static ApplicationUsageProxy DisplaySetting_e8 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SPLIT_STEREO_HORIZONTAL_SEPARATION <float> " , " number of pixels between viewports " ) ;
static ApplicationUsageProxy DisplaySetting_e9 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SPLIT_STEREO_VERTICAL_EYE_MAPPING <mode> " , " LEFT_EYE_TOP_VIEWPORT | LEFT_EYE_BOTTOM_VIEWPORT " ) ;
static ApplicationUsageProxy DisplaySetting_e11 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_SPLIT_STEREO_VERTICAL_SEPARATION <float> " , " number of pixels between viewports " ) ;
static ApplicationUsageProxy DisplaySetting_e12 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_MAX_NUMBER_OF_GRAPHICS_CONTEXTS <int> " , " maximum number of graphics contexts to be used with applications. " ) ;
2003-02-19 00:36:42 +08:00
2001-12-22 06:48:19 +08:00
void DisplaySettings : : readEnvironmentalVariables ( )
2001-12-19 08:38:23 +08:00
{
char * ptr ;
2002-01-30 23:02:56 +08:00
if ( ( ptr = getenv ( " OSG_STEREO_MODE " ) ) ! = 0 )
2001-12-19 08:38:23 +08:00
{
if ( strcmp ( ptr , " QUAD_BUFFER " ) = = 0 )
{
_stereoMode = QUAD_BUFFER ;
}
else
if ( strcmp ( ptr , " ANAGLYPHIC " ) = = 0 )
{
_stereoMode = ANAGLYPHIC ;
}
else
if ( strcmp ( ptr , " HORIZONTAL_SPLIT " ) = = 0 )
{
_stereoMode = HORIZONTAL_SPLIT ;
}
else
if ( strcmp ( ptr , " VERTICAL_SPLIT " ) = = 0 )
{
_stereoMode = VERTICAL_SPLIT ;
}
2002-11-12 18:22:38 +08:00
else
if ( strcmp ( ptr , " LEFT_EYE " ) = = 0 )
{
_stereoMode = LEFT_EYE ;
}
else
if ( strcmp ( ptr , " RIGHT_EYE " ) = = 0 )
{
_stereoMode = RIGHT_EYE ;
}
2001-12-19 08:38:23 +08:00
}
2002-01-30 23:02:56 +08:00
if ( ( ptr = getenv ( " OSG_STEREO " ) ) ! = 0 )
2001-12-19 08:38:23 +08:00
{
if ( strcmp ( ptr , " OFF " ) = = 0 )
{
_stereo = false ;
}
else
if ( strcmp ( ptr , " ON " ) = = 0 )
{
_stereo = true ;
}
}
2002-08-29 11:22:27 +08:00
if ( ( ptr = getenv ( " OSG_EYE_SEPARATION " ) ) ! = 0 )
2001-12-19 08:38:23 +08:00
{
2002-08-29 11:22:27 +08:00
_eyeSeparation = atof ( ptr ) ;
2001-12-19 08:38:23 +08:00
}
2001-12-19 18:29:18 +08:00
2002-01-30 23:02:56 +08:00
if ( ( ptr = getenv ( " OSG_SCREEN_DISTANCE " ) ) ! = 0 )
2001-12-19 18:29:18 +08:00
{
_screenDistance = atof ( ptr ) ;
}
2001-12-22 06:48:19 +08:00
2002-01-30 23:02:56 +08:00
if ( ( ptr = getenv ( " OSG_SCREEN_HEIGHT " ) ) ! = 0 )
2001-12-22 06:48:19 +08:00
{
_screenHeight = atof ( ptr ) ;
}
2002-02-28 08:11:31 +08:00
2002-04-15 06:21:59 +08:00
if ( ( ptr = getenv ( " OSG_SPLIT_STEREO_HORIZONTAL_EYE_MAPPING " ) ) ! = 0 )
{
if ( strcmp ( ptr , " LEFT_EYE_LEFT_VIEWPORT " ) = = 0 )
{
_splitStereoHorizontalEyeMapping = LEFT_EYE_LEFT_VIEWPORT ;
}
else
if ( strcmp ( ptr , " LEFT_EYE_RIGHT_VIEWPORT " ) = = 0 )
{
_splitStereoHorizontalEyeMapping = LEFT_EYE_RIGHT_VIEWPORT ;
}
}
2002-08-29 11:22:27 +08:00
if ( ( ptr = getenv ( " OSG_SPLIT_STEREO_HORIZONTAL_SEPARATION " ) ) ! = 0 )
2002-04-15 06:21:59 +08:00
{
2002-08-29 11:22:27 +08:00
_splitStereoHorizontalSeparation = atoi ( ptr ) ;
2002-04-15 06:21:59 +08:00
}
if ( ( ptr = getenv ( " OSG_SPLIT_STEREO_VERTICAL_EYE_MAPPING " ) ) ! = 0 )
{
if ( strcmp ( ptr , " LEFT_EYE_TOP_VIEWPORT " ) = = 0 )
{
_splitStereoVerticalEyeMapping = LEFT_EYE_TOP_VIEWPORT ;
}
else
if ( strcmp ( ptr , " LEFT_EYE_BOTTOM_VIEWPORT " ) = = 0 )
{
_splitStereoVerticalEyeMapping = LEFT_EYE_BOTTOM_VIEWPORT ;
}
}
2002-08-29 11:22:27 +08:00
if ( ( ptr = getenv ( " OSG_SPLIT_STEREO_VERTICAL_SEPARATION " ) ) ! = 0 )
2002-04-15 06:21:59 +08:00
{
2002-08-29 11:22:27 +08:00
_splitStereoVerticalSeparation = atoi ( ptr ) ;
2002-04-15 06:21:59 +08:00
}
2002-02-28 08:11:31 +08:00
if ( ( ptr = getenv ( " OSG_MAX_NUMBER_OF_GRAPHICS_CONTEXTS " ) ) ! = 0 )
{
2002-03-24 05:30:32 +08:00
_maxNumOfGraphicsContexts = atoi ( ptr ) ;
2002-02-28 08:11:31 +08:00
}
2001-12-19 08:38:23 +08:00
}
2003-02-19 05:58:40 +08:00
void DisplaySettings : : readCommandLine ( ArgumentParser & arguments )
2003-02-19 00:36:42 +08:00
{
2003-02-19 05:58:40 +08:00
// report the usage options.
if ( arguments . getApplicationUsage ( ) )
{
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --stereo " , " Use default stereo mode which is ANAGLYPHIC if not overriden by environmental variable " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --stereo <mode> " , " ANAGLYPHIC | QUAD_BUFFER | HORIZONTAL_SPLIT | VERTICAL_SPLIT | LEFT_EYE | RIGHT_EYE | ON | OFF " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --rgba " , " Request a RGBA color buffer visual " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --stencil " , " Request a stencil buffer visual " ) ;
}
2003-02-19 00:36:42 +08:00
int pos ;
2003-02-19 05:58:40 +08:00
while ( ( pos = arguments . find ( " --stereo " ) ) ! = 0 )
2003-02-19 00:36:42 +08:00
{
2003-02-19 05:58:40 +08:00
if ( arguments . match ( pos + 1 , " ANAGLYPHIC " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = ANAGLYPHIC ; }
else if ( arguments . match ( pos + 1 , " QUAD_BUFFER " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = QUAD_BUFFER ; }
else if ( arguments . match ( pos + 1 , " HORIZONTAL_SPLIT " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = HORIZONTAL_SPLIT ; }
else if ( arguments . match ( pos + 1 , " VERTICAL_SPLIT " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = VERTICAL_SPLIT ; }
else if ( arguments . match ( pos + 1 , " LEFT_EYE " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = LEFT_EYE ; }
else if ( arguments . match ( pos + 1 , " RIGHT_EYE " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; _stereoMode = RIGHT_EYE ; }
else if ( arguments . match ( pos + 1 , " ON " ) ) { arguments . remove ( pos , 2 ) ; _stereo = true ; }
else if ( arguments . match ( pos + 1 , " OFF " ) ) { arguments . remove ( pos , 2 ) ; _stereo = false ; }
else { arguments . remove ( pos ) ; _stereo = true ; }
2003-02-19 00:36:42 +08:00
}
2003-02-19 05:58:40 +08:00
while ( arguments . read ( " --rgba " ) )
2003-02-19 00:36:42 +08:00
{
_RGB = true ;
_minimumNumberAlphaBits = 1 ;
}
2003-02-19 05:58:40 +08:00
while ( arguments . read ( " --stencil " ) )
2003-02-19 00:36:42 +08:00
{
_minimumNumberStencilBits = 1 ;
}
}