diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b9464276..dfc171a22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor): * Fixed crashes when Lara is on a vehicle unreachable by friendly NPCs. * Removed legacy TR5 search object code which caused issues with meshswaps. * Removed excessive HK nerfing in running state. +* Optimized weather particle rendering. ### Lua API changes * Added `View.PlayVideo`, `View.StopVideo`, and other helper functions for the video playback. diff --git a/TombEngine/Game/effects/weather.h b/TombEngine/Game/effects/weather.h index b112554ff..f540a8983 100644 --- a/TombEngine/Game/effects/weather.h +++ b/TombEngine/Game/effects/weather.h @@ -9,7 +9,7 @@ using namespace TEN::Entities::Effects; namespace TEN::Effects::Environment { constexpr auto WEATHER_PARTICLE_SPAWN_DENSITY = 32; - constexpr auto WEATHER_PARTICLE_COUNT_MAX = 2048; + constexpr auto WEATHER_PARTICLE_COUNT_MAX = 4096; constexpr auto WEATHER_PARTICLE_COLL_CHECK_DELAY_MAX = 5.0f; constexpr auto DUST_SIZE_MAX = 25.0f; diff --git a/TombEngine/Renderer/RendererDrawEffect.cpp b/TombEngine/Renderer/RendererDrawEffect.cpp index 05502ba10..5d3c748e9 100644 --- a/TombEngine/Renderer/RendererDrawEffect.cpp +++ b/TombEngine/Renderer/RendererDrawEffect.cpp @@ -1028,6 +1028,12 @@ namespace TEN::Renderer if (!part.Enabled) continue; + auto pos = Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()); + auto size = Lerp(part.PrevSize, part.Size, GetInterpolationFactor()); + + if (!view.Camera.Frustum.SphereInFrustum(pos, size)) + continue; + switch (part.Type) { case WeatherType::None: @@ -1037,9 +1043,9 @@ namespace TEN::Renderer AddSpriteBillboard( &_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], - Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()), + pos, Color(1.0f, 1.0f, 1.0f, part.Transparency()), - 0.0f, 1.0f, Vector2(Lerp(part.PrevSize, part.Size, GetInterpolationFactor())), + 0.0f, 1.0f, Vector2(size), BlendMode::Additive, true, view); break; @@ -1051,9 +1057,9 @@ namespace TEN::Renderer AddSpriteBillboard( &_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], - Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()), + pos, Color(1.0f, 1.0f, 1.0f, part.Transparency()), - 0.0f, 1.0f, Vector2(Lerp(part.PrevSize, part.Size, GetInterpolationFactor())), + 0.0f, 1.0f, Vector2(size), BlendMode::Additive, true, view); break; @@ -1068,10 +1074,10 @@ namespace TEN::Renderer AddSpriteBillboardConstrained( &_sprites[Objects[ID_DRIP_SPRITE].meshIndex], - Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()), + pos, Color(0.8f, 1.0f, 1.0f, part.Transparency()), 0.0f, 1.0f, - Vector2(RAIN_WIDTH, Lerp(part.PrevSize, part.Size, GetInterpolationFactor())), + Vector2(RAIN_WIDTH, size), BlendMode::Additive, -v, true, view); break;