@tool class_name EnvironmentManagerRoot extends Node3D @export var environment_config: EnvironmentConfig @export_group("Particles") @export var particles_wind: GPUParticles3D @export var particles_snow: GPUParticles3D @export var particles_fireflies: GPUParticles3D @export var particles_rain: GPUParticles3D @export var godray: PackedScene @export var fog_overlay: ColorRect #environment nodes @onready var sun: DirectionalLight3D = $"../DirectionalLight3D" @onready var environment: WorldEnvironment = $"../WorldEnvironment" var day_night_controller: DayNightController var weather_controller: WeatherController var day_tween: Tween var day_time: float = 0.0 func _ready() -> void: if day_night_controller == null: day_night_controller = DayNightController.new() day_night_controller.name = "DayNightController" day_night_controller.time_changed.connect(select_day_time) add_child(day_night_controller) if weather_controller == null: weather_controller = WeatherController.new( particles_wind, particles_snow, particles_fireflies, particles_rain, godray, sun, environment, environment_config ) weather_controller.name = "WeatherController" add_child(weather_controller) func select_day_time(normalized_time: float) -> void: # Convert 0.0-1.0 normalized time to range used by atmosphere lerps # morning (dawn→noon) = 1.0-2.0, afternoon/night (noon→midnight) = 2.0-3.0 if normalized_time < 0.5: # 0.0→0.5 maps to 1.0→2.0 (morning to afternoon) day_time = 1.0 + (normalized_time / 0.5) else: # 0.5→1.0 maps to 2.0→3.0 (afternoon to night) day_time = 2.0 + ((normalized_time - 0.5) / 0.5) if day_tween and day_tween.is_valid(): day_tween.kill() day_tween = create_tween() day_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) day_tween.tween_property(self, "day_time", day_time, 3.0) if weather_controller: weather_controller.day_time = day_time