VR-Forces 4.7 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtOsgShadowTechnique.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2014 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <vrvOsg/vrvOsg.h>
13 
16 #include <vrvOsg/vrvOsgUtils.h>
17 
18 #include <osgEarth/VirtualProgram>
19 
20 #include <osgShadow/ShadowTechnique>
21 
22 #include <osg/StateSet>
23 #include <osg/Camera>
24 #include <osg/PolygonOffset>
25 #include <osg/FrameBufferObject>
26 #include <osg/Uniform>
27 #include <osg/LightSource>
28 #include <osg/RenderInfo>
29 #include <osg/Vec2>
30 #include <osg/Vec3>
31 #include <osg/Matrix>
32 #include <osg/MatrixTransform>
33 #include <osg/Program>
34 #include <osg/Texture2D>
35 #include <osg/Texture2DArray>
36 #include <osg/Geode>
37 #include <osg/Geometry>
38 #include <osg/GL>
39 
40 #include <vector>
41 #include <map>
42 #include <string>
43 
44 namespace makVrv
45 {
46 
47  class ShadowTweakables;
48  class DtChannel;
49  class DtOsgChannel;
50  class DtShadowSettingsObject;
51  class TextureApplyAttribute;
52  struct CurrentPassData;
53 
56  class DT_DLL_VRVOSG DtOsgShadowTechnique : public osgShadow::ShadowTechnique
57  {
58  public:
59 
62 
64  DtOsgShadowTechnique(const DtOsgShadowTechnique& es, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
65 
67  virtual osg::Object* cloneType() const { return new DtOsgShadowTechnique(myDe); }
68 
70  virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new DtOsgShadowTechnique (*this, copyop); }
71 
73  virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const DtOsgShadowTechnique *>(obj)!=NULL; }
74 
76  virtual const char* libraryName() const { return "makVrv"; }
77 
79  virtual const char* className() const { return "DtOsgShadowTechnique"; }
80 
82  virtual void init();
83 
85  virtual void postConstructionInit();
86 
88  virtual void update(osg::NodeVisitor& nv);
89 
91  virtual void cull(osgUtil::CullVisitor& cv);
92 
94  virtual void cleanSceneGraph();
95 
97  void setChannelShadowState(DtOsgChannel* osgChannel, bool enable);
98 
100  bool getChannelShadowSettings(DtOsgChannel* osgChannel, DtShadowSettingsObject** shadowSettingObject, bool* isPlanView);
101 
103  bool getCameraCloudShadowMap(osg::Camera* camera, unsigned int* textureIndex, osg::Matrix* textureViewProjMatrix,
104  unsigned int* textureIndex2, osg::Matrix* textureViewProjMatrix2);
105 
107  void setGlobalLight(osg::LightSource* light) { myGlobalLight = light; }
108 
110  const osg::LightSource* getGlobalLight() const { return myGlobalLight.get(); }
111 
112  static const std::string& shadowCameraPrefixString(void);
113  static const std::string& shadowSDSMCameraPrefixString(void);
114 
116  const osg::StateSet * mapCameraToStateSet(const osg::Camera* camera) const;
117 
118  class ShadowTweakables * myShadowUI;
119 
120  protected:
122  virtual void reInitialize(unsigned int quality);
123 
124  virtual bool configureShadowTraversalNodeMask(bool traverseEntities, bool traverseProps, bool traverseTerrain);
125 
126  virtual void slot_refresh_maps();
127 
129  {
131  unsigned int myCascadeIndex;
132  };
133 
135  {
136  osg::ref_ptr<osg::Camera> myCamera;
137 
138  osg::ref_ptr<osg::Uniform> myAtlasTexOffsetAndScaleUniform;
139  osg::ref_ptr<osg::PolygonOffset> myPolygonOffset;
140  unsigned int mySplitIndex;
141 
142  unsigned int myRefreshAge;
143  bool myRefresh;
144  };
145 
146  public:
147  // per window info
148  static const int MAX_NUM_CASCADES = 6;
149 
150  protected:
151  struct PerChannelData : public osg::Referenced
152  {
155  : myDe(de)
156  , myAtlasWidth(0)
157  , myAtlasHeight(0)
158  , myAtlasWidthNumSplits(0)
159  , myAtlasHeightNumSplits(0)
160  , myJustInitialized(false)
161  , myNotInitialized(true)
162  , myChannel(channel)
163  , mySDSMTime(0)
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)
170  , myLastSimTime(0.0)
171  , myRefreshTimer(0.0)
172  , myForceCloudUpdate(false)
173  {
174  for (unsigned int i = 0; i < MAX_NUM_CASCADES; ++i)
175  {
176  mySplitFarDistances[i] = 0.0f;
177  }
178  }
180  std::vector<CascadeImportanceData> myImportances;
181  std::vector<CsmSplitData> myCsmSplits;
182  osg::ref_ptr<osgEarth::VirtualProgram> myVirtualProgram;
183 
184  osg::ref_ptr<osg::StateSet> mySharedStateSet;
185  osg::ref_ptr<osg::Uniform> myShadowTexGenUniform;
186  // geometry shader data, unused
187  osg::ref_ptr<osg::Uniform> myGeometryTransformMatrixUniform;
188  osg::ref_ptr<osg::Uniform> myNumCascadesUniform;
189  osg::ref_ptr<osg::Uniform> myNumPCFFilterSamplesUniform;
190  osg::ref_ptr<osg::Uniform> myInverseShadowMapSizeUniform;
191 
192  // cloud shadow code
196  osg::ref_ptr<osg::Uniform> myCloudShadowTexGenUniform;
197  osg::ref_ptr<osg::Uniform> myCloudShadowLerpUniform;
198  osg::ref_ptr<TextureApplyAttribute> myCloudShadowTextures;
199  osg::Matrix myCloudShadowTexGenMatrix[2];
200  osg::ref_ptr<osg::Camera> myCloudShadowCamera;
202 
203 
204  // atlas data
205  unsigned int myAtlasWidth;
206  unsigned int myAtlasHeight;
207  unsigned int myAtlasWidthNumSplits;
209 
217 
218  osg::ref_ptr<osg::Uniform> mySplitDistancesUniform;
219  double mySplitFarDistances[MAX_NUM_CASCADES];
220 
221  // sdsm stuff
222  osg::ref_ptr<osg::Camera> mySDSMCamera;
223  std::vector<osg::ref_ptr<osg::Camera> > mySDSMReduceCamera;
224  osg::ref_ptr<osg::Uniform> myFarNearSumDiffProdx2Uniform;
225 
226  osg::ref_ptr<osg::Uniform> myUseReverseZBuffer;
227  osg::ref_ptr<osg::Uniform> myShadowAmbientFactorUniform;
228  osg::ref_ptr<osg::Uniform> myInvNumSplitsInterpUniform;
229 
230  // SDSM
231  osg::ref_ptr<osg::Camera> mySDSMLinearizeDepthCamera;
232  osg::ref_ptr<osg::Camera> mySDSMCopyReduceDepthCamera;
233  osg::ref_ptr<osg::Camera> mySDSMPartitionCamera;
234  osg::ref_ptr<osg::Uniform> myMaximumViewDistanceUniform;
235  osg::ref_ptr<osg::Uniform> myMaximumDepthUniform;
236 
237  std::vector<osg::ref_ptr<osg::Camera> > mySDSMPartitionReduceCamera;
238  osg::ref_ptr<SdsmDrawCallback> mySDSMDrawCallback;
239 
240  // debugging stuff
241  osg::ref_ptr<osg::Group> myVisualizersGroup;
242  osg::ref_ptr<osg::Geode> myVisualizers;
243  osg::ref_ptr<osg::Camera> myOverlayDebugCamera;
244  osg::ref_ptr<osg::Camera> myOverlayDebugFarCamera;
245  osg::ref_ptr<DtOsgDebugFrustum> myCameraFrustum;
246  osg::ref_ptr<DtOsgDebugFrustum> myFrustum[MAX_NUM_CASCADES];
247  osg::ref_ptr<osg::MatrixTransform> myTargets[MAX_NUM_CASCADES + 1];
248  osg::ref_ptr<osg::MatrixTransform> myOrigin;
249  osg::ref_ptr<osg::Geometry> myOrthoBox[MAX_NUM_CASCADES];
250  osg::Matrix myTextureViewProjMatrix[MAX_NUM_CASCADES];
251  osg::Matrix myGeometryShaderMatrix[MAX_NUM_CASCADES]; // unused
252 
253 // softshadow prototype
254  osg::ref_ptr<osg::Uniform> myLightViewMatrixUniform;
255  osg::Matrix myLightViewMatrix[MAX_NUM_CASCADES];
256 
257  //VSM camera array
258  std::vector<osg::ref_ptr<osg::Camera> > myDepthCameras;
259  std::vector<osg::ref_ptr<osg::Camera> > myXBlurCameras;
260  std::vector<osg::ref_ptr<osg::Camera> > myYBlurCameras;
261 
262  double mySDSMTime;
263  unsigned int myShadowMapSize;
265 
266  protected:
268  virtual ~PerChannelData();
269  void removeVisualizers();
270 
271  friend class DtOsgShadowTechnique;
272  };
273 
274 
275  struct CloudShadowPreDrawCallback : public osg::Camera::DrawCallback
276  {
278  CloudShadowPreDrawCallback(DtOsgShadowTechnique& shadowTechnique, PerChannelData& perChannelData);
279 
280  // Callback Method to unbind the currently bound framebuffer object
281  virtual void operator () (osg::RenderInfo& renderInfo) const;
284  };
285 
287  virtual std::string generateVertexShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
288 
290  virtual std::string generateFragmentShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
291 
293  virtual std::string generateCloudShadowVertexShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
294 
295 
297  unsigned int getFilterCount(DtShadowSettingsObject* shadowSettingObject);
298 
299 
300 
301  private:
302 
304  std::string generateFragmentComputeShadowFunction(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
305 
307  std::string generateFragmentUniformAndVariables(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
308 
310  std::string generateFragmentMain(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
311 
313  bool getCameraSettings(osg::Camera* viewCamera, PerChannelData** perChannelData, DtShadowSettingsObject** shadowSettingObject, bool* isPlanView);
314 
316  void initPerChannelData(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
317 
318 
320  void installRecieverVPandSharedStateSet(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
321 
322  void triggerExternalModuleShaderRefresh();
323 
325  void packTextureAtlas(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
326 
328  void installSDSM(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
329 
331  void traverseSDSMCameras( CurrentPassData & d, osgUtil::CullVisitor& cv);
332 
334  void installCloudShadows(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
335 
337  void updateCloudShadows(osg::RenderInfo& renderInfo, osg::Camera* camera);
338 
340  void updateCascadeImportance(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
341 
343  osg::Program* getProgramFromFile(const std::string& szVertexShader, const std::string& szFragmentShader);
344 
346  void installPreFilter(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, osg::Camera* depthCamera,
347  osg::Camera* xBlurCamera, osg::Camera* yBlurCamera, osg::Texture2D* texture, osg::StateSet* stateSet, unsigned int textureUnit);
348 
350  void installPreFilter(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, osg::Camera* depthCamera,
351  osg::Camera* xBlurCamera, osg::Camera* yBlurCamera, unsigned int textureLayer, osg::Texture2DArray* texture2DArray,
352  osg::Texture2DArray* preFilterTexture2DArray1, osg::Texture2DArray* preFilterTexture2DArray2);
353 
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);
356 
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);
360 
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);
364 
366  osg::Camera* createCamera(int width, int height, GLbitfield clearMask);
367 
369  osg::Geode* createFullScreenQuad(const osg::Vec2& size, const osg::Vec2& uvStart, const osg::Vec2& uvStop);
370 
372  osg::Camera* createHudCamera(int width, int height, GLbitfield clearMask, const char * name = NULL);
373 
375  double computeUniformSplit(double nearDistance, double farDistance, unsigned int splitIndex, unsigned int numSplits);
376 
378  double computeLogarithmicSplit(double nearDistance, double farDistance, unsigned int splitIndex, unsigned int numSplits);
379 
381  {
382  osg::Matrix myViewMatrix;
383  osg::Matrix myProjectionMatrix;
385  };
387  CameraDescription constructSplitLightCamera(const CurrentPassData & d, int split_index, bool farCascade = false);
388 
389  void updateCameras(const CurrentPassData & d);
390 
391  void getSplitCameraDistances(const CurrentPassData & d, int split_index, double &splitCamNear, double &splitCamFar);
392 
394  void setDirty(bool dirty) { _dirty = dirty; }
395 
396  // not really used yet.
397  void frustumBoundingBoxLightViewSpace(const CurrentPassData & d, int split_index/*for_debug visualization*/, const osg::Matrix & lightViewMatrix,
398  double nearPlane, double farPlane, osg::Vec3d& minFrustum, osg::Vec3d& maxFrustum);
399 
400  friend struct CurrentPassData;
401 
402  protected:
403 
405  virtual ~DtOsgShadowTechnique();
406 
407  typedef std::map< const osg::Camera*, osg::ref_ptr<PerChannelData> > PerChannelDataMap;
408 
410 
411  osg::ref_ptr<osg::LightSource> myGlobalLight;
412  osg::ref_ptr<osg::Uniform> myLightDirectionUniform;
413 
415 
416  static const std::string myShadowCameraPrefixString;
417  static const std::string mySDSMShadowCameraPrefixString;
418 
419  osg::ref_ptr<osg::Program> myVsmBlurTextureProgram;
420  osg::ref_ptr<osg::Program> myVsmBlurTexArrayProgram;
421 
422  osg::ref_ptr<osg::Program> myVsmPassthroughArrayProgram;
423  osg::ref_ptr<osg::Program> myVsmPassthroughProgram;
424 
425  osg::ref_ptr<osg::Program> myEsmBlurTextureProgram;
426  osg::ref_ptr<osg::Program> myEsmBlurTexArrayProgram;
427 
428  osg::ref_ptr<osg::Program> myEVsmBlurTextureProgram;
429  osg::ref_ptr<osg::Program> myEVsmBlurTexArrayProgram;
430 
431  };
432 }
433 

Document ID: Generated on Fri Apr 26 21:53:14 EDT 2019 from SVN revision 197883
Copyright © 2005-2019 VT MAK. All Rights Reserved (www.mak.com)