add snow management for materials

This commit is contained in:
2026-03-31 14:28:10 +02:00
parent 2f4fd27dfd
commit ade67a3b90
26 changed files with 693 additions and 97 deletions

View File

@@ -6,6 +6,7 @@
[ext_resource type="Script" uid="uid://brcimd12tx3dm" path="res://core/daynight/edge_detection_compositor.gd" id="5_jgh18"]
[ext_resource type="Script" uid="uid://cx2tlvxhvatj5" path="res://docs/museums/daynight/control.gd" id="6_q52t1"]
[ext_resource type="Script" uid="uid://ccdd52apoh4ir" path="res://docs/museums/daynight/camera_3d.gd" id="7_p2t1d"]
[ext_resource type="PackedScene" uid="uid://bonjxfjcdnntt" path="res://docs/museums/daynight/scenes/grain_test/grain_test.tscn" id="7_w3se4"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_jiovi"]
fractal_lacunarity = 1.915
@@ -207,20 +208,6 @@ 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
@@ -276,13 +263,17 @@ theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
button_pressed = true
text = "Shadows"
[node name="Scene" type="Node" parent="." unique_id=701973010]
[node name="Grain" parent="Scene" unique_id=838519336 instance=ExtResource("7_w3se4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5548749, 0)
[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"]

View File

@@ -0,0 +1,23 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://2p8yqqg44ci3"]
[ext_resource type="Shader" uid="uid://cs0xl7pc6e26h" path="res://docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader" id="1_etun4"]
[ext_resource type="Texture2D" uid="uid://c0lkmyonx88hc" path="res://docs/museums/daynight/scenes/grain_test/grass_thin.png" id="2_grain"]
[resource]
render_priority = 0
shader = ExtResource("1_etun4")
shader_parameter/billboard_enabled = false
shader_parameter/wind_enabled = true
shader_parameter/base_color = Color(0.85, 0.75, 0.25, 1)
shader_parameter/alpha_texture = ExtResource("2_grain")
shader_parameter/leaves_scale = 1.0
shader_parameter/rotation_degrees = 0.0
shader_parameter/texture_offset = Vector2(0, 0)
shader_parameter/opacity = 1.0
shader_parameter/height_min = 0.0
shader_parameter/height_max = 5.0
shader_parameter/shadow_intensity = 0.5
shader_parameter/highlight_intensity = 0.3
shader_parameter/light_steps = 4.0
shader_parameter/random_mix = 0.3
shader_parameter/cast_shadow_strength = 0.6

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0lkmyonx88hc"
path.s3tc="res://.godot/imported/grass_thin.png-bbc8bfd78fe08207b1371627bbac389f.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://docs/museums/daynight/scenes/grain_test/grass_thin.png"
dest_files=["res://.godot/imported/grass_thin.png-bbc8bfd78fe08207b1371627bbac389f.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c3grftlmap4q5"
path.s3tc="res://.godot/imported/leaf_test.png-d1eaefb043387a8e84dcfdb0070f4094.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://docs/museums/daynight/scenes/grain_test/leaf_test.png"
dest_files=["res://.godot/imported/leaf_test.png-d1eaefb043387a8e84dcfdb0070f4094.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -0,0 +1,24 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://b1ej1sak6omli"]
[ext_resource type="Shader" uid="uid://co2jw3fnyc6aa" path="res://docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader" id="1_2uy3m"]
[ext_resource type="Texture2D" uid="uid://b7sqjhecpoyoh" path="res://docs/museums/daynight/scenes/grain_test/leaf_test.png" id="2_2uy3m"]
[resource]
render_priority = 0
shader = ExtResource("1_2uy3m")
shader_parameter/billboard_enabled = true
shader_parameter/wind_enabled = true
shader_parameter/base_color = Color(0.9549616, 0.54784274, 0.71385026, 1)
shader_parameter/alpha_texture = ExtResource("2_2uy3m")
shader_parameter/leaves_scale = 1.375
shader_parameter/rotation_degrees = 180.0
shader_parameter/texture_offset = Vector2(0, 0)
shader_parameter/opacity = 1.0
shader_parameter/snow_color = Color(0.85, 0.9, 0.95, 1)
shader_parameter/height_min = 6.0
shader_parameter/height_max = 11.0
shader_parameter/shadow_intensity = 0.800000038
shader_parameter/highlight_intensity = 0.0
shader_parameter/light_steps = 10.0
shader_parameter/random_mix = 0.0
shader_parameter/cast_shadow_strength = 0.0

View File

@@ -0,0 +1,24 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://b2lg2y1k7grmo"]
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://docs/museums/daynight/scenes/grain_test/trunk_shader.gdshader" id="1_yna88"]
[resource]
render_priority = 0
shader = ExtResource("1_yna88")
shader_parameter/albedo_color = Color(0.46921068, 0.28503138, 0.05139889, 1)
shader_parameter/use_texture = false
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 5.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0

View File

@@ -0,0 +1,89 @@
shader_type spatial;
render_mode specular_disabled, cull_disabled, ambient_light_disabled;
global uniform float global_wind_speed;
global uniform vec2 global_wind_direction;
global uniform float global_wind_scale;
global uniform float global_wind_strength;
uniform sampler2D wind_noise : filter_linear_mipmap;
uniform bool billboard_enabled = true;
uniform bool wind_enabled = true;
uniform vec4 base_color : source_color = vec4(0.2, 0.6, 0.3, 1.0);
uniform sampler2D alpha_texture : source_color, filter_nearest;
uniform float leaves_scale = 1.0;
uniform float rotation_degrees = 0.0;
uniform vec2 texture_offset = vec2(0.0, 0.0);
uniform float opacity : hint_range(0.0, 1.0) = 1.0;
uniform float height_min = 0.0;
uniform float height_max = 5.0;
uniform float shadow_intensity : hint_range(0.0, 1.0) = 0.5;
uniform float highlight_intensity : hint_range(0.0, 1.0) = 0.3;
uniform float light_steps : hint_range(1.0, 10.0) = 4.0;
uniform float random_mix : hint_range(0.0, 1.0) = 0.3;
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
varying vec3 v_final_color;
float hash(vec3 p) {
p = fract(p * 0.1031);
p += dot(p, p.yzx + 33.33);
return fract((p.x + p.y) * p.z);
}
void vertex() {
vec3 instance_pos = MODEL_MATRIX[3].xyz;
float total_angle = radians(rotation_degrees);
if (wind_enabled) {
float time = TIME * global_wind_speed;
vec2 noise_uv = (instance_pos.xz * global_wind_scale) + (time * global_wind_direction * 0.5);
float noise_val = textureLod(wind_noise, noise_uv, 2.0).r;
float sway = sin(time + (noise_val * 10.0));
total_angle += (sway * global_wind_strength);
}
float h_factor = clamp((instance_pos.y - height_min) / (height_max - height_min), 0.0, 1.0);
float leaf_rand = hash(instance_pos);
float combined_factor = mix(h_factor, leaf_rand, random_mix);
combined_factor = ceil(combined_factor * light_steps) / light_steps;
vec3 dark_color = base_color.rgb * (1.0 - shadow_intensity);
vec3 light_color = base_color.rgb + (vec3(1.0) - base_color.rgb) * highlight_intensity;
v_final_color = mix(dark_color, light_color, combined_factor);
if (billboard_enabled) {
vec3 view_pos_origin = (VIEW_MATRIX * vec4(instance_pos, 1.0)).xyz;
vec2 offset = (UV - 0.5) * leaves_scale;
float c = cos(total_angle);
float s = sin(total_angle);
vec2 rotated_offset = vec2(offset.x * c - offset.y * s, offset.x * s + offset.y * c);
vec3 final_pos = view_pos_origin + vec3(rotated_offset.x, rotated_offset.y, 0.0);
MODELVIEW_MATRIX = mat4(1.0);
MODELVIEW_MATRIX[3].xyz = final_pos;
VERTEX = vec3(0.0);
} else {
float c = cos(total_angle);
float s = sin(total_angle);
vec2 local_v = VERTEX.xy * leaves_scale;
VERTEX.x = local_v.x * c - local_v.y * s;
VERTEX.y = local_v.x * s + local_v.y * c;
}
}
void fragment() {
vec2 shifted_uv = UV + texture_offset;
vec4 tex = texture(alpha_texture, shifted_uv);
ALBEDO = v_final_color;
ALPHA = tex.r * opacity;
ALPHA_SCISSOR_THRESHOLD = 0.5;
ROUGHNESS = 0.02;
}
void light() {
float shadow_factor = mix(1.0 - cast_shadow_strength, 1.0, ATTENUATION);
float cutoff_mask = smoothstep(0.0, 0.05, ATTENUATION);
DIFFUSE_LIGHT += (shadow_factor * LIGHT_COLOR) * cutoff_mask;
}

View File

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

Binary file not shown.

View File

@@ -0,0 +1,44 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://e1an0215p6k2"
path="res://.godot/imported/tree_v1.fbx-c4b0f4368c15e2a509a5e472fe4c861e.scn"
[deps]
source_file="res://docs/museums/daynight/scenes/grain_test/tree_v1.fbx"
dest_files=["res://.godot/imported/tree_v1.fbx-c4b0f4368c15e2a509a5e472fe4c861e.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=true
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
fbx/importer=0
fbx/allow_geometry_helper_nodes=false
fbx/embedded_image_handling=1
fbx/naming_version=2

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,103 @@
shader_type spatial;
render_mode diffuse_toon, specular_disabled, ambient_light_disabled;
group_uniforms Albedo_Settings;
uniform vec4 albedo_color : source_color = vec4(1.0);
uniform sampler2D albedo_texture : source_color, filter_nearest;
uniform bool use_texture = true;
uniform vec2 uv_scale = vec2(1.0, 1.0);
uniform float palette_shift_y : hint_range(0.0, 1.0) = 0.0;
group_uniforms Height_Gradient;
global uniform vec4 global_gradient_color_top;
global uniform vec4 global_gradient_color_bot;
global uniform float global_gradient_intensity;
uniform float gradient_start_y = 0.0;
uniform float gradient_end_y = 10.0;
group_uniforms Toon_Lighting;
uniform float light_steps : hint_range(1.0, 10.0, 1.0) = 3.0;
uniform float step_softness : hint_range(0.01, 1.0) = 0.1;
uniform vec4 shadow_color : source_color = vec4(0.4, 0.4, 0.6, 1.0);
uniform float shadow_offset : hint_range(-1.0, 1.0) = 0.0;
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
// ---> NUOVO SISTEMA: GHIBLI DIRECTIONAL GLINT <---
group_uniforms Ghibli_Directional_Glint;
uniform bool use_ghibli_glint = true;
// Colore del bagliore (consigliato: panna caldo o albicocca desaturato)
uniform vec4 glint_color : source_color = vec4(1.0, 0.95, 0.85, 1.0);
// Quanta luce extra vogliamo (es: 1.0 = colora, >1.0 = fa brillare, ideale per Bloom)
uniform float glint_intensity : hint_range(0.0, 10.0) = 1.0;
// DEFINIZIONE DELL'ANGOLO: Più è alto, più la fascia di luce è stretta e netta (HArd Step)
uniform float glint_sharpness : hint_range(1.0, 128.0) = 32.0;
group_uniforms Emission_Settings;
uniform vec4 emission_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
uniform float emission_energy : hint_range(0.0, 16.0) = 0.0;
varying float world_y;
void vertex() {
world_y = (MODEL_MATRIX * vec4(VERTEX, 1.0)).y;
}
void fragment() {
vec2 final_uv = (UV * uv_scale) + vec2(0.0, palette_shift_y);
vec4 tex = texture(albedo_texture, final_uv);
vec3 base_color = albedo_color.rgb;
if (use_texture) base_color *= tex.rgb;
float grad_factor = smoothstep(gradient_start_y, gradient_end_y, world_y);
vec3 current_gradient_color = mix(global_gradient_color_bot.rgb, global_gradient_color_top.rgb, grad_factor);
base_color = mix(base_color, current_gradient_color, global_gradient_intensity);
ALBEDO = base_color;
EMISSION = emission_color.rgb * emission_energy;
}
void light() {
// GESTIONE ATTENUAZIONE E OMBRE (Anti-frittura con dither)
float shadow_factor = mix(1.0 - cast_shadow_strength, 1.0, ATTENUATION);
float cutoff_mask = smoothstep(0.0, 0.1, ATTENUATION);
float n_dot_l = dot(NORMAL, LIGHT);
// Anti-frittura dither
float dither = fract(sin(dot(FRAGCOORD.xy, vec2(12.9898, 78.233))) * 43758.5453);
float intensity = (clamp(n_dot_l, 0.0, 1.0) * shadow_factor) + (dither - 0.5) * 0.02;
float raw_step = (intensity + shadow_offset) * light_steps;
float lower_step = floor(raw_step);
float fract_step = fract(raw_step);
float soft_lerp = smoothstep(0.5 - step_softness, 0.5 + step_softness, fract_step);
float stepped_intensity = (lower_step + soft_lerp) / light_steps;
// Colori finali Toon
vec3 light_color_final = mix(shadow_color.rgb, vec3(1.1), clamp(stepped_intensity, 0.0, 1.0));
DIFFUSE_LIGHT += (light_color_final * LIGHT_COLOR) * cutoff_mask;
// ---> GHIBLI DIRECTIONAL GLINT (Il segreto dei tetti) <---
// Sfrutta solo la direzione del sole e la normale dell'oggetto, NON la telecamera.
if (use_ghibli_glint) {
// Calcoliamo un'area di "massima luce" molto aggressiva rivolta perpendicolarmente al sole
// Più 'glint_sharpness' è alto, più la fascia si stringe e diventa selettiva
float glint_raw = pow(max(0.0, n_dot_l), glint_sharpness);
// Toon-ifichiamo l'area con un taglio netto ma pulito
float glint_mask = smoothstep(0.5 - step_softness*0.5, 0.5 + step_softness*0.5, glint_raw);
// Mascheriamo per evitare che appaia nelle ombre proiettate dagli alberi (ATTENUATION)
// e puliamo i bordi laterali (cutoff a 0.0)
glint_mask *= smoothstep(0.0, 0.1, n_dot_l);
// Calcoliamo la luce extra finale
vec3 extra_sun_glint = glint_mask * glint_color.rgb * LIGHT_COLOR * glint_intensity * ATTENUATION;
// Aggiungiamo questa "botta" di luce extra direzionale
DIFFUSE_LIGHT += extra_sun_glint;
}
}

View File

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