shader_type spatial;
// cull_disabled permette di vedere il vetro da entrambi i lati (utile se è un singolo piano)
// depth_draw_opaque evita bug visivi di sovrapposizione tra oggetti trasparenti
render_mode blend_mix, depth_draw_opaque, cull_disabled, shadows_disabled;

uniform vec4 colore_vetro : source_color = vec4(0.4, 0.7, 0.9, 0.4);

// --- EFFETTO BORDO (FRESNEL) ---
uniform vec4 colore_bordo : source_color = vec4(1.0, 1.0, 1.0, 0.8);
uniform float spessore_bordo : hint_range(0.0, 10.0) = 2.5;

// --- RIFLESSO DEL SOLE (SPECULAR) ---
uniform float dimensione_riflesso : hint_range(0.0, 1.0) = 0.05;
uniform float intensita_riflesso : hint_range(0.0, 5.0) = 2.0;

// --- STRISCE DIAGONALI (Opzionali, in stile Anime) ---
uniform bool usa_strisce = true;
uniform vec4 colore_strisce : source_color = vec4(1.0, 1.0, 1.0, 0.3);
uniform float densita_strisce : hint_range(0.0, 20.0) = 6.0;
uniform float spessore_strisce : hint_range(0.0, 1.0) = 0.2;

void fragment() {
	// 1. Calcoliamo il Fresnel (l'angolo di visuale rispetto alla normale del vetro)
	float fresnel = 1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0);
	
	// Applichiamo una curva "a gradino" (smoothstep) per renderlo in stile Toon (netto)
	float toon_fresnel = smoothstep(0.4, 0.45, pow(fresnel, spessore_bordo));
	
	// 2. Calcoliamo le strisce diagonali
	float strisce = 0.0;
	if (usa_strisce) {
		// Crea linee diagonali basate sulle coordinate UV
		float pattern = fract((UV.x + UV.y) * densita_strisce);
		strisce = step(1.0 - spessore_strisce, pattern);
	}
	
	// 3. Mescoliamo i colori
	vec3 colore_finale = mix(colore_vetro.rgb, colore_strisce.rgb, strisce * colore_strisce.a);
	colore_finale = mix(colore_finale, colore_bordo.rgb, toon_fresnel);
	
	// 4. L'opacità aumenta sui bordi e sulle strisce
	float alpha_finale = colore_vetro.a;
	alpha_finale = max(alpha_finale, strisce * colore_strisce.a);
	alpha_finale = max(alpha_finale, toon_fresnel * colore_bordo.a);
	
	ALBEDO = colore_finale;
	ALPHA = clamp(alpha_finale, 0.0, 1.0);
}

void light() {
	// --- RIFLESSO TAGLIENTE DEL SOLE ---
	// Calcoliamo dove la luce colpisce il vetro rispetto alla telecamera
	vec3 half_vector = normalize(VIEW + LIGHT);
	float spec_dot = max(dot(NORMAL, half_vector), 0.0);
	
	// Taglio netto per renderlo stile Toon (invece di una sfumatura realistica)
	float spec_toon = smoothstep(1.0 - dimensione_riflesso - 0.01, 1.0 - dimensione_riflesso, spec_dot);
	
	// Luce Diffusa standard (piatta, ideale per il toon)
	float diff_dot = max(dot(NORMAL, LIGHT), 0.0);
	DIFFUSE_LIGHT += LIGHT_COLOR * ALBEDO * diff_dot * ATTENUATION;
	
	// Aggiungiamo il riflesso speculare, moltiplicato per il colore della luce (così al tramonto è arancione!)
	SPECULAR_LIGHT += LIGHT_COLOR * spec_toon * intensita_riflesso * ATTENUATION;
}