diff options
34 files changed, 816 insertions, 175 deletions
| @@ -463,3 +463,4 @@ fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1  69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release  69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release  0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release +75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 62191b4c1a..ac16e30796 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -149,6 +149,9 @@ void LLGLSLShader::clearStats()  	mTimeElapsed = 0;  	mSamplesDrawn = 0;  	mDrawCalls = 0; +	mTextureStateFetched = false; +	mTextureMagFilter.clear(); +	mTextureMinFilter.clear();  }  void LLGLSLShader::dumpStats() @@ -161,6 +164,16 @@ void LLGLSLShader::dumpStats()  		{  			llinfos << mShaderFiles[i].first << llendl;  		} +		for (U32 i = 0; i < mTexture.size(); ++i) +		{ +			GLint idx = mTexture[i]; +			 +			if (idx >= 0) +			{ +				GLint uniform_idx = getUniformLocation(i); +				llinfos << mUniformNameMap[uniform_idx] << " - " << std::hex << mTextureMagFilter[i] << "/" << mTextureMinFilter[i] << std::dec << llendl; +			} +		}  		llinfos << "=============================================" << llendl;  		F32 ms = mTimeElapsed/1000000.f; @@ -211,6 +224,39 @@ void LLGLSLShader::placeProfileQuery()  		glGenQueriesARB(1, &mTimerQuery);  	} +	if (!mTextureStateFetched) +	{ +		mTextureStateFetched = true; +		mTextureMagFilter.resize(mTexture.size()); +		mTextureMinFilter.resize(mTexture.size()); + +		U32 cur_active = gGL.getCurrentTexUnitIndex(); + +		for (U32 i = 0; i < mTexture.size(); ++i) +		{ +			GLint idx = mTexture[i]; + +			if (idx >= 0) +			{ +				gGL.getTexUnit(idx)->activate(); + +				U32 mag = 0xFFFFFFFF; +				U32 min = 0xFFFFFFFF; + +				U32 type = LLTexUnit::getInternalType(gGL.getTexUnit(idx)->getCurrType()); + +				glGetTexParameteriv(type, GL_TEXTURE_MAG_FILTER, (GLint*) &mag); +				glGetTexParameteriv(type, GL_TEXTURE_MIN_FILTER, (GLint*) &min); + +				mTextureMagFilter[i] = mag; +				mTextureMinFilter[i] = min; +			} +		} + +		gGL.getTexUnit(cur_active)->activate(); +	} + +  	glBeginQueryARB(GL_SAMPLES_PASSED, 1);  	glBeginQueryARB(GL_TIME_ELAPSED, mTimerQuery);  #endif @@ -573,6 +619,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)  		}  		mUniformMap[name] = location; +		mUniformNameMap[location] = name;  		LL_DEBUGS("ShaderLoading") << "Uniform " << name << " is at location " << location << LL_ENDL;  		//find the index of this uniform @@ -635,6 +682,7 @@ BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms)  	mActiveTextureChannels = 0;  	mUniform.clear();  	mUniformMap.clear(); +	mUniformNameMap.clear();  	mTexture.clear();  	mValue.clear();  	//initialize arrays @@ -1152,6 +1200,23 @@ void LLGLSLShader::uniform1i(const string& uniform, GLint v)  	}  } +void LLGLSLShader::uniform2i(const string& uniform, GLint i, GLint j) +{ +	GLint location = getUniformLocation(uniform); +				 +	if (location >= 0) +	{ +		std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +		LLVector4 vec(i,j,0.f,0.f); +		if (iter == mValue.end() || shouldChange(iter->second,vec)) +		{ +			glUniform2iARB(location, i, j); +			mValue[location] = vec; +		} +	} +} + +  void LLGLSLShader::uniform1f(const string& uniform, GLfloat v)  {  	GLint location = getUniformLocation(uniform); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 3c775cde27..eabdb9fc92 100755 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -111,6 +111,7 @@ public:  	void uniform3fv(U32 index, U32 count, const GLfloat* v);  	void uniform4fv(U32 index, U32 count, const GLfloat* v);  	void uniform1i(const std::string& uniform, GLint i); +	void uniform2i(const std::string& uniform, GLint i, GLint j);  	void uniform1f(const std::string& uniform, GLfloat v);  	void uniform2f(const std::string& uniform, GLfloat x, GLfloat y);  	void uniform3f(const std::string& uniform, GLfloat x, GLfloat y, GLfloat z); @@ -170,6 +171,7 @@ public:  	U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())  	std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location  	std::map<std::string, GLint> mUniformMap;  //lookup map of uniform name to uniform location +	std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name  	std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value  	std::vector<GLint> mTexture;  	S32 mTotalUniformSize; @@ -192,6 +194,11 @@ public:  	static U64 sTotalSamplesDrawn;  	U32 mDrawCalls;  	static U32 sTotalDrawCalls; + +	bool mTextureStateFetched; +	std::vector<U32> mTextureMagFilter; +	std::vector<U32> mTextureMinFilter; +	  };  //UI shader (declared here so llui_libtest will link properly) diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 25109268e8..d53c37a847 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -53,11 +53,19 @@ void check_framebuffer_status()  bool LLRenderTarget::sUseFBO = false;  U32 LLRenderTarget::sCurFBO = 0; + +extern S32 gGLViewport[4]; + +U32 LLRenderTarget::sCurResX = 0; +U32 LLRenderTarget::sCurResY = 0; +  LLRenderTarget::LLRenderTarget() :  	mResX(0),  	mResY(0),  	mFBO(0),  	mPreviousFBO(0), +	mPreviousResX(0), +	mPreviousResY(0),  	mDepth(0),  	mStencil(0),  	mUseDepth(false), @@ -390,13 +398,12 @@ void LLRenderTarget::bindTarget()  {  	if (mFBO)  	{ -		mPreviousFBO = sCurFBO; -  		stop_glerror(); +		mPreviousFBO = sCurFBO;  		glBindFramebuffer(GL_FRAMEBUFFER, mFBO);  		sCurFBO = mFBO; - +		  		stop_glerror();  		if (gGLManager.mHasDrawBuffers)  		{ //setup multiple render targets @@ -418,7 +425,12 @@ void LLRenderTarget::bindTarget()  		stop_glerror();  	} +	mPreviousResX = sCurResX; +	mPreviousResY = sCurResY;  	glViewport(0, 0, mResX, mResY); +	sCurResX = mResX; +	sCurResY = mResY; +  	sBoundTarget = this;  } @@ -489,6 +501,20 @@ void LLRenderTarget::flush(bool fetch_depth)  		stop_glerror();  		glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFBO);  		sCurFBO = mPreviousFBO; + +		if (mPreviousFBO) +		{ +			glViewport(0, 0, mPreviousResX, mPreviousResY); +			sCurResX = mPreviousResX; +			sCurResY = mPreviousResY; +		} +		else +		{ +			glViewport(gGLViewport[0],gGLViewport[1],gGLViewport[2],gGLViewport[3]); +			sCurResX = gGLViewport[2]; +			sCurResY = gGLViewport[3]; +		} +						  		stop_glerror();  	}  } diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 765a727b5b..66a9874a6b 100755 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -63,6 +63,9 @@ public:  	static bool sUseFBO;   	static U32 sBytesAllocated;  	static U32 sCurFBO; +	static U32 sCurResX; +	static U32 sCurResY; +  	LLRenderTarget();  	~LLRenderTarget(); @@ -146,6 +149,9 @@ protected:  	std::vector<U32> mInternalFormat;  	U32 mFBO;  	U32 mPreviousFBO; +	U32 mPreviousResX; +	U32 mPreviousResY; +  	U32 mDepth;  	bool mStencil;  	bool mUseDepth; diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 9575d51bad..b72762837e 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.6.1 +3.6.2 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3e022f6fa3..72916ccf8c 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7732,7 +7732,7 @@      <key>Type</key>      <string>S32</string>      <key>Value</key> -    <integer>4</integer> +    <integer>3</integer>    </map>    <key>OctreeAlphaDistanceFactor</key> @@ -8516,7 +8516,6 @@      <key>Value</key>      <real>1.0</real>    </map> -    <key>RenderDeferredTreeShadowBias</key>    <map>      <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 77a53a71aa..0899caa2af 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -78,6 +78,7 @@ uniform vec2 screen_res;  vec3 calcDirectionalLight(vec3 n, vec3 l)  {  	float a = max(dot(n,l),0.0); +	a = pow(a, 1.0/1.3);  	return vec3(a,a,a);  } @@ -87,7 +88,7 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  	vec3 lv = lp.xyz-v;  	//get distance -	float d = dot(lv,lv); +	float d = length(lv);  	float da = 0.0; @@ -97,9 +98,11 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  		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; +		float dist = d/la; +		da = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		da *= da; +		da *= 1.4; +	  		// spotlight coefficient.  		float spot = max(dot(-ln, lv), is_pointlight); @@ -212,6 +215,7 @@ void main()  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif +	vec4 gamma_diff = diff;  	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); @@ -224,7 +228,7 @@ void main()  	vec3 normal = vary_norm;   	vec3 l = light_position[0].xyz; -	vec3 dlight = calcDirectionalLight(normal, l) * 2.6; +	vec3 dlight = calcDirectionalLight(normal, l);  	dlight = dlight * vary_directional.rgb * vary_pointlight_col;  #if HAS_SHADOW @@ -233,13 +237,16 @@ void main()  	vec4 col = vec4(vary_ambient + dlight, vertex_color_alpha);  #endif -	vec4 color = diff * col; +	vec4 color = gamma_diff * col;  	color.rgb = atmosLighting(color.rgb);  	color.rgb = scaleSoftClip(color.rgb); + +	color.rgb = pow(color.rgb, vec3(2.2));  	col = vec4(0,0,0,0); +	     #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) @@ -250,7 +257,7 @@ void main()  	LIGHT_LOOP(6)  	LIGHT_LOOP(7) -	color.rgb += diff.rgb * vary_pointlight_col * col.rgb; +	color.rgb += diff.rgb * pow(vary_pointlight_col, vec3(2.2)) * col.rgb;  	color.rgb = pow(color.rgb, vec3(1.0/2.2)); diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 247ee0a34f..9d3ba564cd 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -58,8 +58,6 @@ mat4 getSkinnedTransform();  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);  void calcAtmospherics(vec3 inPositionEye); -vec3 calcDirectionalLight(vec3 n, vec3 l); -  vec3 atmosAmbient(vec3 light);  vec3 atmosAffectDirectionalLight(float lightIntensity);  vec3 scaleDownLight(vec3 light); @@ -88,12 +86,6 @@ uniform vec3 light_diffuse[8];  uniform vec3 sun_dir; -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ -        float a = max(dot(n,l),0.0); -        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 @@ -184,7 +176,7 @@ void main()  	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));  	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); -	vec3 diff = pow(diffuse_color.rgb, vec3(2.2)); +	vec3 diff = diffuse_color.rgb; diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index eebeb91bf8..968a5f6b3d 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -46,11 +46,6 @@ VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 getKern(int i) -{ -	return kern[i]; -} -  vec4 getPosition(vec2 pos_screen)  {  	float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -110,7 +105,7 @@ void main()  	vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);  	dlt /= max(-pos.z*dist_factor, 1.0); -	vec2 defined_weight = getKern(0).xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free' +	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'  	vec4 col = defined_weight.xyxx * ccol;  	// relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances @@ -120,28 +115,33 @@ void main()  	float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2)  	tc_mod -= floor(tc_mod);  	tc_mod *= 2.0; -	tc += ( (tc_mod - 0.5) * getKern(1).z * dlt * 0.5 ); +	tc += ( (tc_mod - 0.5) * kern[1].z * dlt * 0.5 );  	for (int i = 1; i < 4; i++)  	{ -		vec2 samptc = tc + getKern(i).z*dlt; -	        vec3 samppos = getPosition(samptc).xyz;  +		vec2 samptc = tc + kern[i].z*dlt; +	    vec3 samppos = getPosition(samptc).xyz;  +  		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +		  		if (d*d <= pointplanedist_tolerance_pow2)  		{ -			col += texture2DRect(lightMap, samptc)*getKern(i).xyxx; -			defined_weight += getKern(i).xy; +			col += texture2DRect(lightMap, samptc)*kern[i].xyxx; +			defined_weight += kern[i].xy;  		}  	} +  	for (int i = 1; i < 4; i++)  	{ -		vec2 samptc = tc - getKern(i).z*dlt; -	        vec3 samppos = getPosition(samptc).xyz;  +		vec2 samptc = tc - kern[i].z*dlt; +	    vec3 samppos = getPosition(samptc).xyz;  +  		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +		  		if (d*d <= pointplanedist_tolerance_pow2)  		{ -			col += texture2DRect(lightMap, samptc)*getKern(i).xyxx; -			defined_weight += getKern(i).xy; +			col += texture2DRect(lightMap, samptc)*kern[i].xyxx; +			defined_weight += kern[i].xy;  		}  	} diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl index a2c3ec3355..adc361d7a2 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -43,10 +43,12 @@ vec2 encode_normal(vec3 n)  void main()   {  	vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb; +	 +	vec3 spec; +	spec.rgb = vec3(vertex_color.a);  	frag_data[0] = vec4(col, 0.0); -	frag_data[1] = vertex_color.aaaa; // spec -	frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested +	frag_data[1] = vec4(spec, vertex_color.a); // spec  	vec3 nvn = normalize(vary_normal);  	frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index de2f74b681..618ea747f5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -127,7 +127,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe  	vec3 lv = lp.xyz-v;  	//get distance -	float d = dot(lv,lv); +	float d = length(lv);  	float da = 1.0; @@ -139,8 +139,10 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe  		lv = normalize(lv);  		//distance attenuation -		float dist2 = d/la; -		float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); +		float dist = d/la; +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +		dist_atten *= 1.4;  		// spotlight coefficient.  		float spot = max(dot(-ln, lv), is_pointlight); @@ -321,9 +323,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(pow(vec3(sunlight * .5), vec3(2.2)) * 2.2); -	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(2.2)) * 2.2); -	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(2.2)) * 2.2); +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));  }  vec3 atmosLighting(vec3 light) @@ -617,8 +619,8 @@ void main()  	col.rgb *= ambient; -	col.rgb = col.rgb + atmosAffectDirectionalLight(final_da * 2.6); -	col.rgb *= diffuse.rgb; +	col.rgb = col.rgb + atmosAffectDirectionalLight(pow(final_da, 1.0/1.3)); +	col.rgb *= old_diffcol.rgb;  	float glare = 0.0; @@ -647,9 +649,8 @@ void main()  	{  		//add environmentmap  		vec3 env_vec = env_mat * refnormpersp; -		float exponent = mix(2.2, 1.0, diffuse.a); - -		vec3 refcol = pow(textureCube(environmentMap, env_vec).rgb, vec3(exponent))*exponent; +		 +		vec3 refcol = textureCube(environmentMap, env_vec).rgb;  		col = mix(col.rgb, refcol,   			envIntensity);   @@ -660,13 +661,12 @@ void main()  		glare += cur_glare;  	} -	float exponent = mix(1.0, 2.2, diffuse.a); -	col = pow(col, vec3(exponent)); -				 -	  	col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a);  	col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a); +	//convert to linear space before adding local lights +	col = pow(col, vec3(2.2)); +  	vec3 npos = normalize(-pos.xyz); @@ -681,6 +681,7 @@ void main()  		LIGHT_LOOP(7) +	//convert to gamma space for display on screen  	col.rgb = pow(col.rgb, vec3(1.0/2.2));  	frag_color.rgb = col.rgb; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index b35ba549f6..868526d457 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -127,9 +127,9 @@ void main()  		bool light_contrib = (i < light_count);  		vec3 lv = light[i].xyz-pos; -		float dist2 = dot(lv,lv); -		dist2 /= light[i].w; -		if (dist2 > 1.0) +		float dist = length(lv); +		dist /= light[i].w; +		if (dist > 1.0)  		{  			light_contrib = false;  		} @@ -146,10 +146,10 @@ void main()  			da = dot(norm, lv);  			float fa = light_col[i].a+1.0; -			float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); +			float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +			dist_atten *= dist_atten; +			dist_atten *= 2.0; -			dist_atten = pow(dist_atten, 2.2) * 2.2; -  			dist_atten *= noise;  			float lit = da * dist_atten; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 36fb4afa52..97bf49a605 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -177,9 +177,9 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = center.xyz-pos.xyz; -	float dist2 = dot(lv,lv); -	dist2 /= size; -	if (dist2 > 1.0) +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0)  	{  		discard;  	} @@ -201,8 +201,10 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = falloff+1.0; -	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); -	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; +  	if (dist_atten <= 0.0)  	{  		discard; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index c6b1eb7c8d..caf20ce707 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -110,9 +110,9 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = trans_center.xyz-pos; -	float dist2 = dot(lv,lv); -	dist2 /= size; -	if (dist2 > 1.0) +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0)  	{  		discard;  	} @@ -133,8 +133,10 @@ void main()  	vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;  	float fa = falloff+1.0; -	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); -	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; +	  	float lit = da * dist_atten * noise;  	col = color.rgb*lit*col; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl index 9491421236..a5625fbc16 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl @@ -37,7 +37,7 @@ VARYING vec3 trans_center;  void main()  {  	//transform vertex -	vec3 p = position*sqrt(size)+center; +	vec3 p = position*size+center;  	vec4 pos = modelview_projection_matrix * vec4(p.xyz, 1.0);  	vary_fragcoord = pos;  	trans_center = (modelview_matrix*vec4(center.xyz, 1.0)).xyz; diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index b40850e769..08583ad0f2 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -248,9 +248,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); -	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); -	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma); +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));  }  vec3 atmosLighting(vec3 light) @@ -325,8 +325,13 @@ void main()  	norm.xyz = decode_normal(norm.xy); // unpack norm  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); +	da = pow(da, 1.0/1.3);  	vec4 diffuse = texture2DRect(diffuseRect, tc); + +	//convert to gamma space +	diffuse.rgb = pow(diffuse.rgb, vec3(1.0/2.2)); +  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);  	vec3 col;  	float bloom = 0.0; @@ -341,7 +346,7 @@ void main()  		col.rgb *= ambient; -		col += atmosAffectDirectionalLight(max(min(da, 1.0) * 2.6, 0.0)); +		col += atmosAffectDirectionalLight(max(min(da, 1.0), 0.0));  		col *= diffuse.rgb; @@ -362,23 +367,18 @@ void main()  		} -		col = mix(col.rgb, pow(diffuse.rgb, vec3(1.0/2.2)), diffuse.a); -		 -		 +		col = mix(col.rgb, diffuse.rgb, diffuse.a); +				  		if (envIntensity > 0.0)  		{ //add environmentmap  			vec3 env_vec = env_mat * refnormpersp; -			float exponent = mix(2.2, 1.0, diffuse.a); -			vec3 refcol = pow(textureCube(environmentMap, env_vec).rgb, vec3(exponent))*exponent; +			 +			vec3 refcol = textureCube(environmentMap, env_vec).rgb;  			col = mix(col.rgb, refcol,   				envIntensity);   -  		} - -		float exponent = mix(1.0, 2.2, diffuse.a); -		col = pow(col, vec3(exponent));  		if (norm.w < 0.5)  		{ @@ -386,10 +386,12 @@ void main()  			col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);  		} +		col = pow(col, vec3(2.2)); +  		//col = vec3(1,0,1);  		//col.g = envIntensity;  	} -	 +  	frag_color.rgb = col;  	frag_color.a = bloom; diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 3539c8d2b2..1975b18652 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -175,9 +175,9 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = trans_center.xyz-pos.xyz; -	float dist2 = dot(lv,lv); -	dist2 /= size; -	if (dist2 > 1.0) +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0)  	{  		discard;  	} @@ -199,8 +199,10 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = falloff+1.0; -	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); -	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; +  	if (dist_atten <= 0.0)  	{  		discard; @@ -279,10 +281,7 @@ void main()  			//col += spec.rgb;  		}  	}	 -	 -	 -	 -	 +  	if (envIntensity > 0.0)  	{ diff --git a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl new file mode 100644 index 0000000000..6523a06d22 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl @@ -0,0 +1,67 @@ +/**  + * @file debugF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D depthMap; + +uniform float delta; + +VARYING vec2 tc0; +VARYING vec2 tc1; +VARYING vec2 tc2; +VARYING vec2 tc3; +VARYING vec2 tc4; +VARYING vec2 tc5; +VARYING vec2 tc6; +VARYING vec2 tc7; +VARYING vec2 tc8; + +void main()  +{ +	vec4 depth1 =  +		vec4(texture2D(depthMap, tc0).r, +			texture2D(depthMap, tc1).r, +			texture2D(depthMap, tc2).r, +			texture2D(depthMap, tc3).r); + +	vec4 depth2 =  +		vec4(texture2D(depthMap, tc4).r, +			texture2D(depthMap, tc5).r, +			texture2D(depthMap, tc6).r, +			texture2D(depthMap, tc7).r); + +	depth1 = min(depth1, depth2); +	float depth = min(depth1.x, depth1.y); +	depth = min(depth, depth1.z); +	depth = min(depth, depth1.w); +	depth = min(depth, texture2D(depthMap, tc8).r); + +	gl_FragDepth = depth; +} diff --git a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl new file mode 100644 index 0000000000..0e5dc08183 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl @@ -0,0 +1,69 @@ +/**  + * @file debugF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 sampler2DRect depthMap; + +uniform float delta; + +VARYING vec2 tc0; +VARYING vec2 tc1; +VARYING vec2 tc2; +VARYING vec2 tc3; +VARYING vec2 tc4; +VARYING vec2 tc5; +VARYING vec2 tc6; +VARYING vec2 tc7; +VARYING vec2 tc8; + +void main()  +{ +	vec4 depth1 =  +		vec4(texture2DRect(depthMap, tc0).r, +			texture2DRect(depthMap, tc1).r, +			texture2DRect(depthMap, tc2).r, +			texture2DRect(depthMap, tc3).r); + +	vec4 depth2 =  +		vec4(texture2DRect(depthMap, tc4).r, +			texture2DRect(depthMap, tc5).r, +			texture2DRect(depthMap, tc6).r, +			texture2DRect(depthMap, tc7).r); + +	depth1 = min(depth1, depth2); +	float depth = min(depth1.x, depth1.y); +	depth = min(depth, depth1.z); +	depth = min(depth, depth1.w); +	depth = min(depth, texture2DRect(depthMap, tc8).r); + +	gl_FragDepth = depth; +} diff --git a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthV.glsl b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthV.glsl new file mode 100644 index 0000000000..71d80911d6 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthV.glsl @@ -0,0 +1,59 @@ +/**  + * @file debugV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +uniform vec2 screen_res; + +uniform vec2 delta; + +VARYING vec2 tc0; +VARYING vec2 tc1; +VARYING vec2 tc2; +VARYING vec2 tc3; +VARYING vec2 tc4; +VARYING vec2 tc5; +VARYING vec2 tc6; +VARYING vec2 tc7; +VARYING vec2 tc8; + +void main() +{ +	gl_Position = vec4(position, 1.0);  +	 +	vec2 tc = (position.xy*0.5+0.5)*screen_res; +	tc0 = tc+vec2(-delta.x,-delta.y); +	tc1 = tc+vec2(0,-delta.y); +	tc2 = tc+vec2(delta.x,-delta.y); +	tc3 = tc+vec2(-delta.x,0); +	tc4 = tc+vec2(0,0); +	tc5 = tc+vec2(delta.x,0); +	tc6 = tc+vec2(-delta.x,delta.y); +	tc7 = tc+vec2(0,delta.y); +	tc8 = tc+vec2(delta.x,delta.y); +} + diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index eaacb93cb9..780df9ed1a 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -179,9 +179,9 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = center.xyz-pos.xyz; -	float dist2 = dot(lv,lv); -	dist2 /= size; -	if (dist2 > 1.0) +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0)  	{  		discard;  	} @@ -215,8 +215,9 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = falloff+1.0; -	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); -	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0;  	if (dist_atten <= 0.0)  	{  		discard; diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 4fe2f1551e..67bac1f7c2 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -254,9 +254,13 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); +	/*setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma);  	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); -	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma); +	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma);*/ + +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));  }  vec3 atmosLighting(vec3 light) @@ -332,7 +336,14 @@ void main()  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); +	float light_gamma = 1.0/1.3; +	da = pow(da, light_gamma); + +  	vec4 diffuse = texture2DRect(diffuseRect, tc); + +	//convert to gamma space +	diffuse.rgb = pow(diffuse.rgb, vec3(1.0/2.2));  	vec3 col;  	float bloom = 0.0; @@ -340,7 +351,12 @@ void main()  		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);  		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +		scol_ambocc = pow(scol_ambocc, vec2(light_gamma)); +  		float scol = max(scol_ambocc.r, diffuse.a);  + +		 +  		float ambocc = scol_ambocc.g;  		calcAtmospherics(pos.xyz, ambocc); @@ -353,7 +369,7 @@ void main()  		col.rgb *= ambient; -		col += atmosAffectDirectionalLight(max(min(da, scol) * 2.6, 0.0)); +		col += atmosAffectDirectionalLight(max(min(da, scol), 0.0));  		col *= diffuse.rgb; @@ -374,30 +390,27 @@ void main()  		} -		col = mix(col.rgb, pow(diffuse.rgb, vec3(1.0/2.2)), diffuse.a); -		 -		 +		col = mix(col, diffuse.rgb, diffuse.a); +  		if (envIntensity > 0.0)  		{ //add environmentmap  			vec3 env_vec = env_mat * refnormpersp; -			float exponent = mix(2.2, 1.0, diffuse.a); -			vec3 refcol = pow(textureCube(environmentMap, env_vec).rgb, vec3(exponent))*exponent; +			vec3 refcol = textureCube(environmentMap, env_vec).rgb;  			col = mix(col.rgb, refcol,   				envIntensity);    		} - -		float exponent = mix(1.0, 2.2, diffuse.a); -		col = pow(col, vec3(exponent)); -				 +						  		if (norm.w < 0.5)  		{  			col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a);  			col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);  		} +		col = pow(col, vec3(2.2)); +  		//col = vec3(1,0,1);  		//col.g = envIntensity;  	} diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index bdb713d682..fc0e6b2388 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -178,9 +178,9 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = trans_center.xyz-pos.xyz; -	float dist2 = dot(lv,lv); -	dist2 /= size; -	if (dist2 > 1.0) +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0)  	{  		discard;  	} @@ -212,8 +212,10 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = falloff+1.0; -	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); -	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; +  	if (dist_atten <= 0.0)  	{  		discard; diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index 8fd06c7e2f..d174805cc0 100755 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -54,7 +54,6 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y;  uniform vec4 glow; -uniform float global_gamma;  void calcAtmospherics(vec3 inPositionEye) { @@ -132,9 +131,9 @@ void calcAtmospherics(vec3 inPositionEye) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); -	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); -	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma); +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));  	// vary_SunlitColor = vec3(0);  	// vary_AmblitColor = vec3(0); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index b47fe9d4b1..8d3539d297 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1,3 +1,4 @@ +  /**    * @file llmeshrepository.cpp   * @brief Mesh repository implementation. diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 6638b6640d..9e97790df8 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1498,6 +1498,8 @@ BOOL LLSpatialGroup::rebound()  	if (mOctreeNode->getChildCount() == 1 && mOctreeNode->getElementCount() == 0)  	{  		LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(0)->getListener(0); + +		//rebound single child  		group->rebound();  		//copy single child's bounding box @@ -1506,10 +1508,11 @@ BOOL LLSpatialGroup::rebound()  		mExtents[0] = group->mExtents[0];  		mExtents[1] = group->mExtents[1]; +		//treat this node as a "chute" to a deeper level of the tree  		group->setState(SKIP_FRUSTUM_CHECK);  	}  	else if (mOctreeNode->isLeaf()) -	{ //copy object bounding box if this is a leaf +	{ //copy object bounding box if this is a leaf   		boundObjects(TRUE, mExtents[0], mExtents[1]);  		mBounds[0] = mObjectBounds[0];  		mBounds[1] = mObjectBounds[1]; @@ -1518,14 +1521,17 @@ BOOL LLSpatialGroup::rebound()  	{  		LLVector4a& newMin = mExtents[0];  		LLVector4a& newMax = mExtents[1]; +		 +		//get bounding box of first child  		LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(0)->getListener(0);  		group->clearState(SKIP_FRUSTUM_CHECK);  		group->rebound(); +  		//initialize to first child  		newMin = group->mExtents[0];  		newMax = group->mExtents[1]; -		//first, rebound children +		//rebound remaining children, expanding bounding box to encompass children  		for (U32 i = 1; i < mOctreeNode->getChildCount(); i++)  		{  			group = (LLSpatialGroup*) mOctreeNode->getChild(i)->getListener(0); @@ -2506,7 +2512,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)  	}  } -void pushBufferVerts(LLSpatialGroup* group, U32 mask) +void pushBufferVerts(LLSpatialGroup* group, U32 mask, bool push_alpha = true)  {  	if (group->mSpatialPartition->mRenderByGroup)  	{ @@ -2515,7 +2521,10 @@ void pushBufferVerts(LLSpatialGroup* group, U32 mask)  			LLDrawInfo* params = *(group->mDrawMap.begin()->second.begin());  			LLRenderPass::applyModelMatrix(*params); -			pushBufferVerts(group->mVertexBuffer, mask); +			if (push_alpha) +			{ +				pushBufferVerts(group->mVertexBuffer, mask); +			}  			for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i)  			{ @@ -2529,10 +2538,10 @@ void pushBufferVerts(LLSpatialGroup* group, U32 mask)  			}  		}  	} -	else +	/*else  	{ -		drawBox(group->mBounds[0], group->mBounds[1]); -	} +		//drawBox(group->mBounds[0], group->mBounds[1]); +	}*/  }  void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) @@ -2705,18 +2714,54 @@ void renderOctree(LLSpatialGroup* group)  //	drawBoxOutline(LLVector3(node->getCenter()), LLVector3(node->getSize()));  } +std::set<LLSpatialGroup*> visible_selected_groups; +  void renderVisibility(LLSpatialGroup* group, LLCamera* camera)  { -	LLGLEnable blend(GL_BLEND); +	/*LLGLEnable blend(GL_BLEND);  	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	LLGLEnable cull(GL_CULL_FACE); -	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);*/ -	BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() && +	/*BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() &&  							!group->isEmpty(); +  	if (render_objects)  	{ +		LLGLDepthTest depth(GL_TRUE, GL_FALSE); + +		LLGLDisable blend(GL_BLEND); +		gGL.diffuseColor4f(0.f, 0.75f, 0.f,0.5f); +		pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX, false); +		 +		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +		glLineWidth(4.f); +		gGL.diffuseColor4f(0.f, 0.5f, 0.f, 1.f); +		pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX, false); +		glLineWidth(1.f); +		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + +		bool selected = false; +		 +		for (LLSpatialGroup::element_iter iter = group->getDataBegin(); iter != group->getDataEnd(); ++iter) +		{ +			LLDrawable* drawable = *iter; +			if (drawable->getVObj().notNull() && drawable->getVObj()->isSelected()) +			{ +				selected = true; +				break; +			} +		} +		 +		if (selected) +		{ //store for rendering occlusion volume as overlay +			visible_selected_groups.insert(group); +		} +	}*/		 + +	/*if (render_objects) +	{  		LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER);  		gGL.diffuseColor4f(0, 0.5f, 0, 0.5f);  		gGL.diffuseColor4f(0, 0.5f, 0, 0.5f); @@ -2740,6 +2785,59 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)  			gGL.diffuseColor4f(0.f, 0.75f, 0.f,0.5f);  			gGL.diffuseColor4f(0.f, 0.75f, 0.f, 0.5f);  			pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); +		 +			bool selected = false; +		 +			for (LLSpatialGroup::element_iter iter = group->getDataBegin(); iter != group->getDataEnd(); ++iter) +			{ +				LLDrawable* drawable = *iter; +				if (drawable->getVObj().notNull() && drawable->getVObj()->isSelected()) +				{ +					selected = true; +					break; +				} +			} +		 +			if (selected) +			{ //store for rendering occlusion volume as overlay +				visible_selected_groups.insert(group); +			} +		}		 +	}*/ +} + +void renderXRay(LLSpatialGroup* group, LLCamera* camera) +{ +	BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() && +							!group->isEmpty(); +	 +	if (render_objects) +	{ +		pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX, false); + +		bool selected = false; + +		for (LLSpatialGroup::element_iter iter = group->getDataBegin(); iter != group->getDataEnd(); ++iter) +		{ +			LLDrawable* drawable = *iter; +			if (drawable->getVObj().notNull() && drawable->getVObj()->isSelected()) +			{ +				selected = true; +				break; +			} +		} + +		if (selected) +		{ //store for rendering occlusion volume as overlay + +			if (!group->mSpatialPartition->isBridge()) +			{ +				visible_selected_groups.insert(group); +			} +			else +			{ +				visible_selected_groups.insert(group->mSpatialPartition->asBridge()->getSpatialGroup()); +			}  		}  	}  } @@ -4226,6 +4324,48 @@ public:  	}  }; +class LLOctreeRenderXRay : public LLOctreeTraveler<LLDrawable> +{ +public: +	LLCamera* mCamera; +	LLOctreeRenderXRay(LLCamera* camera): mCamera(camera) {} +	 +	virtual void traverse(const LLSpatialGroup::OctreeNode* node) +	{ +		LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0); +		 +		if (!mCamera || mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1])) +		{ +			node->accept(this); +			stop_glerror(); + +			for (U32 i = 0; i < node->getChildCount(); i++) +			{ +				traverse(node->getChild(i)); +				stop_glerror(); +			} +			 +			//render visibility wireframe +			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION)) +			{ +				group->rebuildGeom(); +				group->rebuildMesh(); + +				gGL.flush(); +				gGL.pushMatrix(); +				gGLLastMatrix = NULL; +				gGL.loadMatrix(gGLModelView); +				renderXRay(group, mCamera); +				stop_glerror(); +				gGLLastMatrix = NULL; +				gGL.popMatrix(); +			} +		} +	} + +	virtual void visit(const LLSpatialGroup::OctreeNode* node) {} + +};  class LLOctreeRenderPhysicsShapes : public LLOctreeTraveler<LLDrawable>  { @@ -4453,6 +4593,26 @@ void LLSpatialPartition::renderDebug()  	LLOctreeRenderNonOccluded render_debug(camera);  	render_debug.traverse(mOctree); + +	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION)) +	{ +		{ +			LLGLEnable cull(GL_CULL_FACE); +			 +			LLGLEnable blend(GL_BLEND); +			LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER); +			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +			gGL.diffuseColor4f(0.5f, 0.0f, 0, 0.25f); + +			LLGLEnable offset(GL_POLYGON_OFFSET_LINE); +			glPolygonOffset(-1.f, -1.f); + +			LLOctreeRenderXRay xray(camera); +			xray.traverse(mOctree); + +			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +		} +	}  	if (LLGLSLShader::sNoFixedFunction)  	{  		gDebugProgram.unbind(); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index b07fe39e37..f90b35a7bd 100755 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -673,6 +673,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		static LLCullResult result;  		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; +		LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;  		gPipeline.updateCull(*LLViewerCamera::getInstance(), result, water_clip);  		stop_glerror(); @@ -879,7 +880,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		//}  		LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE; -		 +  		LLGLState::checkStates();  		LLGLState::checkClientArrays(); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index b9e0847935..e24237522a 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -93,6 +93,8 @@ LLGLSLShader	gTwoTextureAddProgram;  LLGLSLShader	gOneTextureNoColorProgram;  LLGLSLShader	gDebugProgram;  LLGLSLShader	gClipProgram; +LLGLSLShader	gDownsampleDepthProgram; +LLGLSLShader	gDownsampleDepthRectProgram;  LLGLSLShader	gAlphaMaskProgram;  //object shaders @@ -702,6 +704,8 @@ void LLViewerShaderMgr::unloadShaders()  	gOcclusionCubeProgram.unload();  	gDebugProgram.unload();  	gClipProgram.unload(); +	gDownsampleDepthProgram.unload(); +	gDownsampleDepthRectProgram.unload();  	gAlphaMaskProgram.unload();  	gUIProgram.unload();  	gPathfindingProgram.unload(); @@ -3003,6 +3007,26 @@ BOOL LLViewerShaderMgr::loadShadersInterface()  	if (success)  	{ +		gDownsampleDepthProgram.mName = "DownsampleDepth Shader"; +		gDownsampleDepthProgram.mShaderFiles.clear(); +		gDownsampleDepthProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); +		gDownsampleDepthProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDownsampleDepthProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gDownsampleDepthProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gDownsampleDepthRectProgram.mName = "DownsampleDepthRect Shader"; +		gDownsampleDepthRectProgram.mShaderFiles.clear(); +		gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); +		gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthRectF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDownsampleDepthRectProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gDownsampleDepthRectProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gAlphaMaskProgram.mName = "Alpha Mask Shader";  		gAlphaMaskProgram.mShaderFiles.clear();  		gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 8c7de05062..438853cd6f 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -230,6 +230,8 @@ extern LLGLSLShader			gSplatTextureRectProgram;  extern LLGLSLShader			gGlowCombineFXAAProgram;  extern LLGLSLShader			gDebugProgram;  extern LLGLSLShader			gClipProgram; +extern LLGLSLShader			gDownsampleDepthProgram; +extern LLGLSLShader			gDownsampleDepthRectProgram;  //output tex0[tc0] + tex1[tc1]  extern LLGLSLShader			gTwoTextureAddProgram; @@ -322,6 +324,7 @@ extern LLGLSLShader			gWLCloudProgram;  extern LLGLSLShader			gPostColorFilterProgram;  extern LLGLSLShader			gPostNightVisionProgram; +  // Deferred rendering shaders  extern LLGLSLShader			gDeferredImpostorProgram;  extern LLGLSLShader			gDeferredWaterProgram; @@ -369,7 +372,6 @@ extern LLGLSLShader			gDeferredSkinnedFullbrightShinyProgram;  extern LLGLSLShader			gDeferredSkinnedFullbrightProgram;  extern LLGLSLShader			gNormalMapGenProgram; -  // Deferred materials shaders  extern LLGLSLShader			gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 77a7d22ea3..e6385dceea 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3523,7 +3523,12 @@ F32 LLVOVolume::getBinRadius()  	}  	else if (mDrawable->isStatic())  	{ -		radius = llmax((S32) mDrawable->getRadius(), 1)*size_factor; +		F32 szf = size_factor; + +		radius = llmax(mDrawable->getRadius(), szf); +		 +		radius = powf(radius, 1.f+szf/radius); +  		radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];  		radius += mDrawable->mDistanceWRTCamera * distance_factor[0];  	} diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 9afb74bb52..0a518f8f78 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -280,7 +280,7 @@ std::string gPoolNames[] =  	"POOL_ALPHA"  }; -void drawBox(const LLVector3& c, const LLVector3& r); +void drawBox(const LLVector4a& c, const LLVector4a& r);  void drawBoxOutline(const LLVector3& pos, const LLVector3& size);  U32 nhpo2(U32 v);  LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage); @@ -931,9 +931,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		S32 shadow_detail = RenderShadowDetail;  		BOOL ssao = RenderDeferredSSAO; +		const U32 occlusion_divisor = 3; +  		//allocate deferred rendering color buffers  		if (!mDeferredScreen.allocate(resX, resY, GL_SRGB8_ALPHA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!mOcclusionDepth.allocate(resX/occlusion_divisor, resY/occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!addDeferredAttachments(mDeferredScreen)) return false;  		GLuint screenFormat = GL_RGBA16; @@ -974,6 +977,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			for (U32 i = 0; i < 4; i++)  			{  				if (!mShadow[i].allocate(sun_shadow_map_width,U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_TEXTURE)) return false; +				if (!mShadowOcclusion[i].allocate(mShadow[i].getWidth()/occlusion_divisor, mShadow[i].getHeight()/occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_TEXTURE)) return false;  			}  		}  		else @@ -981,6 +985,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			for (U32 i = 0; i < 4; i++)  			{  				mShadow[i].release(); +				mShadowOcclusion[i].release();  			}  		} @@ -993,6 +998,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			for (U32 i = 4; i < 6; i++)  			{  				if (!mShadow[i].allocate(spot_shadow_map_width, height, 0, TRUE, FALSE)) return false; +				if (!mShadowOcclusion[i].allocate(mShadow[i].getWidth()/occlusion_divisor, mShadow[i].getHeight()/occlusion_divisor, 0, TRUE, FALSE)) return false;  			}  		}  		else @@ -1000,6 +1006,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			for (U32 i = 4; i < 6; i++)  			{  				mShadow[i].release(); +				mShadowOcclusion[i].release();  			}  		} @@ -1016,11 +1023,13 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		for (U32 i = 0; i < 6; i++)  		{  			mShadow[i].release(); +			mShadowOcclusion[i].release();  		}  		mFXAABuffer.release();  		mScreen.release();  		mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first  		mDeferredDepth.release(); +		mOcclusionDepth.release();  		if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;		  	} @@ -1399,6 +1408,8 @@ void LLPipeline::createLUTBuffers()  			//LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_UNSIGNED_BYTE, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false);  			gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);  			gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); +			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  			delete [] ls;  		} @@ -2432,7 +2443,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	if (to_texture)  	{ -		mScreen.bindTarget(); +		if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender) +		{ +			mOcclusionDepth.bindTarget(); +		} +		else +		{ +			mScreen.bindTarget(); +		}  	}  	if (sUseOcclusion > 1) @@ -2570,7 +2588,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	if (to_texture)  	{ -		mScreen.flush(); +		if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender) +		{ +			mOcclusionDepth.flush(); +		} +		else +		{ +			mScreen.flush(); +		}  	}  } @@ -2638,6 +2663,73 @@ void LLPipeline::markOccluder(LLSpatialGroup* group)  	}  } +void LLPipeline::downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space) +{ +	LLGLSLShader* last_shader = LLGLSLShader::sCurBoundShaderPtr; + +	LLGLSLShader* shader = NULL; + +	if (scratch_space) +	{ +		scratch_space->copyContents(source,  +									0, 0, source.getWidth(), source.getHeight(),  +									0, 0, scratch_space->getWidth(), scratch_space->getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); +	} + +	dest.bindTarget(); +	dest.clear(GL_DEPTH_BUFFER_BIT); + +	LLStrider<LLVector3> vert;  +	mDeferredVB->getVertexStrider(vert); +	LLStrider<LLVector2> tc0; +		 +	vert[0].set(-1,1,0); +	vert[1].set(-1,-3,0); +	vert[2].set(3,1,0); +	 +	if (source.getUsage() == LLTexUnit::TT_RECT_TEXTURE) +	{ +		shader = &gDownsampleDepthRectProgram; +		shader->bind(); +		shader->uniform2f("delta", 1.f, 1.f); +		shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, source.getWidth(), source.getHeight()); +	} +	else +	{ +		shader = &gDownsampleDepthProgram; +		shader->bind(); +		shader->uniform2f("delta", 1.f/source.getWidth(), 1.f/source.getHeight()); +		shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, 1.f, 1.f); +	} + +	gGL.getTexUnit(0)->bind(scratch_space ? scratch_space : &source, TRUE); + +	{ +		LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); +		mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +		mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); +	} +	 +	dest.flush(); +	 +	if (last_shader) +	{ +		last_shader->bind(); +	} +	else +	{ +		shader->unbind(); +	} +} + +void LLPipeline::doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space) +{ +	downsampleDepthBuffer(source, dest, scratch_space); +	dest.bindTarget(); +	doOcclusion(camera); +	dest.flush(); +} +  void LLPipeline::doOcclusion(LLCamera& camera)  {  	if (LLPipeline::sUseOcclusion > 1 && sCull->hasOcclusionGroups()) @@ -4550,7 +4642,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  	gGL.setColorMask(true, false);  } -void LLPipeline::renderGeomPostDeferred(LLCamera& camera) +void LLPipeline::renderGeomPostDeferred(LLCamera& camera, bool do_occlusion)  {  	LLFastTimer t(FTM_POST_DEFERRED_POOLS);  	U32 cur_type = 0; @@ -4565,7 +4657,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  	gGL.setColorMask(true, false);  	pool_set_t::iterator iter1 = mPools.begin(); -	BOOL occlude = LLPipeline::sUseOcclusion > 1; +	BOOL occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion;  	while ( iter1 != mPools.end() )  	{ @@ -4579,7 +4671,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  			gGLLastMatrix = NULL;  			gGL.loadMatrix(gGLModelView);  			LLGLSLShader::bindNoShader(); -			doOcclusion(camera); +			doOcclusion(camera, mScreen, mOcclusionDepth, &mDeferredDepth);  			gGL.setColorMask(true, false);  		} @@ -4785,6 +4877,7 @@ void LLPipeline::renderPhysicsDisplay()  	mPhysicsDisplay.flush();  } +extern std::set<LLSpatialGroup*> visible_selected_groups;  void LLPipeline::renderDebug()  { @@ -5195,6 +5288,27 @@ void LLPipeline::renderDebug()  		}  	} +	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION) && LLGLSLShader::sNoFixedFunction) +	{ //render visible selected group occlusion geometry +		gDebugProgram.bind(); +		LLGLDepthTest depth(GL_TRUE, GL_FALSE); +		gGL.diffuseColor3f(1,0,1); +		for (std::set<LLSpatialGroup*>::iterator iter = visible_selected_groups.begin(); iter != visible_selected_groups.end(); ++iter) +		{ +			LLSpatialGroup* group = *iter; + +			LLVector4a fudge; +			fudge.splat(0.25f); //SG_OCCLUSION_FUDGE + +			LLVector4a size; +			size.setAdd(fudge, group->mBounds[1]); + +			drawBox(group->mBounds[0], size); +		} +	} + +	visible_selected_groups.clear(); +  	if (LLGLSLShader::sNoFixedFunction)  	{  		gUIProgram.bind(); @@ -5849,9 +5963,9 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)  		if (LLPipeline::sRenderDeferred)  		{ -			diffuse.mV[0] = powf(diffuse.mV[0], 2.2f); +			/*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); +			diffuse.mV[2] = powf(diffuse.mV[2], 2.2f);*/  		}  		mHWLightColors[1] = diffuse; @@ -5896,9 +6010,9 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)  		if (LLPipeline::sRenderDeferred)  		{ -			backlight_diffuse.mV[0] = powf(backlight_diffuse.mV[0], 2.2f); +			/*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); +			backlight_diffuse.mV[2] = powf(backlight_diffuse.mV[2], 2.2f);*/  		}  		mHWLightColors[1] = backlight_diffuse; @@ -6110,9 +6224,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  		if (LLPipeline::sRenderDeferred)  		{ -			light_diffuse.mV[0] = powf(light_diffuse.mV[0], 2.2f); +			/*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); +			light_diffuse.mV[2] = powf(light_diffuse.mV[2], 2.2f);*/  		}  		mHWLightColors[0] = light_diffuse; @@ -6185,9 +6299,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			if (LLPipeline::sRenderDeferred)  			{ -				light_color.mV[0] = powf(light_color.mV[0], 2.2f); +				/*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); +				light_color.mV[2] = powf(light_color.mV[2], 2.2f);*/  			}  			mHWLightColors[cur_light] = light_color; @@ -6200,7 +6314,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			if (sRenderDeferred)  			{  				F32 size = light_radius*1.5f; -				light_state->setLinearAttenuation(size*size); +				light_state->setLinearAttenuation(size);  				light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);  			}  			else @@ -6265,9 +6379,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  		if (LLPipeline::sRenderDeferred)  		{ -			light_color.mV[0] = powf(light_color.mV[0], 2.2f); +			/*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); +			light_color.mV[2] = powf(light_color.mV[2], 2.2f);*/  		}  		mHWLightColors[2] = light_color; @@ -8270,11 +8384,7 @@ void LLPipeline::renderDeferredLighting()  		LLStrider<LLVector3> vert;   		mDeferredVB->getVertexStrider(vert); -		LLStrider<LLVector2> tc0; -		LLStrider<LLVector2> tc1; -		mDeferredVB->getTexCoord0Strider(tc0); -		mDeferredVB->getTexCoord1Strider(tc1); - +		  		vert[0].set(-1,1,0);  		vert[1].set(-1,-3,0);  		vert[2].set(3,1,0); @@ -8455,7 +8565,7 @@ void LLPipeline::renderDeferredLighting()  										LLPipeline::END_RENDER_TYPES); -			renderGeomPostDeferred(*LLViewerCamera::getInstance()); +			renderGeomPostDeferred(*LLViewerCamera::getInstance(), false);  			gPipeline.popRenderTypeMask();  		} @@ -8549,13 +8659,13 @@ void LLPipeline::renderDeferredLighting()  								continue;  							} -							col.mV[0] = powf(col.mV[0], 2.2f); +							/*col.mV[0] = powf(col.mV[0], 2.2f);  							col.mV[1] = powf(col.mV[1], 2.2f); -							col.mV[2] = powf(col.mV[2], 2.2f); +							col.mV[2] = powf(col.mV[2], 2.2f);*/  							LLFastTimer ftm(FTM_LOCAL_LIGHTS);  							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); -							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); +							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);  							gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);  							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);  							gGL.syncMatrices(); @@ -8576,7 +8686,7 @@ void LLPipeline::renderDeferredLighting()  						glh::vec3f tc(c);  						mat.mult_matrix_vec(tc); -						fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s*s)); +						fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s));  						light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f));  					}  				} @@ -8609,12 +8719,12 @@ void LLPipeline::renderDeferredLighting()  					setupSpotLight(gDeferredSpotLightProgram, drawablep);  					LLColor3 col = volume->getLightColor(); -					col.mV[0] = powf(col.mV[0], 2.2f); +					/*col.mV[0] = powf(col.mV[0], 2.2f);  					col.mV[1] = powf(col.mV[1], 2.2f); -					col.mV[2] = powf(col.mV[2], 2.2f); +					col.mV[2] = powf(col.mV[2], 2.2f);*/  					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); -					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); +					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);  					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);  					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);  					gGL.syncMatrices(); @@ -8661,11 +8771,11 @@ void LLPipeline::renderDeferredLighting()  					col[count] = light_colors.front();  					light_colors.pop_front(); -					col[count].mV[0] = powf(col[count].mV[0], 2.2f); +					/*col[count].mV[0] = powf(col[count].mV[0], 2.2f);  					col[count].mV[1] = powf(col[count].mV[1], 2.2f); -					col[count].mV[2] = powf(col[count].mV[2], 2.2f); +					col[count].mV[2] = powf(col[count].mV[2], 2.2f);*/ -					far_z = llmin(light[count].mV[2]-sqrtf(light[count].mV[3]), far_z); +					far_z = llmin(light[count].mV[2]-light[count].mV[3], far_z);  					//col[count] = pow4fsrgb(col[count], 2.2f);  					count++;  					if (count == max_count || fullscreen_lights.empty()) @@ -8708,12 +8818,12 @@ void LLPipeline::renderDeferredLighting()  					LLColor3 col = volume->getLightColor(); -					col.mV[0] = powf(col.mV[0], 2.2f); +					/*col.mV[0] = powf(col.mV[0], 2.2f);  					col.mV[1] = powf(col.mV[1], 2.2f); -					col.mV[2] = powf(col.mV[2], 2.2f); +					col.mV[2] = powf(col.mV[2], 2.2f);*/  					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); -					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); +					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);  					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);  					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);  					mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -9389,9 +9499,15 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  		gDeferredShadowCubeProgram.bind();  	} +	LLRenderTarget& occlusion_target = mShadowOcclusion[LLViewerCamera::sCurCameraID-1]; + +	occlusion_target.bindTarget();  	updateCull(shadow_cam, result); +	occlusion_target.flush(); +  	stateSort(shadow_cam, result); +	  	//generate shadow map  	gGL.matrixMode(LLRender::MM_PROJECTION);  	gGL.pushMatrix(); @@ -9479,7 +9595,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	gDeferredShadowCubeProgram.bind();  	gGLLastMatrix = NULL;  	gGL.loadMatrix(gGLModelView); -	doOcclusion(shadow_cam); + +	LLRenderTarget& occlusion_source = mShadow[LLViewerCamera::sCurCameraID-1]; + +	doOcclusion(shadow_cam, occlusion_source, occlusion_target);  	if (use_shader)  	{ diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0f2a807f7a..f0bebbe20d 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -177,6 +177,12 @@ public:  	// Object related methods  	void        markVisible(LLDrawable *drawablep, LLCamera& camera);  	void		markOccluder(LLSpatialGroup* group); + +	//downsample source to dest, taking the maximum depth value per pixel in source and writing to dest +	// if source's depth buffer cannot be bound for reading, a scratch space depth buffer must be provided +	void		downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL); + +	void		doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);  	void		doOcclusion(LLCamera& camera);  	void		markNotCulled(LLSpatialGroup* group, LLCamera &camera);  	void        markMoved(LLDrawable *drawablep, BOOL damped_motion = FALSE); @@ -282,7 +288,7 @@ public:  	void renderGeom(LLCamera& camera, BOOL forceVBOUpdate = FALSE);  	void renderGeomDeferred(LLCamera& camera); -	void renderGeomPostDeferred(LLCamera& camera); +	void renderGeomPostDeferred(LLCamera& camera, bool do_occlusion=true);  	void renderGeomShadow(LLCamera& camera);  	void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, U32 noise_map = 0xFFFFFFFF);  	void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep); @@ -610,6 +616,7 @@ public:  	LLRenderTarget			mFXAABuffer;  	LLRenderTarget			mEdgeMap;  	LLRenderTarget			mDeferredDepth; +	LLRenderTarget			mOcclusionDepth;  	LLRenderTarget			mDeferredLight;  	LLRenderTarget			mHighlight;  	LLRenderTarget			mPhysicsDisplay; @@ -622,6 +629,7 @@ public:  	//sun shadow map  	LLRenderTarget			mShadow[6]; +	LLRenderTarget			mShadowOcclusion[6];  	std::vector<LLVector3>	mShadowFrustPoints[4];  	LLVector4				mShadowError;  	LLVector4				mShadowFOV; diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 35451c9621..53a3e732ca 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -172,7 +172,7 @@ class ViewerManifest(LLManifest):      def app_name(self):          app_suffix='Test'          channel_type=self.channel_lowerword() -        if channel_type == 'release' : +        if channel_type.startswith('release') :              app_suffix='Viewer'          elif re.match('^(beta|project).*',channel_type) :              app_suffix=self.channel_unique() @@ -182,8 +182,8 @@ class ViewerManifest(LLManifest):          icon_path="icons/"          channel_type=self.channel_lowerword()          print "Icon channel type '%s'" % channel_type -        if channel_type == 'release' : -            icon_path += channel_type +        if channel_type.startswith('release') : +            icon_path += 'release'          elif re.match('^beta.*',channel_type) :              icon_path += 'beta'          elif re.match('^project.*',channel_type) : @@ -242,7 +242,7 @@ class WindowsManifest(ViewerManifest):      def final_exe(self):          app_suffix="Test"          channel_type=self.channel_lowerword() -        if channel_type == 'release' : +        if channel_type.startswith('release') :              app_suffix=''          elif re.match('^(beta|project).*',channel_type) :              app_suffix=''.join(self.channel_unique().split()) | 
