summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham Linden <graham@lindenlab.com>2018-10-19 17:45:40 +0100
committerGraham Linden <graham@lindenlab.com>2018-10-19 17:45:40 +0100
commit75858d9f3ff1f6adae4e6b4c4726eecfc57d0e11 (patch)
tree3063f5488a4c10d04bc3770a824f660556f5c63f
parent0532c644a3507166582a44dcde3a6a36bea5a5bf (diff)
SL-9929
Replace WL atmospherics sun color calcs, fix water specular sunlight contribution to use them, and do not add moon contribution during daytime.
-rw-r--r--indra/newview/lldrawpoolwater.cpp22
-rw-r--r--indra/newview/lllegacyatmospherics.h2
-rw-r--r--indra/newview/llvosky.cpp154
-rw-r--r--indra/newview/llvosky.h3
4 files changed, 126 insertions, 55 deletions
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 9eb61a1a1f..d217f95cf3 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -496,7 +496,6 @@ void LLDrawPoolWater::shade()
LLColor3 light_diffuse(0,0,0);
F32 light_exp = 0.0f;
LLVector3 light_dir;
- LLColor3 light_color;
LLEnvironment& environment = LLEnvironment::instance();
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
@@ -510,24 +509,17 @@ void LLDrawPoolWater::shade()
if (sun_up)
{
- light_color = light_color + psky->getSunAmbient();
- light_diffuse += psky->getSunDiffuse();
+ light_diffuse += voskyp->getSun().getColorCached();
+ }
+ // moonlight is several orders of magnitude less bright than sunlight,
+ // so only use this color when the moon alone is showing
+ else if (moon_up)
+ {
+ light_diffuse += psky->getMoonDiffuse();
}
light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0.f);
- if (moon_up)
- {
- LLColor3 moon_diffuse_color = psky->getMoonDiffuse();
- light_color += moon_diffuse_color;
- light_diffuse += moon_diffuse_color * 0.5f;
-
- if (!sun_up)
- {
- light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0.f);
- }
- }
-
light_diffuse.normalize();
light_diffuse *= (light_exp + 0.25f);
diff --git a/indra/newview/lllegacyatmospherics.h b/indra/newview/lllegacyatmospherics.h
index 76b1a0f313..f2900b4323 100644
--- a/indra/newview/lllegacyatmospherics.h
+++ b/indra/newview/lllegacyatmospherics.h
@@ -193,6 +193,7 @@ public:
, haze_horizon(0.0f)
, density_multiplier(0.0f)
, max_y(0.0f)
+ , gamma(1.0f)
, sun_norm(0.0f, 1.0f, 0.0f, 1.0f)
, sunlight()
, ambient()
@@ -220,6 +221,7 @@ public:
F32 density_multiplier;
F32 distance_multiplier;
F32 max_y;
+ F32 gamma;
LLVector4 sun_norm;
LLColor3 sunlight;
LLColor3 ambient;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 7564a5003b..93a38988fa 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -450,26 +450,25 @@ void LLVOSky::init()
updateDirections();
- AtmosphericsVars vars;
-
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
// invariants across whole sky tex process...
- vars.blue_density = psky->getBlueDensity();
- vars.blue_horizon = psky->getBlueHorizon();
- vars.haze_density = psky->getHazeDensity();
- vars.haze_horizon = psky->getHazeHorizon();
- vars.density_multiplier = psky->getDensityMultiplier();
- vars.max_y = psky->getMaxY();
- vars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
- vars.sunlight = psky->getSunlightColor();
- vars.ambient = psky->getAmbientColor();
- vars.glow = psky->getGlow();
- vars.cloud_shadow = psky->getCloudShadow();
- vars.dome_radius = psky->getDomeRadius();
- vars.dome_offset = psky->getDomeOffset();
- vars.light_atten = psky->getLightAttenuation(vars.max_y);
- vars.light_transmittance = psky->getLightTransmittance();
+ m_atmosphericsVars.blue_density = psky->getBlueDensity();
+ m_atmosphericsVars.blue_horizon = psky->getBlueHorizon();
+ m_atmosphericsVars.haze_density = psky->getHazeDensity();
+ m_atmosphericsVars.haze_horizon = psky->getHazeHorizon();
+ m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
+ m_atmosphericsVars.max_y = psky->getMaxY();
+ m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+ m_atmosphericsVars.sunlight = psky->getSunlightColor();
+ m_atmosphericsVars.ambient = psky->getAmbientColor();
+ m_atmosphericsVars.glow = psky->getGlow();
+ m_atmosphericsVars.cloud_shadow = psky->getCloudShadow();
+ m_atmosphericsVars.dome_radius = psky->getDomeRadius();
+ m_atmosphericsVars.dome_offset = psky->getDomeOffset();
+ m_atmosphericsVars.light_atten = psky->getLightAttenuation(m_atmosphericsVars.max_y);
+ m_atmosphericsVars.light_transmittance = psky->getLightTransmittance();
+ m_atmosphericsVars.gamma = psky->getGamma();
// Initialize the cached normalized direction vectors
for (S32 side = 0; side < 6; ++side)
@@ -477,7 +476,7 @@ void LLVOSky::init()
for (S32 tile = 0; tile < NUM_TILES; ++tile)
{
initSkyTextureDirs(side, tile);
- createSkyTexture(vars, side, tile, false);
+ createSkyTexture(m_atmosphericsVars, side, tile, false);
}
}
@@ -497,6 +496,100 @@ void LLVOSky::init()
mHaloMap = LLViewerTextureManager::getFetchedTexture(psky->getHaloTextureId(), FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
}
+
+void LLVOSky::calc()
+{
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+
+ // invariants across whole sky tex process...
+ m_atmosphericsVars.blue_density = psky->getBlueDensity();
+ m_atmosphericsVars.blue_horizon = psky->getBlueHorizon();
+ m_atmosphericsVars.haze_density = psky->getHazeDensity();
+ m_atmosphericsVars.haze_horizon = psky->getHazeHorizon();
+ m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
+ m_atmosphericsVars.max_y = psky->getMaxY();
+ m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+ m_atmosphericsVars.sunlight = psky->getSunlightColor();
+ m_atmosphericsVars.ambient = psky->getAmbientColor();
+ m_atmosphericsVars.glow = psky->getGlow();
+ m_atmosphericsVars.cloud_shadow = psky->getCloudShadow();
+ m_atmosphericsVars.dome_radius = psky->getDomeRadius();
+ m_atmosphericsVars.dome_offset = psky->getDomeOffset();
+ m_atmosphericsVars.light_atten = psky->getLightAttenuation(m_atmosphericsVars.max_y);
+ m_atmosphericsVars.light_transmittance = psky->getLightTransmittance();
+ m_atmosphericsVars.gamma = psky->getGamma();
+
+ LLColor3 vary_HazeColor;
+ LLColor3 vary_SunlightColor;
+ LLColor3 vary_AmbientColor;
+ {
+ // Initialize temp variables
+ LLColor3 sunlight = m_atmosphericsVars.sunlight;
+
+ // Sunlight attenuation effect (hue and brightness) due to atmosphere
+ // this is used later for sunlight modulation at various altitudes
+ LLColor3 light_atten =
+ (m_atmosphericsVars.blue_density * 1.0 + smear(m_atmosphericsVars.haze_density * 0.25f)) * (m_atmosphericsVars.density_multiplier * m_atmosphericsVars.max_y);
+
+ // Calculate relative weights
+ LLColor3 temp2(0.f, 0.f, 0.f);
+ LLColor3 temp1 = m_atmosphericsVars.blue_density + smear(m_atmosphericsVars.haze_density);
+ LLColor3 blue_weight = componentDiv(m_atmosphericsVars.blue_density, temp1);
+ LLColor3 haze_weight = componentDiv(smear(m_atmosphericsVars.haze_density), temp1);
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ /// USE only lightnorm.
+ // temp2[1] = llmax(0.f, llmax(0.f, Pn[1]) * 1.0f + lightnorm[1] );
+ F32 lighty = getSun().getDirection().mV[2];
+ temp2.mV[1] = llmax(0.f, lighty);
+ if(temp2.mV[1] > 0.f)
+ {
+ temp2.mV[1] = 1.f / temp2.mV[1];
+ }
+ componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+
+ // Distance
+ temp2.mV[2] = m_atmosphericsVars.density_multiplier;
+
+ // Transparency (-> temp1)
+ temp1 = componentExp((temp1 * -1.f) * temp2.mV[2]);
+
+ // vary_AtmosAttenuation = temp1;
+
+ //increase ambient when there are more clouds
+ LLColor3 tmpAmbient = m_atmosphericsVars.ambient + (smear(1.f) - m_atmosphericsVars.ambient) * m_atmosphericsVars.cloud_shadow * 0.5f;
+
+ //haze color
+ vary_HazeColor =
+ (m_atmosphericsVars.blue_horizon * blue_weight * (sunlight * (1.f - m_atmosphericsVars.cloud_shadow) + tmpAmbient)
+ + componentMult(m_atmosphericsVars.haze_horizon * haze_weight, sunlight * (1.f - m_atmosphericsVars.cloud_shadow) * temp2.mV[0] + tmpAmbient)
+ );
+
+ //brightness of surface both sunlight and ambient
+ vary_SunlightColor = componentMult(sunlight, temp1) * 1.f;
+ vary_SunlightColor.clamp();
+ vary_SunlightColor = smear(1.0f) - vary_SunlightColor;
+ vary_SunlightColor = componentPow(vary_SunlightColor, m_atmosphericsVars.gamma);
+ vary_SunlightColor = smear(1.0f) - vary_SunlightColor;
+ vary_AmbientColor = componentMult(tmpAmbient, temp1) * 0.5;
+ vary_AmbientColor.clamp();
+ vary_AmbientColor = smear(1.0f) - vary_AmbientColor;
+ vary_AmbientColor = componentPow(vary_AmbientColor, m_atmosphericsVars.gamma);
+ vary_AmbientColor = smear(1.0f) - vary_AmbientColor;
+
+ componentMultBy(vary_HazeColor, LLColor3(1.f, 1.f, 1.f) - temp1);
+
+ }
+
+ mSun.setColor(vary_SunlightColor);
+ mMoon.setColor(LLColor3(1.0f, 1.0f, 1.0f));
+
+ mSun.renewDirection();
+ mSun.renewColor();
+ mMoon.renewDirection();
+ mMoon.renewColor();
+}
+
void LLVOSky::initCubeMap()
{
std::vector<LLPointer<LLImageRaw> > images;
@@ -711,6 +804,8 @@ bool LLVOSky::updateSky()
bool is_alm_wl_sky = gPipeline.canUseWindLightShaders();
+ calc();
+
if (mForceUpdate && mForceUpdateThrottle.hasExpired())
{
LL_RECORD_BLOCK_TIME(FTM_VOSKY_UPDATEFORCED);
@@ -729,32 +824,11 @@ bool LLVOSky::updateSky()
{
updateFog(LLViewerCamera::getInstance()->getFar());
- AtmosphericsVars vars;
-
- LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
-
- // invariants across whole sky tex process...
- vars.blue_density = psky->getBlueDensity();
- vars.blue_horizon = psky->getBlueHorizon();
- vars.haze_density = psky->getHazeDensity();
- vars.haze_horizon = psky->getHazeHorizon();
- vars.density_multiplier = psky->getDensityMultiplier();
- vars.max_y = psky->getMaxY();
- vars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
- vars.sunlight = psky->getSunlightColor();
- vars.ambient = psky->getAmbientColor();
- vars.glow = psky->getGlow();
- vars.cloud_shadow = psky->getCloudShadow();
- vars.dome_radius = psky->getDomeRadius();
- vars.dome_offset = psky->getDomeOffset();
- vars.light_atten = psky->getLightAttenuation(vars.max_y);
- vars.light_transmittance = psky->getLightTransmittance();
-
for (int side = 0; side < 6; side++)
{
for (int tile = 0; tile < NUM_TILES; tile++)
{
- createSkyTexture(vars, side, tile, is_alm_wl_sky);
+ createSkyTexture(m_atmosphericsVars, side, tile, is_alm_wl_sky);
}
}
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 660db1e518..20d0135c21 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -217,6 +217,8 @@ public:
void cleanupGL();
void restoreGL();
+ void calc();
+
/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);
bool updateSky();
@@ -346,6 +348,7 @@ protected:
LLTimer mForceUpdateThrottle;
bool mHeavenlyBodyUpdated ;
+ AtmosphericsVars m_atmosphericsVars;
LLAtmospherics m_legacyAtmospherics;
};