This commit is contained in:
Matteo Sonaglioni
2026-03-13 18:35:50 +01:00
parent 6e11a95a3e
commit 44252ec5e6
27 changed files with 623 additions and 94 deletions

View File

@@ -1,25 +1,28 @@
shader_type spatial;
// Rimosso 'unshaded' per ricevere le ombre.
// Aggiunto 'ambient_light_disabled' per proteggere i tuoi colori piatti.
render_mode specular_disabled, cull_disabled, ambient_light_disabled;
// --- GLOBAL UNIFORMS (Vento) ---
// --- GLOBAL UNIFORMS (Vento e Neve) ---
global uniform float wind_scale;
global uniform float wind_speed;
global uniform float wind_strength;
global uniform vec3 wind_direction;
global uniform sampler2D wind_noise : filter_linear_mipmap;
global uniform float global_snow_amount;
// --- PARAMETRI ESTETICI ---
uniform bool billboard_enabled = true; // <--- PULSANTE ON/OFF BILLBOARD
uniform bool wind_enabled = true; // <--- PULSANTE ON/OFF VENTO
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; // <--- NUOVO PARAMETRO OPACITÀ
uniform float opacity : hint_range(0.0, 1.0) = 1.0;
// Consiglio: Usa un bianco leggermente grigio/azzurro per la neve, non bianco puro!
// Es: vec4(0.8, 0.85, 0.9, 1.0)
uniform vec4 snow_color : source_color = vec4(0.85, 0.9, 0.95, 1.0);
// --- CONTROLLO GRADIENTE E RANDOM ---
uniform float height_min = 0.0;
@@ -29,10 +32,11 @@ 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;
// NUOVO PARAMETRO: Intensità delle ombre proiettate su questo materiale
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
varying vec3 v_final_color;
// ---> AGGIUNTO: Passiamo il fattore di ombra al fragment <---
varying float v_shade_factor;
float hash(vec3 p) {
p = fract(p * 0.1031);
@@ -59,13 +63,15 @@ void vertex() {
float combined_factor = mix(h_factor, leaf_rand, random_mix);
combined_factor = ceil(combined_factor * light_steps) / light_steps;
// Salviamo il fattore per usarlo sulla neve!
v_shade_factor = combined_factor;
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);
// --- LOGICA TRASFORMAZIONE (BILLBOARD vs STANDARD) ---
// --- LOGICA TRASFORMAZIONE ---
if (billboard_enabled) {
// Logica Billboard: guarda sempre la camera
vec3 view_pos_origin = (VIEW_MATRIX * vec4(instance_pos, 1.0)).xyz;
vec2 offset = (UV - 0.5) * leaves_scale;
@@ -79,16 +85,12 @@ void vertex() {
MODELVIEW_MATRIX[3].xyz = final_pos;
VERTEX = vec3(0.0);
} else {
// Logica Standard: usa la rotazione e posizione della mesh
// Applichiamo comunque la rotazione extra e lo scale se desiderato
float c = cos(total_angle);
float s = sin(total_angle);
// Modifichiamo il vertice locale prima della trasformazione world
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;
// La MODELVIEW_MATRIX rimane quella di default fornita da Godot
}
}
@@ -96,20 +98,27 @@ void fragment() {
vec2 shifted_uv = UV + texture_offset;
vec4 tex = texture(alpha_texture, shifted_uv);
ALBEDO = v_final_color;
// Moltiplichiamo l'alpha della texture per il nuovo parametro opacity
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);
// ---> IL SEGRETO È QUI <---
// Scuriamo la neve usando lo stesso gradiente scuro/chiaro usato per le foglie
vec3 dark_snow = snow_color.rgb * (1.0 - shadow_intensity);
vec3 shaded_snow = mix(dark_snow, snow_color.rgb, v_shade_factor);
// Mescoliamo il colore della foglia con la neve correttamente ombreggiata
vec3 final_albedo = mix(v_final_color, shaded_snow, snow_mask);
ALBEDO = final_albedo;
ALPHA = tex.r * opacity;
ALPHA_SCISSOR_THRESHOLD = 0.5;
ROUGHNESS = 0.02;
ROUGHNESS = 0.02;
}
// --- NUOVA LOGICA LUCE (Ombre Proiettate e Fix Quadrati) ---
void light() {
float shadow_factor = mix(1.0 - cast_shadow_strength, 1.0, ATTENUATION);
// Maschera morbida per nascondere i quadrati
float cutoff_mask = smoothstep(0.0, 0.05, ATTENUATION);
DIFFUSE_LIGHT += (shadow_factor * LIGHT_COLOR) * cutoff_mask;
}