Water Shader
This commit is contained in:
@@ -5,7 +5,6 @@ extends Node3D
|
||||
@export var color_pomeriggio: Color = Color(1.0, 0.6, 0.2, 1.0)
|
||||
@export var color_notte: Color = Color(0.1, 0.1, 0.3, 1.0)
|
||||
|
||||
# --- NUOVO: Rotazione del Sole ---
|
||||
@export_group("Rotazione Sole (Gradi)")
|
||||
@export var rotazione_sole_mattina: Vector3 = Vector3(-15.0, 45.0, 0.0)
|
||||
@export var rotazione_sole_pomeriggio: Vector3 = Vector3(-75.0, 10.0, 0.0)
|
||||
@@ -26,9 +25,7 @@ extends Node3D
|
||||
@export var sky_horizon_pomeriggio: Color = Color(0.95, 0.65, 0.35, 1.0)
|
||||
@export var sky_horizon_notte: Color = Color(0.15, 0.1, 0.25, 1.0)
|
||||
|
||||
# --- Colori e Intensità Gradiente Shader ---
|
||||
@export_group("Gradiente Globale Shader")
|
||||
|
||||
@export_subgroup("Colore Top (Alto)")
|
||||
@export var grad_top_mattina: Color = Color(0.8, 0.4, 0.2, 1.0)
|
||||
@export var grad_top_pomeriggio: Color = Color(0.2, 0.3, 0.5, 1.0)
|
||||
@@ -44,7 +41,12 @@ extends Node3D
|
||||
@export var intensita_grad_pomeriggio: float = 0.3
|
||||
@export var intensita_grad_notte: float = 0.8
|
||||
|
||||
# --- NUOVO: Gestione Nebbia ---
|
||||
@export_group("Colori Acqua (Deep)")
|
||||
@export var acqua_deep_mattina: Color = Color(0.0, 0.1, 0.2, 1.0)
|
||||
@export var acqua_deep_pomeriggio: Color = Color(0.0, 0.15, 0.25, 1.0)
|
||||
@export var acqua_deep_notte: Color = Color(0.0, 0.02, 0.05, 1.0)
|
||||
@export_range(0.0, 1.0) var oscuramento_acqua_pioggia: float = 0.6 # <--- SLIDER OSCURAMENTO PIOGGIA
|
||||
|
||||
@export_group("Nebbia (Fog)")
|
||||
@export var colore_nebbia_mattina: Color = Color(0.75, 0.85, 0.95, 1.0)
|
||||
@export var colore_nebbia_pomeriggio: Color = Color(0.95, 0.65, 0.35, 1.0)
|
||||
@@ -53,7 +55,6 @@ extends Node3D
|
||||
@export var densita_nebbia_pomeriggio: float = 0.002
|
||||
@export var densita_nebbia_notte: float = 0.015
|
||||
|
||||
# --- NUOVO: Gestione Bloom (Glow) ---
|
||||
@export_group("Bloom (Glow)")
|
||||
@export var bloom_mattina: float = 1.2
|
||||
@export var bloom_pomeriggio: float = 0.8
|
||||
@@ -61,19 +62,19 @@ extends Node3D
|
||||
|
||||
@export_group("Ciclo Temporale")
|
||||
@export_range(1.0, 3.0) var tempo_giorno: float = 1.0
|
||||
@export var durata_transizione: float = 3.0
|
||||
@export var durata_transizione: float = 3.0
|
||||
@export_range(0.0, 1.0) var energia_luce_notte: float = 0.3
|
||||
|
||||
@export_group("Materiali Extra")
|
||||
@export var materiale_nebbia: ShaderMaterial
|
||||
@export var materiale_pioggia_gocce: StandardMaterial3D
|
||||
@export var materiale_nuvole: ShaderMaterial
|
||||
@export var materiale_pioggia_gocce: StandardMaterial3D
|
||||
@export var materiale_nuvole: ShaderMaterial
|
||||
@export var nodo_polvere: ColorRect
|
||||
@export var materiale_acqua: ShaderMaterial
|
||||
|
||||
@export_group("Meteo (Pioggia & Fulmini)")
|
||||
@export var colore_mood_pioggia: Color = Color(0.5, 0.6, 0.7, 1.0)
|
||||
@export var tempo_min_fulmine: float = 5.0
|
||||
@export var tempo_min_fulmine: float = 5.0
|
||||
@export var tempo_max_fulmine: float = 15.0
|
||||
@export var colore_fulmine: Color = Color(1.0, 1.0, 0.8, 1.0)
|
||||
@export var fulmini_min: int = 1
|
||||
@@ -82,22 +83,22 @@ extends Node3D
|
||||
@export var scala_max_fulmine: float = 3.0
|
||||
|
||||
@export_group("Cinematic Mode Ambiente")
|
||||
@export var intervallo_eventi_meteo: float = 8.0
|
||||
@export var intervallo_eventi_meteo: float = 8.0
|
||||
|
||||
@export_group("God Rays")
|
||||
@export var godray_scene: PackedScene
|
||||
@export var max_rain_godrays: int = 8
|
||||
@export var godray_spawn_radius: float = 15.0
|
||||
@export var godray_spawn_offset: Vector3 = Vector3(15.0, 5.0, -15.0)
|
||||
@export var godray_rotation_degrees: Vector3 = Vector3(-45.0, 45.0, -30.0)
|
||||
@export var godray_spawn_height: float = 5.0
|
||||
@export var godray_spawn_offset: Vector3 = Vector3(15.0, 5.0, -15.0)
|
||||
@export var godray_rotation_degrees: Vector3 = Vector3(-45.0, 45.0, -30.0)
|
||||
@export var godray_spawn_height: float = 5.0
|
||||
@export var godray_scale: Vector3 = Vector3(2.0, 6.0, 2.0)
|
||||
|
||||
@export_group("Lucciole")
|
||||
@export var particelle_lucciole: GPUParticles3D
|
||||
@export var quantita_lucciole: int = 60
|
||||
@export var raggio_spawn_lucciole: float = 20.0
|
||||
@export var altezza_spawn_lucciole: float = 3.0
|
||||
@export var altezza_spawn_lucciole: float = 3.0
|
||||
|
||||
@export_group("Vento")
|
||||
@export var particelle_vento: GPUParticles3D
|
||||
@@ -115,7 +116,7 @@ extends Node3D
|
||||
|
||||
@onready var sole: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var ambiente: WorldEnvironment = $WorldEnvironment
|
||||
@onready var menu_giornata: OptionButton = $CanvasLayer/OptionButton
|
||||
@onready var menu_giornata: OptionButton = $CanvasLayer/OptionButton
|
||||
@onready var bottone_pioggia: CheckButton = $CanvasLayer/CheckButtonPioggia
|
||||
@onready var particelle_pioggia: GPUParticles3D = $SubViewportContainer/SubViewport/World/Camere/PioggiaCadente
|
||||
@onready var nodo_camere: Node3D = $SubViewportContainer/SubViewport/World/Camere
|
||||
@@ -124,14 +125,14 @@ extends Node3D
|
||||
|
||||
var tween_giorno: Tween
|
||||
var is_raining: bool = false
|
||||
var intensita_pioggia: float = 0.0
|
||||
var intensita_pioggia: float = 0.0
|
||||
var timer_prossimo_fulmine: float = 0.0
|
||||
|
||||
var is_cinematic_mode: bool = false
|
||||
var timer_cinematic_env: float = 0.0
|
||||
var sto_cambiando_in_cinematic: bool = false
|
||||
var sto_cambiando_in_cinematic: bool = false
|
||||
|
||||
var is_snow_accumulated: bool = false
|
||||
var is_snow_accumulated: bool = false
|
||||
var is_actively_snowing: bool = false
|
||||
var snow_tween: Tween
|
||||
var cold_tween: Tween
|
||||
@@ -186,7 +187,7 @@ func _input(event: InputEvent) -> void:
|
||||
if event.keycode == KEY_C:
|
||||
is_cinematic_mode = !is_cinematic_mode
|
||||
if is_cinematic_mode:
|
||||
timer_cinematic_env = intervallo_eventi_meteo
|
||||
timer_cinematic_env = intervallo_eventi_meteo
|
||||
print("Ambiente Cinematic: ATTIVATA")
|
||||
else:
|
||||
print("Ambiente Cinematic: DISATTIVATA")
|
||||
@@ -222,7 +223,7 @@ func _on_pioggia_toggled(toggled_on: bool) -> void:
|
||||
is_cinematic_mode = false
|
||||
print("Ambiente Cinematic: DISATTIVATA (Pioggia cambiata manualmente)")
|
||||
|
||||
var stava_piovendo = is_raining
|
||||
var stava_piovendo = is_raining
|
||||
is_raining = toggled_on
|
||||
if particelle_pioggia:
|
||||
particelle_pioggia.emitting = is_raining
|
||||
@@ -237,8 +238,6 @@ func _process(delta: float) -> void:
|
||||
_genera_evento_meteo_casuale()
|
||||
timer_cinematic_env = randf_range(intervallo_eventi_meteo * 0.8, intervallo_eventi_meteo * 1.5)
|
||||
|
||||
|
||||
|
||||
var base_tint: Color
|
||||
var base_sky_top: Color
|
||||
var base_sky_horizon: Color
|
||||
@@ -249,20 +248,11 @@ func _process(delta: float) -> void:
|
||||
var base_grad_top: Color
|
||||
var base_grad_bot: Color
|
||||
var base_grad_intensity: float
|
||||
var base_rotazione_sole: Vector3 # <--- NUOVA VARIABILE
|
||||
var base_rotazione_sole: Vector3
|
||||
var base_acqua_deep: Color
|
||||
|
||||
var tempesta_attiva = is_raining or is_actively_snowing
|
||||
|
||||
if materiale_acqua:
|
||||
# Interpoliamo tra 0.05 (calmo) e 1.0 (pioggia forte)
|
||||
# intensita_pioggia è già gestita dal tuo script (0.0 -> 1.0)
|
||||
var target_ripples = lerp(0.05, 1.0, intensita_pioggia)
|
||||
materiale_acqua.set_shader_parameter("ripple_density", target_ripples)
|
||||
|
||||
# Opzionale: aumenta la velocità dei cerchi quando piove
|
||||
var ripple_speed = lerp(0.8, 1.6, intensita_pioggia)
|
||||
materiale_acqua.set_shader_parameter("ripple_speed", ripple_speed)
|
||||
|
||||
if tempesta_attiva:
|
||||
intensita_pioggia = move_toward(intensita_pioggia, 1.0, delta * 0.5)
|
||||
if is_raining:
|
||||
@@ -287,11 +277,12 @@ func _process(delta: float) -> void:
|
||||
base_fog_color = colore_nebbia_mattina.lerp(colore_nebbia_pomeriggio, t)
|
||||
base_fog_density = lerp(densita_nebbia_mattina, densita_nebbia_pomeriggio, t)
|
||||
base_bloom = lerp(bloom_mattina, bloom_pomeriggio, t)
|
||||
base_esposizione = lerp(esposizione_mattina, esposizione_pomeriggio, t)
|
||||
base_esposizione = lerp(esposizione_mattina, esposizione_pomeriggio, t)
|
||||
base_grad_top = grad_top_mattina.lerp(grad_top_pomeriggio, t)
|
||||
base_grad_bot = grad_bot_mattina.lerp(grad_bot_pomeriggio, t)
|
||||
base_grad_intensity = lerp(intensita_grad_mattina, intensita_grad_pomeriggio, t)
|
||||
base_rotazione_sole = rotazione_sole_mattina.lerp(rotazione_sole_pomeriggio, t) # <--- INTERPOLAZIONE ROTAZIONE
|
||||
base_rotazione_sole = rotazione_sole_mattina.lerp(rotazione_sole_pomeriggio, t)
|
||||
base_acqua_deep = acqua_deep_mattina.lerp(acqua_deep_pomeriggio, t)
|
||||
else:
|
||||
var t = tempo_giorno - 2.0
|
||||
base_tint = color_pomeriggio.lerp(color_notte, t)
|
||||
@@ -300,34 +291,45 @@ func _process(delta: float) -> void:
|
||||
base_fog_color = colore_nebbia_pomeriggio.lerp(colore_nebbia_notte, t)
|
||||
base_fog_density = lerp(densita_nebbia_pomeriggio, densita_nebbia_notte, t)
|
||||
base_bloom = lerp(bloom_pomeriggio, bloom_notte, t)
|
||||
base_esposizione = lerp(esposizione_pomeriggio, esposizione_notte, t)
|
||||
base_esposizione = lerp(esposizione_pomeriggio, esposizione_notte, t)
|
||||
base_grad_top = grad_top_pomeriggio.lerp(grad_top_notte, t)
|
||||
base_grad_bot = grad_bot_pomeriggio.lerp(grad_bot_notte, t)
|
||||
base_grad_intensity = lerp(intensita_grad_pomeriggio, intensita_grad_notte, t)
|
||||
base_rotazione_sole = rotazione_sole_pomeriggio.lerp(rotazione_sole_notte, t) # <--- INTERPOLAZIONE ROTAZIONE
|
||||
base_rotazione_sole = rotazione_sole_pomeriggio.lerp(rotazione_sole_notte, t)
|
||||
base_acqua_deep = acqua_deep_pomeriggio.lerp(acqua_deep_notte, t)
|
||||
|
||||
var final_tint = base_tint.lerp(base_tint * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_sky_top = base_sky_top.lerp(base_sky_top * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_sky_horizon = base_sky_horizon.lerp(base_sky_horizon * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_fog_color = base_fog_color.lerp(base_fog_color * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, intensita_pioggia)
|
||||
var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, intensita_pioggia)
|
||||
|
||||
var final_grad_top = base_grad_top.lerp(base_grad_top * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_grad_bot = base_grad_bot.lerp(base_grad_bot * colore_mood_pioggia, intensita_pioggia)
|
||||
|
||||
# Applico lo scurimento personalizzato all'acqua in base allo slider
|
||||
var final_acqua_deep = base_acqua_deep.lerp(base_acqua_deep.darkened(oscuramento_acqua_pioggia), intensita_pioggia)
|
||||
|
||||
RenderingServer.global_shader_parameter_set("global_gradient_color_top", final_grad_top)
|
||||
RenderingServer.global_shader_parameter_set("global_gradient_color_bot", final_grad_bot)
|
||||
RenderingServer.global_shader_parameter_set("global_gradient_intensity", base_grad_intensity)
|
||||
|
||||
# Assegnazione parametri allo shader dell'acqua
|
||||
if materiale_acqua:
|
||||
var target_ripples = lerp(0.02, 1.0, intensita_pioggia)
|
||||
materiale_acqua.set_shader_parameter("ripple_density", target_ripples)
|
||||
|
||||
var ripple_speed = lerp(0.8, 1.6, intensita_pioggia)
|
||||
materiale_acqua.set_shader_parameter("ripple_speed", ripple_speed)
|
||||
|
||||
materiale_acqua.set_shader_parameter("deep_water_color", final_acqua_deep)
|
||||
|
||||
var night_val = clamp(tempo_giorno - 2.0, 0.0, 1.0)
|
||||
|
||||
# Compensazione esposizione neve
|
||||
var attenuazione_luce_neve = lerp(1.0, 0.55, actual_snow_amount * (1.0 - night_val))
|
||||
var attenuazione_bloom_neve = lerp(1.0, 0.5, actual_snow_amount)
|
||||
|
||||
var final_bloom = lerp(base_bloom, base_bloom * 0.5, intensita_pioggia) * attenuazione_bloom_neve
|
||||
|
||||
# Calcoliamo l'esposizione finale applicando lo smorzamento della neve direttamente all'esposizione della camera
|
||||
var final_esposizione = base_esposizione * attenuazione_luce_neve
|
||||
|
||||
var colore_riflesso = Color(0.4, 0.5, 0.6, 1.0)
|
||||
@@ -339,25 +341,20 @@ func _process(delta: float) -> void:
|
||||
|
||||
if sole:
|
||||
sole.light_color = final_tint
|
||||
sole.rotation_degrees = base_rotazione_sole # <--- APPLICAZIONE DELLA ROTAZIONE
|
||||
sole.rotation_degrees = base_rotazione_sole
|
||||
var target_energy = lerp(1.0, energia_luce_notte, night_val)
|
||||
# La luce del sole scala normalmente in base al meteo/notte (l'esposizione globale fa il resto del lavoro)
|
||||
sole.light_energy = lerp(target_energy, target_energy * 0.4, intensita_pioggia)
|
||||
|
||||
if ambiente and ambiente.environment:
|
||||
ambiente.environment.ambient_light_color = final_tint
|
||||
|
||||
# Applicazione della nebbia
|
||||
ambiente.environment.fog_enabled = true
|
||||
ambiente.environment.fog_light_color = final_fog_color
|
||||
ambiente.environment.fog_density = final_fog_density
|
||||
|
||||
# Applicazione del Bloom
|
||||
ambiente.environment.glow_enabled = true
|
||||
ambiente.environment.glow_intensity = final_bloom
|
||||
|
||||
# --- NUOVO: Assegnazione dell'Esposizione (Tonemap) ---
|
||||
# Assicurati che il Tonemap Mode nell'Environment sia impostato su ACES o Filmic per un risultato migliore!
|
||||
ambiente.environment.tonemap_exposure = final_esposizione
|
||||
|
||||
var sky_mat = ambiente.environment.sky.sky_material as ShaderMaterial
|
||||
@@ -383,7 +380,7 @@ func _process(delta: float) -> void:
|
||||
particelle_vento.emitting = (not tempesta_attiva and not e_notte)
|
||||
|
||||
func _genera_evento_meteo_casuale() -> void:
|
||||
sto_cambiando_in_cinematic = true
|
||||
sto_cambiando_in_cinematic = true
|
||||
|
||||
var scelta = randi() % 3
|
||||
|
||||
@@ -408,7 +405,7 @@ func _genera_evento_meteo_casuale() -> void:
|
||||
_on_pioggia_toggled(true)
|
||||
_scatena_fulmine()
|
||||
|
||||
sto_cambiando_in_cinematic = false
|
||||
sto_cambiando_in_cinematic = false
|
||||
|
||||
func _resetta_timer_fulmine() -> void:
|
||||
timer_prossimo_fulmine = randf_range(tempo_min_fulmine, tempo_max_fulmine)
|
||||
@@ -428,19 +425,19 @@ func _scatena_fulmine() -> void:
|
||||
|
||||
for i in numero_scariche:
|
||||
if sprite_fulmine:
|
||||
var angolo_casuale = randf() * TAU
|
||||
var distanza = randf_range(10.0, 40.0)
|
||||
var angolo_casuale = randf() * TAU
|
||||
var distanza = randf_range(10.0, 40.0)
|
||||
|
||||
sprite_fulmine.position = Vector3(cos(angolo_casuale) * distanza, 10.0, sin(angolo_casuale) * distanza)
|
||||
|
||||
sprite_fulmine.modulate = colore_fulmine
|
||||
sprite_fulmine.modulate.a = 1.0
|
||||
sprite_fulmine.modulate.a = 1.0
|
||||
|
||||
var s = randf_range(scala_min_fulmine, scala_max_fulmine)
|
||||
sprite_fulmine.scale = Vector3(s, s, s)
|
||||
|
||||
var tween_sprite = create_tween()
|
||||
tween_sprite.tween_interval(0.2)
|
||||
tween_sprite.tween_interval(0.2)
|
||||
tween_sprite.tween_property(sprite_fulmine, "modulate:a", 0.0, 0.4)
|
||||
|
||||
if numero_scariche > 1:
|
||||
@@ -465,7 +462,7 @@ func spawn_single_godray() -> void:
|
||||
var ray = godray_scene.instantiate()
|
||||
|
||||
var nodo_mondo = nodo_camere.get_parent()
|
||||
nodo_mondo.add_child(ray)
|
||||
nodo_mondo.add_child(ray)
|
||||
|
||||
var random_x = randf_range(-godray_spawn_radius, godray_spawn_radius)
|
||||
var random_z = randf_range(-godray_spawn_radius, godray_spawn_radius)
|
||||
@@ -517,10 +514,10 @@ func _on_nevicata_button_pressed():
|
||||
|
||||
cold_tween = create_tween()
|
||||
cold_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||
cold_tween.set_parallel(true)
|
||||
cold_tween.set_parallel(true)
|
||||
cold_tween.tween_property(overlay_nebbia_schermo.material, "shader_parameter/max_opacity", target_opacity, 4.0)
|
||||
cold_tween.tween_property(overlay_nebbia_schermo.material, "shader_parameter/clear_center_radius", target_radius, 4.0)
|
||||
|
||||
func set_snow_amount(value: float):
|
||||
actual_snow_amount = value
|
||||
actual_snow_amount = value
|
||||
RenderingServer.global_shader_parameter_set("global_snow_amount", value)
|
||||
|
||||
Reference in New Issue
Block a user