00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GROUNDFOG_H
00022 #define GROUNDFOG_H
00023
00024 #include "CaelumPrerequisites.h"
00025 #include "CameraBoundElement.h"
00026 #include "PrivatePtr.h"
00027 #include "FastGpuParamRef.h"
00028
00029 namespace Caelum
00030 {
00047 class CAELUM_EXPORT GroundFog: public CameraBoundElement
00048 {
00049 public:
00050 static const Ogre::String DEFAULT_PASS_NAME;
00051
00054 GroundFog (Ogre::SceneManager *scene,
00055 Ogre::SceneNode *caelumRootNode,
00056 const Ogre::String &domeMaterialName = "CaelumGroundFogDome",
00057 const Ogre::String &domeEntityName = "CaelumGroundFogDome");
00058
00061 virtual ~GroundFog ();
00062
00065 typedef std::set<Ogre::Pass *> PassSet;
00066
00071 PassSet& getPasses();
00072
00077 const PassSet& getPasses () const;
00078
00083 void findFogPassesByName (const Ogre::String& passName = DEFAULT_PASS_NAME);
00084
00086 void setDensity (Ogre::Real density);
00087
00089 Ogre::Real getDensity () const;
00090
00092 void setColour (const Ogre::ColourValue &colour);
00093
00095 const Ogre::ColourValue getColour () const;
00096
00098 void setVerticalDecay (Ogre::Real verticalDecay);
00099
00101 Ogre::Real getVerticalDecay () const;
00102
00106 void setGroundLevel (Ogre::Real GroundLevela);
00107
00110 Ogre::Real getGroundLevel () const;
00111
00115 void forceUpdate ();
00116
00117 private:
00119 Ogre::Real mDensity;
00120
00122 Ogre::Real mVerticalDecay;
00123
00125 Ogre::Real mGroundLevel;
00126
00128 Ogre::ColourValue mFogColour;
00129
00130 private:
00132 Ogre::SceneManager* mScene;
00133
00135 PrivateMaterialPtr mDomeMaterial;
00136
00138 PrivateSceneNodePtr mDomeNode;
00139
00141 PrivateEntityPtr mDomeEntity;
00142
00143
00144 void updateSkyFogging();
00145
00146 protected:
00148 virtual void setFarRadius (Ogre::Real radius);
00149
00150 public:
00152 virtual void notifyCameraChanged (Ogre::Camera *cam);
00153
00154 void setQueryFlags (uint flags) { mDomeEntity->setQueryFlags (flags); }
00155 uint getQueryFlags () const { return mDomeEntity->getQueryFlags (); }
00156 void setVisibilityFlags (uint flags) { mDomeEntity->setVisibilityFlags (flags); }
00157 uint getVisibilityFlags () const { return mDomeEntity->getVisibilityFlags (); }
00158
00159 private:
00161 PassSet mPasses;
00162
00164 struct FogParamsBase
00165 {
00166 void setup(Ogre::GpuProgramParametersSharedPtr fpParams);
00167
00168 Ogre::GpuProgramParametersSharedPtr fpParams;
00169
00170 FastGpuParamRef fogDensity;
00171 FastGpuParamRef fogColour;
00172 FastGpuParamRef fogVerticalDecay;
00173 FastGpuParamRef fogGroundLevel;
00174
00175 };
00176
00177 struct DomeFogParams: public FogParamsBase {
00178 void setup(Ogre::GpuProgramParametersSharedPtr fpParams);
00179 FastGpuParamRef cameraHeight;
00180 } mDomeParams;
00181
00182 struct PassFogParams: public FogParamsBase {
00183 PassFogParams(Ogre::GpuProgramParametersSharedPtr fpParams) { setup(fpParams); }
00184
00185 static inline bool lessThanByParams(const PassFogParams& a, const PassFogParams& b) {
00186 return a.fpParams.get() <= b.fpParams.get();
00187 }
00188
00189 static inline bool equalByParams(const PassFogParams& a, const PassFogParams& b) {
00190 return a.fpParams.get() == b.fpParams.get();
00191 }
00192 };
00193
00194 typedef std::vector<PassFogParams> PassFogParamsVector;
00195 PassFogParamsVector mPassFogParams;
00196
00198 void updatePassFogParams();
00199 };
00200 }
00201
00202 #endif //GROUNDFOG_H