This commit is contained in:
Overside srl
2026-02-17 17:15:13 +01:00
parent c7d2ae14b3
commit 8b2ea22f0c
6 changed files with 99 additions and 41 deletions

View File

@@ -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:

View File

@@ -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)