summaryrefslogtreecommitdiff
path: root/indra/newview/lldrawpoolwater.cpp
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2025-02-07 05:55:47 -0500
committerGitHub <noreply@github.com>2025-02-07 05:55:47 -0500
commit93a88e602545828c0298b20ff0375f191d1f6d9a (patch)
treecb098bfa5eeb4b0d784a9ed6aec3b5fe7f1a0245 /indra/newview/lldrawpoolwater.cpp
parent317cd6e66e65256eda6441c06fa32e55eee99fa3 (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.cpp48
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);