add env shadows; add clouds and wind parameters for sky and envshadwows

This commit is contained in:
2026-03-27 13:22:39 +01:00
parent 052f200c5d
commit 2f4fd27dfd
17 changed files with 496 additions and 29 deletions

View File

@@ -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;
}

View File

@@ -0,0 +1 @@
uid://bkn6eqgbn37jx

View File

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

View File

@@ -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;
}

View File

@@ -0,0 +1 @@
uid://bwf4wjp802x8j

View File

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

View File

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

View File

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

View File

@@ -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;
}
}
}
}

View File

@@ -0,0 +1 @@
uid://b5wa82soyhsqm

View File

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

View File

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

View File

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