diff --git a/core/daynight/blur.gdshader b/core/daynight/blur.gdshader new file mode 100644 index 0000000..c48a307 --- /dev/null +++ b/core/daynight/blur.gdshader @@ -0,0 +1,16 @@ +shader_type canvas_item; + +uniform sampler2D screen_texture : hint_screen_texture, filter_linear_mipmap; + +uniform float blur_amount : hint_range(0.0, 5.0) = 2.5; +uniform float focus_size : hint_range(0.0, 1.0) = 0.4; +uniform float transition_softness : hint_range(0.01, 1.0) = 0.3; + +void fragment() { + float dist_from_center = abs(SCREEN_UV.y - 0.5); + float mask = smoothstep(focus_size / 2.0, (focus_size / 2.0) + transition_softness, dist_from_center); + + //Apply blur + vec4 blurred_screen = textureLod(screen_texture, SCREEN_UV, blur_amount * mask); + COLOR = blurred_screen; +} \ No newline at end of file diff --git a/core/daynight/blur.gdshader.uid b/core/daynight/blur.gdshader.uid new file mode 100644 index 0000000..12a4cf0 --- /dev/null +++ b/core/daynight/blur.gdshader.uid @@ -0,0 +1 @@ +uid://bkn6eqgbn37jx diff --git a/core/daynight/day_night_controller.gd b/core/daynight/day_night_controller.gd index 0fc602e..f97055e 100644 --- a/core/daynight/day_night_controller.gd +++ b/core/daynight/day_night_controller.gd @@ -1,11 +1,9 @@ class_name DayNightController extends Node -#Time duration in seconds for a day -@export var day_duration: float = 120.0 - #starting time @export_range(0.0, 1.0) var start_time: float = 0.0 +var environment_config: EnvironmentConfig #Multiply for debug @export var time_scale: float = 1.0 @@ -16,16 +14,23 @@ signal time_changed(time: float) var current_time: float = 0.0 +func _init(environmentconfig: EnvironmentConfig) -> void: + environment_config = environmentconfig + func _ready() -> void: + #connect events + UIEvents.set_day_time.connect(_on_set_day_time) + UIEvents.toggle_pause_daytime.connect(_on_toggle_pause_daytime) + current_time = start_time update_time(current_time) - UIEvents.set_day_time.connect(_on_set_day_time) + func _process(delta: float) -> void: - if paused or day_duration <= 0.0: + if paused or environment_config.day_duration <= 0.0: return - var increment: float = (delta * time_scale) / day_duration + var increment: float = (delta * time_scale) / environment_config.day_duration current_time = wrapf(current_time + increment, 0.0, 1.0) update_time(current_time) @@ -46,3 +51,6 @@ func update_time(currtime: float) -> void: func _on_set_day_time(value: float) -> void: set_time(value) + +func _on_toggle_pause_daytime(value: bool) -> void: + paused = value diff --git a/core/daynight/environment_dust.gdshader b/core/daynight/environment_dust.gdshader new file mode 100644 index 0000000..42716af --- /dev/null +++ b/core/daynight/environment_dust.gdshader @@ -0,0 +1,73 @@ +shader_type canvas_item; + +uniform sampler2D screen_texture : hint_screen_texture, filter_linear_mipmap; + +uniform vec4 dust_color : source_color = vec4(1.0, 0.456, 0.125, 0.6); + +//Wind -> negative x = to the left. positive y = to the bottom +uniform vec2 wind_velocity = vec2(-0.2, 0.05); +uniform float wind_oscillation : hint_range(0.0, 1.0) = 0.3; +uniform float dust_speed : hint_range(0.01, 1.0) = 0.15; + +uniform float size_min : hint_range(0.001, 0.1) = 0.02; +uniform float size_max : hint_range(0.01, 0.5) = 0.2; +uniform float dust_density : hint_range(0.01, 10.0) = 1.0; + +// Softness +// 0.0 = Sfumatura totale dal centro esatto fino al bordo. +// 0.5 = Metà pallino è solido, l'altra metà sfuma. +// 0.9 = Pallino dai bordi durissimi. +uniform float solid_core : hint_range(0.0, 0.99) = 0.1; + +vec3 hash33(vec3 p3) { + p3 = fract(p3 * vec3(0.1031, 0.1030, 0.0973)); + p3 += dot(p3, p3.yzx + 33.33); + return fract((p3.xxy + p3.yzz) * p3.zyx); +} + +void fragment() { + vec4 scene_color = texture(screen_texture, SCREEN_UV); + float base_time = TIME * dust_speed; + + vec2 osc = vec2(sin(TIME * 0.5), cos(TIME * 0.3)) * wind_oscillation; + vec2 final_wind = (wind_velocity + osc) * dust_speed; + + float final_particle_alpha = 0.0; + + //Thresolds (near, medium, far) + vec3 layer_scales = vec3(20.0, 50.0, 100.0) / dust_density; + vec3 layer_thresholds = vec3(0.96, 0.98, 0.99); + vec3 layer_speeds = vec3(1.0, 0.6, 0.3); + + for (int i = 0; i < 3; i++) { + float scale = layer_scales[i]; + float threshold = layer_thresholds[i]; + float speed_mult = layer_speeds[i]; + + vec2 st = (SCREEN_UV * scale) - (final_wind * speed_mult * base_time * 50.0); + vec2 ipos = floor(st); + vec2 fpos = fract(st); + + vec3 rand = hash33(vec3(ipos, float(i))); + + if (rand.z > threshold) { + float blink = sin(TIME * (2.0 + rand.x)) * 0.5 + 0.5; + + float d = length(fpos - vec2(0.5)); + float size = size_min + (size_max - size_min) * rand.x; + float scaled_size = size * (0.5 + 0.5 * blink); + + float core = scaled_size * solid_core; + + float particle_softness = 1.0 - smoothstep(core, scaled_size, d); + + float intensity = (rand.z - threshold) / (1.0 - threshold); + final_particle_alpha += particle_softness * blink * intensity; + } + } + + final_particle_alpha = clamp(final_particle_alpha, 0.0, 1.0); + vec4 dust_colored_particle = dust_color * final_particle_alpha; + + COLOR = scene_color + dust_colored_particle; +} \ No newline at end of file diff --git a/core/daynight/environment_dust.gdshader.uid b/core/daynight/environment_dust.gdshader.uid new file mode 100644 index 0000000..f5c22f7 --- /dev/null +++ b/core/daynight/environment_dust.gdshader.uid @@ -0,0 +1 @@ +uid://bwf4wjp802x8j diff --git a/core/daynight/environment_dust_material.tres b/core/daynight/environment_dust_material.tres new file mode 100644 index 0000000..139656c --- /dev/null +++ b/core/daynight/environment_dust_material.tres @@ -0,0 +1,14 @@ +[gd_resource type="ShaderMaterial" format=3 uid="uid://codq5gx71rj4o"] + +[ext_resource type="Shader" uid="uid://bwf4wjp802x8j" path="res://core/daynight/environment_dust.gdshader" id="1_80hx2"] + +[resource] +shader = ExtResource("1_80hx2") +shader_parameter/dust_color = Color(1, 0.9019608, 0.7019608, 0.6) +shader_parameter/wind_velocity = Vector2(-1, 0.5) +shader_parameter/wind_oscillation = 0.0150000007125 +shader_parameter/dust_speed = 0.15 +shader_parameter/size_min = 0.010000000475 +shader_parameter/size_max = 0.15000000642648 +shader_parameter/dust_density = 1.5 +shader_parameter/solid_core = 0.25 diff --git a/core/daynight/environment_management.tscn b/core/daynight/environment_management.tscn index 5ec2cb7..b0e5f79 100644 --- a/core/daynight/environment_management.tscn +++ b/core/daynight/environment_management.tscn @@ -6,14 +6,18 @@ [ext_resource type="Shader" uid="uid://cq4vlcj8cuvge" path="res://core/daynight/fog.gdshader" id="2_r4tfj"] [ext_resource type="PackedScene" uid="uid://dyxvcf2l8ba5x" path="res://core/daynight/god_ray.tscn" id="5_411rw"] [ext_resource type="Shader" uid="uid://bb1jjwe31fl7o" path="res://core/daynight/wind.gdshader" id="5_djqkg"] -[ext_resource type="Shader" uid="uid://b6l166fnyto24" path="res://core/daynight/fogoverlay.gdshader" id="7_i6gqj"] +[ext_resource type="Shader" uid="uid://bwf4wjp802x8j" path="res://core/daynight/environment_dust.gdshader" id="7_ik86e"] +[ext_resource type="Material" uid="uid://codq5gx71rj4o" path="res://core/daynight/environment_dust_material.tres" id="8_amaf0"] +[ext_resource type="Shader" uid="uid://bkn6eqgbn37jx" path="res://core/daynight/blur.gdshader" id="9_amaf0"] +[ext_resource type="Shader" uid="uid://b5wa82soyhsqm" path="res://core/daynight/environment_shadows.gdshader" id="10_tuauy"] +[ext_resource type="FastNoiseLite" uid="uid://c0mtwrkptjcuw" path="res://core/daynight/environment_shadows_noise_clouds.tres" id="11_yn8v8"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_ruhh7"] render_priority = 0 shader = ExtResource("2_i3hjl") shader_parameter/cloud_scale = 0.05 shader_parameter/cloud_speed = 0.05 -shader_parameter/direction = Vector2(1, 0.2) +shader_parameter/direction = Vector2(0.5, 0.2) shader_parameter/sun_angle = Vector2(0.5, 0.5) shader_parameter/cloud_density = 0.4 shader_parameter/center_sharpness = 0.14 @@ -179,21 +183,59 @@ material = SubResource("StandardMaterial3D_ruhh7") size = Vector2(0.05, 0.8) [sub_resource type="ShaderMaterial" id="ShaderMaterial_ik86e"] -shader = ExtResource("7_i6gqj") -shader_parameter/fog_color = Color(0.85, 0.9, 0.95, 1) -shader_parameter/clear_center_radius = 0.39200001862 -shader_parameter/edge_softness = 0.30900001397898 -shader_parameter/max_opacity = 0.10000000475 +shader = ExtResource("7_ik86e") +shader_parameter/dust_color = Color(1, 0.9, 0.7, 0.6) +shader_parameter/wind_velocity = Vector2(-0.2, 0.05) +shader_parameter/wind_oscillation = 0.3 +shader_parameter/dust_speed = 0.15 +shader_parameter/size_min = 0.02 +shader_parameter/size_max = 0.2 +shader_parameter/dust_density = 1.0 +shader_parameter/solid_core = 0.1 -[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "fog_overlay")] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_kavln"] +shader = ExtResource("9_amaf0") +shader_parameter/blur_amount = 0.70000003325 +shader_parameter/focus_size = 0.250000011875 +shader_parameter/transition_softness = 0.40000001830148 + +[sub_resource type="QuadMesh" id="QuadMesh_sxgg7"] +size = Vector2(2, 2) + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_0fcg4"] +noise = ExtResource("11_yn8v8") +seamless = true + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_oqt1s"] +render_priority = 0 +shader = ExtResource("10_tuauy") +shader_parameter/noise_texture = SubResource("NoiseTexture2D_0fcg4") +shader_parameter/cloud_scale = 0.0070000003325 +shader_parameter/cloud_speed = 0.0030000001425 +shader_parameter/direction = Vector2(0.5, 0.2) +shader_parameter/sun_angle = Vector2(0.5, 0.5) +shader_parameter/cloud_density = 0.400000019 +shader_parameter/center_sharpness = 0.138000006555 +shader_parameter/shadow_color = Color(0, 0, 0, 1) +shader_parameter/opacity_center = 0.90000004275 +shader_parameter/opacity_edge = 0.6000000285 +shader_parameter/fade_start = 150.0 +shader_parameter/fade_end = 800.000035625 +shader_parameter/height_fade_start = 10.0 +shader_parameter/height_fade_end = 50.0 + +[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "fog_overlay", "environment_dust", "blur", "environment_shadows")] script = ExtResource("1_wecen") environment_config = SubResource("Resource_r4tfj") +godray = ExtResource("5_411rw") particles_wind = NodePath("Particles_Wind") particles_snow = NodePath("Particles_Snow") particles_fireflies = NodePath("Particles_Fireflies") particles_rain = NodePath("Particles_Rain") -godray = ExtResource("5_411rw") fog_overlay = NodePath("FogOverlay") +environment_dust = NodePath("EnvironmentDust") +blur = NodePath("Blur") +environment_shadows = NodePath("EnvironmentShadows") [node name="Particles_Fireflies" type="GPUParticles3D" parent="." unique_id=947538133] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0) @@ -214,7 +256,6 @@ draw_pass_1 = SubResource("TubeTrailMesh_vo82p") [node name="Particles_Snow" type="GPUParticles3D" parent="." unique_id=1877039876] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 30, 0) -visible = false emitting = false amount = 2000 lifetime = 4.0 @@ -232,7 +273,6 @@ process_material = SubResource("ParticleProcessMaterial_b5atu") draw_pass_1 = SubResource("QuadMesh_cer0u") [node name="FogOverlay" type="ColorRect" parent="." unique_id=1694754918] -visible = false material = SubResource("ShaderMaterial_ik86e") anchors_preset = 15 anchor_right = 1.0 @@ -240,3 +280,26 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 + +[node name="EnvironmentDust" type="ColorRect" parent="." unique_id=1245348005] +material = ExtResource("8_amaf0") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Blur" type="ColorRect" parent="." unique_id=809010331] +material = SubResource("ShaderMaterial_kavln") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="EnvironmentShadows" type="MeshInstance3D" parent="." unique_id=159549433] +extra_cull_margin = 16384.0 +mesh = SubResource("QuadMesh_sxgg7") +surface_material_override/0 = SubResource("ShaderMaterial_oqt1s") diff --git a/core/daynight/environment_manager.gd b/core/daynight/environment_manager.gd index d510fab..681fd03 100644 --- a/core/daynight/environment_manager.gd +++ b/core/daynight/environment_manager.gd @@ -13,6 +13,9 @@ extends Node3D @export var particles_rain: GPUParticles3D @export var godray: PackedScene @export var fog_overlay: ColorRect +@export var environment_dust: ColorRect +@export var blur: ColorRect +@export var environment_shadows: MeshInstance3D #environment nodes @onready var sun: DirectionalLight3D = $"../DirectionalLight3D" @@ -24,10 +27,12 @@ var weather_controller: WeatherController var day_tween: Tween var day_time: float = 0.0 -func _ready() -> void: - +func _ready() -> void: + if day_night_controller == null: - day_night_controller = DayNightController.new() + day_night_controller = DayNightController.new( + environment_config + ) day_night_controller.name = "DayNightController" day_night_controller.time_changed.connect(select_day_time) add_child(day_night_controller) @@ -38,8 +43,12 @@ func _ready() -> void: particles_snow, particles_fireflies, particles_rain, - godray, - sun, + godray, + fog_overlay, + environment_dust, + blur, + environment_shadows, + sun, environment, environment_config, camera diff --git a/core/daynight/environment_shadows.gdshader b/core/daynight/environment_shadows.gdshader new file mode 100644 index 0000000..6beb9a0 --- /dev/null +++ b/core/daynight/environment_shadows.gdshader @@ -0,0 +1,75 @@ +shader_type spatial; + +render_mode unshaded, depth_test_disabled, cull_disabled; + +uniform sampler2D depth_texture : hint_depth_texture, repeat_disable, filter_nearest; +uniform sampler2D noise_texture : repeat_enable, filter_linear; + +uniform float cloud_scale : hint_range(0.001, 0.2) = 0.05; +uniform float cloud_speed : hint_range(0.0, 1.0) = 0.05; +uniform vec2 direction = vec2(1.0, 0.2); +uniform vec2 sun_angle = vec2(0.5, 0.5); + +group_uniforms Cloud_Shape; +uniform float cloud_density : hint_range(0.0, 1.0) = 0.5; +uniform float center_sharpness : hint_range(0.0, 0.99) = 0.7; + +group_uniforms Layout; +uniform vec3 shadow_color : source_color = vec3(0.0, 0.0, 0.0); +uniform float opacity_center : hint_range(0.0, 1.0) = 0.5; +uniform float opacity_edge : hint_range(0.0, 1.0) = 0.2; + +group_uniforms Fade_Distance; +//Fade based on camera distance +uniform float fade_start : hint_range(10.0, 1000.0) = 150.0; +uniform float fade_end : hint_range(50.0, 2000.0) = 300.0; + +group_uniforms Fade_Height; +//Fade based on base height (Y) - meters +uniform float height_fade_start : hint_range(0.0, 500.0) = 10.0; //start disappear at 10m +uniform float height_fade_end : hint_range(0.0, 1000.0) = 50.0; //disappear over 50m + +void vertex() { + POSITION = vec4(VERTEX.xy, 1.0, 1.0); +} + +void fragment() { + float depth = texture(depth_texture, SCREEN_UV).x; + + if (depth >= 0.9999) { + ALPHA = 0.0; + } else { + vec3 ndc = vec3(SCREEN_UV * 2.0 - 1.0, depth); + vec4 view_pos = INV_PROJECTION_MATRIX * vec4(ndc, 1.0); + view_pos /= view_pos.w; + vec4 world_pos = INV_VIEW_MATRIX * view_pos; + + float dist = length(view_pos.xyz); + float dist_fade = smoothstep(fade_end, fade_start, dist); + + float height_fade = smoothstep(height_fade_end, height_fade_start, world_pos.y); + + float final_fade = dist_fade * height_fade; + + if (final_fade <= 0.001) { + ALPHA = 0.0; + } else { + vec2 projected_xz = world_pos.xz + (world_pos.y * sun_angle); + vec2 uv = projected_xz * cloud_scale; + uv += TIME * cloud_speed * direction; + + float n = texture(noise_texture, uv).r; + + if (n < (1.0 - cloud_density)) { + ALPHA = 0.0; + } else { + float internal_n = (n - (1.0 - cloud_density)) / cloud_density; + float is_center = step(center_sharpness, internal_n); + + ALBEDO = shadow_color; + + ALPHA = mix(opacity_edge, opacity_center, is_center) * final_fade; + } + } + } +} \ No newline at end of file diff --git a/core/daynight/environment_shadows.gdshader.uid b/core/daynight/environment_shadows.gdshader.uid new file mode 100644 index 0000000..fc24e7b --- /dev/null +++ b/core/daynight/environment_shadows.gdshader.uid @@ -0,0 +1 @@ +uid://b5wa82soyhsqm diff --git a/core/daynight/environment_shadows.tres b/core/daynight/environment_shadows.tres new file mode 100644 index 0000000..8c9c97f --- /dev/null +++ b/core/daynight/environment_shadows.tres @@ -0,0 +1,26 @@ +[gd_resource type="ShaderMaterial" format=3 uid="uid://cknq8qhom7ral"] + +[ext_resource type="Shader" uid="uid://c0gopfoe0ij8g" path="res://Shaders/Shadow_postProcess.gdshader" id="1_23efu"] +[ext_resource type="FastNoiseLite" uid="uid://c0mtwrkptjcuw" path="res://Assets/Textures/Noise_Clouds.tres" id="2_n0ip8"] + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_5lko7"] +noise = ExtResource("2_n0ip8") +seamless = true + +[resource] +render_priority = 0 +shader = ExtResource("1_23efu") +shader_parameter/noise_texture = SubResource("NoiseTexture2D_5lko7") +shader_parameter/cloud_scale = 0.0070000003325 +shader_parameter/cloud_speed = 0.0030000001425 +shader_parameter/direction = Vector2(1, 0.2) +shader_parameter/sun_angle = Vector2(0.5, 0.5) +shader_parameter/cloud_density = 0.400000019 +shader_parameter/center_sharpness = 0.138000006555 +shader_parameter/shadow_color = Color(0, 0, 0, 1) +shader_parameter/opacity_center = 0.90000004275 +shader_parameter/opacity_edge = 0.6000000285 +shader_parameter/fade_start = 150.0 +shader_parameter/fade_end = 800.000035625 +shader_parameter/height_fade_start = 10.0 +shader_parameter/height_fade_end = 50.0 diff --git a/core/daynight/environment_shadows_noise_clouds.tres b/core/daynight/environment_shadows_noise_clouds.tres new file mode 100644 index 0000000..6d91707 --- /dev/null +++ b/core/daynight/environment_shadows_noise_clouds.tres @@ -0,0 +1,6 @@ +[gd_resource type="FastNoiseLite" format=3 uid="uid://c0mtwrkptjcuw"] + +[resource] +fractal_lacunarity = 1.915 +fractal_gain = 0.53 +fractal_weighted_strength = 0.35 diff --git a/core/daynight/weather_controller.gd b/core/daynight/weather_controller.gd index 9bd2fb5..ae3ec23 100644 --- a/core/daynight/weather_controller.gd +++ b/core/daynight/weather_controller.gd @@ -7,6 +7,9 @@ var particles_fireflies: GPUParticles3D var particles_rain: GPUParticles3D var godray: PackedScene var fog_overlay: ColorRect +var environment_dust: ColorRect +var blur: ColorRect +var environment_shadows: MeshInstance3D var sun: DirectionalLight3D var environment: WorldEnvironment @@ -36,6 +39,7 @@ var thereare_fireflies: bool = false func _init(wind: GPUParticles3D, snow: GPUParticles3D, fireflies: GPUParticles3D, rain: GPUParticles3D, ray: PackedScene, + fogov: ColorRect, dust: ColorRect, blurr: ColorRect, envshadows: MeshInstance3D, thesun: DirectionalLight3D, theenvironment: WorldEnvironment, environmentconfig: EnvironmentConfig, thecamera: Camera3D = null) -> void: particles_wind = wind @@ -44,6 +48,10 @@ func _init(wind: GPUParticles3D, snow: GPUParticles3D, particles_rain = rain godray = ray sun = thesun + fog_overlay = fogov + environment_dust = dust + blur = blurr + environment_shadows = envshadows environment = theenvironment environment_config = environmentconfig camera = thecamera @@ -65,8 +73,13 @@ func _ready() -> void: UIEvents.toggle_wind.connect(toggle_wind) UIEvents.toggle_fireflies.connect(toggle_fireflies) UIEvents.toggle_storm.connect(toggle_storm) - + UIEvents.toggle_fog_overlay.connect(toggle_fog_overlay) + UIEvents.toggle_dust.connect(toggle_dust) + UIEvents.toggle_blur.connect(toggle_blur) + UIEvents.toggle_shadows.connect(toggle_shadows) + func _process(delta: float) -> void: + _follow_camera() var base_tint: Color @@ -204,7 +217,7 @@ func _follow_camera() -> void: if particles_fireflies: particles_fireflies.global_position = Vector3(cam_pos.x, particles_fireflies.position.y, cam_pos.z) -#region fireflies +#region Fireflies func toggle_fireflies(value: bool): thereare_fireflies = value @@ -241,6 +254,28 @@ func set_wind(): var proc_mat_wind = particles_wind.process_material as ParticleProcessMaterial if proc_mat_wind: proc_mat_wind.emission_box_extents = Vector3(environment_config.wind_spawn_ray, environment_config.wind_spawn_height, environment_config.wind_spawn_ray) + + if environment_config: + _apply_cloud_config() + +func _apply_cloud_config() -> void: + var dir = environment_config.wind_direction + var cloud_scale = environment_config.cloud_scale + var cloud_speed = environment_config.cloud_speed + var envshadows_scale_rate = environment_config.cloud_scale_envshadows_rate + var envshadows_speed_rate = environment_config.cloud_speed_envshadows_rate + + if environment and environment.environment and environment.environment.sky: + var sky_mat = environment.environment.sky.sky_material as ShaderMaterial + if sky_mat: + sky_mat.set_shader_parameter("cloud_direction", dir) + sky_mat.set_shader_parameter("cloud_scale", cloud_scale) + sky_mat.set_shader_parameter("cloud_speed", cloud_speed) + + if environment_shadows and environment_shadows.material_override: + environment_shadows.material_override.set_shader_parameter("direction", dir) + environment_shadows.material_override.set_shader_parameter("cloud_scale", cloud_scale * envshadows_scale_rate) + environment_shadows.material_override.set_shader_parameter("cloud_speed", cloud_speed * envshadows_speed_rate) #endregion @@ -325,6 +360,7 @@ func start_lightning(): if lightning_number > 1: await get_tree().create_timer(randf_range(0.05, 0.15)).timeout + #endregion #region Rain @@ -386,6 +422,7 @@ func spawn_single_godray() -> void: godray_tween.tween_interval(2.0) godray_tween.tween_property(ray, "scale", Vector3.ZERO, 2.0).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_SINE) godray_tween.tween_callback(ray.queue_free) + #endregion #region Snow @@ -446,3 +483,23 @@ func set_snow_amount(value: float): RenderingServer.global_shader_parameter_set("global_snow_amount", value) #endregion + +#region Post-Process + +func toggle_fog_overlay(value: bool) -> void: + if fog_overlay: + fog_overlay.visible = value + +func toggle_dust(value: bool) -> void: + if environment_dust: + environment_dust.visible = value + +func toggle_blur(value: bool) -> void: + if blur: + blur.visible = value + +func toggle_shadows(value: bool) -> void: + if environment_shadows: + environment_shadows.visible = value + +#endregion diff --git a/core/environment_config.gd b/core/environment_config.gd index 0084ba7..504c6e6 100644 --- a/core/environment_config.gd +++ b/core/environment_config.gd @@ -1,6 +1,10 @@ class_name EnvironmentConfig extends Resource +#Time duration in seconds for a day +@export_group("Day") +@export var day_duration: float = 120.0 + @export_group("Directional Lights and Environment") @export var morning_color: Color = Color(1.0, 0.9, 0.8, 1.0) @export var afternoon_color: Color = Color(1.0, 0.6, 0.2, 1.0) @@ -55,6 +59,12 @@ extends Resource @export var glow_afternoon: float = 0.8 @export var glow_night: float = 2.0 +@export_group("Post Process") +@export var enable_fog_overlay: bool = true +@export var enable_dust: bool = true +@export var enable_blur: bool = true +@export var enable_environment_shadows: bool = true + @export_group("Environment Materials") @export var material_fog: ShaderMaterial @export var material_drops: StandardMaterial3D @@ -92,6 +102,11 @@ extends Resource @export var wind_amount: int = 100 @export var wind_spawn_ray: float = 25.0 @export var wind_spawn_height: float = 5.0 +@export var wind_direction: Vector2 = Vector2(0.5, 0.2) +@export var cloud_scale: float = 0.5 +@export var cloud_speed: float = 0.05 +@export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.14 +@export_range(0.01, 1.0) var cloud_speed_envshadows_rate: float = 0.5 @export_group("Fireflies") @export var fireflies_amount: int = 60 diff --git a/core/ui_events.gd b/core/ui_events.gd index 8ad1ef7..0c0cd86 100644 --- a/core/ui_events.gd +++ b/core/ui_events.gd @@ -1,5 +1,6 @@ extends Node +#weather signals @warning_ignore("unused_signal") signal toggle_rain(value: bool) @warning_ignore("unused_signal") @@ -12,3 +13,15 @@ signal toggle_fireflies(value: bool) signal toggle_storm(value: bool) @warning_ignore("unused_signal") signal set_day_time(value: float) +@warning_ignore("unused_signal") +signal toggle_fog_overlay(value: bool) +@warning_ignore("unused_signal") +signal toggle_dust(value: bool) +@warning_ignore("unused_signal") +signal toggle_blur(value: bool) +@warning_ignore("unused_signal") +signal toggle_shadows(value: bool) + +#day cycle signals +@warning_ignore("unused_signal") +signal toggle_pause_daytime(value: bool) diff --git a/docs/museums/daynight/control.gd b/docs/museums/daynight/control.gd index 34151c5..9426be0 100644 --- a/docs/museums/daynight/control.gd +++ b/docs/museums/daynight/control.gd @@ -17,3 +17,18 @@ func _on_storm_toggled(toggled_on: bool) -> void: func _on_day_time_slider_value_changed(value: float) -> void: UIEvents.set_day_time.emit(value) + +func _on_fog_overlay_toggled(toggled_on: bool) -> void: + UIEvents.toggle_fog_overlay.emit(toggled_on) + +func _on_dust_toggled(toggled_on: bool) -> void: + UIEvents.toggle_dust.emit(toggled_on) + +func _on_blur_toggled(toggled_on: bool) -> void: + UIEvents.toggle_blur.emit(toggled_on) + +func _on_pause_toggled(toggled_on: bool) -> void: + UIEvents.toggle_pause_daytime.emit(toggled_on) + +func _on_shadows_toggled(toggled_on: bool) -> void: + UIEvents.toggle_shadows.emit(toggled_on) diff --git a/docs/museums/daynight/museum_daynight.tscn b/docs/museums/daynight/museum_daynight.tscn index 3760fa1..820f003 100644 --- a/docs/museums/daynight/museum_daynight.tscn +++ b/docs/museums/daynight/museum_daynight.tscn @@ -113,7 +113,7 @@ directional_shadow_fade_start = 0.9 transform = Transform3D(1, 0, 0, 0, 0.99452555, -0.10449375, 0, 0.10449375, 0.99452555, 0.48949432, 25.39013, 0) script = ExtResource("7_p2t1d") -[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1335123628] +[node name="Terrain" type="MeshInstance3D" parent="." unique_id=1335123628] material_override = SubResource("StandardMaterial3D_p2t1d") mesh = SubResource("BoxMesh_p2t1d") @@ -192,24 +192,98 @@ text = "Storm" [node name="DayTimeLabel" type="Label" parent="Control" unique_id=1673596218] layout_mode = 0 offset_left = 26.0 -offset_top = 142.0 +offset_top = 150.0 offset_right = 135.0 -offset_bottom = 165.0 +offset_bottom = 173.0 theme_override_colors/font_color = Color(0, 0, 0, 1) text = "Day Time" [node name="DayTimeSlider" type="HSlider" parent="Control" unique_id=530788076] layout_mode = 0 offset_left = 26.0 -offset_top = 165.0 +offset_top = 174.0 offset_right = 205.0 -offset_bottom = 181.0 +offset_bottom = 190.0 max_value = 1.0 step = 0.01 +[node name="FogOverlay" type="CheckButton" parent="Control" unique_id=1209829342] +layout_mode = 0 +offset_left = 21.0 +offset_top = 222.0 +offset_right = 160.0 +offset_bottom = 253.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Fog Overlay" + +[node name="Dust" type="CheckButton" parent="Control" unique_id=2023312048] +layout_mode = 0 +offset_left = 21.0 +offset_top = 250.0 +offset_right = 150.0 +offset_bottom = 281.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Dust" + +[node name="Blur" type="CheckButton" parent="Control" unique_id=1758807681] +layout_mode = 0 +offset_left = 21.0 +offset_top = 278.0 +offset_right = 150.0 +offset_bottom = 309.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Blur" + +[node name="Pause" type="CheckButton" parent="Control" unique_id=156986934] +layout_mode = 0 +offset_left = 21.0 +offset_top = 189.0 +offset_right = 158.0 +offset_bottom = 220.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Pause Time" + +[node name="Shadows" type="CheckButton" parent="Control" unique_id=1751516495] +layout_mode = 0 +offset_left = 21.0 +offset_top = 302.0 +offset_right = 150.0 +offset_bottom = 333.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Shadows" + [connection signal="toggled" from="Control/Snow" to="Control" method="_on_snow_toggled"] [connection signal="toggled" from="Control/Rain" to="Control" method="_on_rain_toggled"] [connection signal="toggled" from="Control/Wind" to="Control" method="_on_wind_toggled"] [connection signal="toggled" from="Control/Fireflies" to="Control" method="_on_fireflies_toggled"] [connection signal="toggled" from="Control/Storm" to="Control" method="_on_storm_toggled"] [connection signal="value_changed" from="Control/DayTimeSlider" to="Control" method="_on_day_time_slider_value_changed"] +[connection signal="toggled" from="Control/FogOverlay" to="Control" method="_on_fog_overlay_toggled"] +[connection signal="toggled" from="Control/Dust" to="Control" method="_on_dust_toggled"] +[connection signal="toggled" from="Control/Blur" to="Control" method="_on_blur_toggled"] +[connection signal="toggled" from="Control/Pause" to="Control" method="_on_pause_toggled"] +[connection signal="toggled" from="Control/Shadows" to="Control" method="_on_shadows_toggled"]