Isolate more legacy atmo param use in sky (convert to getLightAttenuation and getLightTransmittance).
Optimize sky texture creation.master
parent
0f33f0a6f3
commit
6d77503542
|
|
@ -752,101 +752,88 @@ void LLSettingsSky::calculateHeavnlyBodyPositions()
|
|||
}
|
||||
}
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
LLColor3 LLSettingsSky::getLightAttenuation(F32 distance) const
|
||||
{
|
||||
LLColor3 blue_density = getBlueDensity();
|
||||
F32 haze_density = getHazeDensity();
|
||||
F32 density_multiplier = getDensityMultiplier();
|
||||
LLColor3 density = (blue_density * 1.0 + smear(haze_density * 0.25f));
|
||||
LLColor3 light_atten = density * density_multiplier * distance;
|
||||
return light_atten;
|
||||
}
|
||||
|
||||
LLColor3 LLSettingsSky::getLightTransmittance() const
|
||||
{
|
||||
LLColor3 blue_density = getBlueDensity();
|
||||
F32 haze_density = getHazeDensity();
|
||||
F32 density_multiplier = getDensityMultiplier();
|
||||
LLColor3 temp1 = blue_density + smear(haze_density);
|
||||
// Transparency (-> temp1)
|
||||
temp1 = componentExp((temp1 * -1.f) * density_multiplier);
|
||||
return temp1;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void LLSettingsSky::calculateLightSettings()
|
||||
{
|
||||
|
||||
// LEGACY_ATMOSPHERICS
|
||||
LLColor3 vary_HazeColor;
|
||||
LLColor3 vary_SunlightColor;
|
||||
LLColor3 vary_AmbientColor;
|
||||
// Initialize temp variables
|
||||
LLColor3 sunlight = getSunlightColor();
|
||||
LLColor3 ambient = getAmbientColor();
|
||||
F32 cloud_shadow = getCloudShadow();
|
||||
LLVector3 lightnorm = getLightDirection();
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
F32 max_y = getMaxY();
|
||||
LLColor3 light_atten = getLightAttenuation(max_y);
|
||||
LLColor3 light_transmittance = getLightTransmittance();
|
||||
|
||||
// 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] );
|
||||
|
||||
// and vary_sunlight will work properly with moon light
|
||||
F32 lighty = lightnorm[1];
|
||||
if (lighty < NIGHTTIME_ELEVATION_COS)
|
||||
{
|
||||
// Initialize temp variables
|
||||
LLColor3 sunlight = getSunlightColor();
|
||||
LLColor3 ambient = getAmbientColor();
|
||||
F32 gamma = getGamma();
|
||||
LLColor3 blue_density = getBlueDensity();
|
||||
LLColor3 blue_horizon = getBlueHorizon();
|
||||
F32 haze_density = getHazeDensity();
|
||||
F32 haze_horizon = getHazeHorizon();
|
||||
|
||||
F32 density_multiplier = getDensityMultiplier();
|
||||
F32 max_y = getMaxY();
|
||||
F32 cloud_shadow = getCloudShadow();
|
||||
LLVector3 lightnorm = getLightDirection();
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
LLColor3 light_atten = (blue_density * 1.0 + smear(haze_density * 0.25f)) * (density_multiplier * max_y);
|
||||
|
||||
// Calculate relative weights
|
||||
LLColor3 temp2(0.f, 0.f, 0.f);
|
||||
LLColor3 temp1 = blue_density + smear(haze_density);
|
||||
LLColor3 blue_weight = componentDiv(blue_density, temp1);
|
||||
LLColor3 haze_weight = componentDiv(smear(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] );
|
||||
|
||||
// and vary_sunlight will work properly with moon light
|
||||
F32 lighty = lightnorm[1];
|
||||
if (lighty < NIGHTTIME_ELEVATION_COS)
|
||||
{
|
||||
lighty = -lighty;
|
||||
}
|
||||
|
||||
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] = density_multiplier;
|
||||
|
||||
// Transparency (-> temp1)
|
||||
temp1 = componentExp((temp1 * -1.f) * temp2.mV[2]);
|
||||
|
||||
// vary_AtmosAttenuation = temp1;
|
||||
|
||||
//increase ambient when there are more clouds
|
||||
LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow * 0.5f;
|
||||
|
||||
//haze color
|
||||
vary_HazeColor =
|
||||
(blue_horizon * blue_weight * (sunlight*(1.f - cloud_shadow) + tmpAmbient)
|
||||
+ componentMult(haze_horizon * haze_weight, sunlight*(1.f - 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, 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, gamma);
|
||||
vary_AmbientColor = smear(1.0f) - vary_AmbientColor;
|
||||
|
||||
componentMultBy(vary_HazeColor, LLColor3(1.f, 1.f, 1.f) - temp1);
|
||||
|
||||
lighty = -lighty;
|
||||
}
|
||||
|
||||
mSunDiffuse = vary_SunlightColor;
|
||||
mSunAmbient = vary_AmbientColor;
|
||||
mMoonDiffuse = vary_SunlightColor;
|
||||
mMoonAmbient = vary_AmbientColor;
|
||||
lighty = llmax(0.f, lighty);
|
||||
if(lighty > 0.f)
|
||||
{
|
||||
lighty = 1.f / lighty;
|
||||
}
|
||||
componentMultBy(sunlight, componentExp((light_atten * -1.f) * lighty));
|
||||
|
||||
mTotalAmbient = LLColor4(vary_AmbientColor, 1.0f);
|
||||
//increase ambient when there are more clouds
|
||||
LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow * 0.5f;
|
||||
|
||||
//brightness of surface both sunlight and ambient
|
||||
mSunDiffuse = gammaCorrect(componentMult(sunlight, light_transmittance));
|
||||
mSunAmbient = gammaCorrect(componentMult(tmpAmbient, light_transmittance) * 0.5);
|
||||
|
||||
mMoonDiffuse = gammaCorrect(componentMult(LLColor3::white, light_transmittance));
|
||||
mMoonAmbient = gammaCorrect(componentMult(LLColor3::white, light_transmittance) * 0.5f);
|
||||
mTotalAmbient = mSunAmbient;
|
||||
|
||||
mFadeColor = mTotalAmbient + (mSunDiffuse + mMoonDiffuse) * 0.5f;
|
||||
mFadeColor.setAlpha(0);
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================
|
||||
namespace
|
||||
{
|
||||
|
|
|
|||
|
|
@ -455,6 +455,9 @@ private:
|
|||
|
||||
void calculateHeavnlyBodyPositions();
|
||||
void calculateLightSettings();
|
||||
LLColor3 getLightAttenuation(F32 distance) const;
|
||||
LLColor3 getLightTransmittance() const;
|
||||
LLColor3 gammaCorrect(const LLColor3& in) const;
|
||||
|
||||
LLVector3 mSunDirection;
|
||||
LLVector3 mMoonDirection;
|
||||
|
|
|
|||
|
|
@ -200,7 +200,6 @@ void LLAtmospherics::init()
|
|||
{
|
||||
const F32 haze_int = color_intens(mHaze.calcSigSca(0));
|
||||
mHazeConcentration = haze_int / (color_intens(mHaze.calcAirSca(0)) + haze_int);
|
||||
calc();
|
||||
mInitialized = true;
|
||||
}
|
||||
|
||||
|
|
@ -445,11 +444,6 @@ LLColor3 LLAtmospherics::calcSkyColorWLFrag(LLVector3 & Pn, AtmosphericsVars& va
|
|||
return res;
|
||||
}
|
||||
|
||||
void LLAtmospherics::calc()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LLAtmospherics::updateFog(const F32 distance, LLVector3& tosun)
|
||||
{
|
||||
if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOG))
|
||||
|
|
|
|||
|
|
@ -213,7 +213,6 @@ public:
|
|||
~LLAtmospherics();
|
||||
|
||||
void init();
|
||||
void calc();
|
||||
void updateFog(const F32 distance, LLVector3& tosun);
|
||||
|
||||
const LLHaze& getHaze() const { return mHaze; }
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ LLVOSky::~LLVOSky()
|
|||
|
||||
void LLVOSky::init()
|
||||
{
|
||||
calcAtmospherics();
|
||||
updateDirections();
|
||||
|
||||
// Initialize the cached normalized direction vectors
|
||||
for (S32 side = 0; side < 6; ++side)
|
||||
|
|
@ -408,7 +408,7 @@ void LLVOSky::restoreGL()
|
|||
mBloomTexturep->setNoDelete() ;
|
||||
mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
||||
calcAtmospherics();
|
||||
updateDirections();
|
||||
|
||||
if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap
|
||||
&& LLCubeMap::sUseCubeMaps)
|
||||
|
|
@ -486,7 +486,7 @@ void LLVOSky::createSkyTexture(const S32 side, const S32 tile)
|
|||
}
|
||||
}
|
||||
|
||||
void LLVOSky::calcAtmospherics(void)
|
||||
void LLVOSky::updateDirections(void)
|
||||
{
|
||||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
|
||||
|
|
@ -508,8 +508,6 @@ void LLVOSky::calcAtmospherics(void)
|
|||
// between sunlight and point lights in windlight to normalize point lights.
|
||||
F32 sun_dynamic_range = llmax(gSavedSettings.getF32("RenderSunDynamicRange"), 0.0001f);
|
||||
LLEnvironment::instance().setSceneLightStrength(2.0f * (1.0f + sun_dynamic_range * dp));
|
||||
|
||||
m_legacyAtmospherics.calc();
|
||||
}
|
||||
|
||||
void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time)
|
||||
|
|
@ -541,7 +539,7 @@ BOOL LLVOSky::updateSky()
|
|||
const S32 total_no_tiles = 6 * NUM_TILES;
|
||||
const S32 cycle_frame_no = total_no_tiles + 1;
|
||||
|
||||
if (mUpdateTimer.getElapsedTimeF32() > 0.001f)
|
||||
if (mUpdateTimer.getElapsedTimeF32() > 0.025f)
|
||||
{
|
||||
mUpdateTimer.reset();
|
||||
const S32 frame = next_frame;
|
||||
|
|
@ -553,7 +551,7 @@ BOOL LLVOSky::updateSky()
|
|||
// sInterpVal = (F32)next_frame / cycle_frame_no;
|
||||
LLSkyTex::setInterpVal( mInterpVal );
|
||||
LLHeavenBody::setInterpVal( mInterpVal );
|
||||
calcAtmospherics();
|
||||
updateDirections();
|
||||
|
||||
if (mForceUpdate || total_no_tiles == frame)
|
||||
{
|
||||
|
|
@ -595,8 +593,6 @@ BOOL LLVOSky::updateSky()
|
|||
}
|
||||
}
|
||||
|
||||
calcAtmospherics();
|
||||
|
||||
for (int side = 0; side < 6; side++)
|
||||
{
|
||||
LLImageRaw* raw1 = mSkyTex[side].getImageRaw(TRUE);
|
||||
|
|
@ -610,45 +606,33 @@ BOOL LLVOSky::updateSky()
|
|||
mShinyTex[side].createGLImage(mShinyTex[side].getWhich(FALSE));
|
||||
}
|
||||
next_frame = 0;
|
||||
|
||||
// update the sky texture
|
||||
for (S32 i = 0; i < 6; ++i)
|
||||
{
|
||||
mSkyTex[i].create(1.0f);
|
||||
mShinyTex[i].create(1.0f);
|
||||
}
|
||||
|
||||
// update the environment map
|
||||
if (mCubeMap)
|
||||
{
|
||||
std::vector<LLPointer<LLImageRaw> > images;
|
||||
images.reserve(6);
|
||||
for (S32 side = 0; side < 6; side++)
|
||||
{
|
||||
images.push_back(mShinyTex[side].getImageRaw(TRUE));
|
||||
}
|
||||
mCubeMap->init(images);
|
||||
gGL.getTexUnit(0)->disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// *TODO really, sky texture and env map should be shared on a single texture
|
||||
/// I'll let Brad take this at some point
|
||||
|
||||
// update the sky texture
|
||||
for (S32 i = 0; i < 6; ++i)
|
||||
{
|
||||
mSkyTex[i].create(1.0f);
|
||||
mShinyTex[i].create(1.0f);
|
||||
}
|
||||
|
||||
// update the environment map
|
||||
if (mCubeMap)
|
||||
{
|
||||
std::vector<LLPointer<LLImageRaw> > images;
|
||||
images.reserve(6);
|
||||
for (S32 side = 0; side < 6; side++)
|
||||
{
|
||||
images.push_back(mShinyTex[side].getImageRaw(TRUE));
|
||||
}
|
||||
mCubeMap->init(images);
|
||||
gGL.getTexUnit(0)->disable();
|
||||
}
|
||||
|
||||
gPipeline.markRebuild(gSky.mVOGroundp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
|
||||
// *TODO: decide whether we need to update the stars vertex buffer in LLVOWLSky -Brad.
|
||||
//gPipeline.markRebuild(gSky.mVOWLSkyp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
|
||||
|
||||
mForceUpdate = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
const S32 side = frame / NUM_TILES;
|
||||
const S32 tile = frame % NUM_TILES;
|
||||
createSkyTexture(side, tile);
|
||||
}
|
||||
}
|
||||
|
||||
if (mDrawable.notNull() && mDrawable->getFace(0) && !mDrawable->getFace(0)->getVertexBuffer())
|
||||
|
|
@ -1405,7 +1389,7 @@ void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_an
|
|||
mMoon.renewDirection();
|
||||
mLastLightingDirection = mSun.getDirection();
|
||||
|
||||
calcAtmospherics();
|
||||
updateDirections();
|
||||
|
||||
if ( !mInitialized )
|
||||
{
|
||||
|
|
@ -1439,7 +1423,8 @@ void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &moon_di
|
|||
mSun.setDirection(sun_direction);
|
||||
|
||||
mMoon.setDirection(moon_dir);
|
||||
calcAtmospherics();
|
||||
updateDirections();
|
||||
|
||||
if (dp < 0.995f) { //the sun jumped a great deal, update immediately
|
||||
mForceUpdate = TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -230,13 +230,7 @@ class LLCubeMap;
|
|||
|
||||
class LLVOSky : public LLStaticViewerObject
|
||||
{
|
||||
|
||||
public:
|
||||
void calcAtmospherics(void);
|
||||
|
||||
void initSkyTextureDirs(const S32 side, const S32 tile);
|
||||
void createSkyTexture(const S32 side, const S32 tile);
|
||||
|
||||
public:
|
||||
enum
|
||||
{
|
||||
FACE_SIDE0,
|
||||
|
|
@ -249,7 +243,6 @@ public:
|
|||
FACE_MOON, // was 7
|
||||
FACE_BLOOM, // was 8
|
||||
FACE_REFLECTION, // was 10
|
||||
FACE_DUMMY, //for an ATI bug --bao
|
||||
FACE_COUNT
|
||||
};
|
||||
|
||||
|
|
@ -343,6 +336,11 @@ public:
|
|||
protected:
|
||||
~LLVOSky();
|
||||
|
||||
void updateDirections(void);
|
||||
|
||||
void initSkyTextureDirs(const S32 side, const S32 tile);
|
||||
void createSkyTexture(const S32 side, const S32 tile);
|
||||
|
||||
LLPointer<LLViewerFetchedTexture> mSunTexturep;
|
||||
LLPointer<LLViewerFetchedTexture> mMoonTexturep;
|
||||
LLPointer<LLViewerFetchedTexture> mBloomTexturep;
|
||||
|
|
|
|||
Loading…
Reference in New Issue