diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index c0a662a6c51ba4fba55dcf857bd27cafa8faf624..c48ec6b6a347e8c561ae3d68e919f171e5e13c1f 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -297,7 +297,15 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha() { sSkipOpaque = TRUE; sShaderLevel = mShaderLevel; - sVertexProgram = &gDeferredAvatarAlphaProgram; + if (LLPipeline::sUnderWaterRender) + { + sVertexProgram = &gDeferredAvatarAlphaWaterProgram; + } + else + { + sVertexProgram = &gDeferredAvatarAlphaProgram; + } + sRenderingSkinned = TRUE; gPipeline.bindDeferredShader(*sVertexProgram); @@ -309,7 +317,15 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha() void LLDrawPoolAvatar::beginDeferredRiggedAlpha() { - sVertexProgram = &gDeferredSkinnedAlphaProgram; + if (LLPipeline::sUnderWaterRender) + { + sVertexProgram = &gDeferredSkinnedAlphaWaterProgram; + } + else + { + sVertexProgram = &gDeferredSkinnedAlphaProgram; + } + gPipeline.bindDeferredShader(*sVertexProgram); sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); gPipeline.enableLightsDynamic(); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e21a7f3b1ff14a1226ba121908cbcb02f4a5c9f4..db4323d1fe76500261f97a7ea9a0fa502bf53349 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -190,6 +190,7 @@ LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; LLGLSLShader gDeferredSkinnedDiffuseProgram; LLGLSLShader gDeferredSkinnedBumpProgram; LLGLSLShader gDeferredSkinnedAlphaProgram; +LLGLSLShader gDeferredSkinnedAlphaWaterProgram; LLGLSLShader gDeferredBumpProgram; LLGLSLShader gDeferredTerrainProgram; LLGLSLShader gDeferredTerrainWaterProgram; @@ -197,6 +198,7 @@ LLGLSLShader gDeferredTreeProgram; LLGLSLShader gDeferredTreeShadowProgram; LLGLSLShader gDeferredAvatarProgram; LLGLSLShader gDeferredAvatarAlphaProgram; +LLGLSLShader gDeferredAvatarAlphaWaterProgram; LLGLSLShader gDeferredLightProgram; LLGLSLShader gDeferredMultiLightProgram[16]; LLGLSLShader gDeferredSpotLightProgram; @@ -317,6 +319,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredAlphaImpostorProgram); mShaderList.push_back(&gDeferredAlphaWaterProgram); mShaderList.push_back(&gDeferredSkinnedAlphaProgram); + mShaderList.push_back(&gDeferredSkinnedAlphaWaterProgram); mShaderList.push_back(&gDeferredFullbrightProgram); mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram); mShaderList.push_back(&gDeferredFullbrightWaterProgram); @@ -330,6 +333,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredUnderWaterProgram); mShaderList.push_back(&gDeferredTerrainWaterProgram); mShaderList.push_back(&gDeferredAvatarAlphaProgram); + mShaderList.push_back(&gDeferredAvatarAlphaWaterProgram); mShaderList.push_back(&gDeferredWLSkyProgram); mShaderList.push_back(&gDeferredWLCloudProgram); mShaderList.push_back(&gDeferredWLMoonProgram); @@ -817,6 +821,7 @@ void LLViewerShaderMgr::unloadShaders() gDeferredSkinnedDiffuseProgram.unload(); gDeferredSkinnedBumpProgram.unload(); gDeferredSkinnedAlphaProgram.unload(); + gDeferredSkinnedAlphaWaterProgram.unload(); mShaderLevel[SHADER_LIGHTING] = 0; mShaderLevel[SHADER_OBJECT] = 0; @@ -1207,6 +1212,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedDiffuseProgram.unload(); gDeferredSkinnedBumpProgram.unload(); gDeferredSkinnedAlphaProgram.unload(); + gDeferredSkinnedAlphaWaterProgram.unload(); gDeferredBumpProgram.unload(); gDeferredImpostorProgram.unload(); gDeferredTerrainProgram.unload(); @@ -1234,6 +1240,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAttachmentAlphaMaskShadowProgram.unload(); gDeferredAvatarProgram.unload(); gDeferredAvatarAlphaProgram.unload(); + gDeferredAvatarAlphaWaterProgram.unload(); gDeferredAlphaProgram.unload(); gDeferredAlphaWaterProgram.unload(); gDeferredFullbrightProgram.unload(); @@ -1446,6 +1453,62 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true; } + if (success) + { + gDeferredSkinnedAlphaWaterProgram.mName = "Deferred Skinned Underwater Alpha Shader"; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasObjectSkinning = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesLighting = false; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasLighting = false; + gDeferredSkinnedAlphaWaterProgram.mFeatures.isAlphaLighting = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.disableTextureIndex = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasSrgb = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.encodesNormal = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesAtmospherics = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasAtmospherics = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasTransport = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasGamma = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasShadows = true; + + gDeferredSkinnedAlphaWaterProgram.mShaderFiles.clear(); + gDeferredSkinnedAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER)); + gDeferredSkinnedAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER)); + gDeferredSkinnedAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + gDeferredSkinnedAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + + gDeferredSkinnedAlphaWaterProgram.clearPermutations(); + gDeferredSkinnedAlphaWaterProgram.addPermutation("USE_DIFFUSE_TEX", "1"); + gDeferredSkinnedAlphaWaterProgram.addPermutation("WATER_FOG", "1"); + gDeferredSkinnedAlphaWaterProgram.addPermutation("HAS_SKIN", "1"); + gDeferredSkinnedAlphaWaterProgram.addPermutation("USE_VERTEX_COLOR", "1"); + + if (use_sun_shadow) + { + gDeferredSkinnedAlphaWaterProgram.addPermutation("HAS_SHADOW", "1"); + } + + if (ambient_kill) + { + gDeferredSkinnedAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1"); + } + + if (sunlight_kill) + { + gDeferredSkinnedAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1"); + } + + if (local_light_kill) + { + gDeferredSkinnedAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); + } + + success = gDeferredSkinnedAlphaWaterProgram.createShader(NULL, NULL); + llassert(success); + + // Hack to include uniforms for lighting without linking in lighting file + gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesLighting = true; + gDeferredSkinnedAlphaWaterProgram.mFeatures.hasLighting = true; + } + if (success) { gDeferredBumpProgram.mName = "Deferred Bump Shader"; @@ -2507,7 +2570,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (success) { - gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader"; + gDeferredAvatarAlphaProgram.mName = "Deferred Avatar Alpha Shader"; gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true; gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false; gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false; @@ -2557,6 +2620,61 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true; } + if (success) + { + gDeferredAvatarAlphaWaterProgram.mName = "Deferred Avatar Underwater Alpha Shader"; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasSkinning = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesLighting = false; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasLighting = false; + gDeferredAvatarAlphaWaterProgram.mFeatures.isAlphaLighting = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.disableTextureIndex = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasSrgb = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.encodesNormal = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesAtmospherics = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasAtmospherics = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasTransport = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasGamma = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.isDeferred = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasShadows = true; + + gDeferredAvatarAlphaWaterProgram.mShaderFiles.clear(); + gDeferredAvatarAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER)); + gDeferredAvatarAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER)); + + gDeferredAvatarAlphaWaterProgram.clearPermutations(); + gDeferredAvatarAlphaWaterProgram.addPermutation("USE_DIFFUSE_TEX", "1"); + gDeferredAvatarAlphaWaterProgram.addPermutation("IS_AVATAR_SKIN", "1"); + gDeferredAvatarAlphaWaterProgram.addPermutation("WATER_FOG", "1"); + + if (use_sun_shadow) + { + gDeferredAvatarAlphaWaterProgram.addPermutation("HAS_SHADOW", "1"); + } + + if (ambient_kill) + { + gDeferredAvatarAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1"); + } + + if (sunlight_kill) + { + gDeferredAvatarAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1"); + } + + if (local_light_kill) + { + gDeferredAvatarAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); + } + gDeferredAvatarAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + gDeferredAvatarAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + + success = gDeferredAvatarAlphaWaterProgram.createShader(NULL, NULL); + llassert(success); + + gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesLighting = true; + gDeferredAvatarAlphaWaterProgram.mFeatures.hasLighting = true; + } + if (success) { gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correction Post Process"; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 5b4b9451a5f3dd763fe281951a18dcae9c3a43b9..26ff76ef3dd5b86d96f116fca24d13d327e2e595 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -273,6 +273,7 @@ extern LLGLSLShader gDeferredNonIndexedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedBumpProgram; extern LLGLSLShader gDeferredSkinnedAlphaProgram; +extern LLGLSLShader gDeferredSkinnedAlphaWaterProgram; extern LLGLSLShader gDeferredBumpProgram; extern LLGLSLShader gDeferredTerrainProgram; extern LLGLSLShader gDeferredTerrainWaterProgram; @@ -313,6 +314,7 @@ extern LLGLSLShader gDeferredFullbrightAlphaMaskWaterProgram; extern LLGLSLShader gDeferredEmissiveProgram; extern LLGLSLShader gDeferredAvatarEyesProgram; extern LLGLSLShader gDeferredAvatarAlphaProgram; +extern LLGLSLShader gDeferredAvatarAlphaWaterProgram; extern LLGLSLShader gDeferredWLSkyProgram; extern LLGLSLShader gDeferredWLCloudProgram; extern LLGLSLShader gDeferredWLSunProgram;