VR-Forces 4.5 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator 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 
15 #include <osgEarth/VirtualProgram>
16 
17 #include <osgShadow/ShadowTechnique>
18 
19 #include <osg/StateSet>
20 #include <osg/Camera>
21 #include <osg/PolygonOffset>
22 #include <osg/FrameBufferObject>
23 #include <osg/Uniform>
24 #include <osg/LightSource>
25 #include <osg/RenderInfo>
26 #include <osg/Vec2>
27 #include <osg/Vec3>
28 #include <osg/Matrix>
29 #include <osg/Program>
30 #include <osg/Texture2D>
31 #include <osg/Texture2DArray>
32 #include <osg/Geode>
33 #include <osg/GL>
34 
35 #include <vector>
36 #include <map>
37 #include <string>
38 
39 namespace makVrv
40 {
41 
42  class DtChannel;
43  class DtOsgChannel;
44  class DtShadowSettingsObject;
45  class TextureApplyAttribute;
46 
49  class DT_DLL_VRVOSG DtOsgShadowTechnique : public osgShadow::ShadowTechnique
50  {
51  public:
52 
55 
57  DtOsgShadowTechnique(const DtOsgShadowTechnique& es, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
58 
60  virtual osg::Object* cloneType() const { return new DtOsgShadowTechnique(myDe); }
61 
63  virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new DtOsgShadowTechnique (*this, copyop); }
64 
66  virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const DtOsgShadowTechnique *>(obj)!=NULL; }
67 
69  virtual const char* libraryName() const { return "makVrv"; }
70 
72  virtual const char* className() const { return "DtOsgShadowTechnique"; }
73 
75  virtual void init();
76 
78  virtual void update(osg::NodeVisitor& nv);
79 
81  virtual void cull(osgUtil::CullVisitor& cv);
82 
84  virtual void cleanSceneGraph();
85 
87  void setChannelShadowState(DtOsgChannel* osgChannel, bool enable);
88 
90  bool getChannelShadowSettings(DtOsgChannel* osgChannel, DtShadowSettingsObject** shadowSettingObject, bool* isPlanView);
91 
93  bool getChannelCloudShadowMap(DtOsgChannel* osgChannel, unsigned int* textureIndex, osg::Matrix* textureViewProjMatrix);
94 
96  bool getCameraCloudShadowMap(osg::Camera* camera, unsigned int* textureIndex, osg::Matrix* textureViewProjMatrix);
97 
99  void setGlobalLight(osg::LightSource* light) { myGlobalLight = light; }
100 
102  const osg::LightSource* getGlobalLight() const { return myGlobalLight.get(); }
103 
104  static const std::string& shadowCameraPrefixString(void);
105  static const std::string& shadowSDSMCameraPrefixString(void);
106 
107  protected:
109  virtual void reInitialize(unsigned int quality);
110 
111  virtual bool configureShadowTraversalNodeMask(bool traverseEntities, bool traverseProps, bool traverseTerrain);
112 
113 
115  {
117  unsigned int myCascadeIndex;
118  };
119 
121  {
122  osg::ref_ptr<osg::Camera> myCamera;
123  osg::ref_ptr<osg::Camera> myDepthCamera;
124  osg::ref_ptr<osg::Camera> myXBlurCamera;
125  osg::ref_ptr<osg::Camera> myYBlurCamera;
126  unsigned int myTexUnit;
128  osg::ref_ptr<osg::Uniform> myAtlasTexOffsetAndScaleUniform;
129  osg::ref_ptr<osg::PolygonOffset> myPolygonOffset;
130 
131 
132  double mySplitFar;
133  osg::ref_ptr<osg::Uniform> mySplitFarUniform;
134 
135 
136  unsigned int mySplitIndex;
138 
140 
141  unsigned int myRefreshAge;
142  bool myRefresh;
143  };
144 
145  struct PerChannelData : public osg::Referenced
146  {
149  : myAtlasWidth(0)
150  , myAtlasHeight(0)
151  , myAtlasWidthNumSplits(0)
152  , myAtlasHeightNumSplits(0)
153  , myJustInitialized(false)
154  , myNotInitialized(true)
155  , myChannel(channel)
156  , mySDSMTime(0)
157  {
158 
159  }
160  std::vector<CascadeImportanceData> myImportance;
161  std::vector<CsmSplitData> myCsmSplits;
162  osg::ref_ptr<osg::StateSet> mySharedStateSet;
163  osg::ref_ptr<osg::Uniform> myShadowTexGenUniform;
164  osg::ref_ptr<osg::Uniform> myCloudShadowTexGenUniform;
165  osg::ref_ptr<TextureApplyAttribute> myCloudShadowTexture;
167  osg::ref_ptr<osgEarth::VirtualProgram> myVirtualProgram;
168  unsigned int myAtlasWidth;
169  unsigned int myAtlasHeight;
170  unsigned int myAtlasWidthNumSplits;
172  osg::ref_ptr<osg::Uniform> myShadowAmbientFactorUniform;
177  osg::ref_ptr<osg::Camera> mySDSMCamera;
178  std::vector<osg::ref_ptr<osg::Camera> > mySDSMReduceCamera;
179  osg::ref_ptr<osg::Uniform> myFarNearSumDiffProdx2Uniform;
180  osg::ref_ptr<osg::Uniform> myUseReverseZBuffer;
181  osg::ref_ptr<osg::Uniform> myMaximumViewDistanceUniform;
182  osg::ref_ptr<osg::Uniform> myMaximumDepthUniform;
183  osg::ref_ptr<osg::Uniform> myInvNumSplitsInterpUniform;
184  osg::ref_ptr<osg::Camera> mySDSMLinearizeDepthCamera;
185  osg::ref_ptr<osg::Camera> mySDSMCopyReduceDepthCamera;
186  osg::ref_ptr<osg::Camera> mySDSMPartitionCamera;
187  std::vector<osg::ref_ptr<osg::Camera> > mySDSMPartitionReduceCamera;
188  osg::ref_ptr<SdsmDrawCallback> mySDSMDrawCallback;
189  osg::ref_ptr<osg::Camera> myAtlasDepthCamera;
190  osg::ref_ptr<osg::Camera> myAtlasXBlurCamera;
191  osg::ref_ptr<osg::Camera> myAtlasYBlurCamera;
192  osg::ref_ptr<osg::Camera> myCloudShadowCamera;
193  double mySDSMTime;
194  protected:
196  virtual ~PerChannelData(){}
197  };
198 
199 
200  struct CloudShadowPreDrawCallback : public osg::Camera::DrawCallback
201  {
203  CloudShadowPreDrawCallback(DtOsgShadowTechnique& shadowTechnique, PerChannelData& perChannelData);
204 
205  // Callback Method to unbind the currently bound framebuffer object
206  virtual void operator () (osg::RenderInfo& renderInfo) const;
209  };
210 
212  virtual std::string generateVertexShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
213 
215  virtual std::string generateFragmentShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
216 
218  virtual std::string generateCloudShadowVertexShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
219 
221  virtual std::string generateCloudShadowFragmentShader(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
222 
224  unsigned int getFilterCount(DtShadowSettingsObject* shadowSettingObject);
225 
228  virtual osg::Matrixd oglRevDepthOrtho(double left, double right, double bottom,
229  double top, double zNear, double zFar);
230 
234  virtual bool getRevZProjectionMatrixAsFrustum(const osg::Matrix& mat, double& left,
235  double& right, double& bottom, double& top, double& zNear, double& zFar);
236 
240  virtual bool getRevPerspective(const osg::Matrix& mat, double& fovy,
241  double& aspectRatio, double& zNear, double& zFar);
242 
246  virtual osg::Matrix makeRevFrustum(double left, double right,
247  double bottom, double top, double zNear, double zFar);
248 
252  virtual osg::Matrix makeRevPerspective(double fovy, double aspectRatio,
253  double zNear, double zFar);
254 
255  private:
256 
258  std::string generatePoissonDiscArray(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
259 
261  std::string generateHelperFunctions(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
262 
264  std::string generateFragmentComputeShadowFunction(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
265 
267  std::string generateFragmentUniformAndVariables(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
268 
270  std::string generateFragmentMain(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
271 
273  std::string generateFragmentVisualizeCascadeMain(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
274 
276  bool getCameraSettings(osg::Camera* viewCamera, PerChannelData** perChannelData, DtShadowSettingsObject** shadowSettingObject, bool* isPlanView);
277 
279  void initPerChannelData(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
280 
282  void installVirtualProgramAndSharedStateSet(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
283 
285  void packTextureAtlas(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
286 
288  void installSDSM(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
289 
291  void traverseSDSMCameras(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, osgUtil::CullVisitor& cv, double cameraMagnification);
292 
294  void installCloudShadows(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
295 
297  void updateCloudShadows(osg::Camera* camera);
298 
300  void updateCloudShadows(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, const osg::Matrix& inverseViewMatrix);
301 
303  void updateCascadeImportance(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject);
304 
306  osg::Program* getProgramFromFile(const std::string& szVertexShader, const std::string& szFragmentShader);
307 
309  void installPreFilter(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, osg::Camera* depthCamera,
310  osg::Camera* xBlurCamera, osg::Camera* yBlurCamera, osg::Texture2D* texture, osg::StateSet* stateSet, unsigned int textureUnit);
311 
313  void installPreFilter(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, osg::Camera* depthCamera,
314  osg::Camera* xBlurCamera, osg::Camera* yBlurCamera, unsigned int textureLayer, osg::Texture2DArray* texture2DArray,
315  osg::Texture2DArray* preFilterTexture2DArray1, osg::Texture2DArray* preFilterTexture2DArray2);
316 
318  osg::Texture2D* createTexture2D(int width, int height, GLenum internalFormat, GLenum sourceFormat, GLenum sourceType, bool shadowComparisonMode,
319  osg::Texture2D::FilterMode minFilter = osg::Texture2D::NEAREST, osg::Texture2D::FilterMode magFilter = osg::Texture2D::NEAREST);
320 
322  osg::Texture2DArray* createTexture2DArray(int width, int height, int depth, GLenum internalFormat, GLenum sourceFormat, GLenum sourceType,
323  bool shadowComparisonMode, osg::Texture2DArray::FilterMode minFilter = osg::Texture2DArray::NEAREST, osg::Texture2DArray::FilterMode magFilter = osg::Texture2DArray::NEAREST);
324 
326  osg::Camera* createCamera(int width, int height, GLbitfield clearMask);
327 
329  osg::Geode* createFullScreenQuad(const osg::Vec2& size, const osg::Vec2& uvStart, const osg::Vec2& uvStop);
330 
332  osg::Camera* createHudCamera(int width, int height, GLbitfield clearMask);
333 
335  double computeUniformSplit(double nearDistance, double farDistance, unsigned int splitIndex, unsigned int numSplits);
336 
338  double computeLogarithmicSplit(double nearDistance, double farDistance, unsigned int splitIndex, unsigned int numSplits);
339 
341  void constructSplitLightCamera(PerChannelData* perChannelData, DtShadowSettingsObject* shadowSettingObject, CsmSplitData &csmSplit, const osg::Vec3& lightDirection,
342  const osg::Matrix& cameraViewMatrix, const osg::Matrix& cameraProjectionMatrix, double cameraMagnification);
343 
345  void setDirty(bool dirty) { _dirty = dirty; }
346  protected:
347 
350 
351  typedef std::map< const osg::Camera*, osg::ref_ptr<PerChannelData> > PerChannelDataMap;
352 
354 
355  osg::ref_ptr<osg::LightSource> myGlobalLight;
356 
357  unsigned int myTextureUnitOffset;
358 
360 
361  static const std::string myShadowCameraPrefixString;
362  static const std::string mySDSMShadowCameraPrefixString;
363 
364 
365  };
366 }
367 

Document ID: Generated on Thu Mar 23 18:54:12 EDT 2017 from SVN revision 174804
Copyright © 2005-2017 VT MÄK. All Rights Reserved (www.mak.com)