18 #include <osgEarth/VirtualProgram>
20 #include <osgShadow/ShadowTechnique>
22 #include <osg/StateSet>
24 #include <osg/PolygonOffset>
25 #include <osg/FrameBufferObject>
26 #include <osg/Uniform>
27 #include <osg/LightSource>
28 #include <osg/RenderInfo>
32 #include <osg/MatrixTransform>
33 #include <osg/Program>
34 #include <osg/Texture2D>
35 #include <osg/Texture2DArray>
37 #include <osg/Geometry>
47 class ShadowTweakables;
50 class DtShadowSettingsObject;
51 class TextureApplyAttribute;
52 struct CurrentPassData;
79 virtual const char*
className()
const {
return "DtOsgShadowTechnique"; }
85 virtual void postConstructionInit();
88 virtual void update(osg::NodeVisitor& nv);
91 virtual void cull(osgUtil::CullVisitor& cv);
94 virtual void cleanSceneGraph();
97 void setChannelShadowState(
DtOsgChannel* osgChannel,
bool enable);
103 bool getCameraCloudShadowMap(osg::Camera* camera,
unsigned int* textureIndex, osg::Matrix* textureViewProjMatrix,
104 unsigned int* textureIndex2, osg::Matrix* textureViewProjMatrix2);
112 static const std::string& shadowCameraPrefixString(
void);
113 static const std::string& shadowSDSMCameraPrefixString(
void);
116 const osg::StateSet * mapCameraToStateSet(
const osg::Camera* camera)
const;
122 virtual void reInitialize(
unsigned int quality);
124 virtual bool configureShadowTraversalNodeMask(
bool traverseEntities,
bool traverseProps,
bool traverseTerrain);
126 virtual void slot_refresh_maps();
148 static const int MAX_NUM_CASCADES = 6;
158 , myAtlasWidthNumSplits(0)
159 , myAtlasHeightNumSplits(0)
160 , myJustInitialized(false)
161 , myNotInitialized(true)
164 , myShadowMapSize(1024)
165 , myLastCloudUpdateTime(-1.0)
166 , myCurrentSimTimeScale(0)
167 , myCurrentCloudShadowMapTarget(0)
168 , myLastCameraPosition(-DBL_MAX, -DBL_MAX, -DBL_MAX )
169 , myLastFarDistance(0.0)
171 , myRefreshTimer(0.0)
172 , myForceCloudUpdate(false)
174 for (
unsigned int i = 0; i < MAX_NUM_CASCADES; ++i)
176 mySplitFarDistances[i] = 0.0f;
199 osg::Matrix myCloudShadowTexGenMatrix[2];
219 double mySplitFarDistances[MAX_NUM_CASCADES];
246 osg::ref_ptr<DtOsgDebugFrustum> myFrustum[MAX_NUM_CASCADES];
247 osg::ref_ptr<osg::MatrixTransform> myTargets[MAX_NUM_CASCADES + 1];
249 osg::ref_ptr<osg::Geometry> myOrthoBox[MAX_NUM_CASCADES];
250 osg::Matrix myTextureViewProjMatrix[MAX_NUM_CASCADES];
251 osg::Matrix myGeometryShaderMatrix[MAX_NUM_CASCADES];
255 osg::Matrix myLightViewMatrix[MAX_NUM_CASCADES];
269 void removeVisualizers();
281 virtual void operator () (osg::RenderInfo& renderInfo)
const;
322 void triggerExternalModuleShaderRefresh();
331 void traverseSDSMCameras( CurrentPassData & d, osgUtil::CullVisitor& cv);
337 void updateCloudShadows(osg::RenderInfo& renderInfo, osg::Camera* camera);
343 osg::Program* getProgramFromFile(
const std::string& szVertexShader,
const std::string& szFragmentShader);
347 osg::Camera* xBlurCamera, osg::Camera* yBlurCamera, osg::Texture2D* texture, osg::StateSet* stateSet,
unsigned int textureUnit);
351 osg::Camera* xBlurCamera, osg::Camera* yBlurCamera,
unsigned int textureLayer, osg::Texture2DArray* texture2DArray,
352 osg::Texture2DArray* preFilterTexture2DArray1, osg::Texture2DArray* preFilterTexture2DArray2);
354 void setupReverseZBuffer(osg::Camera* depthCamera, osg::Camera* xBlurCamera, osg::Camera* yBlurCamera);
355 void setupBlurCamera(osg::Camera* camera, osg::ref_ptr<osg::Program> &blurProgram,
const osg::Vec2 & direction);
358 osg::Texture2D* createTexture2D(
int width,
int height, GLenum internalFormat, GLenum sourceFormat, GLenum sourceType,
bool shadowComparisonMode,
359 osg::Texture2D::FilterMode minFilter = osg::Texture2D::NEAREST, osg::Texture2D::FilterMode magFilter = osg::Texture2D::NEAREST);
362 osg::Texture2DArray* createTexture2DArray(
int width,
int height,
int depth, GLenum internalFormat, GLenum sourceFormat, GLenum sourceType,
363 bool shadowComparisonMode, osg::Texture2DArray::FilterMode minFilter = osg::Texture2DArray::NEAREST, osg::Texture2DArray::FilterMode magFilter = osg::Texture2DArray::NEAREST);
366 osg::Camera* createCamera(
int width,
int height, GLbitfield clearMask);
369 osg::Geode* createFullScreenQuad(
const osg::Vec2&
size,
const osg::Vec2& uvStart,
const osg::Vec2& uvStop);
372 osg::Camera* createHudCamera(
int width,
int height, GLbitfield clearMask,
const char * name = NULL);
375 double computeUniformSplit(
double nearDistance,
double farDistance,
unsigned int splitIndex,
unsigned int numSplits);
378 double computeLogarithmicSplit(
double nearDistance,
double farDistance,
unsigned int splitIndex,
unsigned int numSplits);
387 CameraDescription constructSplitLightCamera(
const CurrentPassData & d,
int split_index,
bool farCascade =
false);
389 void updateCameras(
const CurrentPassData & d);
391 void getSplitCameraDistances(
const CurrentPassData & d,
int split_index,
double &splitCamNear,
double &splitCamFar);
397 void frustumBoundingBoxLightViewSpace(
const CurrentPassData & d,
int split_index,
const osg::Matrix & lightViewMatrix,
398 double nearPlane,
double farPlane, osg::Vec3d& minFrustum, osg::Vec3d& maxFrustum);
400 friend struct CurrentPassData;