diff options
| -rw-r--r-- | indra/llinventory/llsettingssky.cpp | 149 | ||||
| -rw-r--r-- | indra/llinventory/llsettingssky.h | 3 | ||||
| -rw-r--r-- | indra/newview/lllegacyatmospherics.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/lllegacyatmospherics.h | 1 | ||||
| -rw-r--r-- | indra/newview/llvosky.cpp | 71 | ||||
| -rw-r--r-- | indra/newview/llvosky.h | 14 | 
6 files changed, 105 insertions, 139 deletions
| diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index 972579b485..22f048bd0d 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -752,101 +752,88 @@ void LLSettingsSky::calculateHeavnlyBodyPositions()      }  } -void LLSettingsSky::calculateLightSettings() +// 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; +} -// LEGACY_ATMOSPHERICS -    LLColor3 vary_HazeColor; -    LLColor3 vary_SunlightColor; -    LLColor3 vary_AmbientColor; -    { -        // 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; +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; +} -        //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) -            );	 +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; +} -        //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; +void LLSettingsSky::calculateLightSettings() +{ +// LEGACY_ATMOSPHERICS +    // 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] ); -        componentMultBy(vary_HazeColor, LLColor3(1.f, 1.f, 1.f) - temp1); +    // and vary_sunlight will work properly with moon light +    F32 lighty = lightnorm[1]; +    if (lighty < NIGHTTIME_ELEVATION_COS) +    { +        lighty = -lighty; +    } +    lighty = llmax(0.f, lighty); +    if(lighty > 0.f) +    { +        lighty = 1.f / lighty;      } +    componentMultBy(sunlight, componentExp((light_atten * -1.f) * lighty)); + +    //increase ambient when there are more clouds +    LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow * 0.5f; -    mSunDiffuse = vary_SunlightColor; -    mSunAmbient = vary_AmbientColor; -    mMoonDiffuse = vary_SunlightColor; -    mMoonAmbient = vary_AmbientColor; +    //brightness of surface both sunlight and ambient +    mSunDiffuse = gammaCorrect(componentMult(sunlight, light_transmittance));        +    mSunAmbient = gammaCorrect(componentMult(tmpAmbient, light_transmittance) * 0.5); -    mTotalAmbient = LLColor4(vary_AmbientColor, 1.0f); +    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  { diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h index d08e2bbd03..ceb941bf7c 100644 --- a/indra/llinventory/llsettingssky.h +++ b/indra/llinventory/llsettingssky.h @@ -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; diff --git a/indra/newview/lllegacyatmospherics.cpp b/indra/newview/lllegacyatmospherics.cpp index a589ef0a68..622f75a88b 100644 --- a/indra/newview/lllegacyatmospherics.cpp +++ b/indra/newview/lllegacyatmospherics.cpp @@ -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)) diff --git a/indra/newview/lllegacyatmospherics.h b/indra/newview/lllegacyatmospherics.h index 2f0c094c10..71469a622a 100644 --- a/indra/newview/lllegacyatmospherics.h +++ b/indra/newview/lllegacyatmospherics.h @@ -213,7 +213,6 @@ public:      ~LLAtmospherics();      void init(); -    void calc();      void updateFog(const F32 distance, LLVector3& tosun);      const LLHaze& getHaze() const                    { return mHaze; } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 950378c567..d295efaa66 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -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;	 -					} -				} -			} -			/// *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)); +                        // 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(); +			            } +					}  				} -				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;  	} diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index e4d99a5e8b..f8a6827a2b 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -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; | 
