add cloud shadow - godrays

This commit is contained in:
Matteo Sonaglioni
2026-03-11 18:51:31 +01:00
parent 47380d3137
commit 609b70a114
44 changed files with 532 additions and 157 deletions

View File

@@ -1,5 +1,7 @@
extends Node3D
@export_group("Luce Direzionale e Ambiente")
@export var color_mattina: Color = Color(1.0, 0.9, 0.8, 1.0)
@export var color_pomeriggio: Color = Color(1.0, 0.6, 0.2, 1.0)
@@ -21,8 +23,11 @@ extends Node3D
@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
# --- NUOVA VARIABILE PER LE NUVOLE ---
@export var materiale_nuvole: ShaderMaterial
@export_group("Meteo (Pioggia & Fulmini)")
@export var colore_mood_pioggia: Color = Color(0.5, 0.6, 0.7, 1.0)
@@ -46,7 +51,7 @@ extends Node3D
# --- NODI FULMINE ---
@onready var luce_lampo: DirectionalLight3D = $LuceLampo
@onready var sprite_fulmine: Sprite3D = $SpriteFulmine
@onready var sprite_fulmine: Sprite3D = $SubViewportContainer/SubViewport/World/Camere/SpriteFulmine
var tween_giorno: Tween
var is_raining: bool = false
@@ -107,6 +112,10 @@ func _on_giornata_selezionata(index: int) -> void:
tween_giorno = create_tween()
tween_giorno.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween_giorno.tween_property(self, "tempo_giorno", target_tempo, durata_transizione)
func _on_pioggia_toggled(toggled_on: bool) -> void:
# Se l'utente clicca il bottone della pioggia a mano, spegni la cinematic mode
@@ -117,6 +126,9 @@ func _on_pioggia_toggled(toggled_on: bool) -> void:
is_raining = toggled_on
if particelle_pioggia:
particelle_pioggia.emitting = is_raining
func _process(delta: float) -> void:
# --- LOGICA EVENTI CASUALI CINEMATIC MODE ---
@@ -124,7 +136,6 @@ func _process(delta: float) -> void:
timer_cinematic_env -= delta
if timer_cinematic_env <= 0.0:
_genera_evento_meteo_casuale()
# Reset timer con un po' di casualità per non renderlo troppo robotico
timer_cinematic_env = randf_range(intervallo_eventi_meteo * 0.8, intervallo_eventi_meteo * 1.5)
# --- LOGICA NORMALE AMBIENTE ---
@@ -141,6 +152,14 @@ func _process(delta: float) -> void:
_resetta_timer_fulmine()
else:
intensita_pioggia = move_toward(intensita_pioggia, 0.0, delta * 0.5)
# --- LOGICA NUVOLE: SI ADDENSANO CON LA PIOGGIA ---
if materiale_nuvole:
# lerp fa una transizione fluida tra 0.4 (limpido) e 1.0 (coperto) in base all'intensità della pioggia
var densita_attuale = lerp(0.4, 1.0, intensita_pioggia)
materiale_nuvole.set_shader_parameter("cloud_density", densita_attuale)
var sharpness_attuale = lerp(0.14, 0.0, intensita_pioggia)
materiale_nuvole.set_shader_parameter("center_sharpness", sharpness_attuale)
if tempo_giorno <= 2.0:
var t = tempo_giorno - 1.0
@@ -187,39 +206,36 @@ func _process(delta: float) -> void:
# --- FUNZIONE GENERATORE CASUALE ---
func _genera_evento_meteo_casuale() -> void:
sto_cambiando_in_cinematic = true # Avvisiamo il codice che stiamo facendo modifiche "automatiche"
sto_cambiando_in_cinematic = true
var scelta = randi() % 3
if scelta == 0:
# Cambia orario
var nuovo_orario = randi() % 3
if menu_giornata:
menu_giornata.selected = nuovo_orario
_on_giornata_selezionata(nuovo_orario)
elif scelta == 1:
# Cambia meteo (accende o spegne la pioggia)
var piove = randf() > 0.5
if bottone_pioggia:
bottone_pioggia.set_pressed_no_signal(piove)
_on_pioggia_toggled(piove)
elif scelta == 2:
# Forza un fulmine (se non piove, fa iniziare a piovere per dare senso al fulmine!)
if not is_raining:
if bottone_pioggia:
bottone_pioggia.set_pressed_no_signal(true)
_on_pioggia_toggled(true)
_scatena_fulmine()
sto_cambiando_in_cinematic = false # Fine modifiche automatiche
sto_cambiando_in_cinematic = false
# --- FUNZIONI FULMINI ---
func _resetta_timer_fulmine() -> void:
timer_prossimo_fulmine = randf_range(tempo_min_fulmine, tempo_max_fulmine)
# --- FUNZIONI FULMINI ---
func _scatena_fulmine() -> void:
if luce_lampo:
var tween_luce = create_tween()
@@ -235,9 +251,13 @@ func _scatena_fulmine() -> void:
for i in numero_scariche:
if sprite_fulmine:
var angolo_casuale = randf() * PI * 2.0
var distanza = 20.0
sprite_fulmine.position = Vector3(cos(angolo_casuale) * distanza, 20.0, sin(angolo_casuale) * distanza)
var angolo_casuale = randf() * TAU
var distanza = randf_range(10.0, 40.0)
# Ho abbassato la Y da 20.0 a 10.0. Se non lo vedi ancora, abbassala a 5.0!
sprite_fulmine.position = Vector3(cos(angolo_casuale) * distanza, 10.0, sin(angolo_casuale) * distanza)
# VIA LA RIGA LOOK_AT! Ci pensa il Billboard dell'Inspector ora.
sprite_fulmine.modulate = colore_fulmine
sprite_fulmine.modulate.a = 1.0
@@ -246,8 +266,11 @@ func _scatena_fulmine() -> void:
sprite_fulmine.scale = Vector3(s, s, s)
var tween_sprite = create_tween()
tween_sprite.tween_interval(0.1)
tween_sprite.tween_property(sprite_fulmine, "modulate:a", 0.0, 0.2)
# Ora rimane visibile al 100% per 0.2 secondi (il doppio)
tween_sprite.tween_interval(0.2)
# Ora ci mette 0.4 secondi a svanire dolcemente (il doppio)
tween_sprite.tween_property(sprite_fulmine, "modulate:a", 0.0, 0.4)
if numero_scariche > 1:
await get_tree().create_timer(randf_range(0.05, 0.15)).timeout
# --- FUNZIONI GOD RAYS ---