diff --git a/examples/osgshadow/osgshadow.cpp b/examples/osgshadow/osgshadow.cpp index f8ef4d56a..f76f2ff55 100644 --- a/examples/osgshadow/osgshadow.cpp +++ b/examples/osgshadow/osgshadow.cpp @@ -742,6 +742,7 @@ int main(int argc, char** argv) arguments.getApplicationUsage()->addCommandLineOption("--two-sided", "Use two-sided stencil extension for shadow volumes."); arguments.getApplicationUsage()->addCommandLineOption("--two-pass", "Use two-pass stencil for shadow volumes."); arguments.getApplicationUsage()->addCommandLineOption("--near-far-mode","COMPUTE_NEAR_USING_PRIMITIVES, COMPUTE_NEAR_FAR_USING_PRIMITIVES, COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES, DO_NOT_COMPUTE_NEAR_FAR"); + arguments.getApplicationUsage()->addCommandLineOption("--max-shadow-distance"," Maximum distance that the shadow map should extend from the eye point."); // construct the viewer. osgViewer::Viewer viewer(arguments); @@ -859,6 +860,14 @@ int main(int argc, char** argv) } OSG_NOTICE<setMaximumShadowMapDistance(distance); + OSG_NOTICE<<"MaximumShadowMapDistance set to "<getMaximumShadowMapDistance()< msm = NULL; if (arguments.read("--no-shadows")) diff --git a/include/osgShadow/ShadowSettings b/include/osgShadow/ShadowSettings index 649082ead..6750e4a2c 100644 --- a/include/osgShadow/ShadowSettings +++ b/include/osgShadow/ShadowSettings @@ -65,6 +65,10 @@ class OSGSHADOW_EXPORT ShadowSettings : public osg::Object void setMinimumShadowMapNearFarRatio(double ratio) { _minimumShadowMapNearFarRatio = ratio; } double getMinimumShadowMapNearFarRatio() const { return _minimumShadowMapNearFarRatio; } + void setMaximumShadowMapDistance(double distance) { _maximumShadowMapDistance = distance; } + double getMaximumShadowMapDistance() const { return _maximumShadowMapDistance; } + + enum ShadowMapProjectionHint { ORTHOGRAPHIC_SHADOW_MAP, @@ -126,6 +130,7 @@ class OSGSHADOW_EXPORT ShadowSettings : public osg::Object osg::Vec2s _textureSize; double _minimumShadowMapNearFarRatio; + double _maximumShadowMapDistance; ShadowMapProjectionHint _shadowMapProjectionHint; double _perspectiveShadowMapCutOffAngle; diff --git a/src/osgShadow/ShadowSettings.cpp b/src/osgShadow/ShadowSettings.cpp index a0acba631..0305ee7bb 100644 --- a/src/osgShadow/ShadowSettings.cpp +++ b/src/osgShadow/ShadowSettings.cpp @@ -12,6 +12,7 @@ */ #include +#include using namespace osgShadow; @@ -24,6 +25,7 @@ ShadowSettings::ShadowSettings(): _useShadowMapTextureOverride(true), _textureSize(2048,2048), _minimumShadowMapNearFarRatio(0.05), + _maximumShadowMapDistance(DBL_MAX), _shadowMapProjectionHint(PERSPECTIVE_SHADOW_MAP), _perspectiveShadowMapCutOffAngle(2.0), _numShadowMapsPerLight(1), @@ -46,6 +48,7 @@ ShadowSettings::ShadowSettings(const ShadowSettings& ss, const osg::CopyOp& copy _useShadowMapTextureOverride(ss._useShadowMapTextureOverride), _textureSize(ss._textureSize), _minimumShadowMapNearFarRatio(ss._minimumShadowMapNearFarRatio), + _maximumShadowMapDistance(ss._maximumShadowMapDistance), _shadowMapProjectionHint(ss._shadowMapProjectionHint), _perspectiveShadowMapCutOffAngle(ss._perspectiveShadowMapCutOffAngle), _numShadowMapsPerLight(ss._numShadowMapsPerLight), diff --git a/src/osgShadow/ViewDependentShadowMap.cpp b/src/osgShadow/ViewDependentShadowMap.cpp index 889923e9f..82ba278df 100644 --- a/src/osgShadow/ViewDependentShadowMap.cpp +++ b/src/osgShadow/ViewDependentShadowMap.cpp @@ -799,9 +799,12 @@ void ViewDependentShadowMap::cull(osgUtil::CullVisitor& cv) cv.computeNearPlane(); } - //minZNear = osg::maximum(10.0,minZNear); - //maxZFar = osg::minimum(60.0,maxZFar); + // clamp the minZNear and maxZFar to those provided by ShadowSettings + maxZFar = osg::minimum(settings->getMaximumShadowMapDistance(),maxZFar); + if (minZNear>maxZFar) minZNear = maxZFar*settings->getMinimumShadowMapNearFarRatio(); + //OSG_NOTICE<<"maxZFar "<