From 35618b565626933c30c829d83cdde89c74b558a5 Mon Sep 17 00:00:00 2001 From: Overside srl Date: Thu, 23 Apr 2026 15:29:03 +0200 Subject: [PATCH] fix snow and rain for grass --- core/daynight/environment_manager.gd | 8 +++--- core/daynight/grass_leaves.gdshader | 20 ++++++++++++--- core/daynight/tree_leaves.gdshader | 38 +++++++++++++++------------- core/daynight/weather_overlay.tres | 14 ++++++++++ core/environment_config.gd | 4 +-- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/core/daynight/environment_manager.gd b/core/daynight/environment_manager.gd index 6a46dd4..084f33b 100644 --- a/core/daynight/environment_manager.gd +++ b/core/daynight/environment_manager.gd @@ -89,7 +89,6 @@ func _apply_wind_noise_to_node(node: Node, noise_tex: Texture2D) -> void: func ApplyWeatherShaderToMaterials(): var weather_shader = preload("res://core/daynight/weather_overlay.tres") - for node in get_tree().get_nodes_in_group("weather_node"): if node is GeometryInstance3D: node.material_overlay = weather_shader @@ -97,14 +96,17 @@ func ApplyWeatherShaderToMaterials(): for child in node.get_children(): if child is GeometryInstance3D: child.material_overlay = weather_shader + break + var weather_plain_shader = preload("res://core/daynight/weather_plain_shader.tres") for node in get_tree().get_nodes_in_group("weather_vegetables_node"): if node is GeometryInstance3D: - node.material_overlay = weather_shader + node.material_overlay = weather_plain_shader else: for child in node.get_children(): if child is GeometryInstance3D: - child.material_overlay = weather_shader + child.material_overlay = weather_plain_shader + break func select_day_time(normalized_time: float) -> void: #set show_day_time_debug = true to show debug on screen diff --git a/core/daynight/grass_leaves.gdshader b/core/daynight/grass_leaves.gdshader index 11e2a4a..38ef814 100644 --- a/core/daynight/grass_leaves.gdshader +++ b/core/daynight/grass_leaves.gdshader @@ -8,7 +8,10 @@ global uniform float global_wind_speed; global uniform float global_wind_strength; global uniform vec2 global_wind_direction; //global uniform sampler2D global_wind_noise : filter_linear_mipmap; -global uniform float global_snow_amount; +global uniform float global_snow_start_time; +global uniform float global_snow_accumulation_speed; +global uniform float global_snow_melt_time; +global uniform float global_snow_melt_speed; // --- PARAMETRI ESTETICI --- uniform bool billboard_enabled = true; @@ -109,10 +112,19 @@ void fragment() { float noise_sample = texture(color_variance_noise, v_world_pos.xz * variance_scale).r; // Applichiamo la variazione al colore finale dell'erba vec3 varied_grass_color = mix(v_final_color, variance_color.rgb, noise_sample * variance_intensity); + + float snow_amount = 0.0; + if (global_snow_start_time >= 0.0) { + snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0); + } + if (global_snow_melt_time >= 0.0) { + float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0); + snow_amount *= (1.0 - melt); + } float top_mask = 1.0 - shifted_uv.y; - float snow_mask = smoothstep(1.0 - global_snow_amount, 1.2 - global_snow_amount, top_mask); - snow_mask *= step(0.01, global_snow_amount); + float snow_mask = smoothstep(1.0 - snow_amount, 1.2 - snow_amount, top_mask); + snow_mask *= step(0.01, snow_amount); vec3 dark_snow = snow_color.rgb * (1.0 - shadow_intensity); vec3 shaded_snow = mix(dark_snow, snow_color.rgb, v_shade_factor); @@ -131,4 +143,4 @@ 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; -} \ No newline at end of file +} diff --git a/core/daynight/tree_leaves.gdshader b/core/daynight/tree_leaves.gdshader index a07489b..488d82f 100644 --- a/core/daynight/tree_leaves.gdshader +++ b/core/daynight/tree_leaves.gdshader @@ -6,11 +6,12 @@ global uniform vec2 global_wind_direction; global uniform float global_wind_scale; global uniform float global_wind_strength; global uniform float global_wind_fade; +/* global uniform float global_snow_start_time; global uniform float global_snow_accumulation_speed; global uniform float global_snow_melt_time; global uniform float global_snow_melt_speed; -global uniform vec4 global_snow_color; +global uniform vec4 global_snow_color;*/ global uniform float global_rain_intensity; uniform sampler2D wind_noise : filter_linear_mipmap; @@ -87,24 +88,25 @@ void fragment() { vec2 shifted_uv = UV + texture_offset; vec4 tex = texture(alpha_texture, shifted_uv); - // Snow accumulation - float snow_amount = 0.0; - if (global_snow_start_time >= 0.0) { - snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0); - } - if (global_snow_melt_time >= 0.0) { - float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0); - snow_amount *= (1.0 - melt); - } - - float top_mask = 1.0 - shifted_uv.y; - float snow_mask = smoothstep(1.0 - snow_amount, 1.2 - snow_amount, top_mask); - snow_mask *= step(0.01, snow_amount); - - vec3 dark_snow = global_snow_color.rgb * (1.0 - shadow_intensity); - vec3 shaded_snow = mix(dark_snow, global_snow_color.rgb, v_shade_factor); - vec3 final_albedo = mix(v_final_color, shaded_snow, snow_mask); + //// Snow accumulation + //float snow_amount = 0.0; + //if (global_snow_start_time >= 0.0) { + //snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0); + //} + //if (global_snow_melt_time >= 0.0) { + //float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0); + //snow_amount *= (1.0 - melt); + //} +// + //float top_mask = 1.0 - shifted_uv.y; + //float snow_mask = smoothstep(1.0 - snow_amount, 1.2 - snow_amount, top_mask); + //snow_mask *= step(0.01, snow_amount); + //vec3 dark_snow = global_snow_color.rgb * (1.0 - shadow_intensity); + //vec3 shaded_snow = mix(dark_snow, global_snow_color.rgb, v_shade_factor); + //vec3 final_albedo = mix(v_final_color, shaded_snow, snow_mask); + vec3 final_albedo = v_final_color; + // Rain wetness: darken and make shinier float rain_int = clamp(global_rain_intensity, 0.0, 1.0); final_albedo *= mix(1.0, 1.0 - wetness_darkening, rain_int); diff --git a/core/daynight/weather_overlay.tres b/core/daynight/weather_overlay.tres index 8d78446..03906a7 100644 --- a/core/daynight/weather_overlay.tres +++ b/core/daynight/weather_overlay.tres @@ -5,3 +5,17 @@ [resource] render_priority = 0 shader = ExtResource("1_weather") +shader_parameter/snow_noise_scale = 0.15 +shader_parameter/snow_edge_softness = 0.2 +shader_parameter/snow_roughness_variation = 0.15 +shader_parameter/snow_color_variation = 0.05 +shader_parameter/ripple_scale = 1.5 +shader_parameter/ripple_speed = 2.0 +shader_parameter/ripple_layers = 3.0 +shader_parameter/streak_scale = 2.0 +shader_parameter/streak_speed = 0.8 +shader_parameter/wetness_darkening = 0.25 +shader_parameter/wet_roughness = 0.05 +shader_parameter/rain_normal_strength = 0.4 +shader_parameter/puddle_noise_scale = 0.08 +shader_parameter/puddle_threshold = 0.45 diff --git a/core/environment_config.gd b/core/environment_config.gd index d67d56b..adc4235 100644 --- a/core/environment_config.gd +++ b/core/environment_config.gd @@ -100,7 +100,7 @@ extends Resource #Rain weather settings @export_group("Rain") -@export var rain_mode_color: Color = Color(0.5, 0.6, 0.7, 1.0) #Sky/light darkening color during rain +@export var rain_mode_color: Color = Color(0.85, 0.89, 0.93, 1.0) #Sky/light darkening color during rain @export var rain_fade_time: float = 5.0 #Seconds for rain particles to fade in/out @export var rain_audio_volume_db: float = -10.0 #Target rain loop volume in decibels @export var puddle_form_time: float = 15.0 #Seconds for puddles to fully form @@ -109,7 +109,7 @@ extends Resource #Storm settings (applied on top of rain when storm is active) @export_group("Storm") @export var storm_rain_intensity_multiplier: float = 1.5 #Rain intensity target during storm (1.0 = normal rain) -@export var storm_mode_color: Color = Color(0.476, 0.531, 0.639, 1.0) #Additional sky darkening color during storm +@export var storm_mode_color: Color = Color(0.78, 0.83, 0.89, 1.0) #Additional sky darkening color during storm #Lightning and thunder configuration @export_group("Lightning and Thunders")