add rain sound + add time to screen
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user