summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llinventory/llsettingssky.cpp77
-rw-r--r--indra/llinventory/llsettingssky.h6
-rw-r--r--indra/newview/lldrawpoolsky.cpp4
-rw-r--r--indra/newview/lllegacyatmospherics.cpp166
-rw-r--r--indra/newview/lllegacyatmospherics.h5
-rw-r--r--indra/newview/llvosky.cpp110
-rw-r--r--indra/newview/llvosky.h2
7 files changed, 129 insertions, 241 deletions
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 5047f312f0..75b4415086 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -1184,24 +1184,34 @@ LLColor3 LLSettingsSky::getLightAttenuation(F32 distance) const
return light_atten;
}
-LLColor3 LLSettingsSky::getLightTransmittance() const
+LLColor3 LLSettingsSky::getLightTransmittance(F32 distance) const
{
LLColor3 total_density = getTotalDensity();
F32 density_multiplier = getDensityMultiplier();
// Transparency (-> density) from Beer's law
- LLColor3 transmittance = componentExp(total_density * -density_multiplier);
+ LLColor3 transmittance = componentExp(total_density * -(density_multiplier * distance));
return transmittance;
}
+// performs soft scale clip and gamma correction ala the shader implementation
+// scales colors down to 0 - 1 range preserving relative ratios
LLColor3 LLSettingsSky::gammaCorrect(const LLColor3& in) const
{
F32 gamma = getGamma();
+
LLColor3 v(in);
- v.clamp();
- v= smear(1.0f) - v;
- v = componentPow(v, gamma);
- v = smear(1.0f) - v;
- return v;
+ // scale down to 0 to 1 range preserving relative ratio (aka homegenize)
+ F32 max_color = llmax(llmax(in.mV[0], in.mV[1]), in.mV[2]);
+ if (max_color > 1.0f)
+ {
+ v *= 1.0f / max_color;
+ }
+
+ LLColor3 color = in * 2.0f;
+ color = smear(1.f) - componentSaturate(color); // clamping after mul seems wrong, but prevents negative colors...
+ componentPow(color, gamma);
+ color = smear(1.f) - color;
+ return color;
}
LLVector3 LLSettingsSky::getSunDirection() const
@@ -1240,6 +1250,12 @@ LLColor3 LLSettingsSky::getSunDiffuse() const
return mSunDiffuse;
}
+LLColor4 LLSettingsSky::getHazeColor() const
+{
+ update();
+ return mHazeColor;
+}
+
LLColor4 LLSettingsSky::getTotalAmbient() const
{
update();
@@ -1255,14 +1271,19 @@ LLColor3 LLSettingsSky::getMoonlightColor() const
return moonlight;
}
-void LLSettingsSky::clampColor(LLColor3& color) const
+void LLSettingsSky::clampColor(LLColor3& color, F32 gamma, F32 scale) const
{
F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]);
- if (max_color > 1.f)
+ if (max_color > scale)
{
- color *= 1.f/max_color;
+ color *= scale/max_color;
}
- color.clamp();
+ LLColor3 linear(color);
+ linear *= 1.0 / scale;
+ linear = smear(1.0f) - linear;
+ linear = componentPow(linear, gamma);
+ linear *= scale;
+ color = linear;
}
void LLSettingsSky::calculateLightSettings() const
@@ -1278,7 +1299,7 @@ void LLSettingsSky::calculateLightSettings() const
// this is used later for sunlight modulation at various altitudes
F32 max_y = getMaxY();
LLColor3 light_atten = getLightAttenuation(max_y);
- LLColor3 light_transmittance = getLightTransmittance();
+ LLColor3 light_transmittance = getLightTransmittance(max_y);
// and vary_sunlight will work properly with moon light
const F32 LIMIT = FLT_EPSILON * 8.0f;
@@ -1291,16 +1312,34 @@ void LLSettingsSky::calculateLightSettings() const
lighty = llmax(LIMIT, lighty);
componentMultBy(sunlight, componentExp((light_atten * -1.f) * lighty));
componentMultBy(sunlight, light_transmittance);
- clampColor(sunlight);
+
+ F32 max_color = llmax(sunlight.mV[0], sunlight.mV[1], sunlight.mV[2]);
+ if (max_color > 1.0f)
+ {
+ sunlight *= 1.0f/max_color;
+ }
//increase ambient when there are more clouds
LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow * 0.5;
componentMultBy(tmpAmbient, light_transmittance);
- clampColor(tmpAmbient);
+
+ //tmpAmbient = LLColor3::clamp(tmpAmbient, getGamma(), 1.0f);
+ max_color = llmax(tmpAmbient.mV[0], tmpAmbient.mV[1], tmpAmbient.mV[2]);
+ if (max_color > 1.0f)
+ {
+ tmpAmbient *= 1.0f/max_color;
+ }
//brightness of surface both sunlight and ambient
- mSunDiffuse = gammaCorrect(sunlight);
- mSunAmbient = gammaCorrect(tmpAmbient);
+ mSunDiffuse = sunlight;
+ mSunAmbient = tmpAmbient;
+ F32 haze_horizon = getHazeHorizon();
+
+ sunlight *= 1.0 - cloud_shadow;
+ sunlight += tmpAmbient;
+
+ mHazeColor = getBlueHorizon() * getBlueDensity() * sunlight;
+ mHazeColor += LLColor4(haze_horizon, haze_horizon, haze_horizon, haze_horizon) * getHazeDensity() * sunlight;
F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
@@ -1308,10 +1347,10 @@ void LLSettingsSky::calculateLightSettings() const
LLColor3 moonlight_b(0.66, 0.66, 1.2); // scotopic ambient value
componentMultBy(moonlight, componentExp((light_atten * -1.f) * lighty));
- clampColor(moonlight);
+ clampColor(moonlight, getGamma(), 1.0f);
- mMoonDiffuse = gammaCorrect(componentMult(moonlight, light_transmittance) * moon_brightness);
- mMoonAmbient = gammaCorrect(componentMult(moonlight_b, light_transmittance) * 0.0125f);
+ mMoonDiffuse = componentMult(moonlight, light_transmittance) * moon_brightness;
+ mMoonAmbient = componentMult(moonlight_b, light_transmittance) * 0.0125f;
mTotalAmbient = mSunAmbient;
}
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index d04209a1a1..e562fe38ff 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -251,7 +251,7 @@ public:
static LLSD translateLegacyHazeSettings(const LLSD& legacy);
LLColor3 getLightAttenuation(F32 distance) const;
- LLColor3 getLightTransmittance() const;
+ LLColor3 getLightTransmittance(F32 distance) const;
LLColor3 getTotalDensity() const;
LLColor3 gammaCorrect(const LLColor3& in) const;
@@ -290,6 +290,7 @@ public:
LLColor4 getSunAmbient() const;
LLColor3 getSunDiffuse() const;
LLColor4 getTotalAmbient() const;
+ LLColor4 getHazeColor() const;
virtual LLSettingsBase::ptr_t buildDerivedClone() const SETTINGS_OVERRIDE { return buildClone(); }
@@ -346,7 +347,7 @@ private:
void calculateHeavenlyBodyPositions() const;
void calculateLightSettings() const;
- void clampColor(LLColor3& color) const;
+ void clampColor(LLColor3& color, F32 gamma, const F32 scale = 1.0f) const;
mutable LLVector3 mSunDirection;
mutable LLVector3 mMoonDirection;
@@ -360,6 +361,7 @@ private:
mutable LLColor4 mSunAmbient;
mutable LLColor3 mSunDiffuse;
mutable LLColor4 mTotalAmbient;
+ mutable LLColor4 mHazeColor;
typedef std::map<std::string, S32> mapNameToUniformId_t;
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 516302676d..12614b5e2d 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -129,7 +129,9 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
llassert(mSkyTex);
mSkyTex[side].bindTexture(TRUE);
-
+
+ gGL.getTexUnit(0)->setTextureColorSpace(LLTexUnit::TCS_SRGB);
+
face.renderIndexed();
if (LLSkyTex::doInterpolate())
diff --git a/indra/newview/lllegacyatmospherics.cpp b/indra/newview/lllegacyatmospherics.cpp
index b6c46b9ff9..d56e6bd5d6 100644
--- a/indra/newview/lllegacyatmospherics.cpp
+++ b/indra/newview/lllegacyatmospherics.cpp
@@ -204,6 +204,8 @@ void LLAtmospherics::init()
LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVector3 &dir, bool isShiny)
{
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+
F32 saturation = 0.3f;
if (isShiny && dir.mV[VZ] < -0.02f)
@@ -240,17 +242,8 @@ LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVecto
calcSkyColorWLVert(Pn, vars);
-#if SL_11371
- if (dir.mV[VZ] < 0.4f)
- {
- LLColor4 col = LLColor4(llmax(mFogColor[0],0.2f), llmax(mFogColor[1],0.2f), llmax(mFogColor[2],0.22f),0.f);
- col *= dir * LLVector3(0,1,0);
- col += vars.hazeColor;
- return col;
- }
-#endif
-
- LLColor3 sky_color = calcSkyColorWLFrag(Pn, vars);
+ LLColor3 sky_color = psky->gammaCorrect(vars.hazeColor * 2.0f);
+
if (isShiny)
{
F32 brightness = sky_color.brightness();
@@ -261,17 +254,19 @@ LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVecto
return LLColor4(sky_color, 0.0f);
}
+const F32 NIGHTTIME_ELEVATION = -8.0f; // degrees
+const F32 NIGHTTIME_ELEVATION_SIN = (F32)sinf(NIGHTTIME_ELEVATION*DEG_TO_RAD);
+
void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
{
-// LEGACY_ATMOSPHERICS
- //LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
LLColor3 blue_density = vars.blue_density;
LLColor3 blue_horizon = vars.blue_horizon;
F32 haze_horizon = vars.haze_horizon;
F32 haze_density = vars.haze_density;
F32 density_multiplier = vars.density_multiplier;
- //F32 distance_multiplier = vars.distance_multiplier;
+ F32 distance_multiplier = vars.distance_multiplier;
F32 max_y = vars.max_y;
LLVector4 sun_norm = vars.sun_norm;
@@ -287,9 +282,6 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
Pn *= Plen;
- vars.horizontalProjection[0] = LLVector2(Pn[0], Pn[2]);
- vars.horizontalProjection[0] /= - 2.f * Plen;
-
// Set altitude
if (Pn[1] > 0.f)
{
@@ -313,26 +305,38 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
// Sunlight attenuation effect (hue and brightness) due to atmosphere
// this is used later for sunlight modulation at various altitudes
LLColor3 light_atten = vars.light_atten;
+ LLColor3 light_transmittance = psky->getLightTransmittance(Plen);
// Calculate relative weights
LLColor3 temp2(0.f, 0.f, 0.f);
- LLColor3 temp1 = vars.light_transmittance;
+ LLColor3 temp1 = vars.total_density;
LLColor3 blue_weight = componentDiv(blue_density, temp1);
LLColor3 haze_weight = componentDiv(smear(haze_density), temp1);
+ F32 lighty = sun_norm.mV[1];
+ if(lighty < NIGHTTIME_ELEVATION_SIN)
+ {
+ lighty = -lighty;
+ }
+
// Compute sunlight from P & lightnorm (for long rays like sky)
- temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, llmax(0.f, Pn[1]) * 1.0f + sun_norm[1] );
+ temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, llmax(0.f, lighty));
+
+ if (temp2.mV[1] > 0.0000001f)
+ {
+ temp2.mV[1] = 1.f / temp2.mV[1];
+ }
+ temp2.mV[1] = llmax(temp2.mV[1], 0.0000001f);
- temp2.mV[1] = 1.f / temp2.mV[1];
- componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+ componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+ componentMultBy(sunlight, light_transmittance);
- // Distance
+ // Distance
temp2.mV[2] = Plen * density_multiplier;
- // Transparency (-> temp1)
- temp1 = componentExp((temp1 * -1.f) * temp2.mV[2]);// * distance_multiplier);
-
+ // Transparency (-> temp1)
+ temp1 = componentExp((temp1 * -1.f) * temp2.mV[2] * distance_multiplier);
// Compute haze glow
temp2.mV[0] = Pn * LLVector3(sun_norm);
@@ -342,15 +346,8 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
temp2.mV[0] = llmax(temp2.mV[0], .001f);
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
- if (glow.mV[0] > 0) // don't pow(zero,negative value), glow from 0 to 2
- {
- // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
- temp2.mV[0] *= glow.mV[0];
- }
- else
- {
- temp2.mV[0] = F32_MIN;
- }
+ // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.mV[0] *= (glow.mV[0] > 0) ? glow.mV[0] : F32_MIN;
temp2.mV[0] = pow(temp2.mV[0], glow.mV[2]);
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
@@ -371,95 +368,16 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
// Haze color below cloud
vars.hazeColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient) + componentMult(haze_horizon * haze_weight, sunlight * temp2.mV[0] + tmpAmbient));
- // Final atmosphere additive
- componentMultBy(vars.hazeColor, LLColor3::white - temp1);
-
- sunlight = vars.sunlight;
- temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, sun_norm[1] * 2.f);
- temp2.mV[1] = 1.f / temp2.mV[1];
- componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+ LLColor3 final_atten = LLColor3::white - temp1;
+ final_atten.mV[0] = llmax(final_atten.mV[0], 0.0f);
+ final_atten.mV[1] = llmax(final_atten.mV[1], 0.0f);
+ final_atten.mV[2] = llmax(final_atten.mV[2], 0.0f);
- // Attenuate cloud color by atmosphere
- temp1 = componentSqrt(temp1); //less atmos opacity (more transparency) below clouds
+ // Final atmosphere additive
+ componentMultBy(vars.hazeColor, final_atten);
// At horizon, blend high altitude sky color towards the darker color below the clouds
- vars.hazeColor += componentMult(vars.hazeColorBelowCloud - vars.hazeColor, LLColor3::white - componentSqrt(temp1));
-
-#if SL_11371
- if (Pn[1] < 0.f)
- {
- // Eric's original:
- // LLColor3 dark_brown(0.143f, 0.129f, 0.114f);
- LLColor3 dark_brown(0.082f, 0.076f, 0.066f);
- LLColor3 brown(0.430f, 0.386f, 0.322f);
- LLColor3 sky_lighting = sunlight + ambient;
- F32 haze_brightness = vars.hazeColor.brightness();
-
- if (Pn[1] < -0.05f)
- {
- vars.hazeColor = colorMix(dark_brown, brown, -Pn[1] * 0.9f) * sky_lighting * haze_brightness;
- }
-
- if (Pn[1] > -0.1f)
- {
- vars.hazeColor = colorMix(LLColor3::white * haze_brightness, vars.hazeColor, fabs((Pn[1] + 0.05f) * -20.f));
- }
- }
-#endif
-
-}
-
-LLColor3 LLAtmospherics::calcSkyColorWLFrag(LLVector3 & Pn, AtmosphericsVars& vars)
-{
- LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
-
-
- LLColor3 res;
- LLColor3 color0 = vars.hazeColor;
-
- if (!gPipeline.canUseWindLightShaders())
- {
- res = psky->gammaCorrect(color0 * 2.0f);
- }
- else
- {
- res = color0;
- }
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- F32 gamma = psky->getGamma();
- LLColor3 color2 = 2.f * color0;
- LLColor3 color3 = LLColor3(1.f, 1.f, 1.f) - componentSaturate(color2);
- componentPow(color3, gamma);
- color3 = LLColor3(1.f, 1.f, 1.f) - color3;
-
- static enum {
- OUT_DEFAULT = 0,
- OUT_SKY_BLUE = 1,
- OUT_RED = 2,
- OUT_PN = 3,
- OUT_HAZE = 4,
- } debugOut = OUT_DEFAULT;
-
- switch(debugOut)
- {
- case OUT_DEFAULT:
- break;
- case OUT_SKY_BLUE:
- res = LLColor3(0.4f, 0.4f, 0.9f);
- break;
- case OUT_RED:
- res = LLColor3(1.f, 0.f, 0.f);
- break;
- case OUT_PN:
- res = LLColor3(Pn[0], Pn[1], Pn[2]);
- break;
- case OUT_HAZE:
- res = vars.hazeColor;
- break;
- }
-#endif // LL_RELEASE_FOR_DOWNLOAD
- return res;
+ vars.hazeColor += componentMult(vars.hazeColorBelowCloud - vars.hazeColor, final_atten);
}
void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
@@ -520,10 +438,10 @@ void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
vars.blue_horizon = psky->getBlueHorizon();
vars.haze_density = psky->getHazeDensity();
vars.haze_horizon = psky->getHazeHorizon();
- vars.density_multiplier = psky->getDensityMultiplier();
+ vars.density_multiplier = psky->getDensityMultiplier();
vars.distance_multiplier = psky->getDistanceMultiplier();
vars.max_y = psky->getMaxY();
- vars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+ vars.sun_norm = LLEnvironment::instance().getLightDirectionCFR();
vars.sunlight = psky->getSunlightColor();
vars.ambient = psky->getAmbientColor();
vars.glow = psky->getGlow();
@@ -531,7 +449,9 @@ void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
vars.dome_radius = psky->getDomeRadius();
vars.dome_offset = psky->getDomeOffset();
vars.light_atten = psky->getLightAttenuation(vars.max_y);
- vars.light_transmittance = psky->getLightTransmittance();
+ vars.light_transmittance = psky->getLightTransmittance(vars.max_y);
+ vars.total_density = psky->getTotalDensity();
+ vars.gamma = psky->getGamma();
res_color[0] = calcSkyColorInDir(vars, tosun);
res_color[1] = calcSkyColorInDir(vars, perp_tosun);
diff --git a/indra/newview/lllegacyatmospherics.h b/indra/newview/lllegacyatmospherics.h
index 22ed37f830..e304ac3043 100644
--- a/indra/newview/lllegacyatmospherics.h
+++ b/indra/newview/lllegacyatmospherics.h
@@ -204,8 +204,6 @@ public:
, light_atten()
, light_transmittance()
{
- horizontalProjection[0] = LLVector2(0,0);
- horizontalProjection[1] = LLVector2(0,0);
}
LLColor3 hazeColor;
@@ -213,7 +211,6 @@ public:
LLColor3 cloudColorSun;
LLColor3 cloudColorAmbient;
F32 cloudDensity;
- LLVector2 horizontalProjection[2];
LLColor3 blue_density;
LLColor3 blue_horizon;
F32 haze_density;
@@ -231,6 +228,7 @@ public:
F32 dome_offset;
LLColor3 light_atten;
LLColor3 light_transmittance;
+ LLColor3 total_density;
};
class LLAtmospherics
@@ -260,7 +258,6 @@ public:
protected:
void calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars);
- LLColor3 calcSkyColorWLFrag(LLVector3 & Pn, AtmosphericsVars& vars);
LLColor3 getHazeColor(LLSettingsSky::ptr_t psky, AtmosphericsVars& vars, F32 costheta, F32 cloud_shadow);
LLHaze mHaze;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 745278bf0c..3afc57d9ba 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -207,16 +207,7 @@ void LLSkyTex::create(const F32 brightness)
void LLSkyTex::createGLImage(S32 which)
{
-#if USE_SRGB_DECODE
- if (LLPipeline::RenderDeferred)
- {
- mTexture[which]->setExplicitFormat(GL_SRGB8_ALPHA8, GL_RGBA);
- }
- else
-#endif
- {
- mTexture[which]->setExplicitFormat(GL_RGBA8, GL_RGBA);
- }
+ mTexture[which]->setExplicitFormat(GL_SRGB8_ALPHA8, GL_RGBA);
mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLGLTexture::LOCAL);
mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP);
}
@@ -478,7 +469,7 @@ void LLVOSky::init()
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.sun_norm = LLEnvironment::instance().getClampedLightNorm();
m_atmosphericsVars.sunlight = psky->getSunlightColor();
m_atmosphericsVars.ambient = psky->getAmbientColor();
m_atmosphericsVars.glow = psky->getGlow();
@@ -486,7 +477,8 @@ void LLVOSky::init()
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.light_transmittance = psky->getLightTransmittance(m_atmosphericsVars.max_y);
+ m_atmosphericsVars.total_density = psky->getTotalDensity();
m_atmosphericsVars.gamma = psky->getGamma();
// Initialize the cached normalized direction vectors
@@ -496,7 +488,7 @@ void LLVOSky::init()
{
initSkyTextureDirs(side, tile);
createSkyTexture(m_atmosphericsVars, side, tile, mSkyTex);
- createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex);
+ createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex, true);
}
}
@@ -527,8 +519,9 @@ void LLVOSky::calc()
m_atmosphericsVars.haze_density = psky->getHazeDensity();
m_atmosphericsVars.haze_horizon = psky->getHazeHorizon();
m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
+ m_atmosphericsVars.distance_multiplier = psky->getDistanceMultiplier();
m_atmosphericsVars.max_y = psky->getMaxY();
- m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+ m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedLightNorm();
m_atmosphericsVars.sunlight = psky->getSunlightColor();
m_atmosphericsVars.ambient = psky->getAmbientColor();
m_atmosphericsVars.glow = psky->getGlow();
@@ -536,72 +529,10 @@ void LLVOSky::calc()
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.light_transmittance = psky->getLightTransmittance(m_atmosphericsVars.max_y);
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);
+ mSun.setColor(psky->getSunDiffuse());
mMoon.setColor(LLColor3(1.0f, 1.0f, 1.0f));
mSun.renewDirection();
@@ -617,17 +548,17 @@ void LLVOSky::initCubeMap()
{
images.push_back(mShinyTex[side].getImageRaw());
}
- if (mCubeMap)
+
+ if (!mCubeMap && gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
+ {
+ mCubeMap = new LLCubeMap(true);
+ }
+
+ if (mCubeMap)
{
mCubeMap->init(images);
}
- else if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
- {
- bool wantsRGB = LLPipeline::RenderDeferred;
- mCubeMap = new LLCubeMap(wantsRGB);
- mCubeMap->init(images);
- }
gGL.getTexUnit(0)->disable();
}
@@ -709,7 +640,7 @@ void LLVOSky::initSkyTextureDirs(const S32 side, const S32 tile)
}
}
-void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex)
+void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex, bool is_shiny)
{
S32 tile_x = tile % NUM_TILES_X;
S32 tile_y = tile / NUM_TILES_X;
@@ -722,7 +653,7 @@ void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32
{
for (x = tile_x_pos; x < (tile_x_pos + sTileResX); ++x)
{
- tex[side].setPixel(m_legacyAtmospherics.calcSkyColorInDir(vars, tex[side].getDir(x, y), true), x, y);
+ tex[side].setPixel(m_legacyAtmospherics.calcSkyColorInDir(vars, tex[side].getDir(x, y), is_shiny), x, y);
}
}
}
@@ -740,9 +671,6 @@ void LLVOSky::updateDirections(void)
mSun.setRotation(psky->getSunRotation());
mMoon.setRotation(psky->getMoonRotation());
- mSun.setColor(psky->getSunlightColor());
- mMoon.setColor(psky->getMoonDiffuse());
-
mSun.renewDirection();
mSun.renewColor();
mMoon.renewDirection();
@@ -834,7 +762,7 @@ bool LLVOSky::updateSky()
{
for (int tile = 0; tile < NUM_TILES; tile++)
{
- createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex);
+ createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex, true);
}
}
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index e118cc7200..3c7ce4004c 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -303,7 +303,7 @@ protected:
void updateDirections(void);
void initSkyTextureDirs(const S32 side, const S32 tile);
- void createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex);
+ void createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex, bool is_shiny = false);
LLPointer<LLViewerFetchedTexture> mSunTexturep[2];
LLPointer<LLViewerFetchedTexture> mMoonTexturep[2];