diff options
| -rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolavatar.h | 4 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 27 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.h | 2 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 4 | 
5 files changed, 106 insertions, 29 deletions
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index c4581b2c78..4b7de97101 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -53,8 +53,9 @@  static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;  static U32 sBufferUsage = GL_STREAM_DRAW_ARB;  static U32 sShaderLevel = 0; -static LLGLSLShader* sVertexProgram = NULL; + +LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;  BOOL	LLDrawPoolAvatar::sSkipOpaque = FALSE;  BOOL	LLDrawPoolAvatar::sSkipTransparent = FALSE; @@ -176,6 +177,9 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)  	case 2:  		beginDeferredSkinned();  		break; +	case 3: +		beginDeferredRigged(); +		break;  	}  } @@ -202,6 +206,8 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)  	case 2:  		endDeferredSkinned();  		break; +	case 3: +		endDeferredRigged();  	}  } @@ -248,41 +254,58 @@ void LLDrawPoolAvatar::renderPostDeferred(S32 pass)  S32 LLDrawPoolAvatar::getNumShadowPasses()  { -	return 1; +	return 2;  }  void LLDrawPoolAvatar::beginShadowPass(S32 pass)  {  	LLFastTimer t(FTM_SHADOW_AVATAR); -	sVertexProgram = &gDeferredAvatarShadowProgram; -	if (sShaderLevel > 0) + +	if (pass == 0)  	{ -		gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; -	} -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f); -	 -	glColor4f(1,1,1,1); +		sVertexProgram = &gDeferredAvatarShadowProgram; +		if (sShaderLevel > 0) +		{ +			gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; +		} +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f); +		 +		glColor4f(1,1,1,1); -	if ((sShaderLevel > 0))  // for hardware blending +		if ((sShaderLevel > 0))  // for hardware blending +		{ +			sRenderingSkinned = TRUE; +			sVertexProgram->bind(); +			enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); +		} +	} +	else  	{ -		sRenderingSkinned = TRUE; +		sVertexProgram = &gDeferredAttachmentShadowProgram;  		sVertexProgram->bind(); -		enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); +		LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);  	} -  }  void LLDrawPoolAvatar::endShadowPass(S32 pass)  {  	LLFastTimer t(FTM_SHADOW_AVATAR); -	if (sShaderLevel > 0) +	if (pass == 0)  	{ -		sRenderingSkinned = FALSE; +		if (sShaderLevel > 0) +		{ +			sRenderingSkinned = FALSE; +			sVertexProgram->unbind(); +			disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); +		} +	} +	else +	{ +		LLVertexBuffer::unbind();  		sVertexProgram->unbind(); -		disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); +		LLVertexBuffer::sWeight4Loc = -1; +		sVertexProgram = NULL;  	} - -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  }  void LLDrawPoolAvatar::renderShadow(S32 pass) @@ -312,13 +335,19 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)  		return;  	} -	if (sShaderLevel > 0) +	if (pass == 0)  	{ -		gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; -	} - -	avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); +		if (sShaderLevel > 0) +		{ +			gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; +		} +		avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); +	} +	else +	{ +		avatarp->renderSkinnedAttachments(); +	}  }  S32 LLDrawPoolAvatar::getNumPasses() @@ -578,7 +607,7 @@ void LLDrawPoolAvatar::endSkinned()  void LLDrawPoolAvatar::beginRigged()  { -	sVertexProgram = NULL; +	sVertexProgram = &gSkinnedObjectSimpleProgram;  	gSkinnedObjectSimpleProgram.bind();  	LLVertexBuffer::sWeight4Loc = gSkinnedObjectSimpleProgram.getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);  } @@ -591,6 +620,21 @@ void LLDrawPoolAvatar::endRigged()  	LLVertexBuffer::sWeight4Loc = -1;  } +void LLDrawPoolAvatar::beginDeferredRigged() +{ +	sVertexProgram = &gDeferredSkinnedDiffuseProgram; +	sVertexProgram->bind(); +	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT); +} + +void LLDrawPoolAvatar::endDeferredRigged() +{ +	LLVertexBuffer::unbind(); +	sVertexProgram->unbind(); +	LLVertexBuffer::sWeight4Loc = -1; +	sVertexProgram = NULL; +} +  void LLDrawPoolAvatar::beginDeferredSkinned()  {  	sShaderLevel = mVertexShaderLevel; @@ -893,16 +937,16 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const  		glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));  		glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD0])); -		set_vertex_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT])); +		set_vertex_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));  		if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)  		{ -			set_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL])); +			set_binormals(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));  		}  		if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)  		{ -			set_vertex_clothing_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT])); +			set_vertex_clothing_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));  		}  	}  	else diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 45f694ccd9..b42cc54622 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -36,6 +36,7 @@  #include "lldrawpool.h"  class LLVOAvatar; +class LLGLSLShader;  class LLDrawPoolAvatar : public LLFacePool  { @@ -100,10 +101,12 @@ public:  	void beginDeferredImpostor();  	void beginDeferredRigid();  	void beginDeferredSkinned(); +	void beginDeferredRigged();  	void endDeferredImpostor();  	void endDeferredRigid();  	void endDeferredSkinned(); +	void endDeferredRigged();  	/*virtual*/ LLViewerTexture *getDebugTexture();  	/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display @@ -112,6 +115,7 @@ public:  	static BOOL sSkipOpaque;  	static BOOL sSkipTransparent; +	static LLGLSLShader* sVertexProgram;  };  class LLVertexBufferAvatar : public LLVertexBuffer diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 8a68dd6ea7..d978e856a6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -110,6 +110,7 @@ LLGLSLShader			gDeferredImpostorProgram;  LLGLSLShader			gDeferredEdgeProgram;  LLGLSLShader			gDeferredWaterProgram;  LLGLSLShader			gDeferredDiffuseProgram; +LLGLSLShader			gDeferredSkinnedDiffuseProgram;  LLGLSLShader			gDeferredBumpProgram;  LLGLSLShader			gDeferredTerrainProgram;  LLGLSLShader			gDeferredTreeProgram; @@ -124,6 +125,7 @@ LLGLSLShader			gDeferredBlurLightProgram;  LLGLSLShader			gDeferredSoftenProgram;  LLGLSLShader			gDeferredShadowProgram;  LLGLSLShader			gDeferredAvatarShadowProgram; +LLGLSLShader			gDeferredAttachmentShadowProgram;  LLGLSLShader			gDeferredAlphaProgram;  LLGLSLShader			gDeferredFullbrightProgram;  LLGLSLShader			gDeferredGIProgram; @@ -575,6 +577,7 @@ void LLViewerShaderMgr::unloadShaders()  	gPostNightVisionProgram.unload();  	gDeferredDiffuseProgram.unload(); +	gDeferredSkinnedDiffuseProgram.unload();  	mVertexShaderLevel[SHADER_LIGHTING] = 0;  	mVertexShaderLevel[SHADER_OBJECT] = 0; @@ -889,6 +892,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredTreeProgram.unload();  		gDeferredDiffuseProgram.unload(); +		gDeferredSkinnedDiffuseProgram.unload();  		gDeferredBumpProgram.unload();  		gDeferredImpostorProgram.unload();  		gDeferredTerrainProgram.unload(); @@ -901,6 +905,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSoftenProgram.unload();  		gDeferredShadowProgram.unload();  		gDeferredAvatarShadowProgram.unload(); +		gDeferredAttachmentShadowProgram.unload();  		gDeferredAvatarProgram.unload();  		gDeferredAvatarAlphaProgram.unload();  		gDeferredAlphaProgram.unload(); @@ -931,6 +936,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader"; +		gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true; +		gDeferredSkinnedDiffuseProgram.mShaderFiles.clear(); +		gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDeferredBumpProgram.mName = "Deferred Bump Shader";  		gDeferredBumpProgram.mShaderFiles.clear();  		gDeferredBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1106,6 +1122,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredAttachmentShadowProgram.mName = "Deferred Attachment Shadow Shader"; +		gDeferredAttachmentShadowProgram.mFeatures.hasObjectSkinning = true; +		gDeferredAttachmentShadowProgram.mShaderFiles.clear(); +		gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gTerrainProgram.mName = "Deferred Terrain Shader";  		gDeferredTerrainProgram.mShaderFiles.clear();  		gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 83a650cdbc..b279a59777 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -346,6 +346,7 @@ extern LLGLSLShader			gDeferredImpostorProgram;  extern LLGLSLShader			gDeferredEdgeProgram;  extern LLGLSLShader			gDeferredWaterProgram;  extern LLGLSLShader			gDeferredDiffuseProgram; +extern LLGLSLShader			gDeferredSkinnedDiffuseProgram;  extern LLGLSLShader			gDeferredBumpProgram;  extern LLGLSLShader			gDeferredTerrainProgram;  extern LLGLSLShader			gDeferredTreeProgram; @@ -363,6 +364,7 @@ extern LLGLSLShader			gDeferredShadowProgram;  extern LLGLSLShader			gDeferredPostGIProgram;  extern LLGLSLShader			gDeferredPostProgram;  extern LLGLSLShader			gDeferredAvatarShadowProgram; +extern LLGLSLShader			gDeferredAttachmentShadowProgram;  extern LLGLSLShader			gDeferredAlphaProgram;  extern LLGLSLShader			gDeferredFullbrightProgram;  extern LLGLSLShader			gDeferredAvatarAlphaProgram; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index e2650d22b0..7cdbebf4d1 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3742,11 +3742,11 @@ U32 LLVOAvatar::renderSkinnedAttachments()  										}  									} -									gSkinnedObjectSimpleProgram.uniformMatrix4fv("matrixPalette",  +									LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette",   										skin->mJointNames.size(),  										FALSE,  										(GLfloat*) mat[0].mMatrix); -									gSkinnedObjectSimpleProgram.uniformMatrix4fv("matrixPalette[0]",  +									LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette[0]",   										skin->mJointNames.size(),  										FALSE,  										(GLfloat*) mat[0].mMatrix);  | 
