diff options
| -rw-r--r-- | indra/llprimitive/llmaterial.cpp | 11 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterial.h | 5 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl | 111 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl | 241 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llfloaterpreference.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llpanelface.cpp | 32 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 73 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml | 23 | 
15 files changed, 232 insertions, 301 deletions
| diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp index bd98aa040a..ce443dea1d 100644 --- a/indra/llprimitive/llmaterial.cpp +++ b/indra/llprimitive/llmaterial.cpp @@ -186,12 +186,19 @@ bool LLMaterial::operator != (const LLMaterial& rhs) const  } -U32 LLMaterial::getShaderMask() +U32 LLMaterial::getShaderMask(U32 alpha_mode)  { //NEVER incorporate this value into the message system -- this function will vary depending on viewer implementation  	U32 ret = 0;  	//two least significant bits are "diffuse alpha mode" -	ret = getDiffuseAlphaMode(); +	if (alpha_mode != DIFFUSE_ALPHA_MODE_DEFAULT) +	{ +		ret = alpha_mode; +	} +	else +	{ +		ret = getDiffuseAlphaMode(); +	}  	llassert(ret < SHADER_COUNT); diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index b294288c64..b265732adc 100644 --- a/indra/llprimitive/llmaterial.h +++ b/indra/llprimitive/llmaterial.h @@ -44,7 +44,8 @@ public:  		DIFFUSE_ALPHA_MODE_NONE = 0,  		DIFFUSE_ALPHA_MODE_BLEND = 1,  		DIFFUSE_ALPHA_MODE_MASK = 2, -		DIFFUSE_ALPHA_MODE_EMISSIVE = 3 +		DIFFUSE_ALPHA_MODE_EMISSIVE = 3, +		DIFFUSE_ALPHA_MODE_DEFAULT = 4,  	} eDiffuseAlphaMode;  	typedef enum @@ -100,7 +101,7 @@ public:  	bool		operator == (const LLMaterial& rhs) const;  	bool		operator != (const LLMaterial& rhs) const; -	U32			getShaderMask(); +	U32			getShaderMask(U32 alpha_mode = DIFFUSE_ALPHA_MODE_DEFAULT);  protected:  	LLUUID		mNormalID; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index e2fe4a1e9e..50b43f6a8d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -35,12 +35,24 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif +#if HAS_SHADOW +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; + +uniform vec2 shadow_res; + +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float shadow_bias; + +#endif +  #ifdef USE_DIFFUSE_TEX  uniform sampler2D diffuseMap;  #endif -uniform vec2 screen_res; -  vec3 atmosLighting(vec3 light);  vec3 scaleSoftClip(vec3 light); @@ -61,6 +73,8 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; +uniform vec2 screen_res; +  vec3 calcDirectionalLight(vec3 n, vec3 l)  {  	float a = max(dot(n,l),0.0); @@ -98,6 +112,27 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  	return vec3(da,da,da);	  } +#if HAS_SHADOW +float pcfShadow(sampler2DShadow shadowMap, vec4 stc) +{ +	stc.xyz /= stc.w; +	stc.z += shadow_bias; +		 +	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here +	 +	float cs = shadow2D(shadowMap, stc.xyz).x; +	float shadow = cs; +	 +    shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +                        +    return shadow*0.2; +} +#endif + +  void main()   {  	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; @@ -105,6 +140,73 @@ void main()  	vec4 pos = vec4(vary_position, 1.0); + +#if HAS_SHADOW +	float shadow = 0.0; +	vec4 spos = pos; +		 +	if (spos.z > -shadow_clip.w) +	{	 +		vec4 lpos; +		 +		vec4 near_split = shadow_clip*-0.75; +		vec4 far_split = shadow_clip*-1.25; +		vec4 transition_domain = near_split-far_split; +		float weight = 0.0; + +		if (spos.z < near_split.z) +		{ +			lpos = shadow_matrix[3]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap3, lpos)*w; +			weight += w; +			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); +		} + +		if (spos.z < near_split.y && spos.z > far_split.z) +		{ +			lpos = shadow_matrix[2]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap2, lpos)*w; +			weight += w; +		} + +		if (spos.z < near_split.x && spos.z > far_split.y) +		{ +			lpos = shadow_matrix[1]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +			shadow += pcfShadow(shadowMap1, lpos)*w; +			weight += w; +		} + +		if (spos.z > far_split.x) +		{ +			lpos = shadow_matrix[0]*spos; +							 +			float w = 1.0; +			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +			shadow += pcfShadow(shadowMap0, lpos)*w; +			weight += w; +		} +		 + +		shadow /= weight; +	} +	else +	{ +		shadow = 1.0; +	} +#endif +  #ifdef USE_INDEXED_TEX  	vec4 diff = diffuseLookup(vary_texcoord0.xy);  #else @@ -125,7 +227,12 @@ void main()  	vec3 dlight = calcDirectionalLight(normal, l) * 2.6;  	dlight = dlight * vary_directional.rgb * vary_pointlight_col; +#if HAS_SHADOW +	vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha); +#else  	vec4 col = vec4(vary_ambient + dlight, vertex_color_alpha); +#endif +  	vec4 color = diff * col;  	color.rgb = atmosLighting(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl deleted file mode 100644 index d2e85ba8a0..0000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ /dev/null @@ -1,241 +0,0 @@ -/**  - * @file alphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; - -#ifdef USE_DIFFUSE_TEX -uniform sampler2D diffuseMap; -#endif - -uniform vec2 screen_res; -uniform vec2 shadow_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; -VARYING vec3 vary_norm; - -#ifdef USE_VERTEX_COLOR -VARYING vec4 vertex_color; -#endif - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform float shadow_bias; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8];  -uniform vec3 light_diffuse[8]; - -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ -        float a = pow(max(dot(n,l),0.0), 0.7); -        return vec3(a,a,a); -} - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ -	//get light vector -	vec3 lv = lp.xyz-v; -	 -	//get distance -	float d = dot(lv,lv); -	 -	float da = 0.0; - -	if (d > 0.0 && la > 0.0 && fa > 0.0) -	{ -		//normalize light vector -		lv = normalize(lv); -	 -		//distance attenuation -		float dist2 = d/la; -		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); -		da = pow(da, 2.2) * 2.2; - -		// spotlight coefficient. -		float spot = max(dot(-ln, lv), is_pointlight); -		da *= spot*spot; // GL_SPOT_EXPONENT=2 - -		//angular attenuation -		da *= max(pow(dot(n, lv), 0.7), 0.0);		 -	} - -	return vec3(da,da,da);	 -} - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) -{ -	stc.xyz /= stc.w; -	stc.z += shadow_bias; -		 -	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here -	 -	float cs = shadow2D(shadowMap, stc.xyz).x; -	float shadow = cs; -	 -    shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; -    shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; -    shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; -    shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; -                        -    return shadow*0.2; -} - - -void main()  -{ -	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; -	frag *= screen_res; -	 -	float shadow = 0.0; -	vec4 pos = vec4(vary_position, 1.0); -	 -	vec4 spos = pos; -		 -	if (spos.z > -shadow_clip.w) -	{	 -		vec4 lpos; -		 -		vec4 near_split = shadow_clip*-0.75; -		vec4 far_split = shadow_clip*-1.25; -		vec4 transition_domain = near_split-far_split; -		float weight = 0.0; - -		if (spos.z < near_split.z) -		{ -			lpos = shadow_matrix[3]*spos; -			 -			float w = 1.0; -			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -			shadow += pcfShadow(shadowMap3, lpos)*w; -			weight += w; -			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); -		} - -		if (spos.z < near_split.y && spos.z > far_split.z) -		{ -			lpos = shadow_matrix[2]*spos; -			 -			float w = 1.0; -			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; -			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; -			shadow += pcfShadow(shadowMap2, lpos)*w; -			weight += w; -		} - -		if (spos.z < near_split.x && spos.z > far_split.y) -		{ -			lpos = shadow_matrix[1]*spos; -			 -			float w = 1.0; -			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; -			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; -			shadow += pcfShadow(shadowMap1, lpos)*w; -			weight += w; -		} - -		if (spos.z > far_split.x) -		{ -			lpos = shadow_matrix[0]*spos; -							 -			float w = 1.0; -			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -				 -			shadow += pcfShadow(shadowMap0, lpos)*w; -			weight += w; -		} -		 - -		shadow /= weight; -	} -	else -	{ -		shadow = 1.0; -	} - -	vec4 diff; - -#ifdef USE_INDEXED_TEX -	diff = diffuseLookup(vary_texcoord0.xy); -#endif - -#ifdef USE_DIFFUSE_TEX -	diff = texture2D(diffuseMap,vary_texcoord0.xy); -#endif -	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); - -	float vertex_color_alpha = 1.0; - -#ifdef USE_VERTEX_COLOR -	vertex_color_alpha = vertex_color.a;	 -#endif - -	vec3 normal = vary_norm; -	vec3 l = light_position[0].xyz; -	vec3 dlight = calcDirectionalLight(normal, l); -	     dlight = dlight * vary_directional.rgb * vary_pointlight_col; - -	vec4 col = vec4(vary_ambient + dlight *shadow, vertex_color_alpha); -	vec4 color = diff * col; -	 -	color.rgb = atmosLighting(color.rgb); -	color.rgb = scaleSoftClip(color.rgb); - -	col = vec4(0.0f,0.0f,0.0f,0.0f); - -  #define LIGHT_LOOP(i)	col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); -		 -	LIGHT_LOOP(1) -	LIGHT_LOOP(2) -	LIGHT_LOOP(3) -	LIGHT_LOOP(4) -	LIGHT_LOOP(5) -	LIGHT_LOOP(6) -	LIGHT_LOOP(7) - -	color.rgb += diff.rgb * vary_pointlight_col * col.rgb; - -	frag_color = color; -} - diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 1912ae0c16..d5de5d30b0 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -481,7 +481,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  				if (!params.mFullbright && deferred_render && mat)  				{ -					U32 mask = mat->getShaderMask(); +					U32 mask = params.mShaderMask;  					llassert(mask < LLMaterial::SHADER_COUNT);  					target_shader = &(gDeferredMaterialProgram[mask]); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 08a16c9c33..77dd1fe607 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1327,13 +1327,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				0.75f  			}; -			if ((!LLPipeline::sRenderDeferred || !mat) && +			if ((!LLPipeline::sRenderDeferred || !mat || mat->getSpecularID().isNull()) &&  				getPoolType() != LLDrawPool::POOL_ALPHA &&   				(LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))  			{ +				llassert(tep->getShiny() <= 3);  				color.mV[3] = U8 (alpha[tep->getShiny()] * 255);  			}  		} +  	}  	// INDICES diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index bbf88060c1..b45c944a5f 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1089,8 +1089,9 @@ void LLFloaterPreference::refreshEnabledState()  	ctrl_reflections->setEnabled(reflections);  	// Bump & Shiny	 +	LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny");  	bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump"); -	getChild<LLCheckBoxCtrl>("BumpShiny")->setEnabled(bumpshiny ? TRUE : FALSE); +	bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE);  	radio_reflection_detail->setEnabled(reflections); @@ -1149,6 +1150,7 @@ void LLFloaterPreference::refreshEnabledState()  	LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");  	BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&  +						((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) &&  						shaders &&   						gGLManager.mHasFramebufferObject &&  						gSavedSettings.getBOOL("RenderAvatarVP") && @@ -2319,3 +2321,4 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings()  	}  } + diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 1a3f4832fd..1fbf4a39e6 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1297,6 +1297,7 @@ void LLPanelFace::getState()  			mColorSwatch->setEnabled( editable );  			mColorSwatch->setCanApplyImmediately( editable );  		} +  		// Color transparency  		{  			getChildView("color trans")->setEnabled(editable); @@ -1363,14 +1364,10 @@ void LLPanelFace::getState()  			getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical);  			getChildView("label shinycolor")->setEnabled(editable);  		} -		// NORSPEC-94: Set default specular color to white (will get -		//		overwritten from material when loaded) +  		LLColorSwatchCtrl*	mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch"); -		color = LLColor4::white;  		if(mShinyColorSwatch)  		{ -			mShinyColorSwatch->setOriginal(color); -			mShinyColorSwatch->set(color, TRUE);  			mShinyColorSwatch->setValid(editable);  			mShinyColorSwatch->setEnabled( editable );  			mShinyColorSwatch->setCanApplyImmediately( editable ); @@ -1716,13 +1713,20 @@ void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMate  		getChild<LLUICtrl>("shinyRot")->setValue(rot*RAD_TO_DEG);  		getChild<LLUICtrl>("shinyOffsetU")->setValue(offset_x);  		getChild<LLUICtrl>("shinyOffsetV")->setValue(offset_y); -		getChild<LLColorSwatchCtrl>("shinycolorswatch")->setOriginal(material->getSpecularLightColor()); -		getChild<LLColorSwatchCtrl>("shinycolorswatch")->set(material->getSpecularLightColor(),TRUE);  		getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent());  		getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());  	}  	updateShinyControls(combobox_shininess,this, true); +	// Assert desired colorswatch color to match material AFTER updateShinyControls +	// to avoid getting overwritten with the default on some UI state changes. +	// +	if (!material->getSpecularID().isNull()) +	{ +		getChild<LLColorSwatchCtrl>("shinycolorswatch")->setOriginal(material->getSpecularLightColor()); +		getChild<LLColorSwatchCtrl>("shinycolorswatch")->set(material->getSpecularLightColor(),TRUE); +	} +  	// Bumpy (normal)  	texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");  	texture_ctrl->setImageAssetID(material->getNormalID()); @@ -2097,6 +2101,18 @@ void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool mess_  			if (!comboShiny->itemExists(USE_TEXTURE))  			{  				comboShiny->add(USE_TEXTURE); +				 +				// NORSPEC-94: Set default specular color to white +				// +				LLColorSwatchCtrl*	mShinyColorSwatch = self->getChild<LLColorSwatchCtrl>("shinycolorswatch"); +				if(mShinyColorSwatch) +				{ +					// Doing sets in a getState func causes the 'blinking updates' of swatch colors....DON'T. +					// +					LL_DEBUGS("Materials") << "Resetting specular color to default of white" << LL_ENDL; +					mShinyColorSwatch->setOriginal(LLColor4::white); +					mShinyColorSwatch->set(LLColor4::white, TRUE); +				}  			}  			comboShiny->setSimple(USE_TEXTURE);  		} @@ -2118,7 +2134,7 @@ void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool mess_  	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();  	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();  	U32 shiny_value = comboShiny->getCurrentIndex(); -	bool show_shinyctrls = (shiny_value != 0) && show_shininess; // Use texture +	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture  	self->getChildView("label glossiness")->setVisible(show_shinyctrls);  	self->getChildView("glossiness")->setVisible(show_shinyctrls);  	self->getChildView("label environment")->setVisible(show_shinyctrls); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 6bb9d5f201..252f129133 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4634,6 +4634,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,  	mDistance(0.f),  	mDrawMode(LLRender::TRIANGLES),  	mMaterial(NULL), +	mShaderMask(0),  	mSpecColor(1.0f, 1.0f, 1.0f, 0.5f),  	mEnvIntensity(0.0f),  	mAlphaMaskCutoff(0.5f), diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 7c0be549df..bf32440848 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -119,8 +119,8 @@ public:  	LL_ALIGN_16(LLFace* mFace); //associated face  	F32 mDistance;  	U32 mDrawMode; -		  	LLMaterialPtr mMaterial; // If this is null, the following parameters are unused. +	U32 mShaderMask;  	LLPointer<LLViewerTexture> mSpecularMap;  	const LLMatrix4* mSpecularMapMatrix;  	LLPointer<LLViewerTexture> mNormalMap; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index fe43583271..c020ee36d3 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4086,9 +4086,8 @@ S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image)  S32 LLViewerObject::setTENormalMapCore(const U8 te, LLViewerTexture *image)  { -	llassert(image);  	S32 retval = TEM_CHANGE_TEXTURE; -	const LLUUID& uuid = image->getID(); +	const LLUUID& uuid = image ? image->getID() : LLUUID::null;  	if (uuid != getTE(te)->getID() ||  		uuid == LLUUID::null)  	{ @@ -4116,9 +4115,8 @@ S32 LLViewerObject::setTENormalMapCore(const U8 te, LLViewerTexture *image)  S32 LLViewerObject::setTESpecularMapCore(const U8 te, LLViewerTexture *image)  { -	llassert(image);  	S32 retval = TEM_CHANGE_TEXTURE; -	const LLUUID& uuid = image->getID(); +	const LLUUID& uuid = image ? image->getID() : LLUUID::null;  	if (uuid != getTE(te)->getID() ||  		uuid == LLUUID::null)  	{ @@ -4181,14 +4179,14 @@ S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)  S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid)  { -	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( +	LLViewerFetchedTexture *image = (uuid == LLUUID::null) ? NULL : LLViewerTextureManager::getFetchedTexture(  		uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid);  	return setTENormalMapCore(te, image);  }  S32 LLViewerObject::setTESpecularMap(const U8 te, const LLUUID& uuid)  { -	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( +	LLViewerFetchedTexture *image = (uuid == LLUUID::null) ? NULL : LLViewerTextureManager::getFetchedTexture(  		uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid);  	return setTESpecularMapCore(te, image);  } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 8c21145860..fce06b9e13 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1225,6 +1225,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1");  		gDeferredSkinnedAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");  		gDeferredSkinnedAlphaProgram.addPermutation("HAS_SKIN", "1"); +		gDeferredSkinnedAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");  		success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);  		// Hack to include uniforms for lighting without linking in lighting file @@ -1430,6 +1431,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredAlphaProgram.addPermutation("USE_INDEXED_TEX", "1");  		gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); +		gDeferredAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");  		gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredAlphaProgram.createShader(NULL, NULL); @@ -1607,6 +1609,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredAvatarAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1");  		gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1"); +		gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");  		gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a08a8a9676..941892a597 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4088,6 +4088,21 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  	bool batchable = false; +	U32 shader_mask = 0xFFFFFFFF; //no shader + +	if (mat) +	{ +		if (type == LLRenderPass::PASS_ALPHA) +		{ +			shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND); +		} +		else +		{ +			shader_mask = mat->getShaderMask(); +		} +	} + +  	if (index < 255 && idx >= 0)  	{  		if (mat || draw_vec[idx]->mMaterial) @@ -4124,7 +4139,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  		draw_vec[idx]->mBump == bump &&  		draw_vec[idx]->mTextureMatrix == tex_mat &&  		draw_vec[idx]->mModelMatrix == model_mat && -		draw_vec[idx]->mMaterial == mat) +		draw_vec[idx]->mMaterial == mat && +		draw_vec[idx]->mShaderMask == shader_mask)  	{  		draw_vec[idx]->mCount += facep->getIndicesCount();  		draw_vec[idx]->mEnd += facep->getGeomCount(); @@ -4152,37 +4168,46 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  		draw_vec.push_back(draw_info);  		draw_info->mTextureMatrix = tex_mat;  		draw_info->mModelMatrix = model_mat; +		 +		U8 shiny = facep->getTextureEntry()->getShiny(); +		float alpha[4] = +		{ +			0.00f, +			0.25f, +			0.5f, +			0.75f +		}; +		float spec = alpha[shiny & TEM_SHINY_MASK]; +		LLVector4 specColor(spec, spec, spec, spec); +		draw_info->mSpecColor = specColor; +		draw_info->mEnvIntensity = spec; +		draw_info->mSpecularMap = NULL; +  		if (mat)  		{  				// We have a material.  Update our draw info accordingly.  				draw_info->mMaterial = mat; -				LLVector4 specColor; -				specColor.mV[0] = mat->getSpecularLightColor().mV[0] * (1.f / 255.f); -				specColor.mV[1] = mat->getSpecularLightColor().mV[1] * (1.f / 255.f); -				specColor.mV[2] = mat->getSpecularLightColor().mV[2] * (1.f / 255.f); -				specColor.mV[3] = mat->getSpecularLightExponent() * (1.f / 255.f); -				draw_info->mSpecColor = specColor; -				draw_info->mEnvIntensity = mat->getEnvironmentIntensity() * (1.f / 255.f); +				draw_info->mShaderMask = shader_mask; + +				if (!mat->getSpecularID().isNull()) +				{ +					LLVector4 specColor; +					specColor.mV[0] = mat->getSpecularLightColor().mV[0] * (1.f / 255.f); +					specColor.mV[1] = mat->getSpecularLightColor().mV[1] * (1.f / 255.f); +					specColor.mV[2] = mat->getSpecularLightColor().mV[2] * (1.f / 255.f); +					specColor.mV[3] = mat->getSpecularLightExponent() * (1.f / 255.f); +					draw_info->mSpecColor = specColor; +					draw_info->mEnvIntensity = mat->getEnvironmentIntensity() * (1.f / 255.f); +					draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTEOffset()); +				} +  				draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f);  				draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode();  				draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset()); -				draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTEOffset()); +				  		}  		else   		{ -			U8 shiny = facep->getTextureEntry()->getShiny(); -			float alpha[4] = -			{ -				0.00f, -				0.25f, -				0.5f, -				0.75f -			}; -			float spec = alpha[shiny]; -			LLVector4 specColor(spec, spec, spec, spec); -			draw_info->mSpecColor = specColor; -			draw_info->mEnvIntensity = spec; -  			if (type == LLRenderPass::PASS_GRASS)  			{  				draw_info->mAlphaMaskCutoff = 0.5f; @@ -5279,6 +5304,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  				{  					registerFace(group, facep, LLRenderPass::PASS_SIMPLE);  				} +				else if (te->getColor().mV[3] < 0.999f) +				{ +					registerFace(group, facep, LLRenderPass::PASS_ALPHA); +				}  				else  				{  					U32 pass[] =  diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f053d26172..fd4e9dfc05 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1018,7 +1018,8 @@ void LLPipeline::updateRenderDeferred()  {  	BOOL deferred = ((RenderDeferred &&   					 LLRenderTarget::sUseFBO && -					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&	  +					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && +					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump") &&  					 VertexShaderEnable &&   					 RenderAvatarVP &&  					 WindLightUseAtmosShaders) ? TRUE : FALSE) && @@ -1659,7 +1660,8 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima  		return 0;  	} -	bool alpha = te->getColor().mV[3] < 0.999f; +	bool color_alpha = te->getColor().mV[3] < 0.999f; +	bool alpha = color_alpha;  	if (imagep)  	{  		alpha = alpha || (imagep->getComponents() == 4 && imagep->getType() != LLViewerTexture::MEDIA_TEXTURE) || (imagep->getComponents() == 2); @@ -1674,10 +1676,10 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima  				break;  			case 0: //alpha mode set to none, never go to alpha pool  			case 3: //alpha mode set to emissive, never go to alpha pool -				alpha = false; +				alpha = color_alpha;  				break;  			default: //alpha mode set to "mask", go to alpha pool if fullbright -				alpha = false; // Material's alpha mode is set to none, mask, or emissive.  Toss it into the opaque material draw pool. +				alpha = color_alpha; // Material's alpha mode is set to none, mask, or emissive.  Toss it into the opaque material draw pool.  				break;  		}  	} diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 708dcf4e95..d7db7caf66 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -211,16 +211,19 @@  		 name="TransparentWater"  		 top_pad="7"  		 width="256" /> -		<check_box -		 control_name="RenderObjectBump" -		 height="16" -		 initial_value="true" -		 label="Bump mapping and shiny" -		 layout="topleft" -		 left_delta="0" -		 name="BumpShiny" -		 top_pad="1" -		width="256" /> +      <check_box +       control_name="RenderObjectBump" +       height="16" +       initial_value="true" +       label="Bump mapping and shiny" +       layout="topleft" +       left_delta="0" +       name="BumpShiny" +       top_pad="1" +      width="256"> +        <check_box.commit_callback +        function="Pref.VertexShaderEnable" /> +      </check_box>      <check_box  		control_name="RenderLocalLights"  		height="16" | 
