diff options
| author | Dave Parks <davep@lindenlab.com> | 2010-03-19 15:25:35 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2010-03-19 15:25:35 -0500 | 
| commit | b6a482e81093e08316a6e8a9156ff87e34d55637 (patch) | |
| tree | 13241ece0f43ca65706afce3444972a3cde3bd36 | |
| parent | bf5183720bae6fe4e7e867bb7705141049b0c91f (diff) | |
Replace RenderDeferredShadow/RenderDeferredSunShadow with RenderShadowDetail
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 26 | ||||
| -rw-r--r-- | indra/newview/llviewercontrol.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 237 | 
4 files changed, 122 insertions, 145 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f9de77fae8..9c1d710551 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6618,19 +6618,7 @@      <key>Value</key>      <integer>0</integer>    </map> - -  <key>RenderDeferredShadow</key> -  <map> -    <key>Comment</key> -    <string>Enable shadows in deferred renderer.</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>1</integer> -  </map> - +      <key>RenderDeferredGI</key>    <map>      <key>Comment</key> @@ -6643,18 +6631,6 @@      <integer>0</integer>    </map> -  <key>RenderDeferredSunShadow</key> -  <map> -    <key>Comment</key> -    <string>Generate shadows from the sun.</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>1</integer> -  </map> -    <key>RenderDeferredSun</key>    <map>      <key>Comment</key> diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 51a1ae901e..d071baf72c 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -551,7 +551,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));  	gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));  	gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); -	gSavedSettings.getControl("RenderDeferredShadow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +	gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));  	gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2)); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 86b1a8c910..5b7b464e91 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -378,7 +378,7 @@ void LLViewerShaderMgr::setShaders()  		if (LLPipeline::sRenderDeferred)  		{ -			if (gSavedSettings.getBOOL("RenderDeferredShadow")) +			if (gSavedSettings.getS32("RenderShadowDetail") > 0)  			{  				if (gSavedSettings.getBOOL("RenderDeferredGI"))  				{ //shadows + gi diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 8b9f33e88e..e378fb4d08 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6268,7 +6268,7 @@ void LLPipeline::renderDeferredLighting()  			glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);  		} -		if (gSavedSettings.getBOOL("RenderDeferredShadow")) +		if (gSavedSettings.getS32("RenderShadowDetail") > 0)  		{  			glPushMatrix();  			glLoadIdentity(); @@ -7905,30 +7905,11 @@ void LLPipeline::generateHighlight(LLCamera& camera)  void LLPipeline::generateSunShadow(LLCamera& camera)  { -	if (!sRenderDeferred || !gSavedSettings.getBOOL("RenderDeferredShadow")) +	if (!sRenderDeferred || gSavedSettings.getS32("RenderShadowDetail") <= 0)  	{  		return;  	} -	//temporary hack to disable shadows but keep local lights -	static BOOL clear = TRUE; -	BOOL gen_shadow = gSavedSettings.getBOOL("RenderDeferredSunShadow"); -	if (!gen_shadow) -	{ -		if (clear) -		{ -			clear = FALSE; -			for (U32 i = 0; i < 6; i++) -			{ -				mShadow[i].bindTarget(); -				mShadow[i].clear(); -				mShadow[i].flush(); -			} -		} -		return; -	} -	clear = TRUE; -  	F64 last_modelview[16];  	F64 last_projection[16];  	for (U32 i = 0; i < 16; i++) @@ -8444,135 +8425,155 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  		}  	} -	 - -	F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f); -	//update shadow targets -	for (U32 i = 0; i < 2; i++) -	{ //for each current shadow -		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i; +	//hack to disable projector shadows  +	static bool clear = true; +	bool gen_shadow = gSavedSettings.getS32("RenderShadowDetail") > 1; +	 +	if (gen_shadow) +	{ +		clear = true; +		F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f); -		if (mShadowSpotLight[i].notNull() &&  -			(mShadowSpotLight[i] == mTargetShadowSpotLight[0] || -			mShadowSpotLight[i] == mTargetShadowSpotLight[1])) -		{ //keep this spotlight -			mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f); -		} -		else -		{ //fade out this light -			mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f); -			 -			if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull()) -			{ //faded out, grab one of the pending spots (whichever one isn't already taken) -				if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2]) -				{ -					mShadowSpotLight[i] = mTargetShadowSpotLight[0]; -				} -				else -				{ -					mShadowSpotLight[i] = mTargetShadowSpotLight[1]; +		//update shadow targets +		for (U32 i = 0; i < 2; i++) +		{ //for each current shadow +			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i; + +			if (mShadowSpotLight[i].notNull() &&  +				(mShadowSpotLight[i] == mTargetShadowSpotLight[0] || +				mShadowSpotLight[i] == mTargetShadowSpotLight[1])) +			{ //keep this spotlight +				mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f); +			} +			else +			{ //fade out this light +				mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f); +				 +				if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull()) +				{ //faded out, grab one of the pending spots (whichever one isn't already taken) +					if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2]) +					{ +						mShadowSpotLight[i] = mTargetShadowSpotLight[0]; +					} +					else +					{ +						mShadowSpotLight[i] = mTargetShadowSpotLight[1]; +					}  				}  			}  		} -	} - -	for (S32 i = 0; i < 2; i++) -	{ -		glh_set_current_modelview(saved_view); -		glh_set_current_projection(saved_proj); - -		if (mShadowSpotLight[i].isNull()) +		 +		for (S32 i = 0; i < 2; i++)  		{ -			continue; -		} +			glh_set_current_modelview(saved_view); +			glh_set_current_projection(saved_proj); -		LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume(); +			if (mShadowSpotLight[i].isNull()) +			{ +				continue; +			} -		if (!volume) -		{ -			mShadowSpotLight[i] = NULL; -			continue; -		} +			LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume(); -		LLDrawable* drawable = mShadowSpotLight[i]; +			if (!volume) +			{ +				mShadowSpotLight[i] = NULL; +				continue; +			} -		LLVector3 params = volume->getSpotLightParams(); -		F32 fov = params.mV[0]; +			LLDrawable* drawable = mShadowSpotLight[i]; -		//get agent->light space matrix (modelview) -		LLVector3 center = drawable->getPositionAgent(); -		LLQuaternion quat = volume->getRenderRotation(); +			LLVector3 params = volume->getSpotLightParams(); +			F32 fov = params.mV[0]; -		//get near clip plane -		LLVector3 scale = volume->getScale(); -		LLVector3 at_axis(0,0,-scale.mV[2]*0.5f); -		at_axis *= quat; +			//get agent->light space matrix (modelview) +			LLVector3 center = drawable->getPositionAgent(); +			LLQuaternion quat = volume->getRenderRotation(); -		LLVector3 np = center+at_axis; -		at_axis.normVec(); +			//get near clip plane +			LLVector3 scale = volume->getScale(); +			LLVector3 at_axis(0,0,-scale.mV[2]*0.5f); +			at_axis *= quat; -		//get origin that has given fov for plane np, at_axis, and given scale -		F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f); +			LLVector3 np = center+at_axis; +			at_axis.normVec(); -		LLVector3 origin = np - at_axis*dist; +			//get origin that has given fov for plane np, at_axis, and given scale +			F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f); -		LLMatrix4 mat(quat, LLVector4(origin, 1.f)); +			LLVector3 origin = np - at_axis*dist; -		view[i+4] = glh::matrix4f((F32*) mat.mMatrix); +			LLMatrix4 mat(quat, LLVector4(origin, 1.f)); -		view[i+4] = view[i+4].inverse(); +			view[i+4] = glh::matrix4f((F32*) mat.mMatrix); -		//get perspective matrix -		F32 near_clip = dist+0.01f; -		F32 width = scale.mV[VX]; -		F32 height = scale.mV[VY]; -		F32 far_clip = dist+volume->getLightRadius()*1.5f; +			view[i+4] = view[i+4].inverse(); -		F32 fovy = fov * RAD_TO_DEG; -		F32 aspect = width/height; -		 -		proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip); +			//get perspective matrix +			F32 near_clip = dist+0.01f; +			F32 width = scale.mV[VX]; +			F32 height = scale.mV[VY]; +			F32 far_clip = dist+volume->getLightRadius()*1.5f; -		//translate and scale to from [-1, 1] to [0, 1] -		glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, -						0.f, 0.5f, 0.f, 0.5f, -						0.f, 0.f, 0.5f, 0.5f, -						0.f, 0.f, 0.f, 1.f); +			F32 fovy = fov * RAD_TO_DEG; +			F32 aspect = width/height; +			 +			proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip); -		glh_set_current_modelview(view[i+4]); -		glh_set_current_projection(proj[i+4]); +			//translate and scale to from [-1, 1] to [0, 1] +			glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, +							0.f, 0.5f, 0.f, 0.5f, +							0.f, 0.f, 0.5f, 0.5f, +							0.f, 0.f, 0.f, 1.f); -		mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view; -		 -		for (U32 j = 0; j < 16; j++) -		{ -			gGLLastModelView[j] = mShadowModelview[i+4].m[j]; -			gGLLastProjection[j] = mShadowProjection[i+4].m[j]; -		} +			glh_set_current_modelview(view[i+4]); +			glh_set_current_projection(proj[i+4]); -		mShadowModelview[i+4] = view[i+4]; -		mShadowProjection[i+4] = proj[i+4]; +			mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view; +			 +			for (U32 j = 0; j < 16; j++) +			{ +				gGLLastModelView[j] = mShadowModelview[i+4].m[j]; +				gGLLastProjection[j] = mShadowProjection[i+4].m[j]; +			} -		LLCamera shadow_cam = camera; -		shadow_cam.setFar(far_clip); -		shadow_cam.setOrigin(origin); +			mShadowModelview[i+4] = view[i+4]; +			mShadowProjection[i+4] = proj[i+4]; -		LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE); +			LLCamera shadow_cam = camera; +			shadow_cam.setFar(far_clip); +			shadow_cam.setOrigin(origin); -		stop_glerror(); +			LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE); + +			stop_glerror(); -		mShadow[i+4].bindTarget(); -		mShadow[i+4].getViewport(gGLViewport); +			mShadow[i+4].bindTarget(); +			mShadow[i+4].getViewport(gGLViewport); -		static LLCullResult result[2]; +			static LLCullResult result[2]; -		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4; +			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4; -		renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE); +			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE); -		mShadow[i+4].flush(); - 	} +			mShadow[i+4].flush(); + 		} +	} +	else +	{ +		if (clear) +		{ +			clear = false; +			for (U32 i = 4; i < 6; i++) +			{ +				mShadow[i].bindTarget(); +				mShadow[i].clear(); +				mShadow[i].flush(); +			} +		} +	}  	if (!gSavedSettings.getBOOL("CameraOffset"))  	{ | 
