Caelum
DepthComposer.h
1 /*
2 This file is part of Caelum.
3 See http://www.ogre3d.org/wiki/index.php/Caelum
4 
5 Copyright (c) 2008 Caelum team. See Contributors.txt for details.
6 
7 Caelum is free software: you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 Caelum is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU Lesser General Public License for more details.
16 
17 You should have received a copy of the GNU Lesser General Public License
18 along with Caelum. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef CAELUM__DEPTH_COMPOSER_H
22 #define CAELUM__DEPTH_COMPOSER_H
23 
24 #include "CaelumPrerequisites.h"
25 #include "FastGpuParamRef.h"
26 
27 namespace Caelum
28 {
35  class CAELUM_EXPORT DepthComposer
36  {
37  private:
38  Ogre::SceneManager *mSceneMgr;
39 
40  void onCompositorMaterialChanged ();
41  const String& getCompositorName ();
42 
43  protected:
44  inline Ogre::SceneManager* getSceneManager() const { return mSceneMgr; }
45 
46  friend class DepthComposerInstance;
47 
48  public:
49  DepthComposer(Ogre::SceneManager *sceneMgr);
50  virtual ~DepthComposer();
51 
52  void update ();
53 
54  public:
55  typedef std::map<Ogre::Viewport*, DepthComposerInstance*> ViewportInstanceMap;
56  ViewportInstanceMap mViewportInstanceMap;
57 
58  public:
59  DepthComposerInstance* createViewportInstance(Ogre::Viewport* viewport);
60  void destroyViewportInstance(Ogre::Viewport* viewport);
61  DepthComposerInstance* getViewportInstance(Ogre::Viewport* viewport);
62  void destroyAllViewportInstances();
63 
64  private:
65  bool mDebugDepthRender;
66 
67  public:
69  void setDebugDepthRender (bool value);
70  bool getDebugDepthRender () const { return mDebugDepthRender; }
71 
72  private:
73  bool mSkyDomeHazeEnabled;
74  Ogre::Vector3 mSunDirection;
75  Ogre::ColourValue mHazeColour;
76 
77  public:
79  void setSkyDomeHazeEnabled (bool value);
80  bool getSkyDomeHazeEnabled () const { return mSkyDomeHazeEnabled; }
81 
82  void setSunDirection (const Ogre::Vector3& value) { mSunDirection = value; }
83  const Ogre::Vector3 getSunDirection () const { return mSunDirection; }
84 
85  void setHazeColour (const Ogre::ColourValue& value) { mHazeColour = value; }
86  const Ogre::ColourValue getHazeColour () const { return mHazeColour; }
87 
88  private:
89  bool mGroundFogEnabled;
90  Real mGroundFogDensity;
91  Real mGroundFogBaseLevel;
92  Real mGroundFogVerticalDecay;
93  Ogre::ColourValue mGroundFogColour;
94 
95  public:
97  void setGroundFogEnabled (bool value);
98  bool getGroundFogEnabled () const { return mGroundFogEnabled; }
99 
101  void setGroundFogDensity (Real value) { mGroundFogDensity = value; }
102 
104  Real getGroundFogDensity () const { return mGroundFogDensity; }
105 
108  void setGroundFogBaseLevel (Real value) { mGroundFogBaseLevel = value; }
109 
111  Real getGroundFogBaseLevel () const { return mGroundFogBaseLevel; }
112 
114  void setGroundFogVerticalDecay (Real value) { mGroundFogVerticalDecay = value; }
115 
117  Real getGroundFogVerticalDecay () const { return mGroundFogVerticalDecay; }
118 
120  void setGroundFogColour (const Ogre::ColourValue& value) { mGroundFogColour = value; }
121 
123  const Ogre::ColourValue getGroundFogColour () const { return mGroundFogColour; }
124  };
125 
129  class CAELUM_EXPORT DepthComposerInstance: private Ogre::CompositorInstance::Listener
130  {
131  private:
132  DepthComposer* mParent;
133  Ogre::Viewport* mViewport;
134  Ogre::CompositorInstance* mCompInst;
135  std::auto_ptr<DepthRenderer> mDepthRenderer;
136 
137  virtual void notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat);
138  virtual void notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat);
139 
140  struct Params {
141  void setup(Ogre::GpuProgramParametersSharedPtr params);
142 
143  Ogre::GpuProgramParametersSharedPtr fpParams;
144  FastGpuParamRef invViewProjMatrix;
145  FastGpuParamRef worldCameraPos;
146  FastGpuParamRef groundFogDensity;
147  FastGpuParamRef groundFogVerticalDecay;
148  FastGpuParamRef groundFogBaseLevel;
149  FastGpuParamRef groundFogColour;
150  FastGpuParamRef sunDirection;
151  FastGpuParamRef hazeColour;
152  } mParams;
153 
154  protected:
156  void _update ();
157 
158  void addCompositor ();
159  void removeCompositor ();
160  bool isCompositorEnabled () { return mCompInst != 0; }
161 
162  friend class DepthComposer;
163 
164  public:
166  DepthComposer* getParent() const { return mParent; }
167 
169  Ogre::Viewport* getViewport() const { return mViewport; }
170 
172  Ogre::CompositorInstance* getCompositorInstance() const { return mCompInst; }
173 
177  Caelum::DepthRenderer* getDepthRenderer () const { return mDepthRenderer.get(); }
178 
179  DepthComposerInstance(DepthComposer* parent, Ogre::Viewport* view);
180  virtual ~DepthComposerInstance();
181  };
182 
188  class CAELUM_EXPORT DepthRenderer: private Ogre::RenderQueue::RenderableListener
189  {
190  private:
191  Ogre::Viewport* mMasterViewport;
192  Ogre::Viewport* mDepthRenderViewport;
193  Ogre::TexturePtr mDepthRenderTexture;
194  bool mDepthRenderingNow;
195  Ogre::MaterialPtr mDepthRenderMaterial;
196 
197  // Override materials during all rendering.
198 #if OGRE_VERSION < 0x00010600
199  virtual bool renderableQueued(
200  Ogre::Renderable* rend,
201  Ogre::uint8 groupId,
202  Ogre::ushort priority,
203  Ogre::Technique** ppTech);
204 #else
205  virtual bool renderableQueued(
206  Ogre::Renderable* rend,
207  Ogre::uint8 groupId,
208  Ogre::ushort priority,
209  Ogre::Technique** ppTech,
210  Ogre::RenderQueue* pQueue);
211 #endif // OGRE_VERSION
212  inline Ogre::Material* getDepthRenderMaterial() const { return mDepthRenderMaterial.get(); }
213 
214  int mMinRenderGroupId;
215  int mMaxRenderGroupId;
216  int mViewportVisibilityMask;
217 
218  public:
219  DepthRenderer (Ogre::Viewport* viewport);
220  ~DepthRenderer ();
221 
222  inline Ogre::Viewport* getMasterViewport() { return mMasterViewport; }
223  inline Ogre::Texture* getDepthRenderTexture () { return mDepthRenderTexture.get(); }
224  inline Ogre::Viewport* getDepthRenderViewport () { return mDepthRenderViewport; }
225  inline Ogre::RenderTexture* getDepthRenderTarget () {
226  return mDepthRenderTexture->getBuffer()->getRenderTarget ();
227  }
228 
230  void update ();
231 
237  void setRenderGroupRangeFilter (int minGroup, int maxGroup);
238 
240  int getRenderGroupRangeFilterMin () { return mMinRenderGroupId; }
241  int getRenderGroupRangeFilterMax () { return mMaxRenderGroupId; }
242 
245  void disableRenderGroupRangeFilter ();
246 
250  void setViewportVisibilityMask (uint value) { mViewportVisibilityMask = value; }
251  uint getViewportVisibilityMask () { return mViewportVisibilityMask; }
252  void disableViewportVisibilityMask () { mViewportVisibilityMask = ~0; }
253 
254  public:
263  inline void setUseCustomDepthScheme (bool value) { mUseCustomDepthScheme = value; }
264  inline bool getUseCustomDepthScheme () { return mUseCustomDepthScheme; }
265 
268  inline void setCustomDepthSchemeName (const Ogre::String& value) { mCustomDepthSchemeName = value; }
269  inline const Ogre::String& getCustomDepthSchemeName () { return mCustomDepthSchemeName; }
270 
272  static const String DEFAULT_CUSTOM_DEPTH_SCHEME_NAME;
273 
274  private:
275  bool mUseCustomDepthScheme;
276  Ogre::String mCustomDepthSchemeName;
277  };
278 }
279 
280 #endif // CAELUM__DEPTH_COMPOSER_H
Real getGroundFogVerticalDecay() const
Get ground fog density.
void setUseCustomDepthScheme(bool value)
If true then use a user-supplied material scheme which outputs depth.
Ogre::CompositorInstance * getCompositorInstance() const
Get compositor instance; attached to the viewport.
Caelum::DepthRenderer * getDepthRenderer() const
Get the underlying depth renderer.
void setCustomDepthSchemeName(const Ogre::String &value)
Set the name of the custom depth scheme (default is CaelumDepth).
void setGroundFogVerticalDecay(Real value)
Sets ground fog vertical decay.
Compositor-based precipitation controller.
Definition: DepthComposer.h:35
void setGroundFogColour(const Ogre::ColourValue &value)
Sets ground fog colour.
Per-viewport instance of.
const Ogre::ColourValue getGroundFogColour() const
Get ground fog colour.
DepthComposer * getParent() const
Get parent DepthComposer; with all the interesting parameters.
void setGroundFogBaseLevel(Real value)
Sets ground fog level At ground level fogginess is equal to GroundFogDensity.
void setViewportVisibilityMask(uint value)
Query mask for the depth rendering viewport.
static const String DEFAULT_CUSTOM_DEPTH_SCHEME_NAME
Default name of the custom scheme.
Ogre::Viewport * getViewport() const
Get the viewport this instance is attached to.
Real getGroundFogDensity() const
Get ground fog density.
Real getGroundFogBaseLevel() const
Get ground fog density.
Render the depth buffer to a texture.
An optimized reference to a gpu shared parameter.
Caelum namespace.
Definition: Astronomy.cpp:24
void setGroundFogDensity(Real value)
Sets ground fog density.