From 22ca8d2160f9c22bbcc5716e244cffca7b44d547 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 8 Jan 2010 11:37:35 +0000 Subject: [PATCH] From Marius Heise, "osgShadow was using single precision variables for light positioning and orientation. This was causing precision problems (shadow jumping) with big databases (eg. geocentric created vpb). This patch fixes this by using double precision variables for light positioning and orientation. It works for all algorithms dreived form osgShadow::StandardShadowMap. " --- src/osgShadow/StandardShadowMap.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/osgShadow/StandardShadowMap.cpp b/src/osgShadow/StandardShadowMap.cpp index a5aaa7522..fe1f34307 100644 --- a/src/osgShadow/StandardShadowMap.cpp +++ b/src/osgShadow/StandardShadowMap.cpp @@ -677,7 +677,7 @@ void StandardShadowMap::ViewData::aimShadowCastingCamera( if( light->getSpotCutoff() < 180.0f) // spotlight, no need for bounding box { - osg::Vec3 position(lightPos.x(), lightPos.y(), lightPos.z()); + osg::Vec3d position(lightPos.x(), lightPos.y(), lightPos.z()); float spotAngle = light->getSpotCutoff(); projection.makePerspective( spotAngle, 1.0, 0.1, 1000.0); @@ -687,14 +687,15 @@ void StandardShadowMap::ViewData::aimShadowCastingCamera( { if (lightPos[3]!=0.0) // point light { - osg::Vec3 position(lightPos.x(), lightPos.y(), lightPos.z()); + osg::Vec3d position(lightPos.x(), lightPos.y(), lightPos.z()); float centerDistance = (position-bs.center()).length(); float znear = centerDistance-bs.radius(); float zfar = centerDistance+bs.radius(); float zNearRatio = 0.001f; - if (znear