From aeacabee5139700db51d0e85f85c5c7d65848106 Mon Sep 17 00:00:00 2001 From: Um-Yeah-No Date: Sat, 17 Oct 2026 03:18:32 +1000 Subject: [PATCH 1/5] Document level.set_rain_wetness --- gamedata/scripts/lua_help_ex.script | 1 + 1 file changed, 1 insertion(+) diff --git a/gamedata/scripts/lua_help_ex.script b/gamedata/scripts/lua_help_ex.script index c4810e70e0..4a581727c4 100644 --- a/gamedata/scripts/lua_help_ex.script +++ b/gamedata/scripts/lua_help_ex.script @@ -583,6 +583,7 @@ float get_weather_weight() void set_weather_weight(float) void set_weather_smooth(string) + void set_rain_wetness(float) // 0 to 1, read with level.rain_wetness() // Camera, position is x,y,z vector, direction is head,pitch,roll vector in RADIANS void set_cam_custom_position_direction(Fvector position, Fvector direction, int smoothing, bool hudDraw, bool hudAffect) From 61ee96c029ea80f2784f6f0c371fcbd9d6527905 Mon Sep 17 00:00:00 2001 From: Um-Yeah-No Date: Sat, 17 Oct 2026 03:20:19 +1000 Subject: [PATCH 2/5] Add level.set_rain_wetness --- src/xrGame/level_script.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/xrGame/level_script.cpp b/src/xrGame/level_script.cpp index 52aebcda7c..2643d4f41d 100644 --- a/src/xrGame/level_script.cpp +++ b/src/xrGame/level_script.cpp @@ -384,6 +384,12 @@ float rain_wetness() return (g_pGamePersistent->Environment().wetness_factor); } +void set_rain_wetness(float val) +{ + clamp(val, 0.f, 1.f); + g_pGamePersistent->Environment().wetness_factor = val; +} + float rain_hemi() { CEffect_Rain* rain = g_pGamePersistent->pEnvironment->eff_Rain; @@ -2728,6 +2734,7 @@ void CLevel::script_register(lua_State* L) def("vertex_in_direction", vertex_in_direction), def("rain_factor", rain_factor), def("rain_wetness", rain_wetness), + def("set_rain_wetness", set_rain_wetness), def("rain_hemi", rain_hemi), def("patrol_path_exists", patrol_path_exists), def("vertex_position", vertex_position), From aa4714ec85d8de9123664dfb200f0112cbdb9bf3 Mon Sep 17 00:00:00 2001 From: Um-Yeah-No Date: Sat, 17 Oct 2026 03:21:15 +1000 Subject: [PATCH 3/5] Scale rain wetness by frame time --- src/xrEngine/Environment_misc.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/xrEngine/Environment_misc.cpp b/src/xrEngine/Environment_misc.cpp index 5d5b47735b..400fe37556 100644 --- a/src/xrEngine/Environment_misc.cpp +++ b/src/xrEngine/Environment_misc.cpp @@ -520,10 +520,13 @@ void CEnvDescriptorMixer::lerp(CEnvironment* env, CEnvDescriptor& A, CEnvDescrip sun_color.lerp(A.sun_color, B.sun_color, f); + // frame rate independent, one step per frame at 60 fps + const float wetness_step = Device.fTimeDelta * 60.f; + if (rain_density > 0.f) - env->wetness_factor += ( rain_density * ssfx_wetness_multiplier.x) / 10000.f; + env->wetness_factor += ( rain_density * ssfx_wetness_multiplier.x) / 10000.f * wetness_step; else - env->wetness_factor -= 0.0001f * ssfx_wetness_multiplier.y; + env->wetness_factor -= 0.0001f * ssfx_wetness_multiplier.y * wetness_step; clamp(env->wetness_factor, 0.f, 1.f); From 56cd388b861efc35ad216dbd19ea13d41eeb82fa Mon Sep 17 00:00:00 2001 From: Um-Yeah-No Date: Sat, 17 Oct 2026 05:50:52 +1000 Subject: [PATCH 4/5] Use WETNESS_CHANGE_TIME for wetness rate --- src/xrEngine/Environment_misc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrEngine/Environment_misc.cpp b/src/xrEngine/Environment_misc.cpp index 400fe37556..17f052a764 100644 --- a/src/xrEngine/Environment_misc.cpp +++ b/src/xrEngine/Environment_misc.cpp @@ -16,6 +16,9 @@ extern float ps_r2_sun_shafts_min; extern float ps_r2_sun_shafts_value; extern Fvector3 ssfx_wetness_multiplier; +// seconds to fully wet or dry at multiplier 1 +static const float WETNESS_CHANGE_TIME = 10000.f / 60.f; + void CEnvModifier::load(IReader* fs, u32 version) { use_flags.one(); @@ -520,13 +523,10 @@ void CEnvDescriptorMixer::lerp(CEnvironment* env, CEnvDescriptor& A, CEnvDescrip sun_color.lerp(A.sun_color, B.sun_color, f); - // frame rate independent, one step per frame at 60 fps - const float wetness_step = Device.fTimeDelta * 60.f; - if (rain_density > 0.f) - env->wetness_factor += ( rain_density * ssfx_wetness_multiplier.x) / 10000.f * wetness_step; + env->wetness_factor += rain_density * ssfx_wetness_multiplier.x * Device.fTimeDelta / WETNESS_CHANGE_TIME; else - env->wetness_factor -= 0.0001f * ssfx_wetness_multiplier.y * wetness_step; + env->wetness_factor -= ssfx_wetness_multiplier.y * Device.fTimeDelta / WETNESS_CHANGE_TIME; clamp(env->wetness_factor, 0.f, 1.f); From fc7d3724c12d914f7373ad60de36fa65fab7a557 Mon Sep 17 00:00:00 2001 From: Um-Yeah-No Date: Sat, 17 Oct 2026 08:51:34 +1000 Subject: [PATCH 5/5] Set WETNESS_CHANGE_TIME to 166 seconds --- src/xrEngine/Environment_misc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrEngine/Environment_misc.cpp b/src/xrEngine/Environment_misc.cpp index 17f052a764..40b1f33aa6 100644 --- a/src/xrEngine/Environment_misc.cpp +++ b/src/xrEngine/Environment_misc.cpp @@ -17,7 +17,7 @@ extern float ps_r2_sun_shafts_value; extern Fvector3 ssfx_wetness_multiplier; // seconds to fully wet or dry at multiplier 1 -static const float WETNESS_CHANGE_TIME = 10000.f / 60.f; +static const float WETNESS_CHANGE_TIME = 166.f; void CEnvModifier::load(IReader* fs, u32 version) {