From 8b2ea22f0ca8def989b241aa22b431ce536c6a8e Mon Sep 17 00:00:00 2001 From: Overside srl Date: Tue, 17 Feb 2026 17:15:13 +0100 Subject: [PATCH] add moon --- dynamic-sky/dynamic_sky.tscn | 48 +++++++++++++------ dynamic-sky/environment.tres | 10 ++-- dynamic-sky/resources/sky_config.gd | 4 +- dynamic-sky/scripts/dynamic_sky_root.gd | 47 ++++++++++-------- .../scripts/post_process_controller.gd | 30 ++++++++++++ scenes/trainjourney.tscn | 1 + 6 files changed, 99 insertions(+), 41 deletions(-) diff --git a/dynamic-sky/dynamic_sky.tscn b/dynamic-sky/dynamic_sky.tscn index 11a2936..633e81f 100644 --- a/dynamic-sky/dynamic_sky.tscn +++ b/dynamic-sky/dynamic_sky.tscn @@ -197,6 +197,18 @@ colors = PackedColorArray(0.05, 0.06, 0.1, 1, 0.6, 0.65, 0.75, 1, 0.7, 0.75, 0.8 _data = [Vector2(0, 0.02), 0.0, 0.0, 0, 0, Vector2(0.25, 0.015), 0.0, 0.0, 0, 0, Vector2(0.5, 0.01), 0.0, 0.0, 0, 0, Vector2(0.75, 0.015), 0.0, 0.0, 0, 0, Vector2(1, 0.02), 0.0, 0.0, 0, 0] point_count = 5 +[sub_resource type="Gradient" id="Gradient_2w5ig"] +offsets = PackedFloat32Array(0, 0.2, 0.3, 0.5, 0.75, 0.85, 1) +colors = PackedColorArray(0.01, 0.01, 0.04, 1, 0.01, 0.01, 0.04, 1, 0.18, 0.35, 0.8, 1, 0.15, 0.35, 0.82, 1, 0.12, 0.15, 0.4, 1, 0.02, 0.02, 0.06, 1, 1, 1, 1, 1) + +[sub_resource type="Gradient" id="Gradient_cnx2n"] +offsets = PackedFloat32Array(0, 0.2, 0.25, 0.35, 0.5, 0.75, 0.85, 1) +colors = PackedColorArray(0.03, 0.04, 0.08, 1, 0.03, 0.04, 0.08, 1, 0.85, 0.55, 0.45, 1, 0.45, 0.6, 0.85, 1, 0.5, 0.65, 0.88, 1, 0.95, 0.45, 0.25, 1, 0.06, 0.06, 0.1, 1, 1, 1, 1, 1) + +[sub_resource type="Gradient" id="Gradient_djhca"] +offsets = PackedFloat32Array(0, 0.2, 0.3, 0.5, 0.75, 0.85, 1) +colors = PackedColorArray(0.02, 0.02, 0.05, 1, 0.02, 0.02, 0.05, 1, 0.35, 0.45, 0.55, 1, 0.35, 0.45, 0.55, 1, 0.3, 0.2, 0.2, 1, 0.03, 0.03, 0.06, 1, 1, 1, 1, 1) + [sub_resource type="Curve" id="Curve_ta3fj"] _data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.2, 0.8), 0.0, 0.0, 0, 0, Vector2(0.3, 0), 0.0, 0.0, 0, 0, Vector2(0.7, 0), 0.0, 0.0, 0, 0, Vector2(0.85, 0.8), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] point_count = 6 @@ -310,7 +322,7 @@ flow_speed = 0.015 [sub_resource type="Compositor" id="Compositor_ssi15"] -[node name="DynamicSky" type="Node3D" unique_id=516593260 node_paths=PackedStringArray("preset_library", "day_night_controller", "weather_controller", "cloud_system", "post_process_controller", "vfx_controller", "shadow_proxy_system", "world_environment", "sun_light", "moon_light")] +[node name="DynamicSky" type="Node3D" unique_id=516593260 node_paths=PackedStringArray("preset_library", "day_night_controller", "weather_controller", "cloud_system", "post_process_controller", "vfx_controller", "shadow_proxy_system", "weather_vfx", "world_environment", "sun_light", "moon_light")] script = ExtResource("1_dynamic_sky") preset_library = NodePath("PresetLibrary") day_night_controller = NodePath("DayNightController") @@ -319,6 +331,7 @@ cloud_system = NodePath("CloudSystem") post_process_controller = NodePath("PostProcessController") vfx_controller = NodePath("VFXController") shadow_proxy_system = NodePath("ShadowProxySystem") +weather_vfx = NodePath("WeatherVFX") world_environment = NodePath("WorldEnvironment") sun_light = NodePath("SunLight") moon_light = NodePath("MoonLight") @@ -331,7 +344,7 @@ presets = Array[ExtResource("3_c6jpa")]([SubResource("Resource_ajt3x"), SubResou [node name="DayNightController" type="Node" parent="." unique_id=1083149574] script = ExtResource("3_day_night") -time_of_day = 0.3159409316050229 +time_of_day = 0.6330777230246745 current_day = 4 sun_color_curve = SubResource("Gradient_sxvon") sun_intensity_curve = SubResource("Curve_fm80q") @@ -341,6 +354,9 @@ ambient_color_curve = SubResource("Gradient_bq8yq") ambient_intensity_curve = SubResource("Curve_x6xf2") fog_color_curve = SubResource("Gradient_tn5up") fog_density_curve = SubResource("Curve_ej5u1") +sky_top_color_curve = SubResource("Gradient_2w5ig") +sky_horizon_color_curve = SubResource("Gradient_cnx2n") +sky_bottom_color_curve = SubResource("Gradient_djhca") stars_visibility_curve = SubResource("Curve_ta3fj") [node name="WeatherController" type="Node" parent="." unique_id=1440281936] @@ -353,10 +369,11 @@ script = ExtResource("5_clouds") layer_configs = Array[ExtResource("4_ssi15")]([SubResource("Resource_xh4oc"), SubResource("Resource_ahi10"), SubResource("Resource_a5xai"), SubResource("Resource_uxs4q")]) global_coverage = 0.2 global_wind_speed = 0.5 -sun_direction = Vector3(0.9038672, 0.39738584, 0.15845723) -sun_color = Color(1, 0.63184845, 0.471403, 1) -sun_intensity = 0.80360174 -moon_direction = Vector3(0.91050637, -0.40030476, -0.10360649) +sun_direction = Vector3(-0.71683276, 0.6476549, 0.25825176) +sun_color = Color(1, 0.95, 0.85, 1) +sun_intensity = 1.2 +moon_direction = Vector3(-0.7310799, -0.6605271, -0.17095698) +moon_color = Color(0.8, 0.85, 1, 1) moon_intensity = 0.0 [node name="PostProcessController" type="Node" parent="." unique_id=186747041] @@ -367,11 +384,11 @@ sky_top_color = Color(0.2, 0.4, 0.85, 1) sky_horizon_color = Color(0.6, 0.75, 0.95, 1) sky_bottom_color = Color(0.5, 0.6, 0.7, 1) skybox_texture = ExtResource("6_ssi15") -fog_color = Color(0.25821814, 0.28612906, 0.371403, 1) -fog_density = 0.014140322 -sun_glow_intensity = 0.40180087 -sun_glow_color = Color(1, 0.63184845, 0.471403, 1) -sun_direction = Vector3(0.9038672, 0.39738584, 0.15845723) +fog_color = Color(0.7, 0.64355034, 0.6637131, 1) +fog_density = 0.012741526 +sun_glow_intensity = 0.3 +sun_glow_color = Color(1, 0.95, 0.85, 1) +sun_direction = Vector3(-0.71683276, 0.6476549, 0.25825176) [node name="VFXController" type="Node3D" parent="." unique_id=207251300] script = ExtResource("7_vfx") @@ -386,13 +403,14 @@ environment = ExtResource("13_2w5ig") compositor = SubResource("Compositor_ssi15") [node name="SunLight" type="DirectionalLight3D" parent="." unique_id=1278065589] -transform = Transform3D(0.17267685, -0.9848151, 0.017930198, 0, 0.018203637, 0.99983454, -0.98497826, -0.17264825, 0.0031433487, 0, 50, 0) -light_color = Color(1, 0.63184845, 0.471403, 1) -light_energy = 0.80360174 +transform = Transform3D(0.33894238, 0.9407005, -0.014151112, 0, 0.015041453, 0.9998871, 0.9408068, -0.33890405, 0.0050981897, 0, 50, 0) +light_color = Color(1, 0.84032553, 0.65726346, 1) +light_energy = 0.58916044 shadow_enabled = true [node name="MoonLight" type="DirectionalLight3D" parent="." unique_id=52072807] -transform = Transform3D(-0.11306036, -0.9934189, 0.018351724, 0, 0.018470151, 0.99982965, -0.9935881, 0.11304111, -0.0020882422, 0, 50, 0) +transform = Transform3D(-0.22769909, 0.9736189, -0.014815218, 0, 0.015214887, 0.9998845, 0.9737314, 0.22767279, -0.0034644168, 0, 50, 0) visible = false light_color = Color(0.7, 0.8, 1, 1) light_energy = 0.0 +light_indirect_energy = 1.979 diff --git a/dynamic-sky/environment.tres b/dynamic-sky/environment.tres index dc6fadf..7c69b29 100644 --- a/dynamic-sky/environment.tres +++ b/dynamic-sky/environment.tres @@ -110,7 +110,7 @@ shader_parameter/sky_bottom_color = Color(0.5, 0.6, 0.7, 1) shader_parameter/gradient_intensity = 1.0 shader_parameter/horizon_blend = 0.5 shader_parameter/sun_glow_enabled = true -shader_parameter/sun_direction = Vector3(-0.92782164, 0.34649342, 0.13816392) +shader_parameter/sun_direction = Vector3(-0.71683276, 0.6476549, 0.25825176) shader_parameter/sun_glow_color = Color(1, 0.95, 0.85, 1) shader_parameter/sun_glow_intensity = 0.3 shader_parameter/sun_glow_size = 0.2 @@ -128,9 +128,9 @@ sky_material = SubResource("ShaderMaterial_jmmec") [resource] background_mode = 2 sky = SubResource("Sky_ssi15") -ambient_light_color = Color(0.5, 0.6, 0.8, 1) -ambient_light_energy = 0.6 +ambient_light_color = Color(0.5733876, 0.5701628, 0.64355034, 1) +ambient_light_energy = 0.52610695 fog_enabled = true -fog_light_color = Color(0.7, 0.8, 0.95, 1) -fog_density = 0.005 +fog_light_color = Color(0.7, 0.64355034, 0.6637131, 1) +fog_density = 0.012741526 fog_height_density = 0.1 diff --git a/dynamic-sky/resources/sky_config.gd b/dynamic-sky/resources/sky_config.gd index 6dbb21f..062df2d 100644 --- a/dynamic-sky/resources/sky_config.gd +++ b/dynamic-sky/resources/sky_config.gd @@ -9,8 +9,8 @@ extends Resource @export_group("Moon Settings") @export var moon_color: Color = Color(0.8, 0.85, 1.0) -@export var moon_intensity: float = 0.3 -@export var moon_size: float = 0.03 +@export var moon_intensity: float = 0.8 +@export var moon_size: float = 0.3 @export_group("Ambient Settings") @export var ambient_color: Color = Color(0.4, 0.5, 0.6) diff --git a/dynamic-sky/scripts/dynamic_sky_root.gd b/dynamic-sky/scripts/dynamic_sky_root.gd index d9963a4..57d1155 100644 --- a/dynamic-sky/scripts/dynamic_sky_root.gd +++ b/dynamic-sky/scripts/dynamic_sky_root.gd @@ -21,6 +21,10 @@ signal preset_changed(preset: SkyPreset) @export var sun_light: DirectionalLight3D @export var moon_light: DirectionalLight3D +@export_group("Moon Visual") +@export var moon_size: float = 0.045 +@export var moon_height: float = 45.0 + @export_group("Global Settings") @export var auto_create_controllers: bool = true @export var deterministic_seed: int = 0: @@ -209,25 +213,17 @@ func _sync_sun_moon() -> void: var ambient_color: Color var ambient_energy: float - if _current_config: - sun_color = _current_config.sun_color - sun_energy = _current_config.sun_intensity - moon_color = _current_config.moon_color - moon_energy = _current_config.moon_intensity - ambient_color = _current_config.ambient_color - ambient_energy = _current_config.ambient_intensity - else: - sun_color = day_night_controller.get_sun_color() - sun_energy = day_night_controller.get_sun_intensity() - moon_color = day_night_controller.get_moon_color() - moon_energy = day_night_controller.get_moon_intensity() - ambient_color = day_night_controller.get_ambient_color() - ambient_energy = day_night_controller.get_ambient_intensity() - if weather_controller: - var wp := weather_controller.get_current_profile() - if wp: - ambient_color *= wp.ambient_color_multiplier - ambient_energy *= wp.ambient_intensity_multiplier + sun_color = day_night_controller.get_sun_color() + sun_energy = day_night_controller.get_sun_intensity() + moon_color = day_night_controller.get_moon_color() + moon_energy = day_night_controller.get_moon_intensity() + ambient_color = day_night_controller.get_ambient_color() + ambient_energy = day_night_controller.get_ambient_intensity() + if weather_controller: + var wp := weather_controller.get_current_profile() + if wp: + ambient_color *= wp.ambient_color_multiplier + ambient_energy *= wp.ambient_intensity_multiplier if sun_light: sun_light.look_at(global_position - sun_dir, Vector3.UP) @@ -341,6 +337,19 @@ func _sync_post_process() -> void: day_night_controller.get_sky_horizon_color(), day_night_controller.get_sky_bottom_color() ) + + var moon_energy := day_night_controller.get_moon_intensity() + var visual_intensity := moon_energy * 4.0 + var mh: float = moon_height if moon_height > 0.0 else 45.0 + var ms: float = moon_size if moon_size > 0.0 else 0.045 + var moon_angle := (day_night_controller.time_of_day + 0.25) * TAU + var elevation := sin(moon_angle) * deg_to_rad(mh) + var moon_visual_dir := Vector3( + cos(moon_angle + PI), + sin(elevation) * 2.0, + sin(moon_angle) * 0.3 + ).normalized() + post_process_controller.set_moon(moon_visual_dir, Color.WHITE, visual_intensity, ms) func _apply_preset_assets(preset: SkyPreset) -> void: diff --git a/dynamic-sky/scripts/post_process_controller.gd b/dynamic-sky/scripts/post_process_controller.gd index 8fa5275..d23cf98 100644 --- a/dynamic-sky/scripts/post_process_controller.gd +++ b/dynamic-sky/scripts/post_process_controller.gd @@ -54,6 +54,10 @@ extends Node var _sky_material: ShaderMaterial var _post_process_quad: MeshInstance3D +var _moon_direction: Vector3 = Vector3(0.0, -1.0, 0.0) +var _moon_color: Color = Color(0.9, 0.92, 1.0) +var _moon_intensity: float = 0.0 +var _moon_size: float = 0.03 func _ready() -> void: @@ -155,6 +159,11 @@ uniform vec4 dawn_dusk_color : source_color = vec4(1.0, 0.6, 0.4, 1.0); uniform float dawn_dusk_intensity = 0.5; uniform float dawn_dusk_blend = 0.0; +uniform vec3 moon_direction = vec3(0.0, -1.0, 0.0); +uniform vec4 moon_color : source_color = vec4(0.9, 0.92, 1.0, 1.0); +uniform float moon_intensity = 0.0; +uniform float moon_size = 0.03; + uniform float stars_visibility = 0.0; uniform vec4 stars_tint : source_color = vec4(1.0); @@ -222,6 +231,14 @@ void sky() { color += stars_tint.rgb * star_value; } + if (moon_intensity > 0.0 && moon_direction.y > 0.0) { + vec3 moon_dir = normalize(moon_direction); + float moon_dot = dot(dir, moon_dir); + float disc = smoothstep(1.0 - moon_size, 1.0 - moon_size * 0.6, moon_dot); + float glow = pow(max(0.0, moon_dot), 32.0) * 0.15; + color += moon_color.rgb * disc * moon_intensity + moon_color.rgb * glow * moon_intensity * 0.5; + } + COLOR = color; } """ @@ -255,6 +272,11 @@ func _update_sky_material() -> void: _sky_material.set_shader_parameter("dawn_dusk_enabled", dawn_dusk_enabled and effects_enabled) _sky_material.set_shader_parameter("dawn_dusk_blend", dawn_dusk_blend) _sky_material.set_shader_parameter("dawn_dusk_intensity", dawn_dusk_intensity) + + _sky_material.set_shader_parameter("moon_direction", _moon_direction) + _sky_material.set_shader_parameter("moon_color", _moon_color) + _sky_material.set_shader_parameter("moon_intensity", _moon_intensity) + _sky_material.set_shader_parameter("moon_size", _moon_size) func set_sky_colors(top: Color, horizon: Color, bottom: Color) -> void: @@ -283,6 +305,14 @@ func set_dawn_dusk_blend(blend: float) -> void: _update_sky_material() +func set_moon(direction: Vector3, color: Color, intensity: float, size: float = 0.03) -> void: + _moon_direction = direction.normalized() + _moon_color = color + _moon_intensity = intensity + _moon_size = size + _update_sky_material() + + func set_stars_visibility(visibility: float, tint: Color = Color.WHITE) -> void: if _sky_material: _sky_material.set_shader_parameter("stars_visibility", visibility) diff --git a/scenes/trainjourney.tscn b/scenes/trainjourney.tscn index 815cd13..e3d795e 100644 --- a/scenes/trainjourney.tscn +++ b/scenes/trainjourney.tscn @@ -43,6 +43,7 @@ main_scene = ExtResource("2_7fone") [node name="DynamicSky" parent="." unique_id=516593260 node_paths=PackedStringArray("weather_vfx") instance=ExtResource("3_7brvr")] weather_vfx = NodePath("WeatherVFX") +moon_height = 45.0 [node name="TrackGenerator" type="Node3D" parent="." unique_id=1804102656] script = ExtResource("2_j07ug")