diff options
| -rw-r--r-- | indra/newview/llvosky.cpp | 73 | ||||
| -rw-r--r-- | indra/newview/llvosky.h | 9 | 
2 files changed, 25 insertions, 57 deletions
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index ae63a9921c..28ad3d0877 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -64,6 +64,7 @@ namespace      const S32 NUM_TILES_X = 8;      const S32 NUM_TILES_Y = 4;      const S32 NUM_TILES = NUM_TILES_X * NUM_TILES_Y; +    const S32 NUM_CUBEMAP_FACES = 6;      // Heavenly body constants      const F32 SUN_DISK_RADIUS	= 0.5f; @@ -80,9 +81,11 @@ namespace      const F32 COLOR_CHANGE_THRESHOLD = 0.01f;      LLTrace::BlockTimerStatHandle FTM_VOSKY_UPDATETIMER("VOSky Update Timer Tick"); +    LLTrace::BlockTimerStatHandle FTM_VOSKY_CALC("VOSky Update Calculations"); +    LLTrace::BlockTimerStatHandle FTM_VOSKY_CREATETEXTURES("VOSky Update Textures");      LLTrace::BlockTimerStatHandle FTM_VOSKY_UPDATEFORCED("VOSky Update Forced"); -    F32Seconds UPDATE_EXPRY(2.0f); +    F32Seconds UPDATE_EXPRY(0.25f);  }  /***************************************  		SkyTex @@ -429,7 +432,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)      mForceUpdateThrottle.setTimerExpirySec(UPDATE_EXPRY);      mForceUpdateThrottle.reset(); -	for (S32 i = 0; i < 6; i++) +	for (S32 i = 0; i < NUM_CUBEMAP_FACES; i++)  	{  		mSkyTex[i].init(false);  		mShinyTex[i].init(true); @@ -492,7 +495,7 @@ void LLVOSky::init()      m_atmosphericsVars.gamma = psky->getGamma();  	// Initialize the cached normalized direction vectors -	for (S32 side = 0; side < 6; ++side) +	for (S32 side = 0; side < NUM_CUBEMAP_FACES; ++side)  	{  		for (S32 tile = 0; tile < NUM_TILES; ++tile)  		{ @@ -502,7 +505,7 @@ void LLVOSky::init()  		}  	} -	for (S32 i = 0; i < 6; ++i) +	for (S32 i = 0; i < NUM_CUBEMAP_FACES; ++i)  	{  		mSkyTex[i].create(1.0f);  		mShinyTex[i].create(1.0f); @@ -554,7 +557,7 @@ void LLVOSky::calc()  void LLVOSky::initCubeMap()   {  	std::vector<LLPointer<LLImageRaw> > images; -	for (S32 side = 0; side < 6; side++) +	for (S32 side = 0; side < NUM_CUBEMAP_FACES; side++)  	{  		images.push_back(mShinyTex[side].getImageRaw());  	} @@ -576,7 +579,7 @@ void LLVOSky::initCubeMap()  void LLVOSky::cleanupGL()  {  	S32 i; -	for (i = 0; i < 6; i++) +	for (i = 0; i < NUM_CUBEMAP_FACES; i++)  	{  		mSkyTex[i].cleanupGL();  	} @@ -589,7 +592,7 @@ void LLVOSky::cleanupGL()  void LLVOSky::restoreGL()  {  	S32 i; -	for (i = 0; i < 6; i++) +	for (i = 0; i < NUM_CUBEMAP_FACES; i++)  	{  		mSkyTex[i].restoreGL();  	} @@ -672,19 +675,12 @@ void LLVOSky::updateDirections(void)  {      LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -    mLastSunLightingDirection  = mSun.getDirection(); -    mLastMoonLightingDirection = mMoon.getDirection(); -      mSun.setDirection(psky->getSunDirection());  	mMoon.setDirection(psky->getMoonDirection()); -      mSun.setRotation(psky->getSunRotation());  	mMoon.setRotation(psky->getMoonRotation()); -  	mSun.renewDirection(); -	mSun.renewColor();  	mMoon.renewDirection(); -	mMoon.renewColor();  }  void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time) @@ -702,8 +698,6 @@ bool LLVOSky::updateSky()  {          LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -    LLColor4 total_ambient = psky->getTotalAmbient(); -  	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY)))  	{  		return TRUE; @@ -720,8 +714,10 @@ bool LLVOSky::updateSky()  		return TRUE;  	} +    bool is_alm_wl_sky = gPipeline.canUseWindLightShaders(); +  	static S32 next_frame = 0; -	const S32 total_no_tiles = 6 * NUM_TILES; +	const S32 total_no_tiles = NUM_CUBEMAP_FACES * NUM_TILES;  	const S32 cycle_frame_no = total_no_tiles + 1;  	const S32 frame = next_frame; @@ -735,30 +731,7 @@ bool LLVOSky::updateSky()  	LLHeavenBody::setInterpVal( mInterpVal );  	updateDirections(); -    LLVector3 sun_dir = mSun.getDirection(); -	sun_dir.normalize(); -    LLVector3 moon_dir = mMoon.getDirection(); -	moon_dir.normalize(); - -	const F32 dot_sun  = sun_dir  * mLastSunLightingDirection; -    const F32 dot_moon = moon_dir * mLastMoonLightingDirection; - -	LLColor3 delta_color; -	delta_color.setVec(mLastTotalAmbient.mV[0] - total_ambient.mV[0], -						mLastTotalAmbient.mV[1] - total_ambient.mV[1], -                        mLastTotalAmbient.mV[2] - total_ambient.mV[2]); - -    bool sun_direction_changed  = (dot_sun < LIGHT_DIRECTION_THRESHOLD); -    bool moon_direction_changed = (dot_moon < LIGHT_DIRECTION_THRESHOLD); -    bool color_changed          = (delta_color.length() >= COLOR_CHANGE_THRESHOLD); - -    mNeedUpdate = mNeedUpdate || sun_direction_changed; -    mNeedUpdate = mNeedUpdate || moon_direction_changed; -    mNeedUpdate = mNeedUpdate || color_changed; -    mNeedUpdate = mNeedUpdate || !mInitialized; - -    bool is_alm_wl_sky = gPipeline.canUseWindLightShaders(); - +    // Note: must be before comparison of old/current env settings below to be an effective optimization      calc();      bool same_atmospherics = m_lastAtmosphericsVars == m_atmosphericsVars; @@ -773,14 +746,13 @@ bool LLVOSky::updateSky()          m_lastAtmosphericsVars = m_atmosphericsVars; -        mLastTotalAmbient = total_ambient;  		mInitialized = TRUE;  		if (mCubeMap)  		{  			updateFog(LLViewerCamera::getInstance()->getFar()); -			for (int side = 0; side < 6; side++)  +			for (int side = 0; side < NUM_CUBEMAP_FACES; side++)   			{  				for (int tile = 0; tile < NUM_TILES; tile++)   				{ @@ -792,7 +764,7 @@ bool LLVOSky::updateSky()          int tex = mSkyTex[0].getWhich(TRUE); -		for (int side = 0; side < 6; side++)  +		for (int side = 0; side < NUM_CUBEMAP_FACES; side++)   		{              LLImageRaw* raw1 = nullptr;              LLImageRaw* raw2 = nullptr; @@ -815,13 +787,13 @@ bool LLVOSky::updateSky()  		// update the sky texture          if (!is_alm_wl_sky)          { -			for (S32 i = 0; i < 6; ++i) +			for (S32 i = 0; i < NUM_CUBEMAP_FACES; ++i)  			{                  mSkyTex[i].create(1.0f);  			}          } -        for (S32 i = 0; i < 6; ++i) +        for (S32 i = 0; i < NUM_CUBEMAP_FACES; ++i)  		{  			mShinyTex[i].create(1.0f);  		} @@ -831,7 +803,7 @@ bool LLVOSky::updateSky()  		{  			std::vector<LLPointer<LLImageRaw> > images;  			images.reserve(6); -			for (S32 side = 0; side < 6; side++) +			for (S32 side = 0; side < NUM_CUBEMAP_FACES; side++)  			{  				images.push_back(mShinyTex[side].getImageRaw(TRUE));  			} @@ -895,7 +867,7 @@ LLDrawable *LLVOSky::createDrawable(LLPipeline *pipeline)  	poolp->setSkyTex(mSkyTex);  	mDrawable->setRenderType(LLPipeline::RENDER_TYPE_SKY); -	for (S32 i = 0; i < 6; ++i) +	for (S32 i = 0; i < NUM_CUBEMAP_FACES; ++i)  	{  		mFace[FACE_SIDE0 + i] = mDrawable->addFace(poolp, NULL);  	} @@ -1057,7 +1029,7 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)  	U16 index_offset;  	LLFace *face;	 -	for (S32 side = 0; side < 6; ++side) +	for (S32 side = 0; side < NUM_CUBEMAP_FACES; ++side)  	{  		face = mFace[FACE_SIDE0 + side];  @@ -1613,7 +1585,6 @@ void LLVOSky::setSunAndMoonDirectionsCFR(const LLVector3 &sun_dir_cfr, const LLV  	    mBumpSunDir = adjustedDir * sunDot + sun_dir_cfr * (1.0f - sunDot);  	    mBumpSunDir.normalize();      } -  	updateDirections();  } @@ -1636,13 +1607,11 @@ void LLVOSky::setSunDirectionCFR(const LLVector3 &sun_dir_cfr)  	    mBumpSunDir = adjustedDir * sunDot + sun_dir_cfr * (1.0f - sunDot);  	    mBumpSunDir.normalize();      } -  	updateDirections();  }  void LLVOSky::setMoonDirectionCFR(const LLVector3 &moon_dir_cfr)  {  	mMoon.setDirection(moon_dir_cfr); -  	updateDirections();  } diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 6c9d6dc8be..b1a01a9366 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -337,11 +337,10 @@ protected:  	F32					mWind;  	bool				mInitialized; -    bool				mNeedUpdate;				//flag to mark update being necessary (input has changed) -	bool				mForceUpdate;				//flag to force instantaneous update of cubemap -	LLVector3			mLastSunLightingDirection; -    LLVector3			mLastMoonLightingDirection; -	LLColor3			mLastTotalAmbient; +	bool				mForceUpdate;	 +    bool				mNeedUpdate;				// flag to force update of cubemap +	S32					mCubeMapUpdateStage;		// state of cubemap uodate: -1 idle; 0-5 per-face updates; 6 finalizing +  	F32					mAmbientScale;  	LLColor3			mNightColorShift;  	F32					mInterpVal;  | 
