2006-07-18 23:21:48 +08:00
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2004-04-30 23:35:31 +08:00
*
* 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 .
*/
2007-08-05 22:51:56 +08:00
# include <stdlib.h>
# include <string.h>
2004-04-30 23:35:31 +08:00
# include <osg/CullSettings>
2004-05-05 17:16:12 +08:00
# include <osg/ArgumentParser>
# include <osg/ApplicationUsage>
# include <osg/Notify>
2004-04-30 23:35:31 +08:00
using namespace osg ;
2004-05-05 17:16:12 +08:00
CullSettings : : CullSettings ( const CullSettings & cs )
{
setCullSettings ( cs ) ;
}
2004-04-30 23:35:31 +08:00
void CullSettings : : setDefaults ( )
{
2004-10-12 17:54:03 +08:00
_inheritanceMask = ALL_VARIABLES ;
2004-04-30 23:35:31 +08:00
_cullingMode = DEFAULT_CULLING ;
_LODScale = 1.0f ;
_smallFeatureCullingPixelSize = 2.0f ;
_computeNearFar = COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES ;
_nearFarRatio = 0.0005f ;
_impostorActive = true ;
_depthSortImpostorSprites = false ;
_impostorPixelErrorThreshold = 4.0f ;
_numFramesToKeepImpostorSprites = 10 ;
_cullMask = 0xffffffff ;
_cullMaskLeft = 0xffffffff ;
_cullMaskRight = 0xffffffff ;
// override during testing
2004-05-14 06:06:20 +08:00
//_computeNearFar = COMPUTE_NEAR_FAR_USING_PRIMITIVES;
//_nearFarRatio = 0.00005f;
2004-04-30 23:35:31 +08:00
}
2007-08-11 01:44:54 +08:00
void CullSettings : : setCullSettings ( const CullSettings & rhs )
{
_inheritanceMask = rhs . _inheritanceMask ;
_computeNearFar = rhs . _computeNearFar ;
_cullingMode = rhs . _cullingMode ;
_LODScale = rhs . _LODScale ;
_smallFeatureCullingPixelSize = rhs . _smallFeatureCullingPixelSize ;
_clampProjectionMatrixCallback = rhs . _clampProjectionMatrixCallback ;
_nearFarRatio = rhs . _nearFarRatio ;
_impostorActive = rhs . _impostorActive ;
_depthSortImpostorSprites = rhs . _depthSortImpostorSprites ;
_impostorPixelErrorThreshold = rhs . _impostorPixelErrorThreshold ;
_numFramesToKeepImpostorSprites = rhs . _numFramesToKeepImpostorSprites ;
_cullMask = rhs . _cullMask ;
_cullMaskLeft = rhs . _cullMaskLeft ;
_cullMaskRight = rhs . _cullMaskRight ;
}
2004-10-12 17:54:03 +08:00
void CullSettings : : inheritCullSettings ( const CullSettings & settings , unsigned int inheritanceMask )
2004-04-30 23:35:31 +08:00
{
2004-10-12 17:54:03 +08:00
if ( inheritanceMask & COMPUTE_NEAR_FAR_MODE ) _computeNearFar = settings . _computeNearFar ;
if ( inheritanceMask & NEAR_FAR_RATIO ) _nearFarRatio = settings . _nearFarRatio ;
if ( inheritanceMask & IMPOSTOR_ACTIVE ) _impostorActive = settings . _impostorActive ;
if ( inheritanceMask & DEPTH_SORT_IMPOSTOR_SPRITES ) _depthSortImpostorSprites = settings . _depthSortImpostorSprites ;
if ( inheritanceMask & IMPOSTOR_PIXEL_ERROR_THRESHOLD ) _impostorPixelErrorThreshold = settings . _impostorPixelErrorThreshold ;
if ( inheritanceMask & NUM_FRAMES_TO_KEEP_IMPOSTORS_SPRITES ) _numFramesToKeepImpostorSprites = settings . _numFramesToKeepImpostorSprites ;
if ( inheritanceMask & CULL_MASK ) _cullMask = settings . _cullMask ;
if ( inheritanceMask & CULL_MASK_LEFT ) _cullMaskLeft = settings . _cullMaskLeft ;
if ( inheritanceMask & CULL_MASK_RIGHT ) _cullMaskRight = settings . _cullMaskRight ;
if ( inheritanceMask & CULLING_MODE ) _cullingMode = settings . _cullingMode ;
if ( inheritanceMask & LOD_SCALE ) _LODScale = settings . _LODScale ;
if ( inheritanceMask & SMALL_FEATURE_CULLING_PIXEL_SIZE ) _smallFeatureCullingPixelSize = settings . _smallFeatureCullingPixelSize ;
if ( inheritanceMask & CLAMP_PROJECTION_MATRIX_CALLBACK ) _clampProjectionMatrixCallback = settings . _clampProjectionMatrixCallback ;
2004-04-30 23:35:31 +08:00
}
2004-05-05 17:16:12 +08:00
2004-10-12 17:54:03 +08:00
2004-05-05 17:16:12 +08:00
static ApplicationUsageProxy ApplicationUsageProxyCullSettings_e0 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_COMPUTE_NEAR_FAR_MODE <mode> " , " DO_NOT_COMPUTE_NEAR_FAR | COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES | COMPUTE_NEAR_FAR_USING_PRIMITIVES " ) ;
static ApplicationUsageProxy ApplicationUsageProxyCullSettings_e1 ( ApplicationUsage : : ENVIRONMENTAL_VARIABLE , " OSG_NEAR_FAR_RATIO <float> " , " Set the ratio between near and far planes - must greater than 0.0 but less than 1.0. " ) ;
void CullSettings : : readEnvironmentalVariables ( )
{
osg : : notify ( osg : : INFO ) < < " CullSettings::readEnvironmentalVariables() " < < std : : endl ;
char * ptr ;
if ( ( ptr = getenv ( " OSG_COMPUTE_NEAR_FAR_MODE " ) ) ! = 0 )
{
if ( strcmp ( ptr , " DO_NOT_COMPUTE_NEAR_FAR " ) = = 0 ) _computeNearFar = DO_NOT_COMPUTE_NEAR_FAR ;
else if ( strcmp ( ptr , " COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES " ) = = 0 ) _computeNearFar = COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES ;
else if ( strcmp ( ptr , " COMPUTE_NEAR_FAR_USING_PRIMITIVES " ) = = 0 ) _computeNearFar = COMPUTE_NEAR_FAR_USING_PRIMITIVES ;
osg : : notify ( osg : : INFO ) < < " Set compute near far mode to " < < _computeNearFar < < std : : endl ;
}
if ( ( ptr = getenv ( " OSG_NEAR_FAR_RATIO " ) ) ! = 0 )
{
_nearFarRatio = atof ( ptr ) ;
osg : : notify ( osg : : INFO ) < < " Set near/far ratio to " < < _nearFarRatio < < std : : endl ;
}
}
void CullSettings : : readCommandLine ( ArgumentParser & arguments )
{
// report the usage options.
if ( arguments . getApplicationUsage ( ) )
{
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --COMPUTE_NEAR_FAR_MODE <mode> " , " DO_NOT_COMPUTE_NEAR_FAR | COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES | COMPUTE_NEAR_FAR_USING_PRIMITIVES " ) ;
arguments . getApplicationUsage ( ) - > addCommandLineOption ( " --NEAR_FAR_RATIO <float> " , " Set the ratio between near and far planes - must greater than 0.0 but less than 1.0. " ) ;
}
std : : string str ;
while ( arguments . read ( " --COMPUTE_NEAR_FAR_MODE " , str ) )
{
if ( str = = " DO_NOT_COMPUTE_NEAR_FAR " ) _computeNearFar = DO_NOT_COMPUTE_NEAR_FAR ;
else if ( str = = " COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES " ) _computeNearFar = COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES ;
else if ( str = = " COMPUTE_NEAR_FAR_USING_PRIMITIVES " ) _computeNearFar = COMPUTE_NEAR_FAR_USING_PRIMITIVES ;
osg : : notify ( osg : : INFO ) < < " Set compute near far mode to " < < _computeNearFar < < std : : endl ;
}
double value ;
while ( arguments . read ( " --NEAR_FAR_RATIO " , value ) )
{
_nearFarRatio = value ;
osg : : notify ( osg : : INFO ) < < " Set near/far ratio to " < < _nearFarRatio < < std : : endl ;
}
}