diff options
author | Jonathan "Geenz" Goodman <geenz@lindenlab.com> | 2025-02-07 05:55:47 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-07 05:55:47 -0500 |
commit | 93a88e602545828c0298b20ff0375f191d1f6d9a (patch) | |
tree | cb098bfa5eeb4b0d784a9ed6aec3b5fe7f1a0245 /indra/newview/lldrawpoolwater.cpp | |
parent | 317cd6e66e65256eda6441c06fa32e55eee99fa3 (diff) |
Water Exclusion Surfaces (#3517)
* #3455 Add support for water exclusion surfaces
Diffstat (limited to 'indra/newview/lldrawpoolwater.cpp')
-rw-r--r-- | indra/newview/lldrawpoolwater.cpp | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 53d6e528b6..c27f5ef486 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -236,6 +236,8 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) gGL.getTexUnit(bumpTex2)->bind(tex_b); } + shader->bindTexture(LLShaderMgr::WATER_EXCLUSIONTEX, &gPipeline.mWaterExclusionMask); + // bind reflection texture from RenderTarget S32 screentex = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX); @@ -307,30 +309,11 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) LLGLDisable cullface(GL_CULL_FACE); - LLVOWater* water = nullptr; - for (LLFace* const& face : mDrawFace) - { - if (!face) continue; - water = static_cast<LLVOWater*>(face->getViewerObject()); - if (!water) continue; - - if ((bool)edge == (bool)water->getIsEdgePatch()) - { - face->renderIndexed(); - - // Note non-void water being drawn, updates required - if (!edge) // SL-16461 remove !LLPipeline::sUseOcclusion check - { - sNeedsReflectionUpdate = true; - sNeedsDistortionUpdate = true; - } - } - } + pushWaterPlanes(edge); shader->disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); shader->disableTexture(LLShaderMgr::WATER_SCREENTEX); shader->disableTexture(LLShaderMgr::BUMP_MAP); - shader->disableTexture(LLShaderMgr::WATER_REFTEX); // clean up gPipeline.unbindDeferredShader(*shader); @@ -345,6 +328,31 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) gGL.setColorMask(true, false); } +void LLDrawPoolWater::pushWaterPlanes(int pass) +{ + LLVOWater* water = nullptr; + for (LLFace* const& face : mDrawFace) + { + if (!face) + continue; + water = static_cast<LLVOWater*>(face->getViewerObject()); + if (!water) + continue; + + if ((bool)pass == (bool)water->getIsEdgePatch()) + { + face->renderIndexed(); + + // Note non-void water being drawn, updates required + if (!pass) // SL-16461 remove !LLPipeline::sUseOcclusion check + { + sNeedsReflectionUpdate = true; + sNeedsDistortionUpdate = true; + } + } + } +} + LLViewerTexture *LLDrawPoolWater::getDebugTexture() { return LLViewerTextureManager::getFetchedTexture(IMG_SMOKE); |