diff --git a/examples/osgshadow/osgshadow.cpp b/examples/osgshadow/osgshadow.cpp index 617699b95..f8ef4d56a 100644 --- a/examples/osgshadow/osgshadow.cpp +++ b/examples/osgshadow/osgshadow.cpp @@ -741,6 +741,7 @@ int main(int argc, char** argv) arguments.getApplicationUsage()->addCommandLineOption("-4", "Use test model four - island scene."); 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"); // construct the viewer. osgViewer::Viewer viewer(arguments); @@ -840,6 +841,25 @@ int main(int argc, char** argv) settings->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask); settings->setCastsShadowTraversalMask(CastsShadowTraversalMask); + std::string nearFarMode(""); + if (arguments.read("--near-far-mode",nearFarMode)) + { + if (nearFarMode=="COMPUTE_NEAR_USING_PRIMITIVES") settings->setComputeNearFarModeOverride(osg::CullSettings::COMPUTE_NEAR_USING_PRIMITIVES); + else if (nearFarMode=="COMPUTE_NEAR_FAR_USING_PRIMITIVES") settings->setComputeNearFarModeOverride(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES); + else if (nearFarMode=="DO_NOT_COMPUTE_NEAR_FAR") settings->setComputeNearFarModeOverride(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); + else if (nearFarMode=="COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES") settings->setComputeNearFarModeOverride(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES); + + OSG_NOTICE<<"ComputeNearFarModeOverride set to "; + switch(settings->getComputeNearFarModeOverride()) + { + case(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES): OSG_NOTICE<<"COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES"; break; + case(osg::CullSettings::COMPUTE_NEAR_USING_PRIMITIVES): OSG_NOTICE<<"COMPUTE_NEAR_USING_PRIMITIVES"; break; + case(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES): OSG_NOTICE<<"COMPUTE_NEAR_FAR_USING_PRIMITIVES"; break; + case(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR): OSG_NOTICE<<"DO_NOT_COMPUTE_NEAR_FAR"; break; + } + OSG_NOTICE< msm = NULL; if (arguments.read("--no-shadows")) { diff --git a/include/osgShadow/ShadowSettings b/include/osgShadow/ShadowSettings index 3e0ecb701..649082ead 100644 --- a/include/osgShadow/ShadowSettings +++ b/include/osgShadow/ShadowSettings @@ -15,6 +15,7 @@ #define OSGSHADOW_SHADOWSETTINGS 1 #include +#include #include namespace osgShadow { @@ -34,6 +35,10 @@ class OSGSHADOW_EXPORT ShadowSettings : public osg::Object void setCastsShadowTraversalMask(unsigned int mask) { _castsShadowTraversalMask = mask; } unsigned int getCastsShadowTraversalMask() const { return _castsShadowTraversalMask; } + void setComputeNearFarModeOverride(osg::CullSettings::ComputeNearFarMode cnfn) { _computeNearFearModeOverride = cnfn; } + osg::CullSettings::ComputeNearFarMode getComputeNearFarModeOverride() const { return _computeNearFearModeOverride; } + + /** Set the LightNum of the light in the scene to assign a shadow for. * Default value is -1, which signifies that shadow technique should automatically select an active light * to assign a shadow, typically this will be the first active light found. */ @@ -113,6 +118,8 @@ class OSGSHADOW_EXPORT ShadowSettings : public osg::Object unsigned int _receivesShadowTraversalMask; unsigned int _castsShadowTraversalMask; + osg::CullSettings::ComputeNearFarMode _computeNearFearModeOverride; + int _lightNum; unsigned int _baseShadowTextureUnit; bool _useShadowMapTextureOverride; diff --git a/src/osgShadow/ShadowSettings.cpp b/src/osgShadow/ShadowSettings.cpp index 319418092..a0acba631 100644 --- a/src/osgShadow/ShadowSettings.cpp +++ b/src/osgShadow/ShadowSettings.cpp @@ -18,6 +18,7 @@ using namespace osgShadow; ShadowSettings::ShadowSettings(): _receivesShadowTraversalMask(0xffffffff), _castsShadowTraversalMask(0xffffffff), + _computeNearFearModeOverride(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR), _lightNum(-1), _baseShadowTextureUnit(1), _useShadowMapTextureOverride(true), @@ -31,12 +32,15 @@ ShadowSettings::ShadowSettings(): // _shaderHint(PROVIDE_FRAGMENT_SHADER), _debugDraw(false) { + //_computeNearFearModeOverride = osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES; + //_computeNearFearModeOverride = osg::CullSettings::COMPUTE_NEAR_USING_PRIMITIVES); } ShadowSettings::ShadowSettings(const ShadowSettings& ss, const osg::CopyOp& copyop): Object(ss,copyop), _receivesShadowTraversalMask(ss._receivesShadowTraversalMask), _castsShadowTraversalMask(ss._castsShadowTraversalMask), + _computeNearFearModeOverride(ss._computeNearFearModeOverride), _lightNum(ss._lightNum), _baseShadowTextureUnit(ss._baseShadowTextureUnit), _useShadowMapTextureOverride(ss._useShadowMapTextureOverride), diff --git a/src/osgShadow/ViewDependentShadowMap.cpp b/src/osgShadow/ViewDependentShadowMap.cpp index 542502e0a..6f587f9e5 100644 --- a/src/osgShadow/ViewDependentShadowMap.cpp +++ b/src/osgShadow/ViewDependentShadowMap.cpp @@ -746,6 +746,8 @@ void ViewDependentShadowMap::cull(osgUtil::CullVisitor& cv) return; } + ShadowSettings* settings = getShadowedScene()->getShadowSettings(); + OSG_INFO<<"cv->getProjectionMatrix()="<<*cv.getProjectionMatrix()<getComputeNearFarModeOverride()!=osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR) + { + cv.setComputeNearFarMode(settings->getComputeNearFarModeOverride()); + } // 1. Traverse main scene graph cv.pushStateSet( _shadowRecievingPlaceholderStateSet.get() ); @@ -795,6 +799,9 @@ void ViewDependentShadowMap::cull(osgUtil::CullVisitor& cv) cv.computeNearPlane(); } + //minZNear = osg::maximum(10.0,minZNear); + //maxZFar = osg::minimum(60.0,maxZFar); + Frustum frustum(&cv, minZNear, maxZFar); // return compute near far mode back to it's original settings @@ -807,7 +814,6 @@ void ViewDependentShadowMap::cull(osgUtil::CullVisitor& cv) // create a list of light sources + their matrices to place them selectActiveLights(&cv, vdd); - ShadowSettings* settings = getShadowedScene()->getShadowSettings(); unsigned int pos_x = 0; unsigned int textureUnit = settings->getBaseShadowTextureUnit();