00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CAELUM__DEPTH_COMPOSER_H
00022 #define CAELUM__DEPTH_COMPOSER_H
00023
00024 #include "CaelumPrerequisites.h"
00025
00026 namespace Caelum
00027 {
00034 class CAELUM_EXPORT DepthComposer
00035 {
00036 private:
00037 Ogre::SceneManager *mSceneMgr;
00038
00040 void _updateMaterialParams (const Ogre::MaterialPtr& mat);
00041
00042 void onCompositorMaterialChanged ();
00043 const String& getCompositorName ();
00044
00045 protected:
00046 inline Ogre::SceneManager* getSceneManager() const { return mSceneMgr; }
00047
00048 friend class DepthComposerInstance;
00049
00050 public:
00051 DepthComposer(Ogre::SceneManager *sceneMgr);
00052 virtual ~DepthComposer();
00053
00054 void update ();
00055
00056 public:
00057 typedef std::map<Ogre::Viewport*, DepthComposerInstance*> ViewportInstanceMap;
00058 ViewportInstanceMap mViewportInstanceMap;
00059
00060 public:
00061 DepthComposerInstance* createViewportInstance(Ogre::Viewport* viewport);
00062 void destroyViewportInstance(Ogre::Viewport* viewport);
00063 DepthComposerInstance* getViewportInstance(Ogre::Viewport* viewport);
00064 void destroyAllViewportInstances();
00065
00066 private:
00067 bool mDebugDepthRender;
00068
00069 public:
00071 void setDebugDepthRender (bool value);
00072 bool getDebugDepthRender () const { return mDebugDepthRender; }
00073
00074 private:
00075 bool mSkyDomeHazeEnabled;
00076 Ogre::Vector3 mSunDirection;
00077 Ogre::ColourValue mHazeColour;
00078
00079 public:
00081 void setSkyDomeHazeEnabled (bool value);
00082 bool getSkyDomeHazeEnabled () const { return mSkyDomeHazeEnabled; }
00083
00084 void setSunDirection (const Ogre::Vector3& value) { mSunDirection = value; }
00085 const Ogre::Vector3 getSunDirection () const { return mSunDirection; }
00086
00087 void setHazeColour (const Ogre::ColourValue& value) { mHazeColour = value; }
00088 const Ogre::ColourValue getHazeColour () const { return mHazeColour; }
00089
00090 private:
00091 bool mGroundFogEnabled;
00092 Real mGroundFogDensity;
00093 Real mGroundFogBaseLevel;
00094 Real mGroundFogVerticalDecay;
00095 Ogre::ColourValue mGroundFogColour;
00096
00097 public:
00099 void setGroundFogEnabled (bool value);
00100 bool getGroundFogEnabled () const { return mGroundFogEnabled; }
00101
00103 void setGroundFogDensity (Real value) { mGroundFogDensity = value; }
00104
00106 Real getGroundFogDensity () const { return mGroundFogDensity; }
00107
00110 void setGroundFogBaseLevel (Real value) { mGroundFogBaseLevel = value; }
00111
00113 Real getGroundFogBaseLevel () const { return mGroundFogBaseLevel; }
00114
00116 void setGroundFogVerticalDecay (Real value) { mGroundFogVerticalDecay = value; }
00117
00119 Real getGroundFogVerticalDecay () const { return mGroundFogVerticalDecay; }
00120
00122 void setGroundFogColour (const Ogre::ColourValue& value) { mGroundFogColour = value; }
00123
00125 const Ogre::ColourValue getGroundFogColour () const { return mGroundFogColour; }
00126 };
00127
00131 class CAELUM_EXPORT DepthComposerInstance: private Ogre::CompositorInstance::Listener
00132 {
00133 private:
00134 DepthComposer* mParent;
00135 Ogre::Viewport* mViewport;
00136 Ogre::CompositorInstance* mCompInst;
00137 std::auto_ptr<DepthRenderer> mDepthRenderer;
00138
00139 virtual void notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat);
00140 virtual void notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat);
00141
00142 protected:
00144 void _update ();
00145
00146 void addCompositor ();
00147 void removeCompositor ();
00148 bool isCompositorEnabled () { return mCompInst != 0; }
00149
00150 friend class DepthComposer;
00151
00152 public:
00154 DepthComposer* getParent() const { return mParent; }
00155
00157 Ogre::Viewport* getViewport() const { return mViewport; }
00158
00160 Ogre::CompositorInstance* getCompositorInstance() const { return mCompInst; }
00161
00165 Caelum::DepthRenderer* getDepthRenderer () const { return mDepthRenderer.get(); }
00166
00167 DepthComposerInstance(DepthComposer* parent, Ogre::Viewport* view);
00168 virtual ~DepthComposerInstance();
00169 };
00170
00176 class CAELUM_EXPORT DepthRenderer: private Ogre::RenderQueue::RenderableListener
00177 {
00178 private:
00179 Ogre::Viewport* mMasterViewport;
00180 Ogre::Viewport* mDepthRenderViewport;
00181 Ogre::TexturePtr mDepthRenderTexture;
00182 bool mDepthRenderingNow;
00183 Ogre::MaterialPtr mDepthRenderMaterial;
00184
00185
00186 #if OGRE_VERSION < 0x00010600
00187 virtual bool renderableQueued(
00188 Ogre::Renderable* rend,
00189 Ogre::uint8 groupId,
00190 Ogre::ushort priority,
00191 Ogre::Technique** ppTech);
00192 #else
00193 virtual bool renderableQueued(
00194 Ogre::Renderable* rend,
00195 Ogre::uint8 groupId,
00196 Ogre::ushort priority,
00197 Ogre::Technique** ppTech,
00198 Ogre::RenderQueue* pQueue);
00199 #endif // OGRE_VERSION
00200 inline Ogre::Material* getDepthRenderMaterial() const { return mDepthRenderMaterial.get(); }
00201
00202 int mMinRenderGroupId;
00203 int mMaxRenderGroupId;
00204 int mViewportVisibilityMask;
00205
00206 public:
00207 DepthRenderer (Ogre::Viewport* viewport);
00208 ~DepthRenderer ();
00209
00210 inline Ogre::Viewport* getMasterViewport() { return mMasterViewport; }
00211 inline Ogre::Texture* getDepthRenderTexture () { return mDepthRenderTexture.get(); }
00212 inline Ogre::Viewport* getDepthRenderViewport () { return mDepthRenderViewport; }
00213 inline Ogre::RenderTexture* getDepthRenderTarget () {
00214 return mDepthRenderTexture->getBuffer()->getRenderTarget ();
00215 }
00216
00218 void update ();
00219
00225 void setRenderGroupRangeFilter (int minGroup, int maxGroup);
00226
00228 int getRenderGroupRangeFilterMin () { return mMinRenderGroupId; }
00229 int getRenderGroupRangeFilterMax () { return mMaxRenderGroupId; }
00230
00233 void disableRenderGroupRangeFilter ();
00234
00238 void setViewportVisibilityMask (uint value) { mViewportVisibilityMask = value; }
00239 uint getViewportVisibilityMask () { return mViewportVisibilityMask; }
00240 void disableViewportVisibilityMask () { mViewportVisibilityMask = ~0; }
00241
00242 public:
00251 inline void setUseCustomDepthScheme (bool value) { mUseCustomDepthScheme = value; }
00252 inline bool getUseCustomDepthScheme () { return mUseCustomDepthScheme; }
00253
00256 inline void setCustomDepthSchemeName (const Ogre::String& value) { mCustomDepthSchemeName = value; }
00257 inline const Ogre::String& getCustomDepthSchemeName () { return mCustomDepthSchemeName; }
00258
00260 static const String DEFAULT_CUSTOM_DEPTH_SCHEME_NAME;
00261
00262 private:
00263 bool mUseCustomDepthScheme;
00264 Ogre::String mCustomDepthSchemeName;
00265 };
00266 }
00267
00268 #endif // CAELUM__DEPTH_COMPOSER_H