diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl | 5 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl | 10 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 31 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 78 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 3 | 
6 files changed, 72 insertions, 57 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index a5e04fba57..899446e283 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -42,12 +42,13 @@ uniform sampler2DRect depthMap;  uniform vec3 env_mat[3];  uniform float sun_wash; -uniform vec3 center;  uniform vec3 color;  uniform float falloff;  uniform float size;  VARYING vec4 vary_fragcoord; +VARYING vec3 trans_center; +  uniform vec2 screen_res;  uniform mat4 inv_proj; @@ -74,7 +75,7 @@ void main()  	frag.xy *= screen_res;  	vec3 pos = getPosition(frag.xy).xyz; -	vec3 lv = center.xyz-pos; +	vec3 lv = trans_center.xyz-pos;  	float dist2 = dot(lv,lv);  	dist2 /= size;  	if (dist2 > 1.0) diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl index cb14e6d4e8..9491421236 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl @@ -24,16 +24,22 @@   */  uniform mat4 modelview_projection_matrix; +uniform mat4 modelview_matrix;  ATTRIBUTE vec3 position; +uniform vec3 center; +uniform float size; +  VARYING vec4 vary_fragcoord; +VARYING vec3 trans_center;  void main()  {  	//transform vertex -	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); +	vec3 p = position*sqrt(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;  	gl_Position = pos;  } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 06604fba6f..10cdea1c09 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -280,6 +280,37 @@ U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)  	return (U8*) (sOcclusionIndices+cypher*8);  } +//create a vertex buffer for efficiently rendering cubes +LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage) +{ +	LLVertexBuffer* ret = new LLVertexBuffer(type_mask, usage); + +	ret->allocateBuffer(8, 64, true); + +	LLStrider<LLVector3> pos; +	LLStrider<U16> idx; + +	ret->getVertexStrider(pos); +	ret->getIndexStrider(idx); + +	pos[0] = LLVector3(-1,-1,-1); +	pos[1] = LLVector3(-1,-1, 1); +	pos[2] = LLVector3(-1, 1,-1); +	pos[3] = LLVector3(-1, 1, 1); +	pos[4] = LLVector3( 1,-1,-1); +	pos[5] = LLVector3( 1,-1, 1); +	pos[6] = LLVector3( 1, 1,-1); +	pos[7] = LLVector3( 1, 1, 1); + +	for (U32 i = 0; i < 64; i++) +	{ +		idx[i] = sOcclusionIndices[i]; +	} + +	ret->flush(); + +	return ret; +}  static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion"); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 485e3af62d..ca4e1c4b62 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1272,7 +1272,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";  		gDeferredMultiSpotLightProgram.mShaderFiles.clear(); -		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a76a32f834..aff3b3fb26 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -268,6 +268,7 @@ std::string gPoolNames[] =  void drawBox(const LLVector3& c, const LLVector3& r);  void drawBoxOutline(const LLVector3& pos, const LLVector3& size);  U32 nhpo2(U32 v); +LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage);  glh::matrix4f glh_copy_matrix(F32* src)  { @@ -510,6 +511,11 @@ void LLPipeline::init()  		mSpotLightFade[i] = 1.f;  	} +	if (mCubeVB.isNull()) +	{ +		mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB); +	} +  	mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);  	mDeferredVB->allocateBuffer(8, 0, true);  	setLightingDetail(-1); @@ -6321,6 +6327,8 @@ void LLPipeline::doResetVertexBuffers()  	mResetVertexBuffers = false; +	mCubeVB = NULL; +  	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();   			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  	{ @@ -7556,12 +7564,17 @@ void LLPipeline::renderDeferredLighting()  			std::list<LLVector4> light_colors;  			LLVertexBuffer::unbind(); -			LLVector4a* v = (LLVector4a*) vert.get();  			{  				bindDeferredShader(gDeferredLightProgram); -				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				 +				if (mCubeVB.isNull()) +				{ +					mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB); +				} +				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				  				LLGLDepthTest depth(GL_TRUE, GL_FALSE);  				for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)  				{ @@ -7607,25 +7620,7 @@ void LLPipeline::renderDeferredLighting()  					}  					sVisibleLightCount++; - -					glh::vec3f tc(c); -					mat.mult_matrix_vec(tc); -					 -					//vertex positions are encoded so the 3 bits of their vertex index  -					//correspond to their axis facing, with bit position 3,2,1 matching -					//axis facing x,y,z, bit set meaning positive facing, bit clear  -					//meaning negative facing -					mDeferredVB->getVertexStrider(vert); -					v[0].set(c[0]-s,c[1]-s,c[2]-s);  // 0 - 0000  -					v[1].set(c[0]-s,c[1]-s,c[2]+s);  // 1 - 0001 -					v[2].set(c[0]-s,c[1]+s,c[2]-s);  // 2 - 0010 -					v[3].set(c[0]-s,c[1]+s,c[2]+s);  // 3 - 0011 -																									    -					v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100 -					v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101 -					v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110 -					v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111 - +										  					if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||  						camera->getOrigin().mV[0] < c[0] - s - 0.2f ||  						camera->getOrigin().mV[1] > c[1] + s + 0.2f || @@ -7643,16 +7638,13 @@ void LLPipeline::renderDeferredLighting()  							}  							LLFastTimer ftm(FTM_LOCAL_LIGHTS); -							//glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s); -							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); +							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);  							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);  							gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);  							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f); -							//gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);  							gGL.syncMatrices(); -							mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -							glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -								GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center)); +							 +							mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));  							stop_glerror();  						}  					} @@ -7665,6 +7657,9 @@ void LLPipeline::renderDeferredLighting()  							continue;  						} +						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));  						light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f));  					} @@ -7677,7 +7672,7 @@ void LLPipeline::renderDeferredLighting()  				LLGLDepthTest depth(GL_TRUE, GL_FALSE);  				bindDeferredShader(gDeferredSpotLightProgram); -				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);  				gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); @@ -7695,36 +7690,17 @@ void LLPipeline::renderDeferredLighting()  					sVisibleLightCount++; -					glh::vec3f tc(c); -					mat.mult_matrix_vec(tc); -					  					setupSpotLight(gDeferredSpotLightProgram, drawablep);  					LLColor3 col = volume->getLightColor(); -					//vertex positions are encoded so the 3 bits of their vertex index  -					//correspond to their axis facing, with bit position 3,2,1 matching -					//axis facing x,y,z, bit set meaning positive facing, bit clear  -					//meaning negative facing -					mDeferredVB->getVertexStrider(vert); -					v[0].set(c[0]-s,c[1]-s,c[2]-s);  // 0 - 0000  -					v[1].set(c[0]-s,c[1]-s,c[2]+s);  // 1 - 0001 -					v[2].set(c[0]-s,c[1]+s,c[2]-s);  // 2 - 0010 -					v[3].set(c[0]-s,c[1]+s,c[2]+s);  // 3 - 0011 -																									    -					v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100 -					v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101 -					v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110 -					v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111 -					 -					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); +					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);  					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);  					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);  					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);  					gGL.syncMatrices(); -					mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -					glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -							GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center)); +										 +					mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));  				}  				gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);  				unbindDeferredShader(gDeferredSpotLightProgram); @@ -7756,8 +7732,6 @@ void LLPipeline::renderDeferredLighting()  				LLVector4 light[max_count];  				LLVector4 col[max_count]; -//				glVertexPointer(2, GL_FLOAT, 0, vert); -  				F32 far_z = 0.f;  				while (!fullscreen_lights.empty()) diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 9eebe3831f..060116dff7 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -542,6 +542,9 @@ public:  	//utility buffer for rendering post effects, gets abused by renderDeferredLighting  	LLPointer<LLVertexBuffer> mDeferredVB; +	//utility buffer for rendering cubes, 8 vertices are corners of a cube [-1, 1] +	LLPointer<LLVertexBuffer> mCubeVB; +  	//sun shadow map  	LLRenderTarget			mShadow[6];  	std::vector<LLVector3>	mShadowFrustPoints[4]; | 
