From fdfe2336f8273552517862b927b46681d23b3ad6 Mon Sep 17 00:00:00 2001 From: Overside srl Date: Tue, 2 Jun 2026 08:39:46 +0200 Subject: [PATCH] manage color and exposure during rain e storm; remove wind from rice; disable fireflies on rain, snow or storm; remove key for fireworks test; add hero to railway_pool; manage train windows --- core/biome_generator/rails.gd | 4 +- core/biome_generator/railway_pool.tres | 3 +- core/daynight/weather_controller.gd | 41 ++++++- core/environment_config.gd | 18 ++++ core/game_menu/biome_picker.gd | 4 - .../scene/rice/chunk_country_straight_04.tscn | 12 +-- .../river/scene/chunk_river_straight_5.tscn | 12 +-- tgcc/train/train.tscn | 8 +- tgcc/train/train_glass_emission.gd | 100 ++++++++++++++++++ tgcc/train/train_glass_emission.gd.uid | 1 + 10 files changed, 179 insertions(+), 24 deletions(-) create mode 100644 tgcc/train/train_glass_emission.gd create mode 100644 tgcc/train/train_glass_emission.gd.uid diff --git a/core/biome_generator/rails.gd b/core/biome_generator/rails.gd index c1f31e8..ad8e8b1 100644 --- a/core/biome_generator/rails.gd +++ b/core/biome_generator/rails.gd @@ -264,8 +264,8 @@ func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and not event.echo: if event.keycode == KEY_T: _goto_next_stop() - elif event.keycode == KEY_F: - _test_manual_fireworks() + #elif event.keycode == KEY_F: + #_test_manual_fireworks() func _test_manual_fireworks() -> void: if fireworks_scene == null or train_instance == null: return diff --git a/core/biome_generator/railway_pool.tres b/core/biome_generator/railway_pool.tres index 78117c4..b0eac7a 100644 --- a/core/biome_generator/railway_pool.tres +++ b/core/biome_generator/railway_pool.tres @@ -10,8 +10,9 @@ [ext_resource type="PackedScene" uid="uid://fi6faw7ag1i0" path="res://tgcc/chunk/railway/scene/chunk_railway_curve_3.tscn" id="8_r0882"] [ext_resource type="PackedScene" uid="uid://dglpoh63x2lpy" path="res://tgcc/chunk/railway/scene/chunk_railway_curve_4.tscn" id="9_3auto"] [ext_resource type="Script" uid="uid://c374rv220mvh1" path="res://core/biome_generator/railway_pool.gd" id="9_8tdc7"] +[ext_resource type="PackedScene" uid="uid://bup6gwlxos0w2" path="res://tgcc/chunk/railway/hero/chunk_railway_station_hero.tscn" id="10_3auto"] [resource] script = ExtResource("9_8tdc7") name = "Railway Pool" -available_railways = Array[PackedScene]([ExtResource("1_86h1y"), ExtResource("3_3auto"), ExtResource("4_i1umq"), ExtResource("5_x44at"), ExtResource("6_vrrkw"), ExtResource("7_l17bw"), ExtResource("8_qcl5o"), ExtResource("8_r0882"), ExtResource("9_3auto")]) +available_railways = Array[PackedScene]([ExtResource("1_86h1y"), ExtResource("3_3auto"), ExtResource("4_i1umq"), ExtResource("5_x44at"), ExtResource("6_vrrkw"), ExtResource("7_l17bw"), ExtResource("8_qcl5o"), ExtResource("8_r0882"), ExtResource("9_3auto"), ExtResource("10_3auto")]) diff --git a/core/daynight/weather_controller.gd b/core/daynight/weather_controller.gd index 9112125..597bcc5 100644 --- a/core/daynight/weather_controller.gd +++ b/core/daynight/weather_controller.gd @@ -123,7 +123,7 @@ func _process(delta: float) -> void: var is_night = day_time >= 2.5 if particles_fireflies: - particles_fireflies.emitting = thereare_fireflies and is_night + particles_fireflies.emitting = thereare_fireflies and is_night and not is_raining and not is_snowing and not is_storm var base_tint: Color var base_sky_top: Color @@ -190,11 +190,22 @@ func _process(delta: float) -> void: var final_fog_color = base_fog_color.lerp(base_fog_color * weather_color, clamp(rain_intensity, 0.0, 1.0)) var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, clamp(rain_intensity, 0.0, 1.0)) var final_water_color = base_water_color.darkened(clamp(environment_config.water_darkening_rain, 0.0, 1.0) * clamp(rain_intensity, 0.0, 1.0)) + var rain_weather_amount: float = 0.0 + if is_raining: + rain_weather_amount = clamp(rain_intensity, 0.0, 1.0) + var storm_weather_amount: float = 0.0 + if is_raining and is_storm: + if environment_config.storm_rain_intensity_multiplier > 1.0: + storm_weather_amount = clamp((rain_intensity - 1.0) / (environment_config.storm_rain_intensity_multiplier - 1.0), 0.0, 1.0) + else: + storm_weather_amount = rain_weather_amount final_tint = final_tint.lerp(final_tint * environment_config.snow_mode_color, snow_weather_amount) final_sky_top = final_sky_top.lerp(final_sky_top * environment_config.snow_mode_color, snow_weather_amount) final_sky_horizon = final_sky_horizon.lerp(final_sky_horizon * environment_config.snow_mode_color, snow_weather_amount) final_fog_color = final_fog_color.lerp(final_fog_color * environment_config.snow_mode_color, snow_weather_amount) + final_tint = final_tint.lerp(final_tint * _get_rain_day_color(), rain_weather_amount) + final_tint = final_tint.lerp(final_tint * _get_storm_day_color(), storm_weather_amount) #Shader parameters for global trunk_shader var final_grad_top = base_grad_top.lerp(base_grad_top * weather_color, clamp(rain_intensity, 0.0, 1.0)) @@ -214,6 +225,8 @@ func _process(delta: float) -> void: # We calculate the final exposure by applying snow damping directly to the camera exposure var final_exposure = base_exposure * snow_light_attenuation + final_exposure = lerp(final_exposure, _get_rain_day_exposure(), rain_weather_amount) + final_exposure = lerp(final_exposure, _get_storm_day_exposure(), storm_weather_amount) var reflected_color = Color(0.4, 0.5, 0.6, 1.0) var drops_color = final_sky_horizon.lerp(reflected_color, 0.15) @@ -293,6 +306,30 @@ func create_sound_players(): thunder_audio_player.volume_db = environment_config.thunder_audio_volume_db add_child(thunder_audio_player) +func _get_rain_day_color() -> Color: + if day_time <= 2.0: + return environment_config.rain_morning_color.lerp(environment_config.rain_afternoon_color, day_time - 1.0) + + return environment_config.rain_afternoon_color.lerp(environment_config.rain_night_color, day_time - 2.0) + +func _get_storm_day_color() -> Color: + if day_time <= 2.0: + return environment_config.storm_morning_color.lerp(environment_config.storm_afternoon_color, day_time - 1.0) + + return environment_config.storm_afternoon_color.lerp(environment_config.storm_night_color, day_time - 2.0) + +func _get_rain_day_exposure() -> float: + if day_time <= 2.0: + return lerp(environment_config.rain_exposure_morning, environment_config.rain_exposure_afternoon, day_time - 1.0) + + return lerp(environment_config.rain_exposure_afternoon, environment_config.rain_exposure_night, day_time - 2.0) + +func _get_storm_day_exposure() -> float: + if day_time <= 2.0: + return lerp(environment_config.storm_exposure_morning, environment_config.storm_exposure_afternoon, day_time - 1.0) + + return lerp(environment_config.storm_exposure_afternoon, environment_config.storm_exposure_night, day_time - 2.0) + #region camera func _set_camera(curr_camera: Camera3D): camera = curr_camera @@ -347,7 +384,7 @@ func toggle_fireflies(value: bool): thereare_fireflies = value var is_night = day_time >= 2.5 if particles_fireflies: - particles_fireflies.emitting = thereare_fireflies and is_night + particles_fireflies.emitting = thereare_fireflies and is_night and not is_raining #disable fireflies and set default values and materials func init_fireflies(): diff --git a/core/environment_config.gd b/core/environment_config.gd index 97eae1b..303470f 100644 --- a/core/environment_config.gd +++ b/core/environment_config.gd @@ -33,6 +33,24 @@ extends Resource @export var exposure_afternoon: float = 0.95 @export var exposure_night: float = 0.4 +#Camera tonemap exposure and light tint used only while rain is active +@export_group("Rain Exposition and Colors") +@export var rain_exposure_morning: float = 0.8 +@export var rain_exposure_afternoon: float = 0.7 +@export var rain_exposure_night: float = 0.35 +@export var rain_morning_color: Color = Color(0.85, 0.89, 0.93, 1.0) +@export var rain_afternoon_color: Color = Color(0.78, 0.83, 0.89, 1.0) +@export var rain_night_color: Color = Color(0.55, 0.6, 0.75, 1.0) + +#Camera tonemap exposure and light tint used only while storm is active +@export_group("Storm Exposition and Colors") +@export var storm_exposure_morning: float = 0.65 +@export var storm_exposure_afternoon: float = 0.55 +@export var storm_exposure_night: float = 0.25 +@export var storm_morning_color: Color = Color(0.78, 0.83, 0.89, 1.0) +@export var storm_afternoon_color: Color = Color(0.65, 0.7, 0.78, 1.0) +@export var storm_night_color: Color = Color(0.45, 0.5, 0.65, 1.0) + #Sky top color for each time of day @export_group("Sky Colors - Top") @export var sky_top_morning: Color = Color(0.35, 0.65, 0.9, 1.0) diff --git a/core/game_menu/biome_picker.gd b/core/game_menu/biome_picker.gd index a6abcd4..e97d724 100644 --- a/core/game_menu/biome_picker.gd +++ b/core/game_menu/biome_picker.gd @@ -8,8 +8,6 @@ extends Button if is_inside_tree() and has_node("%Texture"): $%Texture.texture = image - - func _ready(): if image != null and has_node("%Texture"): $%Texture.texture = image @@ -20,8 +18,6 @@ func _ready(): $%TextureRect.hide() TweenFX.breathe(self, 1) - - func _on_pressed() -> void: if TweenFX.is_playing(self, TweenFX.Animations.PRESS_ROTATE): return diff --git a/tgcc/chunk/countryside/scene/rice/chunk_country_straight_04.tscn b/tgcc/chunk/countryside/scene/rice/chunk_country_straight_04.tscn index 85ef8de..cfe1adf 100644 --- a/tgcc/chunk/countryside/scene/rice/chunk_country_straight_04.tscn +++ b/tgcc/chunk/countryside/scene/rice/chunk_country_straight_04.tscn @@ -58,19 +58,19 @@ script = ExtResource("2_0bmh1") north = true south = true -[node name="Argini_003" parent="." index="0" unique_id=1178813592] +[node name="Argini_003" parent="." index="0" unique_id=509439881] surface_material_override/0 = ExtResource("3_c4jie") -[node name="Grass_005" parent="." index="1" unique_id=1427965126 groups=["weather_vegetables_node", "wind_node"]] +[node name="Grass_005" parent="." index="1" unique_id=188609017 groups=["weather_vegetables_node", "wind_node"]] surface_material_override/0 = ExtResource("3_c4jie") -[node name="MSH_Staccioanta_1_002" parent="." index="2" unique_id=562234307] +[node name="MSH_Staccioanta_1_002" parent="." index="2" unique_id=746941179] surface_material_override/0 = ExtResource("4_lr7xw") -[node name="Strada_004" parent="." index="3" unique_id=387203009 groups=["weather_node"]] +[node name="Strada_004" parent="." index="3" unique_id=604168900 groups=["weather_node"]] surface_material_override/0 = ExtResource("5_5jc2f") -[node name="Water_004" parent="." index="4" unique_id=1258756459] +[node name="Water_004" parent="." index="4" unique_id=244513747] surface_material_override/0 = ExtResource("6_0bmh1") [node name="grass" type="Node3D" parent="." index="5" unique_id=1540226859 groups=["weather_vegetables_node", "wind_node"]] @@ -104,7 +104,7 @@ material_override = ExtResource("10_tbcfd") cast_shadow = 0 multimesh = SubResource("MultiMesh_e417f") -[node name="rice" type="Node3D" parent="." index="6" unique_id=1524870522 groups=["weather_vegetables_node", "wind_node"]] +[node name="rice" type="Node3D" parent="." index="6" unique_id=1524870522 groups=["weather_vegetables_node"]] visible = false [node name="rice_plane" type="MeshInstance3D" parent="rice" index="0" unique_id=629743434] diff --git a/tgcc/chunk/countryside/scene/rice/river/scene/chunk_river_straight_5.tscn b/tgcc/chunk/countryside/scene/rice/river/scene/chunk_river_straight_5.tscn index ad41460..60e2e64 100644 --- a/tgcc/chunk/countryside/scene/rice/river/scene/chunk_river_straight_5.tscn +++ b/tgcc/chunk/countryside/scene/rice/river/scene/chunk_river_straight_5.tscn @@ -9,7 +9,7 @@ [ext_resource type="Material" uid="uid://jygb1hcokks5" path="res://tgcc/chunk/prop/grass/grass_bank.tres" id="6_cxqsi"] [ext_resource type="Material" uid="uid://fnjxocmx16b7" path="res://tgcc/chunk/prop/grass/grass_chunk.tres" id="7_vkypx"] [ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="8_k7yf4"] -[ext_resource type="ArrayMesh" uid="uid://doophefr873pt" path="res://tgcc/chunk/prop/tree/bambù/Bambu.res" id="11_fy14c"] +[ext_resource type="ArrayMesh" uid="uid://bg5rfu7tyl3p8" path="res://tgcc/chunk/prop/tree/bambù/Bambu.res" id="11_fy14c"] [ext_resource type="PackedScene" uid="uid://d12t04rs47jq3" path="res://tgcc/chunk/prop/tree/tree_01/tree_01.tscn" id="12_fqf4n"] [ext_resource type="Script" uid="uid://cp1pb5dnuojg3" path="res://tgcc/chunk/prop/tree/bambù/bambu.gd" id="12_s2jc4"] @@ -60,20 +60,20 @@ script = ExtResource("2_vkypx") river_north = true river_south = true -[node name="Argini_011" parent="." index="0" unique_id=895986402] +[node name="Argini_011" parent="." index="0" unique_id=1103166467] surface_material_override/0 = ExtResource("2_mic04") surface_material_override/1 = ExtResource("2_mic04") -[node name="Grass_019" parent="." index="1" unique_id=1784106582] +[node name="Grass_019" parent="." index="1" unique_id=163702648] surface_material_override/0 = ExtResource("2_mic04") -[node name="Water_012" parent="." index="2" unique_id=1865739867] +[node name="Water_012" parent="." index="2" unique_id=183333409] surface_material_override/0 = ExtResource("3_5p1m2") -[node name="Water_F_015" parent="." index="3" unique_id=147107428] +[node name="Water_F_015" parent="." index="3" unique_id=1691016237] surface_material_override/0 = ExtResource("4_532mt") -[node name="rice" type="Node3D" parent="." index="4" unique_id=1336289627 groups=["weather_vegetables_node", "wind_node"]] +[node name="rice" type="Node3D" parent="." index="4" unique_id=1336289627 groups=["weather_vegetables_node"]] transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 21.006079, 0, 0) [node name="rice_plane" type="MeshInstance3D" parent="rice" index="0" unique_id=1744988640] diff --git a/tgcc/train/train.tscn b/tgcc/train/train.tscn index 7489e87..fb9839a 100644 --- a/tgcc/train/train.tscn +++ b/tgcc/train/train.tscn @@ -8,6 +8,7 @@ [ext_resource type="Material" uid="uid://o31kp0jm07q3" path="res://tgcc/chunk/material/rocks.tres" id="5_pj7tp"] [ext_resource type="Material" uid="uid://d4vsl672lwv7" path="res://tgcc/chunk/material/rocks2.tres" id="6_5hjh1"] [ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="8_d3e7a"] +[ext_resource type="Script" uid="uid://5frq4qrokiy2" path="res://tgcc/train/train_glass_emission.gd" id="9_4qk3b"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_fuy7x"] render_priority = 0 @@ -31,17 +32,18 @@ shader_parameter/emission_color = Color(0.3875077, 0.16205889, 0.035861596, 1) shader_parameter/emission_energy = 12.00000057 [node name="Treno" unique_id=1182090923 instance=ExtResource("1_33mei")] +script = ExtResource("9_4qk3b") -[node name="Finestrini" parent="." index="0" unique_id=1797001001] +[node name="Finestrini" parent="." index="0" unique_id=271431519] surface_material_override/0 = ExtResource("2_bks4l") surface_material_override/1 = ExtResource("3_sgpgi") surface_material_override/2 = ExtResource("4_gua5y") -[node name="Ruote" parent="." index="1" unique_id=226016697] +[node name="Ruote" parent="." index="1" unique_id=1570760095] surface_material_override/0 = ExtResource("5_pj7tp") surface_material_override/1 = ExtResource("4_gua5y") -[node name="Train" parent="." index="2" unique_id=1876679965] +[node name="Train" parent="." index="2" unique_id=301191703] surface_material_override/0 = ExtResource("6_5hjh1") surface_material_override/1 = ExtResource("2_5yo4e") surface_material_override/2 = ExtResource("2_bks4l") diff --git a/tgcc/train/train_glass_emission.gd b/tgcc/train/train_glass_emission.gd new file mode 100644 index 0000000..a27940a --- /dev/null +++ b/tgcc/train/train_glass_emission.gd @@ -0,0 +1,100 @@ +## Updates the train window emission during the day/night cycle. +extends Node3D + +@export_group("Windows") +@export var glass_surface_index: int = 1 +@export var morning_emissive_intensity: float = 0.0 +@export var night_emissive_intensity: float = 8.0 + +var _glass_material: ShaderMaterial +var _sunrise_time: float = 0.0 +var _night_time: float = 0.0 + +@onready var _finestrini: MeshInstance3D = $Finestrini + + +func _ready() -> void: + var environment_manager: EnvironmentManagerRoot = _get_environment_manager() + if environment_manager == null or environment_manager.environment_config == null: + return + + _sunrise_time = environment_manager.environment_config.sunrise + _night_time = environment_manager.environment_config.night + + if _finestrini != null: + _glass_material = _finestrini.get_surface_override_material(glass_surface_index) as ShaderMaterial + + _apply_emissive_intensity(_get_current_normalized_time()) + + if not UIEvents.day_time_changed.is_connected(_on_day_time_changed): + UIEvents.day_time_changed.connect(_on_day_time_changed) + + +func _exit_tree() -> void: + if UIEvents.day_time_changed.is_connected(_on_day_time_changed): + UIEvents.day_time_changed.disconnect(_on_day_time_changed) + + +func _get_current_normalized_time() -> float: + var environment_manager: EnvironmentManagerRoot = _get_environment_manager() + if environment_manager == null: + return _sunrise_time + + if environment_manager.day_night_controller != null: + return environment_manager.day_night_controller.current_time + + if environment_manager.environment_config != null: + return environment_manager.environment_config.start_time + + return _sunrise_time + + +func _get_environment_manager() -> EnvironmentManagerRoot: + var current_scene: Node = get_tree().current_scene + if current_scene == null: + return null + + for child in current_scene.get_children(): + var environment_manager := child as EnvironmentManagerRoot + if environment_manager != null: + return environment_manager + + return null + + +func _apply_emissive_intensity(normalized_time: float) -> void: + if _glass_material == null: + return + + _glass_material.set_shader_parameter( + "intensita_emissiva", + _calculate_emissive_intensity(normalized_time) + ) + + +func _calculate_emissive_intensity(normalized_time: float) -> float: + var wrapped_time: float = wrapf(normalized_time, 0.0, 1.0) + var sunrise_time: float = clampf(_sunrise_time, 0.0, 1.0) + var night_time: float = clampf(_night_time, sunrise_time, 1.0) + + if sunrise_time > 0.0 and wrapped_time < sunrise_time: + var night_to_morning_t: float = wrapped_time / sunrise_time + return lerpf( + night_emissive_intensity, + morning_emissive_intensity, + night_to_morning_t + ) + + if is_equal_approx(night_time, sunrise_time): + return morning_emissive_intensity + + var morning_to_night_t: float = inverse_lerp(sunrise_time, night_time, wrapped_time) + return lerpf( + morning_emissive_intensity, + night_emissive_intensity, + clampf(morning_to_night_t, 0.0, 1.0) + ) + + +func _on_day_time_changed(value: float, _time_string: String) -> void: + _apply_emissive_intensity(value) diff --git a/tgcc/train/train_glass_emission.gd.uid b/tgcc/train/train_glass_emission.gd.uid new file mode 100644 index 0000000..cc7c865 --- /dev/null +++ b/tgcc/train/train_glass_emission.gd.uid @@ -0,0 +1 @@ +uid://5frq4qrokiy2 -- 2.49.1