From dec8a284aa0c62fc2dba79fdac9a7ad970685665 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Thu, 25 Dec 2025 01:31:41 +0300 Subject: [PATCH] Improve high wind speed rain/snow behavior (#8864) Enable water ripples and wrap-around Remove rain particle angle random element Simplify disabling rain ripples --- apps/openmw/mwrender/renderingmanager.cpp | 4 +--- apps/openmw/mwrender/sky.cpp | 9 +++------ apps/openmw/mwrender/skyutil.cpp | 2 +- apps/openmw/mwrender/water.cpp | 21 ++------------------- apps/openmw/mwrender/water.hpp | 1 - files/shaders/compatibility/water.frag | 3 +-- 6 files changed, 8 insertions(+), 32 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index c1f9061749..e58bdaa506 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -897,9 +897,7 @@ namespace MWRender mResourceSystem->getSceneManager()->getShaderManager().update(*mViewer); - float rainIntensity = mSky->getPrecipitationAlpha(); - mWater->setRainIntensity(rainIntensity); - mWater->setRainRipplesEnabled(mSky->getRainRipplesEnabled()); + mWater->setRainIntensity(mSky->getRainRipplesEnabled() ? mSky->getPrecipitationAlpha() : 0.f); mWater->update(dt, paused); if (!paused) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 11a79e1301..50df4199d8 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -517,7 +517,7 @@ namespace MWRender bool SkyManager::getRainRipplesEnabled() const { - if (!mEnabled || mIsStorm) + if (!mEnabled) return false; if (hasRain()) @@ -531,10 +531,7 @@ namespace MWRender float SkyManager::getPrecipitationAlpha() const { - if (mEnabled && !mIsStorm && (hasRain() || mParticleNode)) - return mPrecipitationAlpha; - - return 0.f; + return mPrecipitationAlpha; } void SkyManager::update(float duration) @@ -729,7 +726,7 @@ namespace MWRender = static_cast(findPSVisitor.mFoundNodes[i]); osg::ref_ptr program = new osgParticle::ModularProgram; - if (!mIsStorm) + if (occlusionEnabledForEffect) program->addOperator(new WrapAroundOperator(mCamera, defaultWrapRange)); program->addOperator(new WeatherAlphaOperator(mPrecipitationAlpha, false)); program->setParticleSystem(ps); diff --git a/apps/openmw/mwrender/skyutil.cpp b/apps/openmw/mwrender/skyutil.cpp index 8523499a83..5329b86b8b 100644 --- a/apps/openmw/mwrender/skyutil.cpp +++ b/apps/openmw/mwrender/skyutil.cpp @@ -1146,7 +1146,7 @@ namespace MWRender void RainShooter::shoot(osgParticle::Particle* particle) const { particle->setVelocity(mVelocity); - particle->setAngle(osg::Vec3f(-mAngle, 0, (Misc::Rng::rollProbability() * 2 - 1) * osg::PIf)); + particle->setAngle(osg::Vec3f(-mAngle, 0.f, 0.f)); } void RainShooter::setVelocity(const osg::Vec3f& velocity) diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index e6828107a7..23a3a49e4a 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -212,22 +212,15 @@ namespace MWRender class RainSettingsUpdater : public SceneUtil::StateSetUpdater { public: - RainSettingsUpdater() - : mRainIntensity(0.f) - , mEnableRipples(false) - { - } + RainSettingsUpdater() = default; void setRainIntensity(float rainIntensity) { mRainIntensity = rainIntensity; } - void setRipplesEnabled(bool enableRipples) { mEnableRipples = enableRipples; } protected: void setDefaults(osg::StateSet* stateset) override { osg::ref_ptr rainIntensityUniform = new osg::Uniform("rainIntensity", 0.0f); stateset->addUniform(rainIntensityUniform.get()); - osg::ref_ptr enableRainRipplesUniform = new osg::Uniform("enableRainRipples", false); - stateset->addUniform(enableRainRipplesUniform.get()); } void apply(osg::StateSet* stateset, osg::NodeVisitor* /*nv*/) override @@ -235,14 +228,10 @@ namespace MWRender osg::ref_ptr rainIntensityUniform = stateset->getUniform("rainIntensity"); if (rainIntensityUniform != nullptr) rainIntensityUniform->set(mRainIntensity); - osg::ref_ptr enableRainRipplesUniform = stateset->getUniform("enableRainRipples"); - if (enableRainRipplesUniform != nullptr) - enableRainRipplesUniform->set(mEnableRipples); } private: - float mRainIntensity; - bool mEnableRipples; + float mRainIntensity{ 0.f }; }; class Refraction : public SceneUtil::RTTNode @@ -807,12 +796,6 @@ namespace MWRender mRainSettingsUpdater->setRainIntensity(rainIntensity); } - void Water::setRainRipplesEnabled(bool enableRipples) - { - if (mRainSettingsUpdater) - mRainSettingsUpdater->setRipplesEnabled(enableRipples); - } - void Water::update(float dt, bool paused) { if (!paused) diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp index 92299309f0..3194ae955f 100644 --- a/apps/openmw/mwrender/water.hpp +++ b/apps/openmw/mwrender/water.hpp @@ -114,7 +114,6 @@ namespace MWRender void changeCell(const MWWorld::CellStore* store); void setHeight(const float height); void setRainIntensity(const float rainIntensity); - void setRainRipplesEnabled(bool enableRipples); void update(float dt, bool paused); diff --git a/files/shaders/compatibility/water.frag b/files/shaders/compatibility/water.frag index dbf36560b3..384f507156 100644 --- a/files/shaders/compatibility/water.frag +++ b/files/shaders/compatibility/water.frag @@ -80,7 +80,6 @@ uniform float near; uniform float far; uniform float rainIntensity; -uniform bool enableRainRipples; uniform vec2 screenRes; @@ -112,7 +111,7 @@ void main(void) vec4 rainRipple; - if (rainIntensity > 0.01 && enableRainRipples) + if (rainIntensity > 0.01) rainRipple = rainCombined(position.xy/1000.0, waterTimer) * clamp(rainIntensity, 0.0, 1.0); else rainRipple = vec4(0.0);