Add Global Gradient on shader - Revamp lighting
This commit is contained in:
@@ -5,6 +5,11 @@ 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)
|
||||
|
||||
@export_group("Esposizione Generale")
|
||||
@export var esposizione_mattina: float = 1.0
|
||||
@export var esposizione_pomeriggio: float = 0.95
|
||||
@export var esposizione_notte: float = 0.4
|
||||
|
||||
@export_group("Colori Cielo - Alto (Top)")
|
||||
@export var sky_top_mattina: Color = Color(0.35, 0.65, 0.9, 1.0)
|
||||
@export var sky_top_pomeriggio: Color = Color(0.7, 0.45, 0.2, 1.0)
|
||||
@@ -15,6 +20,39 @@ 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)
|
||||
@export var grad_top_notte: Color = Color(0.05, 0.05, 0.1, 1.0)
|
||||
|
||||
@export_subgroup("Colore Bottom (Basso)")
|
||||
@export var grad_bot_mattina: Color = Color(0.5, 0.2, 0.1, 1.0)
|
||||
@export var grad_bot_pomeriggio: Color = Color(0.1, 0.15, 0.25, 1.0)
|
||||
@export var grad_bot_notte: Color = Color(0.01, 0.01, 0.05, 1.0)
|
||||
|
||||
@export_subgroup("Intensità Gradiente")
|
||||
@export var intensita_grad_mattina: float = 0.5
|
||||
@export var intensita_grad_pomeriggio: float = 0.3
|
||||
@export var intensita_grad_notte: float = 0.8
|
||||
|
||||
# --- NUOVO: Gestione Nebbia ---
|
||||
@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)
|
||||
@export var colore_nebbia_notte: Color = Color(0.15, 0.1, 0.25, 1.0)
|
||||
@export var densita_nebbia_mattina: float = 0.005
|
||||
@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
|
||||
@export var bloom_notte: float = 2.0
|
||||
|
||||
@export_group("Ciclo Temporale")
|
||||
@export_range(1.0, 3.0) var tempo_giorno: float = 1.0
|
||||
@export var durata_transizione: float = 3.0
|
||||
@@ -168,7 +206,6 @@ func _on_giornata_selezionata(index: int) -> void:
|
||||
trigger_morning()
|
||||
|
||||
func _on_pioggia_toggled(toggled_on: bool) -> void:
|
||||
# Blocchiamo la pioggia se sta già nevicando
|
||||
if is_actively_snowing and toggled_on:
|
||||
if bottone_pioggia:
|
||||
bottone_pioggia.set_pressed_no_signal(false)
|
||||
@@ -196,14 +233,18 @@ func _process(delta: float) -> void:
|
||||
var base_tint: Color
|
||||
var base_sky_top: Color
|
||||
var base_sky_horizon: Color
|
||||
var base_fog_color: Color
|
||||
var base_fog_density: float
|
||||
var base_bloom: float
|
||||
var base_esposizione: float # <--- NUOVA VARIABILE
|
||||
var base_grad_top: Color
|
||||
var base_grad_bot: Color
|
||||
var base_grad_intensity: float
|
||||
|
||||
# Usiamo questa variabile per animare le nuvole sia se piove sia se nevica
|
||||
var tempesta_attiva = is_raining or is_actively_snowing
|
||||
|
||||
if tempesta_attiva:
|
||||
intensita_pioggia = move_toward(intensita_pioggia, 1.0, delta * 0.5)
|
||||
|
||||
# I fulmini partono SOLO se sta piovendo
|
||||
if is_raining:
|
||||
timer_prossimo_fulmine -= delta
|
||||
if timer_prossimo_fulmine <= 0.0:
|
||||
@@ -223,17 +264,50 @@ func _process(delta: float) -> void:
|
||||
base_tint = color_mattina.lerp(color_pomeriggio, t)
|
||||
base_sky_top = sky_top_mattina.lerp(sky_top_pomeriggio, t)
|
||||
base_sky_horizon = sky_horizon_mattina.lerp(sky_horizon_pomeriggio, t)
|
||||
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) # <--- INTERPOLAZIONE MATTINA/POM
|
||||
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)
|
||||
else:
|
||||
var t = tempo_giorno - 2.0
|
||||
base_tint = color_pomeriggio.lerp(color_notte, t)
|
||||
base_sky_top = sky_top_pomeriggio.lerp(sky_top_notte, t)
|
||||
base_sky_horizon = sky_horizon_pomeriggio.lerp(sky_horizon_notte, t)
|
||||
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) # <--- INTERPOLAZIONE POM/NOTTE
|
||||
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)
|
||||
|
||||
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_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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
var colore_gocce = final_sky_horizon.lerp(colore_riflesso, 0.15)
|
||||
colore_gocce = colore_gocce.lerp(colore_gocce * 0.4, night_val)
|
||||
@@ -244,11 +318,24 @@ func _process(delta: float) -> void:
|
||||
if sole:
|
||||
sole.light_color = final_tint
|
||||
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
|
||||
ambiente.environment.fog_light_color = final_sky_horizon
|
||||
|
||||
# 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
|
||||
if sky_mat:
|
||||
@@ -264,22 +351,13 @@ func _process(delta: float) -> void:
|
||||
var e_notte = tempo_giorno >= 2.5
|
||||
|
||||
if nodo_polvere:
|
||||
if not tempesta_attiva and not e_notte:
|
||||
nodo_polvere.visible = true
|
||||
else:
|
||||
nodo_polvere.visible = false
|
||||
nodo_polvere.visible = (not tempesta_attiva and not e_notte)
|
||||
|
||||
if particelle_lucciole:
|
||||
if not tempesta_attiva and e_notte:
|
||||
particelle_lucciole.emitting = true
|
||||
else:
|
||||
particelle_lucciole.emitting = false
|
||||
particelle_lucciole.emitting = (not tempesta_attiva and e_notte)
|
||||
|
||||
if particelle_vento:
|
||||
if not tempesta_attiva and not e_notte:
|
||||
particelle_vento.emitting = true
|
||||
else:
|
||||
particelle_vento.emitting = false
|
||||
particelle_vento.emitting = (not tempesta_attiva and not e_notte)
|
||||
|
||||
func _genera_evento_meteo_casuale() -> void:
|
||||
sto_cambiando_in_cinematic = true
|
||||
@@ -293,7 +371,6 @@ func _genera_evento_meteo_casuale() -> void:
|
||||
_on_giornata_selezionata(nuovo_orario)
|
||||
|
||||
elif scelta == 1:
|
||||
# Blocca il trigger della pioggia in cinematic mode se nevica
|
||||
if not is_actively_snowing:
|
||||
var piove = randf() > 0.5
|
||||
if bottone_pioggia:
|
||||
@@ -301,7 +378,6 @@ func _genera_evento_meteo_casuale() -> void:
|
||||
_on_pioggia_toggled(piove)
|
||||
|
||||
elif scelta == 2:
|
||||
# Blocca il trigger di tempesta/fulmini se nevica
|
||||
if not is_actively_snowing:
|
||||
if not is_raining:
|
||||
if bottone_pioggia:
|
||||
@@ -375,17 +451,12 @@ func spawn_single_godray() -> void:
|
||||
ray.rotation_degrees = godray_rotation_degrees
|
||||
ray.scale = godray_scale
|
||||
|
||||
# ==========================================
|
||||
# --- LOGICA NEVE E NEVICATA ---
|
||||
# ==========================================
|
||||
|
||||
func _on_snow_button_pressed():
|
||||
is_snow_accumulated = !is_snow_accumulated
|
||||
|
||||
if bottone_nevicata:
|
||||
bottone_nevicata.disabled = !is_snow_accumulated
|
||||
|
||||
# Attiva in automatico la nevicata quando nevica, la spegne quando si scioglie
|
||||
if is_snow_accumulated and not is_actively_snowing:
|
||||
_on_nevicata_button_pressed()
|
||||
elif not is_snow_accumulated and is_actively_snowing:
|
||||
@@ -399,14 +470,12 @@ func _on_snow_button_pressed():
|
||||
snow_tween = create_tween()
|
||||
snow_tween.tween_method(set_snow_amount, actual_snow_amount, target_snow, tempo_transizione_neve)
|
||||
|
||||
|
||||
func _on_nevicata_button_pressed():
|
||||
if not is_snow_accumulated:
|
||||
return
|
||||
|
||||
is_actively_snowing = !is_actively_snowing
|
||||
|
||||
# Disabilita il pulsante della pioggia. Se pioveva già, spegne la pioggia.
|
||||
if bottone_pioggia:
|
||||
bottone_pioggia.disabled = is_actively_snowing
|
||||
if is_actively_snowing and is_raining:
|
||||
@@ -417,7 +486,7 @@ func _on_nevicata_button_pressed():
|
||||
particelle_neve.emitting = is_actively_snowing
|
||||
|
||||
if overlay_nebbia_schermo and overlay_nebbia_schermo.material:
|
||||
var target_opacity: float = 1.0 if is_actively_snowing else 0.135
|
||||
var target_opacity: float = 0.5 if is_actively_snowing else 0.1
|
||||
var target_radius: float = 0.350 if is_actively_snowing else 0.465
|
||||
|
||||
if cold_tween and cold_tween.is_valid():
|
||||
|
||||
Reference in New Issue
Block a user