From bd8386459a843bd7260cf382305a601a1e06240d Mon Sep 17 00:00:00 2001
From: AnyOldName3 <krizdjali@gmail.com>
Date: Wed, 25 Sep 2024 16:14:19 +0100
Subject: [PATCH] Fix inventory doll when ripple fragment shader path is used

Basically don't abuse OSG as badly. We need to let it know we've bound a shader program so it doesn't assume the FFP is still used, but it doesn't have a built-in way to apply the uniforms when doing so, so we need to do it manually.
---
 apps/openmw/mwrender/ripples.cpp | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/apps/openmw/mwrender/ripples.cpp b/apps/openmw/mwrender/ripples.cpp
index 08a96d4b1b..bb8248217a 100644
--- a/apps/openmw/mwrender/ripples.cpp
+++ b/apps/openmw/mwrender/ripples.cpp
@@ -206,8 +206,14 @@ namespace MWRender
         };
 
         // PASS: Blot in all ripple spawners
+        state.pushStateSet(frameState.mStateset);
+        state.apply();
         state.applyAttribute(mProgramBlobber);
-        state.apply(frameState.mStateset);
+        for (const auto& [name, stack] : state.getUniformMap())
+        {
+            if (!stack.uniformVec.empty())
+                state.getLastAppliedProgramObject()->apply(*(stack.uniformVec.back().first));
+        }
 
         if (mUseCompute)
         {
@@ -226,7 +232,11 @@ namespace MWRender
 
         // PASS: Wave simulation
         state.applyAttribute(mProgramSimulation);
-        state.apply(frameState.mStateset);
+        for (const auto& [name, stack] : state.getUniformMap())
+        {
+            if (!stack.uniformVec.empty())
+                state.getLastAppliedProgramObject()->apply(*(stack.uniformVec.back().first));
+        }
 
         if (mUseCompute)
         {
@@ -242,6 +252,8 @@ namespace MWRender
             state.applyTextureAttribute(0, mTextures[1]);
             osg::Geometry::drawImplementation(renderInfo);
         }
+
+        state.popStateSet();
     }
 
     osg::Texture* RipplesSurface::getColorTexture() const