65 lines
1.9 KiB
GDScript
65 lines
1.9 KiB
GDScript
@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
|