From 727dfa5c6c8c4e1e673483f2fd5053a3ac62dbc9 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 13 Mar 2026 09:52:23 -0700 Subject: [PATCH] feat: integrate lightning system for storm weather and heavy rain The lightning system (lightning.hpp/cpp) was fully implemented but never wired into the renderer. Connect it now: - Enable lightning during server storm weather (wType==3, intensity>0.1) and heavy rain (wType==1, intensity>0.7) as a bonus visual - Scale lightning intensity proportionally to weather intensity - Render in both parallel (SEC_POST) and fallback rendering paths - Update and shutdown alongside the weather system - Show active lightning info in the performance HUD weather section --- include/rendering/renderer.hpp | 3 +++ src/rendering/performance_hud.cpp | 6 ++++++ src/rendering/renderer.cpp | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/include/rendering/renderer.hpp b/include/rendering/renderer.hpp index a198b0c7..dd727caf 100644 --- a/include/rendering/renderer.hpp +++ b/include/rendering/renderer.hpp @@ -39,6 +39,7 @@ class StarField; class Clouds; class LensFlare; class Weather; +class Lightning; class LightingManager; class SwimEffects; class MountDust; @@ -127,6 +128,7 @@ public: Clouds* getClouds() const { return skySystem ? skySystem->getClouds() : nullptr; } LensFlare* getLensFlare() const { return skySystem ? skySystem->getLensFlare() : nullptr; } Weather* getWeather() const { return weather.get(); } + Lightning* getLightning() const { return lightning.get(); } CharacterRenderer* getCharacterRenderer() const { return characterRenderer.get(); } WMORenderer* getWMORenderer() const { return wmoRenderer.get(); } M2Renderer* getM2Renderer() const { return m2Renderer.get(); } @@ -216,6 +218,7 @@ private: std::unique_ptr clouds; std::unique_ptr lensFlare; std::unique_ptr weather; + std::unique_ptr lightning; std::unique_ptr lightingManager; std::unique_ptr skySystem; // Coordinator for sky rendering std::unique_ptr swimEffects; diff --git a/src/rendering/performance_hud.cpp b/src/rendering/performance_hud.cpp index 1351e715..a5a76ab2 100644 --- a/src/rendering/performance_hud.cpp +++ b/src/rendering/performance_hud.cpp @@ -10,6 +10,7 @@ #include "rendering/clouds.hpp" #include "rendering/lens_flare.hpp" #include "rendering/weather.hpp" +#include "rendering/lightning.hpp" #include "rendering/character_renderer.hpp" #include "rendering/wmo_renderer.hpp" #include "rendering/m2_renderer.hpp" @@ -369,6 +370,11 @@ void PerformanceHUD::render(const Renderer* renderer, const Camera* camera) { ImGui::Text("Intensity: %.0f%%", weather->getIntensity() * 100.0f); } + auto* lightning = renderer->getLightning(); + if (lightning && lightning->isEnabled()) { + ImGui::Text("Lightning: active (%.0f%%)", lightning->getIntensity() * 100.0f); + } + ImGui::Spacing(); } } diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 9f85c3d5..af577ca6 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -12,6 +12,7 @@ #include "rendering/clouds.hpp" #include "rendering/lens_flare.hpp" #include "rendering/weather.hpp" +#include "rendering/lightning.hpp" #include "rendering/lighting_manager.hpp" #include "rendering/sky_system.hpp" #include "rendering/swim_effects.hpp" @@ -699,6 +700,9 @@ bool Renderer::initialize(core::Window* win) { weather = std::make_unique(); weather->initialize(vkCtx, perFrameSetLayout); + lightning = std::make_unique(); + lightning->initialize(vkCtx, perFrameSetLayout); + swimEffects = std::make_unique(); swimEffects->initialize(vkCtx, perFrameSetLayout); @@ -802,6 +806,11 @@ void Renderer::shutdown() { weather.reset(); } + if (lightning) { + lightning->shutdown(); + lightning.reset(); + } + if (swimEffects) { swimEffects->shutdown(); swimEffects.reset(); @@ -942,6 +951,7 @@ void Renderer::applyMsaaChange() { if (characterRenderer) characterRenderer->recreatePipelines(); if (questMarkerRenderer) questMarkerRenderer->recreatePipelines(); if (weather) weather->recreatePipelines(); + if (lightning) lightning->recreatePipelines(); if (swimEffects) swimEffects->recreatePipelines(); if (mountDust) mountDust->recreatePipelines(); if (chargeEffect) chargeEffect->recreatePipelines(); @@ -2863,6 +2873,20 @@ void Renderer::update(float deltaTime) { weather->updateZoneWeather(currentZoneId, deltaTime); } weather->setEnabled(true); + + // Enable lightning during storms (wType==3) and heavy rain + if (lightning) { + uint32_t wType2 = gh->getWeatherType(); + float wInt2 = gh->getWeatherIntensity(); + bool stormActive = (wType2 == 3 && wInt2 > 0.1f) + || (wType2 == 1 && wInt2 > 0.7f); + lightning->setEnabled(stormActive); + if (stormActive) { + // Scale intensity: storm at full, heavy rain proportionally + float lIntensity = (wType2 == 3) ? wInt2 : (wInt2 - 0.7f) / 0.3f; + lightning->setIntensity(lIntensity); + } + } } else if (weather) { // No game handler (single-player without network) — zone weather only weather->updateZoneWeather(currentZoneId, deltaTime); @@ -2932,6 +2956,11 @@ void Renderer::update(float deltaTime) { weather->update(*camera, deltaTime); } + // Update lightning (storm / heavy rain) + if (lightning && camera && lightning->isEnabled()) { + lightning->update(deltaTime, *camera); + } + // Update swim effects if (swimEffects && camera && cameraController && waterRenderer) { swimEffects->update(*camera, *cameraController, *waterRenderer, deltaTime); @@ -5217,6 +5246,7 @@ void Renderer::renderWorld(game::World* world, game::GameHandler* gameHandler) { if (waterRenderer && camera) waterRenderer->render(cmd, perFrameSet, *camera, globalTime, false, frameIdx); if (weather && camera) weather->render(cmd, perFrameSet); + if (lightning && camera && lightning->isEnabled()) lightning->render(cmd, perFrameSet); if (swimEffects && camera) swimEffects->render(cmd, perFrameSet); if (mountDust && camera) mountDust->render(cmd, perFrameSet); if (chargeEffect && camera) chargeEffect->render(cmd, perFrameSet); @@ -5353,6 +5383,7 @@ void Renderer::renderWorld(game::World* world, game::GameHandler* gameHandler) { if (waterRenderer && camera) waterRenderer->render(currentCmd, perFrameSet, *camera, globalTime, false, frameIdx); if (weather && camera) weather->render(currentCmd, perFrameSet); + if (lightning && camera && lightning->isEnabled()) lightning->render(currentCmd, perFrameSet); if (swimEffects && camera) swimEffects->render(currentCmd, perFrameSet); if (mountDust && camera) mountDust->render(currentCmd, perFrameSet); if (chargeEffect && camera) chargeEffect->render(currentCmd, perFrameSet);