diff --git a/components/sceneutil/shadow.cpp b/components/sceneutil/shadow.cpp index f1943f08d..e8c7e1947 100644 --- a/components/sceneutil/shadow.cpp +++ b/components/sceneutil/shadow.cpp @@ -449,6 +449,18 @@ namespace SceneUtil Frustum frustum(&cv, minZNear, maxZFar); + double reducedNear, reducedFar; + if (cv.getComputeNearFarMode() != osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR) + { + reducedNear = osg::maximum(cv.getCalculatedNearPlane(), minZNear); + reducedFar = osg::minimum(cv.getCalculatedFarPlane(), maxZFar); + } + else + { + reducedNear = minZNear; + reducedFar = maxZFar; + } + // return compute near far mode back to it's original settings cv.setComputeNearFarMode(cachedNearFarMode); @@ -544,6 +556,20 @@ namespace SceneUtil double yMid = (clsb._bb.yMin() + clsb._bb.yMax())*0.5f; double yRange = (clsb._bb.yMax() - clsb._bb.yMin()); + osg::Matrixd cornerConverter = osg::Matrixd::inverse(projectionMatrix) * osg::Matrixd::inverse(viewMatrix) * *cv.getModelViewMatrix(); + double minZ = DBL_MAX; + double maxZ = -DBL_MAX; + for (unsigned int i = 0; i < 8; i++) + { + osg::Vec3 corner = clsb._bb.corner(i); + corner = corner * cornerConverter; + + maxZ = osg::maximum(maxZ, -corner.z()); + minZ = osg::minimum(minZ, -corner.z()); + } + reducedNear = osg::maximum(reducedNear, minZ); + reducedFar = osg::minimum(reducedFar, maxZ); + // OSG_NOTICE<<" xMid="<