00001
00032 #ifndef LL_WATER_PARAMMANAGER_H
00033 #define LL_WATER_PARAMMANAGER_H
00034
00035 #include <vector>
00036 #include <map>
00037 #include "llwaterparamset.h"
00038 #include "llviewercamera.h"
00039 #include "v4color.h"
00040
00041 const F32 WATER_FOG_LIGHT_CLAMP = 0.3f;
00042
00043
00044 struct WaterColorControl {
00045
00046 F32 mR, mG, mB, mA, mI;
00047 char const * mName;
00048 std::string mSliderName;
00049 bool mHasSliderName;
00050
00051 inline WaterColorControl(F32 red, F32 green, F32 blue, F32 alpha,
00052 F32 intensity, char const * n, char const * sliderName = "")
00053 : mR(red), mG(green), mB(blue), mA(alpha), mI(intensity), mName(n), mSliderName(sliderName)
00054 {
00055
00056 mHasSliderName = false;
00057 if (mSliderName != "") {
00058 mHasSliderName = true;
00059 }
00060 }
00061
00062 inline WaterColorControl & operator = (LLColor4 const & val)
00063 {
00064 mR = val.mV[0];
00065 mG = val.mV[1];
00066 mB = val.mV[2];
00067 mA = val.mV[3];
00068 return *this;
00069 }
00070
00071 inline operator LLColor4 (void) const
00072 {
00073 return LLColor4(mR, mG, mB, mA);
00074 }
00075
00076 inline WaterColorControl & operator = (LLVector4 const & val)
00077 {
00078 mR = val.mV[0];
00079 mG = val.mV[1];
00080 mB = val.mV[2];
00081 mA = val.mV[3];
00082 return *this;
00083 }
00084
00085 inline operator LLVector4 (void) const
00086 {
00087 return LLVector4(mR, mG, mB, mA);
00088 }
00089
00090 inline operator LLVector3 (void) const
00091 {
00092 return LLVector3(mR, mG, mB);
00093 }
00094
00095 inline void update(LLWaterParamSet & params) const
00096 {
00097 params.set(mName, mR, mG, mB, mA);
00098 }
00099 };
00100
00101 struct WaterVector3Control
00102 {
00103 F32 mX;
00104 F32 mY;
00105 F32 mZ;
00106
00107 char const * mName;
00108
00109
00110 inline WaterVector3Control(F32 valX, F32 valY, F32 valZ, char const * n)
00111 : mX(valX), mY(valY), mZ(valZ), mName(n)
00112 {
00113 }
00114
00115 inline WaterVector3Control & operator = (LLVector3 const & val)
00116 {
00117 mX = val.mV[0];
00118 mY = val.mV[1];
00119 mZ = val.mV[2];
00120
00121 return *this;
00122 }
00123
00124 inline void update(LLWaterParamSet & params) const
00125 {
00126 params.set(mName, mX, mY, mZ);
00127 }
00128
00129 };
00130
00131 struct WaterVector2Control
00132 {
00133 F32 mX;
00134 F32 mY;
00135
00136 char const * mName;
00137
00138
00139 inline WaterVector2Control(F32 valX, F32 valY, char const * n)
00140 : mX(valX), mY(valY), mName(n)
00141 {
00142 }
00143
00144 inline WaterVector2Control & operator = (LLVector2 const & val)
00145 {
00146 mX = val.mV[0];
00147 mY = val.mV[1];
00148
00149 return *this;
00150 }
00151
00152 inline void update(LLWaterParamSet & params) const
00153 {
00154 params.set(mName, mX, mY);
00155 }
00156 };
00157
00158
00159 struct WaterFloatControl
00160 {
00161 F32 mX;
00162 char const * mName;
00163 F32 mMult;
00164
00165 inline WaterFloatControl(F32 val, char const * n, F32 m=1.0f)
00166 : mX(val), mName(n), mMult(m)
00167 {
00168 }
00169
00170 inline WaterFloatControl & operator = (LLVector4 const & val)
00171 {
00172 mX = val.mV[0];
00173
00174 return *this;
00175 }
00176
00177 inline operator F32 (void) const
00178 {
00179 return mX;
00180 }
00181
00182 inline void update(LLWaterParamSet & params) const
00183 {
00184 params.set(mName, mX);
00185 }
00186 };
00187
00188
00189 struct WaterExpFloatControl
00190 {
00191 F32 mExp;
00192 char const * mName;
00193 F32 mBase;
00194
00195 inline WaterExpFloatControl(F32 val, char const * n, F32 b)
00196 : mExp(val), mName(n), mBase(b)
00197 {
00198 }
00199
00200 inline WaterExpFloatControl & operator = (F32 val)
00201 {
00202 mExp = log(val) / log(mBase);
00203
00204 return *this;
00205 }
00206
00207 inline operator F32 (void) const
00208 {
00209 return pow(mBase, mExp);
00210 }
00211
00212 inline void update(LLWaterParamSet & params) const
00213 {
00214 params.set(mName, pow(mBase, mExp));
00215 }
00216 };
00217
00218
00220 class LLWaterParamManager
00221 {
00222 public:
00223
00224 LLWaterParamManager();
00225 ~LLWaterParamManager();
00226
00228 void loadAllPresets(const LLString & fileName);
00229
00231 void loadPreset(const LLString & name);
00232
00234 void savePreset(const LLString & name);
00235
00237 void propagateParameters(void);
00238
00240 void update(LLViewerCamera * cam);
00241
00243 void updateShaderUniforms(LLGLSLShader * shader);
00244
00246 static void initClass(void);
00247
00248
00249 static void cleanupClass();
00250
00252 bool addParamSet(const std::string& name, LLWaterParamSet& param);
00253
00255 BOOL addParamSet(const std::string& name, LLSD const & param);
00256
00258 bool getParamSet(const std::string& name, LLWaterParamSet& param);
00259
00261 bool setParamSet(const std::string& name, LLWaterParamSet& param);
00262
00264 bool setParamSet(const std::string& name, LLSD const & param);
00265
00268 bool removeParamSet(const std::string& name, bool delete_from_disk);
00269
00271 bool setNormalMapID(const LLUUID& img);
00272
00273 void setDensitySliderValue(F32 val);
00274
00276 LLUUID getNormalMapID(void);
00277 LLVector2 getWave1Dir(void);
00278 LLVector2 getWave2Dir(void);
00279 F32 getScaleAbove(void);
00280 F32 getScaleBelow(void);
00281 LLVector3 getNormalScale(void);
00282 F32 getFresnelScale(void);
00283 F32 getFresnelOffset(void);
00284 F32 getBlurMultiplier(void);
00285 F32 getFogDensity(void);
00286 LLColor4 getFogColor(void);
00287
00288
00289 static LLWaterParamManager * instance();
00290
00291 public:
00292
00293 LLWaterParamSet mCurParams;
00294
00296 WaterColorControl mFogColor;
00297 WaterExpFloatControl mFogDensity;
00298 WaterFloatControl mUnderWaterFogMod;
00299
00301 WaterVector3Control mNormalScale;
00302 WaterVector2Control mWave1Dir;
00303 WaterVector2Control mWave2Dir;
00304
00305
00306 WaterFloatControl mFresnelScale;
00307 WaterFloatControl mFresnelOffset;
00308 WaterFloatControl mScaleAbove;
00309 WaterFloatControl mScaleBelow;
00310 WaterFloatControl mBlurMultiplier;
00311
00312
00313 std::map<std::string, LLWaterParamSet> mParamList;
00314
00315 F32 mDensitySliderValue;
00316
00317 private:
00318 LLVector4 mWaterPlane;
00319 F32 mWaterFogKS;
00320
00321
00322 static LLWaterParamManager * sInstance;
00323 };
00324
00325 inline void LLWaterParamManager::setDensitySliderValue(F32 val)
00326 {
00327 val /= 10.0f;
00328 val = 1.0f - val;
00329 val *= val * val;
00330
00331 mDensitySliderValue = val;
00332 }
00333
00334 inline LLUUID LLWaterParamManager::getNormalMapID()
00335 {
00336 return mCurParams.mParamValues["normalMap"].asUUID();
00337 }
00338
00339 inline bool LLWaterParamManager::setNormalMapID(const LLUUID& id)
00340 {
00341 mCurParams.mParamValues["normalMap"] = id;
00342 return true;
00343 }
00344
00345 inline LLVector2 LLWaterParamManager::getWave1Dir(void)
00346 {
00347 bool err;
00348 return mCurParams.getVector2("wave1Dir", err);
00349 }
00350
00351 inline LLVector2 LLWaterParamManager::getWave2Dir(void)
00352 {
00353 bool err;
00354 return mCurParams.getVector2("wave2Dir", err);
00355 }
00356
00357 inline F32 LLWaterParamManager::getScaleAbove(void)
00358 {
00359 bool err;
00360 return mCurParams.getFloat("scaleAbove", err);
00361 }
00362
00363 inline F32 LLWaterParamManager::getScaleBelow(void)
00364 {
00365 bool err;
00366 return mCurParams.getFloat("scaleBelow", err);
00367 }
00368
00369 inline LLVector3 LLWaterParamManager::getNormalScale(void)
00370 {
00371 bool err;
00372 return mCurParams.getVector3("normScale", err);
00373 }
00374
00375 inline F32 LLWaterParamManager::getFresnelScale(void)
00376 {
00377 bool err;
00378 return mCurParams.getFloat("fresnelScale", err);
00379 }
00380
00381 inline F32 LLWaterParamManager::getFresnelOffset(void)
00382 {
00383 bool err;
00384 return mCurParams.getFloat("fresnelOffset", err);
00385 }
00386
00387 inline F32 LLWaterParamManager::getBlurMultiplier(void)
00388 {
00389 bool err;
00390 return mCurParams.getFloat("blurMultiplier", err);
00391 }
00392
00393 inline LLColor4 LLWaterParamManager::getFogColor(void)
00394 {
00395 bool err;
00396 return LLColor4(mCurParams.getVector4("waterFogColor", err));
00397 }
00398
00399 #endif