add rain sound + add time to screen

This commit is contained in:
2026-04-09 14:21:16 +02:00
parent ecaa3704d7
commit 65294c7011
32 changed files with 383 additions and 234 deletions

View File

@@ -1,8 +1,10 @@
class_name WeatherController
extends Node
var audio_player: AudioStreamPlayer3D
var thunder_audio_player: AudioStreamPlayer
var thunder_sounds: Array[AudioStream]
var rain_sounds: Array[AudioStream]
var rain_audio_player: AudioStreamPlayer
var particles_wind: GPUParticles3D
var particles_snow: GPUParticles3D
@@ -27,6 +29,7 @@ var timer_next_lightning: float = 0.0
var is_raining: bool = false
var rain_intensity: float = 0.0
var rain_tween: Tween
var rain_audio_tween: Tween
var puddle_tween: Tween
var puddle_amount: float = 0.0
@@ -45,7 +48,7 @@ func _init(wind: GPUParticles3D, snow: GPUParticles3D,
fireflies: GPUParticles3D, rain: GPUParticles3D, ray: PackedScene,
dust: ColorRect, blurr: ColorRect, envshadows: MeshInstance3D,
thesun: DirectionalLight3D, theenvironment: WorldEnvironment, environmentconfig: EnvironmentConfig,
thecamera: Camera3D, audiostreamplayer: AudioStreamPlayer3D, thundersounds: Array[AudioStream]) -> void:
thecamera: Camera3D, thundersounds: Array[AudioStream], rainsounds: Array[AudioStream]) -> void:
particles_wind = wind
particles_snow = snow
particles_fireflies = fireflies
@@ -59,7 +62,7 @@ func _init(wind: GPUParticles3D, snow: GPUParticles3D,
environment_config = environmentconfig
camera = thecamera
thunder_sounds = thundersounds
audio_player = audiostreamplayer
rain_sounds = rainsounds
set_rain()
@@ -70,15 +73,17 @@ func _init(wind: GPUParticles3D, snow: GPUParticles3D,
set_snow()
set_lightning()
create_sound_players()
func _ready() -> void:
#connect events
UIEvents.toggle_rain.connect(toggle_rain)
UIEvents.toggle_snow.connect(toggle_snow)
UIEvents.toggle_wind.connect(toggle_wind)
UIEvents.toggle_fireflies.connect(toggle_fireflies)
UIEvents.toggle_storm.connect(toggle_storm)
#UIEvents.toggle_fog_overlay.connect(toggle_fog_overlay)
UIEvents.toggle_dust.connect(toggle_dust)
UIEvents.toggle_blur.connect(toggle_blur)
UIEvents.toggle_shadows.connect(toggle_shadows)
@@ -171,11 +176,10 @@ func _process(delta: float) -> void:
#Snow exposure compensation
var snow_light_attenuation = lerp(1.0, 0.55, actual_snow_amount * (1.0 - night_val))
var snow_glow_attenuation = lerp(1.0, 0.5, actual_snow_amount)
var final_bloom = lerp(base_bloom, base_bloom * 0.5, rain_intensity) * snow_glow_attenuation
# We calculate the final exposure by applying snow damping directly to the camera exposure
var final_esposizione = base_exposure * snow_light_attenuation
var final_exposure = base_exposure * snow_light_attenuation
var reflected_color = Color(0.4, 0.5, 0.6, 1.0)
var drops_color = final_sky_horizon.lerp(reflected_color, 0.15)
@@ -203,9 +207,7 @@ func _process(delta: float) -> void:
# Apply glow
environment.environment.glow_enabled = true
environment.environment.glow_intensity = final_bloom
# Make sure the Tonemap Mode in the Environment is set to ACES or Filmic for best results!
environment.environment.tonemap_exposure = final_esposizione
environment.environment.tonemap_exposure = final_exposure
var sky_mat = environment.environment.sky.sky_material as ShaderMaterial
if sky_mat:
@@ -238,6 +240,18 @@ func _follow_camera() -> void:
if particles_fireflies:
particles_fireflies.global_position = Vector3(cam_pos.x, particles_fireflies.position.y, cam_pos.z)
func create_sound_players():
rain_audio_player = AudioStreamPlayer.new()
rain_audio_player.name = "RainAudioPlayer"
rain_audio_player.volume_db = environment_config.rain_audio_volume_db
rain_audio_player.finished.connect(_on_rain_audio_player_finished)
add_child(rain_audio_player)
thunder_audio_player = AudioStreamPlayer.new()
thunder_audio_player.name = "ThunderAudioPlayer"
thunder_audio_player.volume_db = environment_config.thunder_audio_volume_db
add_child(thunder_audio_player)
#region Fireflies
func toggle_fireflies(value: bool):
@@ -400,13 +414,13 @@ func start_lightning():
func _play_thunder_delayed(delay: float):
await get_tree().create_timer(delay).timeout
if thunder_sounds.is_empty() or not audio_player:
if thunder_sounds.is_empty() or not thunder_audio_player:
return
#choose a random track
audio_player.stream = thunder_sounds[randi() % thunder_sounds.size()]
audio_player.pitch_scale = randf_range(0.9, 1.1)
audio_player.play()
thunder_audio_player.stream = thunder_sounds[randi() % thunder_sounds.size()]
thunder_audio_player.pitch_scale = randf_range(0.9, 1.1)
thunder_audio_player.play()
#endregion
#region Rain
@@ -416,6 +430,9 @@ func set_rain():
if particles_rain:
particles_rain.visible = true
particles_rain.emitting = false
if rain_audio_player:
rain_audio_player.volume_db = environment_config.rain_audio_volume_db
rain_audio_player.stop()
RenderingServer.global_shader_parameter_set("global_rain_puddle_amount", 0.0)
func set_puddle_amount(value: float):
@@ -440,11 +457,18 @@ func toggle_rain(value: bool):
if is_raining:
particles_rain.amount_ratio = 0.0
particles_rain.emitting = true
if rain_audio_player:
if not rain_audio_player.playing:
rain_audio_player.volume_db = -80.0
_play_random_rain_sound()
_fade_rain_audio(environment_config.rain_audio_volume_db, false)
rain_tween = create_tween()
rain_tween.tween_property(particles_rain, "amount_ratio", 1.0, environment_config.rain_fade_time)
puddle_tween = create_tween()
puddle_tween.tween_method(set_puddle_amount, puddle_amount, 1.0, environment_config.puddle_form_time)
else:
if rain_audio_player:
_fade_rain_audio(-80.0, true)
rain_tween = create_tween()
rain_tween.tween_property(particles_rain, "amount_ratio", 0.0, environment_config.rain_fade_time)
rain_tween.tween_callback(func():
@@ -481,6 +505,36 @@ func spawn_single_godray() -> void:
godray_tween.tween_property(ray, "scale", Vector3.ZERO, 2.0).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_SINE)
godray_tween.tween_callback(ray.queue_free)
func _play_random_rain_sound() -> void:
if rain_sounds.is_empty() or rain_audio_player == null:
return
rain_audio_player.stream = rain_sounds[randi() % rain_sounds.size()]
rain_audio_player.pitch_scale = 1.0
rain_audio_player.volume_db = minf(rain_audio_player.volume_db, environment_config.rain_audio_volume_db)
rain_audio_player.play()
func _on_rain_audio_player_finished() -> void:
if is_raining:
_play_random_rain_sound()
func _fade_rain_audio(target_volume_db: float, stop_after_fade: bool) -> void:
if rain_audio_player == null:
return
if rain_audio_tween and rain_audio_tween.is_valid():
rain_audio_tween.kill()
rain_audio_tween = create_tween()
rain_audio_tween.tween_property(
rain_audio_player,
"volume_db",
target_volume_db,
environment_config.rain_fade_time #same value of the rain particles
)
if stop_after_fade:
rain_audio_tween.tween_callback(func(): rain_audio_player.stop())
#endregion
#region Snow