fix fog and weather controller

This commit is contained in:
2026-03-25 18:32:18 +01:00
parent 5af1ba0ba8
commit ce6d9673ca
7 changed files with 67 additions and 58 deletions

View File

@@ -30,7 +30,7 @@ transparency = 2
alpha_scissor_threshold = 0.0
alpha_antialiasing_mode = 0
disable_ambient_light = true
albedo_color = Color(0.07500001, 0.06400001, 0.12100001, 0.39999998)
albedo_color = Color(0.1334653, 0.106680326, 0.15061459, 0.47993344)
billboard_mode = 3
particles_anim_h_frames = 1
particles_anim_v_frames = 1
@@ -46,7 +46,7 @@ shader_parameter/texture_scale = Vector2(1, 1)
shader_parameter/edge_softness_y = 0.2
shader_parameter/edge_softness_x = 0.1
shader_parameter/night_intensity = 0.0
shader_parameter/sun_color = Color(1, 1, 1, 1)
shader_parameter/sun_color = Color(1, 0.6716112, 0.3432224, 1)
[sub_resource type="Resource" id="Resource_r4tfj"]
script = ExtResource("2_h6hjk")

View File

@@ -1,29 +1,15 @@
shader_type canvas_item;
// Colore della tua nebbia (scegli un colore che stia bene col tuo Skybox)
uniform vec4 fog_color : source_color = vec4(0.85, 0.9, 0.95, 1.0);
// Quanto è grande lo spazio pulito al centro per il treno
uniform float clear_center_radius : hint_range(0.0, 1.0) = 0.4;
// Quanto è morbida la sfumatura della nebbia verso i bordi
uniform float edge_softness : hint_range(0.01, 1.0) = 0.5;
// Opacità massima ai bordi estremi dello schermo
uniform float max_opacity : hint_range(0.0, 1.0) = 0.8;
void fragment() {
// Calcola la distanza del pixel dal centro dello schermo (0.5, 0.5)
float dist_from_center = distance(SCREEN_UV, vec2(0.5));
// Crea una maschera morbida circolare
// Al centro (distanza < clear_center) sarà 0.0 (trasparente)
// Verso i bordi salirà dolcemente fino a 1.0 (opaco)
float fog_amount = smoothstep(clear_center_radius, clear_center_radius + edge_softness, dist_from_center);
// Moltiplica per l'opacità massima desiderata
fog_amount *= max_opacity;
// Applica il colore della nebbia solo dove serve
COLOR = vec4(fog_color.rgb, fog_color.a * fog_amount);
}

View File

@@ -29,6 +29,7 @@ var is_snowing: bool = false
var is_snow_accumulated: bool = false
var actual_snow_amount: float = 0.0
var is_storm: bool = false
var cold_tween: Tween
var is_windy: bool = false
var thereare_fireflies: bool = false
@@ -61,6 +62,7 @@ func _ready() -> void:
UIEvents.toggle_snow.connect(toggle_snow)
UIEvents.toggle_wind.connect(toggle_wind)
UIEvents.toggle_fireflies.connect(toggle_fireflies)
UIEvents.toggle_storm.connect(toggle_storm)
func _process(delta: float) -> void:
var base_tint: Color
@@ -74,9 +76,6 @@ func _process(delta: float) -> void:
var base_grad_bot: Color
var base_grad_intensity: float
var base_rotation_sun: Vector3
var is_storm = is_raining and is_snowing
var is_night = day_time >= 2.5
if is_storm:
rain_intensity = move_toward(rain_intensity, 1.0, delta * 0.5)
@@ -87,13 +86,7 @@ func _process(delta: float) -> void:
set_lightning_timer()
else:
rain_intensity = move_toward(rain_intensity, 0.0, delta * 0.5)
if environment_config.material_clouds:
var current_density = lerp(0.4, 1.0, rain_intensity)
environment_config.material_clouds.set_shader_parameter("cloud_density", current_density)
var current_sharpness = lerp(0.14, 0.0, rain_intensity)
environment_config.material_clouds.set_shader_parameter("center_sharpness", current_sharpness)
if day_time <= 2.0:
var t = day_time - 1.0
base_tint = environment_config.morning_color.lerp(environment_config.afternoon_color, t)
@@ -183,6 +176,12 @@ func _process(delta: float) -> void:
sky_mat.set_shader_parameter("sun_color", final_tint)
sky_mat.set_shader_parameter("night_intensity", night_val)
if environment_config.material_clouds:
var current_density = lerp(0.4, 1.0, rain_intensity)
environment_config.material_clouds.set_shader_parameter("cloud_density", current_density)
var current_sharpness = lerp(0.14, 0.0, rain_intensity)
environment_config.material_clouds.set_shader_parameter("center_sharpness", current_sharpness)
if environment_config.material_fog:
environment_config.material_fog.set_shader_parameter("night_intensity", night_val)
environment_config.material_fog.set_shader_parameter("sun_color", final_tint)
@@ -230,6 +229,10 @@ func set_wind():
#endregion
#region Lightning
func toggle_storm(value: bool):
is_storm = value
#set lightning
func set_lightning():
lightning_light.name = "Lightning Light"
@@ -276,23 +279,23 @@ func set_lightning_timer():
func start_lightning():
if lightning_light:
var tween_luce = create_tween()
var tween_lighting = create_tween()
lightning_light.light_energy = 5.0
tween_luce.tween_interval(0.05)
tween_luce.tween_callback(func(): lightning_light.light_energy = 0.0)
tween_luce.tween_interval(0.05)
tween_luce.tween_callback(func(): lightning_light.light_energy = 2.0)
tween_luce.tween_method(func(val): lightning_light.light_energy = val, 2.0, 0.0, 0.2)
tween_lighting.tween_interval(0.05)
tween_lighting.tween_callback(func(): lightning_light.light_energy = 0.0)
tween_lighting.tween_interval(0.05)
tween_lighting.tween_callback(func(): lightning_light.light_energy = 2.0)
tween_lighting.tween_method(func(val): lightning_light.light_energy = val, 2.0, 0.0, 0.2)
var lightning_number = randi_range(environment_config.lightning_min, environment_config.lightning_max)
for i in lightning_number:
if lightning_sprite:
var angolo_casuale = randf() * TAU
var distanza = randf_range(10.0, 40.0)
var random_angle = randf() * TAU
var distance = randf_range(10.0, 40.0)
lightning_sprite.position = Vector3(cos(angolo_casuale) * distanza, 10.0, sin(angolo_casuale) * distanza)
lightning_sprite.position = Vector3(cos(random_angle) * distance, 10.0, sin(random_angle) * distance)
lightning_sprite.modulate = environment_config.lightning_color
lightning_sprite.modulate.a = 1.0

View File

@@ -11,7 +11,7 @@ extends Resource
@export var sun_rotation_morning: Vector3 = Vector3(-15.0, 45.0, 0.0)
@export var sun_rotation_afternoon: Vector3 = Vector3(-75.0, 10.0, 0.0)
@export var sun_rotation_night: Vector3 = Vector3(-35.0, -120.0, 0.0)
@export_range(0.0, 1.0) var night_light_energy: float = 0.3
@export var night_light_energy: float = 0.3
@export_group("General Exposition")
@export var exposure_morning: float = 1.0

View File

@@ -5,3 +5,4 @@ signal toggle_rain(value: bool)
signal toggle_snow(value: bool)
signal toggle_wind(value: bool)
signal toggle_fireflies(value: bool)
signal toggle_storm(value: bool)