add cloud shadow - godrays
This commit is contained in:
@@ -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 ---
|
||||
|
||||
Reference in New Issue
Block a user