#pragma once #include "hd2d/Scene.h" #include #include namespace hd2d { struct RenderSettings; // Everything the weather changes about the look, so it can be blended. struct WeatherLook { float sunIntensity = 0.0f; glm::vec3 sunColor{1.0f}; glm::vec3 zenith{0.5f}, horizon{0.5f}, ground{0.2f}; float ambient = 0.5f; glm::vec3 fogColor{0.5f}; float fogDensity = 0.0f, fogHeightFalloff = 0.1f, godRays = 0.0f, shaftStrength = 0.0f, cookieStrength = 0.0f; float windStrength = 0.0f, windGustSpeed = 0.0f; float bloomStrength = 0.0f, saturation = 1.0f; }; // Blends the scene from its clear-weather look (captured from the current // scene + settings while it is not raining, so manual tuning is kept) toward // a storm preset, and drives rain intensity, wetness, ground splashes and the // fading of ambient particles. class Weather { public: Weather(); void setRain(float target) { targetRain_ = glm::clamp(target, 0.0f, 1.0f); } float targetRain() const { return targetRain_; } float rain() const { return rain_; } // Jumps straight to the target (no transition), e.g. for screenshots. void snap() { rain_ = targetRain_; wetness_ = targetRain_; } void update(float dt, Scene& scene, RenderSettings& settings); WeatherLook storm; // look at full rain intensity float transitionSeconds = 5.0f; // clear <-> storm fade time float splashesPerSecond = 500.0f; float splashRadius = 12.0f; // around Scene::focusPoint private: static WeatherLook capture(const Scene& scene, const RenderSettings& settings); static void apply(const WeatherLook& look, Scene& scene, RenderSettings& settings); WeatherLook clear_; bool haveClear_ = false; float rain_ = 0.0f, targetRain_ = 0.0f, wetness_ = 0.0f, splashAccum_ = 0.0f; std::mt19937 rng_{99}; }; } // namespace hd2d