Files
OpenSceneGraph/src/osg/CullSettings.cpp
Robert Osfield 06abd75198 From Mathias Froehlich, "We are currently getting issues with locale settings and some osg plugins.
Therefore I have changed all the occurances of atof by asciiToFloat or
asciiToDouble.

I believe that it is safe to do so at least for all the plugins.
Included here are also asciiToFloat conversion of environment variables. One
might argue that these should be locale dependent. But IMO these should be
set and interpreted by osg independent of the current locale.
"
2009-06-25 16:07:49 +00:00

173 lines
7.5 KiB
C++

/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
*/
#include <stdlib.h>
#include <string.h>
#include <osg/CullSettings>
#include <osg/ArgumentParser>
#include <osg/ApplicationUsage>
#include <osg/Notify>
using namespace osg;
CullSettings::CullSettings(const CullSettings& cs)
{
setCullSettings(cs);
}
void CullSettings::setDefaults()
{
_inheritanceMask = ALL_VARIABLES;
_inheritanceMaskActionOnAttributeSetting = DISABLE_ASSOCIATED_INHERITANCE_MASK_BIT;
_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
//_computeNearFar = COMPUTE_NEAR_FAR_USING_PRIMITIVES;
//_nearFarRatio = 0.00005f;
}
void CullSettings::setCullSettings(const CullSettings& rhs)
{
_inheritanceMask = rhs._inheritanceMask;
_inheritanceMaskActionOnAttributeSetting = rhs._inheritanceMaskActionOnAttributeSetting;
_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;
}
void CullSettings::inheritCullSettings(const CullSettings& settings, unsigned int inheritanceMask)
{
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;
}
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 = osg::asciiToDouble(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;
}
}
void CullSettings::write(std::ostream& out)
{
out<<"CullSettings: "<<this<<" {"<<std::endl;
out<<" _inheritanceMask = "<<_inheritanceMask<<std::endl;
out<<" _inheritanceMaskActionOnAttributeSetting = "<<_inheritanceMaskActionOnAttributeSetting<<std::endl;
out<<" _computeNearFar = "<<_computeNearFar<<std::endl;
out<<" _cullingMode = "<<_cullingMode<<std::endl;
out<<" _LODScale = "<<_LODScale<<std::endl;
out<<" _smallFeatureCullingPixelSize = "<<_smallFeatureCullingPixelSize<<std::endl;
out<<" _clampProjectionMatrixCallback = "<<_clampProjectionMatrixCallback.get()<<std::endl;
out<<" _nearFarRatio = "<<_nearFarRatio<<std::endl;
out<<" _impostorActive = "<<_impostorActive<<std::endl;
out<<" _depthSortImpostorSprites = "<<_depthSortImpostorSprites<<std::endl;
out<<" _impostorPixelErrorThreshold = "<<_impostorPixelErrorThreshold<<std::endl;
out<<" _numFramesToKeepImpostorSprites = "<<_numFramesToKeepImpostorSprites<<std::endl;
out<<" _cullMask = "<<_cullMask<<std::endl;
out<<" _cullMaskLeft = "<<_cullMaskLeft<<std::endl;
out<<" _cullMaskRight = "<<_cullMaskRight<<std::endl;
out<<"{"<<std::endl;
}