diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl | 24 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.h | 1 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 181 | 
5 files changed, 135 insertions, 88 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl new file mode 100644 index 0000000000..ab48d08bbb --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -0,0 +1,24 @@ +/**  + * @file postDeferredF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +#version 120 + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2DRect diffuseRect; +uniform sampler2D bloomMap; + +uniform vec2 screen_res; +varying vec2 vary_fragcoord; + +void main()  +{ +	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); +	 +	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); +	gl_FragColor = diff + bloom; +} diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 2cfd3b0a33..8b5a2ce781 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -107,10 +107,14 @@ S32 LLDrawPoolAlpha::getNumPostDeferredPasses()  	{ //skip depth buffer filling pass when rendering impostors  		return 1;  	} -	else +	else if (gSavedSettings.getBOOL("RenderDepthOfField"))  	{  		return 2;   	} +	else +	{ +		return 1; +	}  }  void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 25cf63a367..e81ee72c05 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -137,6 +137,7 @@ LLGLSLShader			gDeferredGIProgram;  LLGLSLShader			gDeferredGIFinalProgram;  LLGLSLShader			gDeferredPostGIProgram;  LLGLSLShader			gDeferredPostProgram; +LLGLSLShader			gDeferredPostNoDoFProgram;  LLGLSLShader			gLuminanceGatherProgram; @@ -1246,6 +1247,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		success = gDeferredPostProgram.createShader(NULL, NULL);  	} +	if (success) +	{ +		gDeferredPostNoDoFProgram.mName = "Deferred Post Shader"; +		gDeferredPostNoDoFProgram.mShaderFiles.clear(); +		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredPostNoDoFProgram.createShader(NULL, NULL); +	} +  	if (mVertexShaderLevel[SHADER_DEFERRED] > 1)  	{  		if (success) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f31d2d1836..72ac5e02ee 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -368,6 +368,7 @@ extern LLGLSLShader			gDeferredSoftenProgram;  extern LLGLSLShader			gDeferredShadowProgram;  extern LLGLSLShader			gDeferredPostGIProgram;  extern LLGLSLShader			gDeferredPostProgram; +extern LLGLSLShader			gDeferredPostNoDoFProgram;  extern LLGLSLShader			gDeferredAvatarShadowProgram;  extern LLGLSLShader			gDeferredAttachmentShadowProgram;  extern LLGLSLShader			gDeferredAlphaProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 21fbe52ccd..02c17f9e78 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6275,128 +6275,135 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater())  	{ +		bool dof_enabled = true; +  		LLGLSLShader* shader = &gDeferredPostProgram;  		if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)  		{  			shader = &gDeferredGIFinalProgram; +			dof_enabled = false; +		} +		else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) +		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult +			shader = &gDeferredPostNoDoFProgram; +			dof_enabled = false;  		} +		  		LLGLDisable blend(GL_BLEND);  		bindDeferredShader(*shader); -		//depth of field focal plane calculations +		if (dof_enabled) +		{ +			//depth of field focal plane calculations -		static F32 current_distance = 16.f; -		static F32 start_distance = 16.f; -		static F32 transition_time = 1.f; +			static F32 current_distance = 16.f; +			static F32 start_distance = 16.f; +			static F32 transition_time = 1.f; -		LLVector3 focus_point; +			LLVector3 focus_point; -		LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); -		if (obj && obj->mDrawable && obj->isSelected()) -		{ -			S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); -			if (obj && obj->mDrawable) +			LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); +			if (obj && obj->mDrawable && obj->isSelected())  			{ -				LLFace* face = obj->mDrawable->getFace(face_idx); -				if (face) +				S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); +				if (obj && obj->mDrawable)  				{ -					focus_point = face->getPositionAgent(); +					LLFace* face = obj->mDrawable->getFace(face_idx); +					if (face) +					{ +						focus_point = face->getPositionAgent(); +					}  				}  			} -		} -		if (focus_point.isExactlyZero()) -		{ -			if (LLViewerJoystick::getInstance()->getOverrideCamera()) +			if (focus_point.isExactlyZero())  			{ -				focus_point = gDebugRaycastIntersection; -			} -			else if (gAgentCamera.cameraMouselook()) -			{ -				gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, -											  NULL, -											  &focus_point); -			} -			else -			{ -				LLViewerObject* obj = gAgentCamera.getFocusObject(); -				if (obj) +				if (LLViewerJoystick::getInstance()->getOverrideCamera())  				{ -					focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); +					focus_point = gDebugRaycastIntersection; +				} +				else if (gAgentCamera.cameraMouselook()) +				{ +					gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, +												  NULL, +												  &focus_point);  				}  				else  				{ -					focus_point = gDebugRaycastIntersection; +					LLViewerObject* obj = gAgentCamera.getFocusObject(); +					if (obj) +					{ +						focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); +					} +					else +					{ +						focus_point = gDebugRaycastIntersection; +					}  				}  			} -		} -		LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); -		F32 target_distance = 16.f; -		if (!focus_point.isExactlyZero()) -		{ -			target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); -		} - -		if (transition_time >= 1.f && -			fabsf(current_distance-target_distance)/current_distance > 0.01f) -		{ //large shift happened, interpolate smoothly to new target distance -			transition_time = 0.f; -			start_distance = current_distance; -		} -		else if (transition_time < 1.f) -		{ //currently in a transition, continue interpolating -			transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; -			transition_time = llmin(transition_time, 1.f); +			LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); +			F32 target_distance = 16.f; +			if (!focus_point.isExactlyZero()) +			{ +				target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); +			} -			F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; -			current_distance = start_distance + (target_distance-start_distance)*t; -		} -		else -		{ //small or no change, just snap to target distance -			current_distance = target_distance; -		} +			if (transition_time >= 1.f && +				fabsf(current_distance-target_distance)/current_distance > 0.01f) +			{ //large shift happened, interpolate smoothly to new target distance +				transition_time = 0.f; +				start_distance = current_distance; +			} +			else if (transition_time < 1.f) +			{ //currently in a transition, continue interpolating +				transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; +				transition_time = llmin(transition_time, 1.f); -		//convert to mm -		F32 subject_distance = current_distance*1000.f; -		F32 fnumber = gSavedSettings.getF32("CameraFNumber"); -		F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); +				F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; +				current_distance = start_distance + (target_distance-start_distance)*t; +			} +			else +			{ //small or no change, just snap to target distance +				current_distance = target_distance; +			} -		if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) -		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult -			default_focal_length = 5.f; -		} +			//convert to mm +			F32 subject_distance = current_distance*1000.f; +			F32 fnumber = gSavedSettings.getF32("CameraFNumber"); +			F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); -		F32 fov = LLViewerCamera::getInstance()->getView(); +			F32 fov = LLViewerCamera::getInstance()->getView(); -		const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; -		//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); +			const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; +			//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); -		//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); +			//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); -		F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); -		//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); +			F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); +			//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); -		F32 focal_length = dv/(2*tanf(fov/2.f)); +			F32 focal_length = dv/(2*tanf(fov/2.f)); -		//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); +			//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); -		// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) -		// where	 N = fnumber -		//			 s2 = dot distance -		//			 s1 = subject distance -		//			 f = focal length -		//	 - -		F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); -		blur_constant /= 1000.f; //convert to meters for shader -		F32 magnification = focal_length/(subject_distance-focal_length); - -		shader->uniform1f("focal_distance", -subject_distance/1000.f); -		shader->uniform1f("blur_constant", blur_constant); -		shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); -		shader->uniform1f("magnification", magnification); +			// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) +			// where	 N = fnumber +			//			 s2 = dot distance +			//			 s1 = subject distance +			//			 f = focal length +			//	 + +			F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); +			blur_constant /= 1000.f; //convert to meters for shader +			F32 magnification = focal_length/(subject_distance-focal_length); + +			shader->uniform1f("focal_distance", -subject_distance/1000.f); +			shader->uniform1f("blur_constant", blur_constant); +			shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); +			shader->uniform1f("magnification", magnification); +		}  		S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);  		if (channel > -1) | 
