diff options
| author | Graham Linden <graham@lindenlab.com> | 2013-07-10 09:56:22 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2013-07-10 09:56:22 -0700 | 
| commit | d7856f09999206be489183f52ae2f33020a68538 (patch) | |
| tree | a5ee5e01e05510fc98d979b197f76448bca9717e /indra | |
| parent | 326e20b0e5cd8e30d4b52c662a29aa2fc816b40d (diff) | |
| parent | cb013b54c27257e25e429267fe0ea041a61bb6f8 (diff) | |
Merge
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/pipeline.cpp | 502 | ||||
| -rwxr-xr-x | indra/newview/pipeline.h | 2 | 
2 files changed, 2 insertions, 502 deletions
| diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e9fb94239e..a44cc73678 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8729,7 +8729,7 @@ void LLPipeline::renderDeferredLighting()  						//unbindDeferredShader(gDeferredMultiLightProgram[idx]);  					}  				} - +				  				unbindDeferredShader(gDeferredMultiLightProgram[0]);  				bindDeferredShader(gDeferredMultiSpotLightProgram); @@ -8893,503 +8893,6 @@ void LLPipeline::renderDeferredLighting()  } -void LLPipeline::renderDeferredLightingToRenderTarget(LLRenderTarget* render_target) -{ -	if (!sCull) -	{ -		return; -	} - -	{ -		LLFastTimer ftm(FTM_RENDER_DEFERRED); - -		LLViewerCamera* camera = LLViewerCamera::getInstance(); -		{ -			LLGLDepthTest depth(GL_TRUE); -			mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), -							0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);	 -		} - -		LLGLEnable multisample(0); - -		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) -		{ -			gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); -		} - -		//ati doesn't seem to love actually using the stencil buffer on FBO's -		LLGLDisable stencil(GL_STENCIL_TEST); -		//glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); -		//glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - -		gGL.setColorMask(true, true); -		 -		//draw a cube around every light -		LLVertexBuffer::unbind(); - -		LLGLEnable cull(GL_CULL_FACE); -		LLGLEnable blend(GL_BLEND); - -		glh::matrix4f mat = glh_copy_matrix(gGLModelView); - -		LLStrider<LLVector3> vert;  -		mDeferredVB->getVertexStrider(vert); -		 -		vert[0].set(-1,1,0); -		vert[1].set(-1,-3,0); -		vert[2].set(3,1,0); -		 -		{ -			setupHWLights(NULL); //to set mSunDir; -			LLVector4 dir(mSunDir, 0.f); -			glh::vec4f tc(dir.mV); -			mat.mult_matrix_vec(tc); -			mTransformedSunDir.set(tc.v); -		} - -		gGL.pushMatrix(); -		gGL.loadIdentity(); -		gGL.matrixMode(LLRender::MM_PROJECTION); -		gGL.pushMatrix(); -		gGL.loadIdentity(); - -		stop_glerror(); -		gGL.popMatrix(); -		stop_glerror(); -		gGL.matrixMode(LLRender::MM_MODELVIEW); -		stop_glerror(); -		gGL.popMatrix(); -		stop_glerror(); - -		render_target = render_target ? render_target : &mScreen; - -		llassert(render_target); - -		render_target->bindTarget(); - -		// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky -		glClearColor(0,0,0,0); -		render_target->clear(GL_COLOR_BUFFER_BIT); -		 -		if (RenderDeferredAtmospheric) -		{ //apply sunlight contribution  -			LLFastTimer ftm(FTM_ATMOSPHERICS); -			bindDeferredShader(LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram);	 -			{ -				LLGLDepthTest depth(GL_FALSE); -				LLGLDisable blend(GL_BLEND); -				LLGLDisable test(GL_ALPHA_TEST); - -				//full screen blit -				gGL.pushMatrix(); -				gGL.loadIdentity(); -				gGL.matrixMode(LLRender::MM_PROJECTION); -				gGL.pushMatrix(); -				gGL.loadIdentity(); - -				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -				 -				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); - -				gGL.popMatrix(); -				gGL.matrixMode(LLRender::MM_MODELVIEW); -				gGL.popMatrix(); -			} - -			unbindDeferredShader(LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram); -		} - -		{ //render non-deferred geometry (fullbright, alpha, etc) -			LLGLDisable blend(GL_BLEND); -			LLGLDisable stencil(GL_STENCIL_TEST); -			gGL.setSceneBlendType(LLRender::BT_ALPHA); - -			gPipeline.pushRenderTypeMask(); -			 -			gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, -										LLPipeline::RENDER_TYPE_CLOUDS, -										LLPipeline::RENDER_TYPE_WL_SKY, -										LLPipeline::END_RENDER_TYPES); -								 -			 -			renderGeomPostDeferred(*LLViewerCamera::getInstance(), false); -			gPipeline.popRenderTypeMask(); -		} - -		BOOL render_local = RenderLocalLights; -				 -		if (render_local) -		{ -			gGL.setSceneBlendType(LLRender::BT_ADD); -			std::list<LLVector4> fullscreen_lights; -			LLDrawable::drawable_list_t spot_lights; -			LLDrawable::drawable_list_t fullscreen_spot_lights; - -			for (U32 i = 0; i < 2; i++) -			{ -				mTargetShadowSpotLight[i] = NULL; -			} - -			std::list<LLVector4> light_colors; - -			LLVertexBuffer::unbind(); - -			{ -				bindDeferredShader(gDeferredLightProgram); -				 -				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) -				{ -					LLDrawable* drawablep = *iter; -					 -					LLVOVolume* volume = drawablep->getVOVolume(); -					if (!volume) -					{ -						continue; -					} - -					if (volume->isAttachment()) -					{ -						if (!sRenderAttachedLights) -						{ -							continue; -						} -					} - - -					LLVector4a center; -					center.load3(drawablep->getPositionAgent().mV); -					const F32* c = center.getF32ptr(); -					F32 s = volume->getLightRadius()*1.5f; - -					LLColor3 col = volume->getLightColor(); -					 -					if (col.magVecSquared() < 0.001f) -					{ -						continue; -					} - -					if (s <= 0.001f) -					{ -						continue; -					} - -					LLVector4a sa; -					sa.splat(s); -					if (camera->AABBInFrustumNoFarClip(center, sa) == 0) -					{ -						continue; -					} - -					sVisibleLightCount++; -										 -					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 || -						camera->getOrigin().mV[1] < c[1] - s - 0.2f || -						camera->getOrigin().mV[2] > c[2] + s + 0.2f || -						camera->getOrigin().mV[2] < c[2] - s - 0.2f) -					{ //draw box if camera is outside box -						if (render_local) -						{ -							if (volume->isLightSpotlight()) -							{ -								drawablep->getVOVolume()->updateSpotLightPriority(); -								spot_lights.push_back(drawablep); -								continue; -							} -							 -							/*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);*/ -							 -							LLFastTimer ftm(FTM_LOCAL_LIGHTS); -							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); -							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(); -							 -							mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center)); -							stop_glerror(); -						} -					} -					else -					{	 -						if (volume->isLightSpotlight()) -						{ -							drawablep->getVOVolume()->updateSpotLightPriority(); -							fullscreen_spot_lights.push_back(drawablep); -							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)); -						light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f)); -					} -				} -				unbindDeferredShader(gDeferredLightProgram); -			} - -			if (!spot_lights.empty()) -			{ -				LLGLDepthTest depth(GL_TRUE, GL_FALSE); -				bindDeferredShader(gDeferredSpotLightProgram); - -				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - -				gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); - -				for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter) -				{ -					LLFastTimer ftm(FTM_PROJECTORS); -					LLDrawable* drawablep = *iter; - -					LLVOVolume* volume = drawablep->getVOVolume(); - -					LLVector4a center; -					center.load3(drawablep->getPositionAgent().mV); -					const F32* c = center.getF32ptr(); -					F32 s = volume->getLightRadius()*1.5f; - -					sVisibleLightCount++; - -					setupSpotLight(gDeferredSpotLightProgram, drawablep); -					 -					LLColor3 col = volume->getLightColor(); -					/*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);*/ -					 -					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); -					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(); -										 -					mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center)); -				} -				gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); -				unbindDeferredShader(gDeferredSpotLightProgram); -			} - -			//reset mDeferredVB to fullscreen triangle -			mDeferredVB->getVertexStrider(vert); -			vert[0].set(-1,1,0); -			vert[1].set(-1,-3,0); -			vert[2].set(3,1,0); - -			{ -				bindDeferredShader(gDeferredMultiLightProgram[0]); -			 -				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - -				LLGLDepthTest depth(GL_FALSE); - -				//full screen blit -				gGL.pushMatrix(); -				gGL.loadIdentity(); -				gGL.matrixMode(LLRender::MM_PROJECTION); -				gGL.pushMatrix(); -				gGL.loadIdentity(); - -				U32 count = 0; - -				const U32 max_count = 8; -				LLVector4 light[max_count]; -				LLVector4 col[max_count]; - -				F32 far_z = 0.f; - -				while (!fullscreen_lights.empty()) -				{ -					LLFastTimer ftm(FTM_FULLSCREEN_LIGHTS); -					light[count] = fullscreen_lights.front(); -					fullscreen_lights.pop_front(); -					col[count] = light_colors.front(); -					light_colors.pop_front(); -					 -					/*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);*/ -					 -					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()) -					{ -						U32 idx = count-1; -						bindDeferredShader(gDeferredMultiLightProgram[idx]); - -						gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count); -						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light); -						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col); -						gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z); -						far_z = 0.f; -						count = 0;  -						mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -						mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); - -						// This "seems necessary"...ask davep if it's automagical -						// -						//unbindDeferredShader(gDeferredMultiLightProgram[idx]); -					} -				} - -				unbindDeferredShader(gDeferredMultiLightProgram[0]); - -				bindDeferredShader(gDeferredMultiSpotLightProgram); - -				gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); - -				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - -				for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter) -				{ -					LLFastTimer ftm(FTM_PROJECTORS); -					LLDrawable* drawablep = *iter; -					 -					LLVOVolume* volume = drawablep->getVOVolume(); - -					LLVector3 center = drawablep->getPositionAgent(); -					F32* c = center.mV; -					F32 s = volume->getLightRadius()*1.5f; - -					sVisibleLightCount++; - -					glh::vec3f tc(c); -					mat.mult_matrix_vec(tc); -					 -					setupSpotLight(gDeferredMultiSpotLightProgram, drawablep); - -					LLColor3 col = volume->getLightColor(); -					 -					/*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);*/ -					 -					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); -					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); -				} - -				gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); -				unbindDeferredShader(gDeferredMultiSpotLightProgram); - -				gGL.popMatrix(); -				gGL.matrixMode(LLRender::MM_MODELVIEW); -				gGL.popMatrix(); -			} -		} - -		gGL.setColorMask(true, true); -	} - -	render_target->flush(); - -	//gamma correct lighting -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.pushMatrix(); -	gGL.loadIdentity(); -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.pushMatrix(); -	gGL.loadIdentity(); - -	{ -		LLGLDepthTest depth(GL_FALSE, GL_FALSE); - -		LLVector2 tc1(0,0); -		LLVector2 tc2((F32) render_target->getWidth()*2,(F32) render_target->getHeight()*2); - -		render_target->bindTarget(); -		// Apply gamma correction to the frame here. -		gDeferredPostGammaCorrectProgram.bind(); -		//mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -		S32 channel = 0; -		channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, render_target->getUsage()); -		if (channel > -1) -		{ -			render_target->bindTexture(0,channel); -			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); -		} -		 -		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); -		 -		F32 gamma = 1.0f/1.8f; - -		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); -		 -		gGL.begin(LLRender::TRIANGLE_STRIP); -		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); -		gGL.vertex2f(-1,-1); -		 -		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); -		gGL.vertex2f(-1,3); -		 -		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); -		gGL.vertex2f(3,-1); -		 -		gGL.end(); -		 -		gGL.getTexUnit(channel)->unbind(render_target->getUsage()); -		gDeferredPostGammaCorrectProgram.unbind(); -		render_target->flush(); -	} - -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.popMatrix(); -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.popMatrix();	 - -	render_target->bindTarget(); - -	{ //render non-deferred geometry (alpha, fullbright, glow) -		LLGLDisable blend(GL_BLEND); -		LLGLDisable stencil(GL_STENCIL_TEST); - -		pushRenderTypeMask(); -		andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, -						 LLPipeline::RENDER_TYPE_FULLBRIGHT, -						 LLPipeline::RENDER_TYPE_VOLUME, -						 LLPipeline::RENDER_TYPE_GLOW, -						 LLPipeline::RENDER_TYPE_BUMP, -						 LLPipeline::RENDER_TYPE_PASS_SIMPLE, -						 LLPipeline::RENDER_TYPE_PASS_ALPHA, -						 LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, -						 LLPipeline::RENDER_TYPE_PASS_BUMP, -						 LLPipeline::RENDER_TYPE_PASS_POST_BUMP, -						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, -						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, -						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, -						 LLPipeline::RENDER_TYPE_PASS_GLOW, -						 LLPipeline::RENDER_TYPE_PASS_GRASS, -						 LLPipeline::RENDER_TYPE_PASS_SHINY, -						 LLPipeline::RENDER_TYPE_PASS_INVISIBLE, -						 LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, -						 LLPipeline::RENDER_TYPE_AVATAR, -						 LLPipeline::RENDER_TYPE_ALPHA_MASK, -						 LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, -						 END_RENDER_TYPES); -		 -		renderGeomPostDeferred(*LLViewerCamera::getInstance()); -		popRenderTypeMask(); -	} - -	render_target->flush(); -						 -} -  void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)  {  	//construct frustum @@ -11663,6 +11166,3 @@ void LLPipeline::restoreHiddenObject( const LLUUID& id )  	}  } - - - diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index a8ad16b8fb..2f0fc3491d 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -288,7 +288,6 @@ public:  	void unbindDeferredShader(LLGLSLShader& shader);  	void renderDeferredLighting(); -	void renderDeferredLightingToRenderTarget(LLRenderTarget* render_target);  	void generateWaterReflection(LLCamera& camera);  	void generateSunShadow(LLCamera& camera); @@ -955,3 +954,4 @@ extern BOOL gDebugPipeline;  extern const LLMatrix4* gGLLastMatrix;  #endif + | 
