diff options
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl | 12 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl | 22 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/materialF.glsl | 12 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl | 7 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl | 9 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl | 10 | ||||
| -rwxr-xr-x | indra/newview/featuretable.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.h | 9 | ||||
| -rwxr-xr-x | indra/newview/llviewershadermgr.cpp | 6 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 19 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.h | 4 | ||||
| -rwxr-xr-x | indra/newview/pipeline.cpp | 38 | 
13 files changed, 137 insertions, 18 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 84e83d4c8b..50b43f6a8d 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -60,10 +60,14 @@ VARYING vec3 vary_ambient;  VARYING vec3 vary_directional;  VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position; -VARYING vec4 vary_pointlight_col; +VARYING vec3 vary_pointlight_col;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_norm; +#ifdef USE_VERTEX_COLOR +VARYING vec4 vertex_color; +#endif +  uniform vec4 light_position[8];  uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];  @@ -212,7 +216,7 @@ void main()  	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f));  #ifdef USE_VERTEX_COLOR -	float vertex_color_alpha = vary_pointlight_col.a;	 +	float vertex_color_alpha = vertex_color.a;	  #else  	float vertex_color_alpha = 1.0;  #endif @@ -221,7 +225,7 @@ void main()  	vec3 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l) * 2.6; -	dlight = dlight * vary_directional.rgb * vary_pointlight_col.rgb; +	dlight = dlight * vary_directional.rgb * vary_pointlight_col;  #if HAS_SHADOW  	vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha); @@ -246,7 +250,7 @@ void main()  	LIGHT_LOOP(6)  	LIGHT_LOOP(7) -	color.rgb += diff.rgb * vary_pointlight_col.rgb * col.rgb; +	color.rgb += diff.rgb * vary_pointlight_col * col.rgb;  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 6ed2ad5192..247ee0a34f 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -69,8 +69,11 @@ VARYING vec3 vary_ambient;  VARYING vec3 vary_directional;  VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position; -VARYING vec4 vary_pointlight_col; +VARYING vec3 vary_pointlight_col; +#ifdef USE_VERTEX_COLOR +VARYING vec4 vertex_color; +#endif  VARYING vec2 vary_texcoord0; @@ -83,6 +86,8 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; +uniform vec3 sun_dir; +  vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = max(dot(n,l),0.0); @@ -183,21 +188,30 @@ void main() -	vary_pointlight_col.rgb = diff; -	vary_pointlight_col.a = diffuse_color.a; +	vary_pointlight_col = diff; +	  	col.rgb = vec3(0,0,0);  	// Add windlight lights  	col.rgb = atmosAmbient(col.rgb); +	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +	ambient *= 0.5; +	ambient *= ambient; +	ambient = (1.0-ambient); + +	col.rgb *= ambient; +  	vary_ambient = col.rgb*diff.rgb;  	vary_directional.rgb = atmosAffectDirectionalLight(1.0f);  	col.rgb = col.rgb*diff.rgb; - +#ifdef USE_VERTEX_COLOR +	vertex_color = col; +#endif  #ifdef HAS_SKIN  	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 599477ad9e..fc4b8b33f8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -579,6 +579,14 @@ void main()            final_da = max(final_da, 0.0f);  	col.rgb = atmosAmbient(col); +	 +	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +	ambient *= 0.5; +	ambient *= ambient; +	ambient = (1.0-ambient); + +	col.rgb *= ambient; +  	col.rgb = col.rgb + atmosAffectDirectionalLight(final_da * 2.6);  	col.rgb *= diffuse.rgb; @@ -625,13 +633,13 @@ void main()   #define LIGHT_LOOP(i) col.rgb = col.rgb + calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare); -		/*LIGHT_LOOP(1) +		LIGHT_LOOP(1)  		LIGHT_LOOP(2)  		LIGHT_LOOP(3)  		LIGHT_LOOP(4)  		LIGHT_LOOP(5)  		LIGHT_LOOP(6) -		LIGHT_LOOP(7)*/ +		LIGHT_LOOP(7)  	frag_color.rgb = col.rgb;  	glare = min(glare, 1.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index a1dff9188f..9197df2628 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -301,6 +301,13 @@ void main()  		calcAtmospherics(pos.xyz, 1.0);  		col = atmosAmbient(vec3(0)); +		float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +		ambient *= 0.5; +		ambient *= ambient; +		ambient = (1.0-ambient); + +		col.rgb *= ambient; +  		col += atmosAffectDirectionalLight(max(min(da, 1.0) * 2.6, diffuse.a));  		col *= diffuse.rgb; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 127c1709b8..13c6ffc607 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -83,6 +83,8 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; +uniform vec3 sun_dir; +  vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = max(dot(n,l),0.0); @@ -190,6 +192,13 @@ void main()  	// Add windlight lights  	col.rgb = atmosAmbient(col.rgb); +	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +	ambient *= 0.5; +	ambient *= ambient; +	ambient = (1.0-ambient); + +	col.rgb *= ambient; +  	vary_directional.rgb = atmosAffectDirectionalLight(1.0f);  	vary_ambient = col.rgb*dff; diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 10a598a85c..ee6aaddb00 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -296,7 +296,7 @@ void main()  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);  	vec4 diffuse = texture2DRect(diffuseRect, tc); - +	  	vec3 col;  	float bloom = 0.0; @@ -310,6 +310,14 @@ void main()  		calcAtmospherics(pos.xyz, ambocc);  		col = atmosAmbient(vec3(0)); + +		float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +		ambient *= 0.5; +		ambient *= ambient; +		ambient = (1.0-ambient); + +		col *= ambient; +  		col += atmosAffectDirectionalLight(max(min(da, scol) * 2.6, diffuse.a));  		col *= diffuse.rgb; diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index cd7825ba9f..4030324ecb 100755 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -441,7 +441,7 @@ list OpenGLPre15  RenderVBOEnable				1	0  list OpenGLPre30 -RenderDeferred				1	0 +RenderDeferred				0	0  RenderMaxTextureIndex		1	1  list Intel diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index 59e5d05736..edf8e83038 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -217,6 +217,7 @@ boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LL  	return connection;  } +#if USE_TE_SPECIFIC_REGISTRATION  boost::signals2::connection LLMaterialMgr::getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, LLMaterialMgr::get_callback_te_t::slot_type cb)  {  	boost::signals2::connection connection; @@ -261,6 +262,7 @@ boost::signals2::connection LLMaterialMgr::getTE(const LLUUID& region_id, const  	return connection;  } +#endif  bool LLMaterialMgr::isGetAllPending(const LLUUID& region_id) const  { @@ -346,6 +348,7 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL  		mGetCallbacks.erase(itCallback);  	} +#if USE_TE_SPECIFIC_REGISTRATION  	TEMaterialPair te_mat_pair;  	te_mat_pair.materialID = material_id; @@ -361,6 +364,7 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL  			mGetTECallbacks.erase(itCallbackTE);  		}  	} +#endif  	return itMaterial->second;  } @@ -779,3 +783,4 @@ void LLMaterialMgr::onRegionRemoved(LLViewerRegion* regionp)  	clearGetQueues(regionp->getRegionID());  	// Put doesn't need clearing: objects that can't be found will clean up in processPutQueue()  } + diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index b5ba8ab680..9b3d7a0246 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -44,11 +44,13 @@ public:  	typedef std::map<LLMaterialID, LLMaterialPtr> material_map_t;  	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr)> get_callback_t; -	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr, U32 te)> get_callback_te_t; -  	const LLMaterialPtr         get(const LLUUID& region_id, const LLMaterialID& material_id);  	boost::signals2::connection get(const LLUUID& region_id, const LLMaterialID& material_id, get_callback_t::slot_type cb); + +#if USE_TE_SPECIFIC_REGISTRATION +	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr, U32 te)> get_callback_te_t;  	boost::signals2::connection getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, get_callback_te_t::slot_type cb); +#endif  	typedef boost::signals2::signal<void (const LLUUID&, const material_map_t&)> getall_callback_t;  	void                        getAll(const LLUUID& region_id); @@ -82,6 +84,7 @@ protected:  	typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t;  	get_callback_map_t mGetCallbacks; +#if USE_TE_SPECIFIC_REGISTRATION  	// struct for TE-specific material ID query  	struct TEMaterialPair  	{ @@ -101,6 +104,7 @@ protected:  	typedef std::map<TEMaterialPair, get_callback_te_t*> get_callback_te_map_t;  	get_callback_te_map_t mGetTECallbacks; +#endif  	typedef std::set<LLUUID> getall_queue_t;  	getall_queue_t        mGetAllQueue; @@ -118,3 +122,4 @@ protected:  };  #endif // LL_LLMATERIALMGR_H + diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 022ddb69ce..14d98d9a5a 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -466,6 +466,12 @@ void LLViewerShaderMgr::setShaders()  		S32 deferred_class = 0;  		S32 transform_class = gGLManager.mHasTransformFeedback ? 1 : 0; +		static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); +		if (!use_transform_feedback) +		{ +			transform_class = 0; +		} +		  		if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&  		    gSavedSettings.getBOOL("RenderDeferred") &&  			gSavedSettings.getBOOL("RenderAvatarVP") && diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c3c6747e99..d8f1896654 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1973,7 +1973,7 @@ S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow)  	return  res;  } -void LLVOVolume::setTEMaterialParamsCallback(const LLMaterialID &pMaterialID, const LLMaterialPtr pMaterialParams, U32 te) +void LLVOVolume::setTEMaterialParamsCallbackTE(const LLMaterialID &pMaterialID, const LLMaterialPtr pMaterialParams, U32 te)  {  	LL_DEBUGS("MaterialTEs") << "materialid " << pMaterialID.asString() << " to TE " << te << LL_ENDL;  	if (te >= getNumTEs()) @@ -1986,6 +1986,18 @@ void LLVOVolume::setTEMaterialParamsCallback(const LLMaterialID &pMaterialID, co  	}  } +void LLVOVolume::setTEMaterialParamsCallback(const LLMaterialID &pMaterialID, const LLMaterialPtr pMaterialParams) +{ +	LL_DEBUGS("MaterialTEs") << "materialid " << pMaterialID.asString() << LL_ENDL; +	for (U8 i = 0; i < getNumTEs(); i++) +	{ +		if (getTE(i) && (getTE(i)->getMaterialID().isNull() || (getTE(i)->getMaterialID() == pMaterialID))) +		{ +			setTEMaterialParams(i, pMaterialParams); +		} +	} +} +  S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  {  	S32 res = LLViewerObject::setTEMaterialID(te, pMaterialID); @@ -1996,7 +2008,11 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  	LL_DEBUGS("MaterialTEs") << " " << pMaterialID.asString() << LL_ENDL;  	if (res)  	{ +#if USE_TE_SPECIFIC_REGISTRATION  		LLMaterialMgr::instance().getTE(getRegion()->getRegionID(), pMaterialID, te, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2, _3));			 +#else +		LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2)); +#endif  		setChanged(TEXTURE);  		if (!mDrawable.isNull())  		{ @@ -5553,4 +5569,3 @@ void LLHUDPartition::shift(const LLVector4a &offset)  	//HUD objects don't shift with region crossing.  That would be silly.  } - diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index a5f933c319..52539ab8d5 100755 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -187,7 +187,8 @@ public:  	/*virtual*/ S32		setTEMediaFlags(const U8 te, const U8 media_flags);  	/*virtual*/ S32		setTEGlow(const U8 te, const F32 glow);  	/*virtual*/ S32		setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); -				void	setTEMaterialParamsCallback(const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams, U32 te); +				void	setTEMaterialParamsCallback(const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams); +				void	setTEMaterialParamsCallbackTE(const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams, U32 te);  	/*virtual*/ S32		setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);  	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);  	/*virtual*/ S32		setTEScaleS(const U8 te, const F32 s); @@ -382,3 +383,4 @@ protected:  };  #endif // LL_LLVOVOLUME_H + diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index bcbd752550..19ff1e852d 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -5765,8 +5765,15 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)  		LLLightState* light = gGL.getLight(1); -		mHWLightColors[1] = diffuse; +		if (LLPipeline::sRenderDeferred) +		{ +			diffuse.mV[0] = powf(diffuse.mV[0], 2.2f); +			diffuse.mV[1] = powf(diffuse.mV[1], 2.2f); +			diffuse.mV[2] = powf(diffuse.mV[2], 2.2f); +		} +		mHWLightColors[1] = diffuse; +				  		light->setDiffuse(diffuse);  		light->setAmbient(LLColor4::black);  		light->setSpecular(LLColor4::black); @@ -5805,6 +5812,13 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)  		}  		backlight_diffuse *= backlight_mag / max_component; +		if (LLPipeline::sRenderDeferred) +		{ +			backlight_diffuse.mV[0] = powf(backlight_diffuse.mV[0], 2.2f); +			backlight_diffuse.mV[1] = powf(backlight_diffuse.mV[1], 2.2f); +			backlight_diffuse.mV[2] = powf(backlight_diffuse.mV[2], 2.2f); +		} +  		mHWLightColors[1] = backlight_diffuse;  		LLLightState* light = gGL.getLight(1); @@ -6011,6 +6025,14 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  		LLVector4 light_pos(mSunDir, 0.0f);  		LLColor4 light_diffuse = mSunDiffuse; + +		if (LLPipeline::sRenderDeferred) +		{ +			light_diffuse.mV[0] = powf(light_diffuse.mV[0], 2.2f); +			light_diffuse.mV[1] = powf(light_diffuse.mV[1], 2.2f); +			light_diffuse.mV[2] = powf(light_diffuse.mV[2], 2.2f); +		} +  		mHWLightColors[0] = light_diffuse;  		LLLightState* light = gGL.getLight(0); @@ -6079,6 +6101,13 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			F32 x = (3.f * (1.f + light->getLightFalloff())); // why this magic?  probably trying to match a historic behavior.  			float linatten = x / (light_radius); // % of brightness at radius +			if (LLPipeline::sRenderDeferred) +			{ +				light_color.mV[0] = powf(light_color.mV[0], 2.2f); +				light_color.mV[1] = powf(light_color.mV[1], 2.2f); +				light_color.mV[2] = powf(light_color.mV[2], 2.2f); +			} +  			mHWLightColors[cur_light] = light_color;  			LLLightState* light_state = gGL.getLight(cur_light); @@ -6152,6 +6181,13 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			F32 x = 3.f;  		float linatten = x / (light_radius); // % of brightness at radius +		if (LLPipeline::sRenderDeferred) +		{ +			light_color.mV[0] = powf(light_color.mV[0], 2.2f); +			light_color.mV[1] = powf(light_color.mV[1], 2.2f); +			light_color.mV[2] = powf(light_color.mV[2], 2.2f); +		} +  		mHWLightColors[2] = light_color;  		LLLightState* light = gGL.getLight(2);  | 
