summaryrefslogtreecommitdiff
path: root/indra/newview/llwlparamset.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llwlparamset.cpp')
-rwxr-xr-x[-rw-r--r--]indra/newview/llwlparamset.cpp210
1 files changed, 115 insertions, 95 deletions
diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp
index cf06766d73..066cb9a0ac 100644..100755
--- a/indra/newview/llwlparamset.cpp
+++ b/indra/newview/llwlparamset.cpp
@@ -29,100 +29,131 @@
#include "llwlparamset.h"
#include "llwlanimator.h"
-#include "llfloaterwindlight.h"
#include "llwlparammanager.h"
+#include "llglslshader.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
+#include "pipeline.h"
#include <llgl.h>
#include <sstream>
+static LLStaticHashedString sStarBrightness("star_brightness");
+static LLStaticHashedString sPresetNum("preset_num");
+static LLStaticHashedString sSunAngle("sun_angle");
+static LLStaticHashedString sEastAngle("east_angle");
+static LLStaticHashedString sEnableCloudScroll("enable_cloud_scroll");
+static LLStaticHashedString sCloudScrollRate("cloud_scroll_rate");
+static LLStaticHashedString sLightNorm("lightnorm");
+static LLStaticHashedString sCloudDensity("cloud_pos_density1");
+static LLStaticHashedString sCloudScale("cloud_scale");
+static LLStaticHashedString sCloudShadow("cloud_shadow");
+static LLStaticHashedString sDensityMultiplier("density_multiplier");
+static LLStaticHashedString sDistanceMultiplier("distance_multiplier");
+static LLStaticHashedString sHazeDensity("haze_density");
+static LLStaticHashedString sHazeHorizon("haze_horizon");
+static LLStaticHashedString sMaxY("max_y");
+
LLWLParamSet::LLWLParamSet(void) :
mName("Unnamed Preset"),
mCloudScrollXOffset(0.f), mCloudScrollYOffset(0.f)
-{
-/* REMOVE or init the LLSD
- const std::map<std::string, LLVector4>::value_type hardcodedPreset[] = {
- std::make_pair("lightnorm", LLVector4(0.f, 0.707f, -0.707f, 0.f)),
- std::make_pair("sunlight_color", LLVector4(0.6f, 0.6f, 2.83f, 2.27f)),
- std::make_pair("ambient", LLVector4(0.27f, 0.33f, 0.44f, 1.19f)),
- std::make_pair("blue_horizon", LLVector4(0.3f, 0.4f, 0.9f, 1.f)),
- std::make_pair("blue_density", LLVector4(0.3f, 0.4f, 0.8f, 1.f)),
- std::make_pair("haze_horizon", LLVector4(0.6f, 0.6f, 0.6f, 1.f)),
- std::make_pair("haze_density", LLVector4(0.3f, 0.3f, 0.3f, 1.f)),
- std::make_pair("cloud_shadow", LLVector4(0.f, 0.f, 0.f, 0.f)),
- std::make_pair("density_multiplier", LLVector4(0.001f, 0.001f, 0.001f, 0.001f)),
- std::make_pair("distance_multiplier", LLVector4(1.f, 1.f, 1.f, 1.f)),
- std::make_pair("max_y", LLVector4(600.f, 600.f, 600.f, 0.f)),
- std::make_pair("glow", LLVector4(15.f, 0.001f, -0.03125f, 0.f)),
- std::make_pair("cloud_color", LLVector4(0.0f, 0.0f, 0.0f, 0.0f)),
- std::make_pair("cloud_pos_density1", LLVector4(0.f, 0.f, 0.f, 1.f)),
- std::make_pair("cloud_pos_density2", LLVector4(0.f, 0.f, 0.f, 1.f)),
- std::make_pair("cloud_scale", LLVector4(0.42f, 0.f, 0.f, 1.f)),
- std::make_pair("gamma", LLVector4(2.0f, 2.0f, 2.0f, 0.0f)),
- };
- std::map<std::string, LLVector4>::value_type const * endHardcodedPreset =
- hardcodedPreset + LL_ARRAY_SIZE(hardcodedPreset);
-
- mParamValues.insert(hardcodedPreset, endHardcodedPreset);
-*/
-}
+{}
+
+static LLTrace::BlockTimerStatHandle FTM_WL_PARAM_UPDATE("WL Param Update");
void LLWLParamSet::update(LLGLSLShader * shader) const
{
- for(LLSD::map_const_iterator i = mParamValues.beginMap();
- i != mParamValues.endMap();
- ++i)
+ LL_RECORD_BLOCK_TIME(FTM_WL_PARAM_UPDATE);
+ LLSD::map_const_iterator i = mParamValues.beginMap();
+ std::vector<LLStaticHashedString>::const_iterator n = mParamHashedNames.begin();
+ for(;(i != mParamValues.endMap()) && (n != mParamHashedNames.end());++i, n++)
{
- const std::string& param = i->first;
+ const LLStaticHashedString& param = *n;
- if( param == "star_brightness" || param == "preset_num" || param == "sun_angle" ||
- param == "east_angle" || param == "enable_cloud_scroll" ||
- param == "cloud_scroll_rate" || param == "lightnorm" )
+ // check that our pre-hashed names are still tracking the mParamValues map correctly
+ //
+ llassert(param.String() == i->first);
+
+ if (param == sStarBrightness || param == sPresetNum || param == sSunAngle ||
+ param == sEastAngle || param == sEnableCloudScroll ||
+ param == sCloudScrollRate || param == sLightNorm )
{
continue;
}
- if(param == "cloud_pos_density1")
+ if (param == sCloudDensity)
{
LLVector4 val;
val.mV[0] = F32(i->second[0].asReal()) + mCloudScrollXOffset;
val.mV[1] = F32(i->second[1].asReal()) + mCloudScrollYOffset;
val.mV[2] = (F32) i->second[2].asReal();
val.mV[3] = (F32) i->second[3].asReal();
-
- shader->uniform4fv(param, 1, val.mV);
- }
- else
+
+ stop_glerror();
+ shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
+ }
+ else if (param == sCloudScale || param == sCloudShadow ||
+ param == sDensityMultiplier || param == sDistanceMultiplier ||
+ param == sHazeDensity || param == sHazeHorizon ||
+ param == sMaxY )
+ {
+ F32 val = (F32) i->second[0].asReal();
+
+ stop_glerror();
+ shader->uniform1f(param, val);
+ stop_glerror();
+ }
+ else // param is the uniform name
{
- LLVector4 val;
-
// handle all the different cases
- if(i->second.isArray() && i->second.size() == 4)
+ if (i->second.isArray() && i->second.size() == 4)
{
+ LLVector4 val;
+
val.mV[0] = (F32) i->second[0].asReal();
val.mV[1] = (F32) i->second[1].asReal();
val.mV[2] = (F32) i->second[2].asReal();
val.mV[3] = (F32) i->second[3].asReal();
+
+ stop_glerror();
+ shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
}
- else if(i->second.isReal())
+ else if (i->second.isReal())
{
- val.mV[0] = (F32) i->second.asReal();
+ F32 val = (F32) i->second.asReal();
+
+ stop_glerror();
+ shader->uniform1f(param, val);
+ stop_glerror();
}
- else if(i->second.isInteger())
+ else if (i->second.isInteger())
{
- val.mV[0] = (F32) i->second.asReal();
+ S32 val = (S32) i->second.asInteger();
+
+ stop_glerror();
+ shader->uniform1i(param, val);
+ stop_glerror();
}
- else if(i->second.isBoolean())
+ else if (i->second.isBoolean())
{
- val.mV[0] = i->second.asBoolean();
+ S32 val = (i->second.asBoolean() ? 1 : 0);
+
+ stop_glerror();
+ shader->uniform1i(param, val);
+ stop_glerror();
}
-
-
- shader->uniform4fv(param, 1, val.mV);
}
}
+
+ if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && !LLPipeline::sUnderWaterRender)
+ {
+ shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2);
+ } else {
+ shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0);
+ }
}
void LLWLParamSet::set(const std::string& paramName, float x)
@@ -141,7 +172,8 @@ void LLWLParamSet::set(const std::string& paramName, float x)
}
}
-void LLWLParamSet::set(const std::string& paramName, float x, float y) {
+void LLWLParamSet::set(const std::string& paramName, float x, float y)
+{
mParamValues[paramName][0] = x;
mParamValues[paramName][1] = y;
}
@@ -187,7 +219,6 @@ void LLWLParamSet::set(const std::string& paramName, const LLColor4 & val)
LLVector4 LLWLParamSet::getVector(const std::string& paramName, bool& error)
{
-
// test to see if right type
LLSD cur_val = mParamValues.get(paramName);
if (!cur_val.isArray())
@@ -208,7 +239,6 @@ LLVector4 LLWLParamSet::getVector(const std::string& paramName, bool& error)
F32 LLWLParamSet::getFloat(const std::string& paramName, bool& error)
{
-
// test to see if right type
LLSD cur_val = mParamValues.get(paramName);
if (cur_val.isArray() && cur_val.size() != 0)
@@ -227,8 +257,6 @@ F32 LLWLParamSet::getFloat(const std::string& paramName, bool& error)
return 0;
}
-
-
void LLWLParamSet::setSunAngle(float val)
{
// keep range 0 - 2pi
@@ -256,11 +284,9 @@ void LLWLParamSet::setEastAngle(float val)
mParamValues["east_angle"] = val;
}
-
void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
{
// set up the iterators
- LLSD::map_iterator cIt = mParamValues.beginMap();
// keep cloud positions and coverage the same
/// TODO masking will do this later
@@ -273,55 +299,38 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
LLSD srcVal;
LLSD destVal;
- // do the interpolation for all the ones saved as vectors
- // skip the weird ones
- for(; cIt != mParamValues.endMap(); cIt++) {
-
- // check params to make sure they're actually there
- if(src.mParamValues.has(cIt->first))
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
+ // If param exists in both src and dest, set the holder variables, otherwise skip
+ if(src.mParamValues.has(iter->first) && dest.mParamValues.has(iter->first))
{
- srcVal = src.mParamValues[cIt->first];
+ srcVal = src.mParamValues[iter->first];
+ destVal = dest.mParamValues[iter->first];
}
else
{
continue;
}
- if(dest.mParamValues.has(cIt->first))
+ if(iter->second.isReal()) // If it's a real, interpolate directly
{
- destVal = dest.mParamValues[cIt->first];
+ iter->second = srcVal.asReal() + ((destVal.asReal() - srcVal.asReal()) * weight);
}
- else
- {
- continue;
- }
-
- // skip if not a vector
- if(!cIt->second.isArray())
+ else if(iter->second.isArray() && iter->second[0].isReal() // If it's an array of reals, loop through the reals and interpolate on those
+ && iter->second.size() == srcVal.size() && iter->second.size() == destVal.size())
{
- continue;
+ // Actually do interpolation: old value + (difference in values * factor)
+ for(int i=0; i < iter->second.size(); ++i)
+ {
+ // iter->second[i] = (1.f-weight)*(F32)srcVal[i].asReal() + weight*(F32)destVal[i].asReal(); // old way of doing it -- equivalent but one more operation
+ iter->second[i] = srcVal[i].asReal() + ((destVal[i].asReal() - srcVal[i].asReal()) * weight);
+ }
}
-
- // only Real vectors allowed
- if(!cIt->second[0].isReal())
+ else // Else, skip
{
continue;
- }
-
- // make sure all the same size
- if( cIt->second.size() != srcVal.size() ||
- cIt->second.size() != destVal.size())
- {
- continue;
- }
-
- // more error checking might be necessary;
-
- for(int i=0; i < cIt->second.size(); ++i)
- {
- cIt->second[i] = (1.0f - weight) * (F32) srcVal[i].asReal() +
- weight * (F32) destVal[i].asReal();
- }
+ }
}
// now mix the extra parameters
@@ -396,3 +405,14 @@ void LLWLParamSet::updateCloudScrolling(void)
mCloudScrollYOffset += F32(delta_t * (getCloudScrollY() - 10.f) / 100.f);
}
}
+
+void LLWLParamSet::updateHashedNames()
+{
+ mParamHashedNames.clear();
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
+ mParamHashedNames.push_back(LLStaticHashedString(iter->first));
+ }
+}
+