summaryrefslogtreecommitdiff
path: root/indra/newview/llwaterparammanager.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llwaterparammanager.h')
-rw-r--r--indra/newview/llwaterparammanager.h401
1 files changed, 401 insertions, 0 deletions
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
new file mode 100644
index 0000000000..6892bb1924
--- /dev/null
+++ b/indra/newview/llwaterparammanager.h
@@ -0,0 +1,401 @@
+/**
+ * @file llwaterparammanager.h
+ * @brief Implementation for the LLWaterParamManager class.
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_WATER_PARAMMANAGER_H
+#define LL_WATER_PARAMMANAGER_H
+
+#include <vector>
+#include <map>
+#include "llwaterparamset.h"
+#include "llviewercamera.h"
+#include "v4color.h"
+
+const F32 WATER_FOG_LIGHT_CLAMP = 0.3f;
+
+// color control
+struct WaterColorControl {
+
+ F32 mR, mG, mB, mA, mI; /// the values
+ char const * mName; /// name to use to dereference params
+ std::string mSliderName; /// name of the slider in menu
+ bool mHasSliderName; /// only set slider name for true color types
+
+ inline WaterColorControl(F32 red, F32 green, F32 blue, F32 alpha,
+ F32 intensity, char const * n, char const * sliderName = "")
+ : mR(red), mG(green), mB(blue), mA(alpha), mI(intensity), mName(n), mSliderName(sliderName)
+ {
+ // if there's a slider name, say we have one
+ mHasSliderName = false;
+ if (mSliderName != "") {
+ mHasSliderName = true;
+ }
+ }
+
+ inline WaterColorControl & operator = (LLColor4 const & val)
+ {
+ mR = val.mV[0];
+ mG = val.mV[1];
+ mB = val.mV[2];
+ mA = val.mV[3];
+ return *this;
+ }
+
+ inline operator LLColor4 (void) const
+ {
+ return LLColor4(mR, mG, mB, mA);
+ }
+
+ inline WaterColorControl & operator = (LLVector4 const & val)
+ {
+ mR = val.mV[0];
+ mG = val.mV[1];
+ mB = val.mV[2];
+ mA = val.mV[3];
+ return *this;
+ }
+
+ inline operator LLVector4 (void) const
+ {
+ return LLVector4(mR, mG, mB, mA);
+ }
+
+ inline operator LLVector3 (void) const
+ {
+ return LLVector3(mR, mG, mB);
+ }
+
+ inline void update(LLWaterParamSet & params) const
+ {
+ params.set(mName, mR, mG, mB, mA);
+ }
+};
+
+struct WaterVector3Control
+{
+ F32 mX;
+ F32 mY;
+ F32 mZ;
+
+ char const * mName;
+
+ // basic constructor
+ inline WaterVector3Control(F32 valX, F32 valY, F32 valZ, char const * n)
+ : mX(valX), mY(valY), mZ(valZ), mName(n)
+ {
+ }
+
+ inline WaterVector3Control & operator = (LLVector3 const & val)
+ {
+ mX = val.mV[0];
+ mY = val.mV[1];
+ mZ = val.mV[2];
+
+ return *this;
+ }
+
+ inline void update(LLWaterParamSet & params) const
+ {
+ params.set(mName, mX, mY, mZ);
+ }
+
+};
+
+struct WaterVector2Control
+{
+ F32 mX;
+ F32 mY;
+
+ char const * mName;
+
+ // basic constructor
+ inline WaterVector2Control(F32 valX, F32 valY, char const * n)
+ : mX(valX), mY(valY), mName(n)
+ {
+ }
+
+ inline WaterVector2Control & operator = (LLVector2 const & val)
+ {
+ mX = val.mV[0];
+ mY = val.mV[1];
+
+ return *this;
+ }
+
+ inline void update(LLWaterParamSet & params) const
+ {
+ params.set(mName, mX, mY);
+ }
+};
+
+// float slider control
+struct WaterFloatControl
+{
+ F32 mX;
+ char const * mName;
+ F32 mMult;
+
+ inline WaterFloatControl(F32 val, char const * n, F32 m=1.0f)
+ : mX(val), mName(n), mMult(m)
+ {
+ }
+
+ inline WaterFloatControl & operator = (LLVector4 const & val)
+ {
+ mX = val.mV[0];
+
+ return *this;
+ }
+
+ inline operator F32 (void) const
+ {
+ return mX;
+ }
+
+ inline void update(LLWaterParamSet & params) const
+ {
+ params.set(mName, mX);
+ }
+};
+
+// float slider control
+struct WaterExpFloatControl
+{
+ F32 mExp;
+ char const * mName;
+ F32 mBase;
+
+ inline WaterExpFloatControl(F32 val, char const * n, F32 b)
+ : mExp(val), mName(n), mBase(b)
+ {
+ }
+
+ inline WaterExpFloatControl & operator = (F32 val)
+ {
+ mExp = log(val) / log(mBase);
+
+ return *this;
+ }
+
+ inline operator F32 (void) const
+ {
+ return pow(mBase, mExp);
+ }
+
+ inline void update(LLWaterParamSet & params) const
+ {
+ params.set(mName, pow(mBase, mExp));
+ }
+};
+
+
+/// WindLight parameter manager class - what controls all the wind light shaders
+class LLWaterParamManager
+{
+public:
+
+ LLWaterParamManager();
+ ~LLWaterParamManager();
+
+ /// load a preset file
+ void loadAllPresets(const LLString & fileName);
+
+ /// load an individual preset into the sky
+ void loadPreset(const LLString & name);
+
+ /// save the parameter presets to file
+ void savePreset(const LLString & name);
+
+ /// send the parameters to the shaders
+ void propagateParameters(void);
+
+ /// update information for the shader
+ void update(LLViewerCamera * cam);
+
+ /// Update shader uniforms that have changed.
+ void updateShaderUniforms(LLGLSLShader * shader);
+
+ /// Perform global initialization for this class.
+ static void initClass(void);
+
+ // Cleanup of global data that's only inited once per class.
+ static void cleanupClass();
+
+ /// add a param to the list
+ bool addParamSet(const std::string& name, LLWaterParamSet& param);
+
+ /// add a param to the list
+ BOOL addParamSet(const std::string& name, LLSD const & param);
+
+ /// get a param from the list
+ bool getParamSet(const std::string& name, LLWaterParamSet& param);
+
+ /// set the param in the list with a new param
+ bool setParamSet(const std::string& name, LLWaterParamSet& param);
+
+ /// set the param in the list with a new param
+ bool setParamSet(const std::string& name, LLSD const & param);
+
+ /// gets rid of a parameter and any references to it
+ /// returns true if successful
+ bool removeParamSet(const std::string& name, bool delete_from_disk);
+
+ /// set the normap map we want for water
+ bool setNormalMapID(const LLUUID& img);
+
+ void setDensitySliderValue(F32 val);
+
+ /// getters for all the different things water param manager maintains
+ LLUUID getNormalMapID(void);
+ LLVector2 getWave1Dir(void);
+ LLVector2 getWave2Dir(void);
+ F32 getScaleAbove(void);
+ F32 getScaleBelow(void);
+ LLVector3 getNormalScale(void);
+ F32 getFresnelScale(void);
+ F32 getFresnelOffset(void);
+ F32 getBlurMultiplier(void);
+ F32 getFogDensity(void);
+ LLColor4 getFogColor(void);
+
+ // singleton pattern implementation
+ static LLWaterParamManager * instance();
+
+public:
+
+ LLWaterParamSet mCurParams;
+
+ /// Atmospherics
+ WaterColorControl mFogColor;
+ WaterExpFloatControl mFogDensity;
+ WaterFloatControl mUnderWaterFogMod;
+
+ /// wavelet scales and directions
+ WaterVector3Control mNormalScale;
+ WaterVector2Control mWave1Dir;
+ WaterVector2Control mWave2Dir;
+
+ // controls how water is reflected and refracted
+ WaterFloatControl mFresnelScale;
+ WaterFloatControl mFresnelOffset;
+ WaterFloatControl mScaleAbove;
+ WaterFloatControl mScaleBelow;
+ WaterFloatControl mBlurMultiplier;
+
+ // list of all the parameters, listed by name
+ std::map<std::string, LLWaterParamSet> mParamList;
+
+ F32 mDensitySliderValue;
+
+private:
+ // our parameter manager singleton instance
+ static LLWaterParamManager * sInstance;
+
+private:
+
+ LLVector4 mWaterPlane;
+ F32 mWaterFogKS;
+};
+
+inline void LLWaterParamManager::setDensitySliderValue(F32 val)
+{
+ val /= 10;
+ val = 1.0f - val;
+ val *= val * val;
+// val *= val;
+ mDensitySliderValue = val;
+}
+
+inline LLUUID LLWaterParamManager::getNormalMapID()
+{
+ return mCurParams.mParamValues["normalMap"].asUUID();
+}
+
+inline bool LLWaterParamManager::setNormalMapID(const LLUUID& id)
+{
+ mCurParams.mParamValues["normalMap"] = id;
+ return true;
+}
+
+inline LLVector2 LLWaterParamManager::getWave1Dir(void)
+{
+ bool err;
+ return mCurParams.getVector2("wave1Dir", err);
+}
+
+inline LLVector2 LLWaterParamManager::getWave2Dir(void)
+{
+ bool err;
+ return mCurParams.getVector2("wave2Dir", err);
+}
+
+inline F32 LLWaterParamManager::getScaleAbove(void)
+{
+ bool err;
+ return mCurParams.getFloat("scaleAbove", err);
+}
+
+inline F32 LLWaterParamManager::getScaleBelow(void)
+{
+ bool err;
+ return mCurParams.getFloat("scaleBelow", err);
+}
+
+inline LLVector3 LLWaterParamManager::getNormalScale(void)
+{
+ bool err;
+ return mCurParams.getVector3("normScale", err);
+}
+
+inline F32 LLWaterParamManager::getFresnelScale(void)
+{
+ bool err;
+ return mCurParams.getFloat("fresnelScale", err);
+}
+
+inline F32 LLWaterParamManager::getFresnelOffset(void)
+{
+ bool err;
+ return mCurParams.getFloat("fresnelOffset", err);
+}
+
+inline F32 LLWaterParamManager::getBlurMultiplier(void)
+{
+ bool err;
+ return mCurParams.getFloat("blurMultiplier", err);
+}
+
+inline LLColor4 LLWaterParamManager::getFogColor(void)
+{
+ bool err;
+ return LLColor4(mCurParams.getVector4("waterFogColor", err));
+}
+
+#endif