Files
autgame/menus/assets/shaders/submenu_tent_lights.gdshader
T

104 lines
3.7 KiB
Plaintext

shader_type canvas_item;
// Shader per i menu di secondo livello P2A e P3A.
// Coordinate UV relative al TextureRect del mockup (2796x1290).
// Tracciate e verificate ad alto contrasto con fondo nero:
// 1. Stella centrata sul numero 1
// 2. 20 lucine lungo le due falde del tetto a cono
// 3. 4 grandi punti di ancoraggio sulla balza ondulata
uniform float lights_strength : hint_range(0.0, 1.5) = 1.0;
uniform float star_strength : hint_range(0.0, 1.5) = 1.0;
uniform vec2 star_center = vec2(0.269671, 0.155039);
uniform float garland_fps : hint_range(1.0, 60.0) = 12.5;
const vec3 GOLD_CORE = vec3(0.945, 0.80, 0.385);
const vec3 GOLD_HALO = vec3(1.0, 0.78, 0.35);
// 20 lampadine lungo le due falde del tetto a cono
// Coordinate UV nella texture del mockup (2796x1290), z = fase del loop (4, 2, 0)
// Coordinate rilevate automaticamente dal PNG 2a_tendone.png:
// dodici lampadine reali per lato, non dieci e non interpolate su una retta.
const vec3 p2a_bulbs[24] = vec3[24](
// Sinistra, dal colletto verso il bordo esterno
vec3(0.251808, 0.249698, 4.0), // L0
vec3(0.234388, 0.289171, 2.0), // L1
vec3(0.214765, 0.320653, 0.0), // L2
vec3(0.194605, 0.356896, 4.0), // L3
vec3(0.181462, 0.375494, 2.0), // L4
vec3(0.167428, 0.398533, 0.0), // L5
vec3(0.150578, 0.433674, 4.0), // L6
vec3(0.129082, 0.459304, 2.0), // L7
vec3(0.107434, 0.492707, 0.0), // L8
vec3(0.088943, 0.512666, 4.0), // L9
vec3(0.070246, 0.536780, 2.0), // L10
vec3(0.042324, 0.560880, 0.0), // L11
// Destra, dal colletto verso il bordo esterno
vec3(0.285755, 0.241321, 0.0), // R0
vec3(0.300670, 0.272138, 2.0), // R1
vec3(0.320168, 0.303235, 4.0), // R2
vec3(0.339147, 0.339426, 0.0), // R3
vec3(0.357906, 0.370273, 2.0), // R4
vec3(0.376152, 0.403834, 4.0), // R5
vec3(0.393310, 0.431054, 0.0), // R6
vec3(0.413618, 0.461451, 2.0), // R7
vec3(0.439441, 0.496182, 4.0), // R8
vec3(0.462399, 0.522573, 0.0), // R9
vec3(0.482340, 0.544497, 2.0), // R10
vec3(0.500324, 0.560728, 4.0) // R11
);
// 4 grandi punti di ancoraggio lungo la balza ondulata del tendone
const vec3 p2a_anchor_bulbs[4] = vec3[4](
vec3(0.08727, 0.46822, 4.0), // A0 (Estremità sinistra della balza)
vec3(0.19170, 0.51783, 0.0), // A1 (Angolo ingresso SX)
vec3(0.27182, 0.51783, 2.0), // A2 (Angolo ingresso DX)
vec3(0.37697, 0.46822, 4.0) // A3 (Estremità destra della balza)
);
float chase_intensity(float d) {
if (d < 1.0) return 0.30;
if (d < 2.0) return 0.60;
if (d < 3.0) return 1.00;
if (d < 4.0) return 0.95;
return 0.0;
}
void fragment() {
vec4 color = texture(TEXTURE, UV);
// 1. Stella grande in cima al tendone
if (star_strength > 0.001) {
vec2 aspect_diff = (UV - star_center) * vec2(2.1674, 1.0);
float star_dist = length(aspect_diff);
float star_area = 1.0 - smoothstep(0.020, 0.060, star_dist);
float pulse = 0.88 + 0.12 * sin(TIME * 5.0);
vec3 gold_glow = vec3(1.0, 0.75, 0.20) * star_area * star_strength * pulse;
color.rgb += gold_glow;
}
// 2. Lucine lungo le falde del tetto e punti sulla balza
if (lights_strength > 0.001) {
float frame_time = TIME * garland_fps;
float cycle = mod(floor(frame_time), 6.0);
// 20 Lucine lungo le due falde del tetto a cono
for (int i = 0; i < 24; i++) {
float d = mod(cycle - p2a_bulbs[i].z + 6.0, 6.0);
float intensity = chase_intensity(d);
if (intensity <= 0.0) {
continue;
}
vec2 delta = (UV - p2a_bulbs[i].xy) * vec2(2796.0, 1290.0);
float r = length(delta);
float core = 1.0 - smoothstep(4.0, 10.0, r);
float halo = exp(-r / 15.0);
float ga = clamp(intensity * lights_strength, 0.0, 1.0);
color.rgb = mix(color.rgb, GOLD_CORE, core * ga);
color.rgb += GOLD_HALO * (halo * ga * 0.75 * (1.0 - core));
}
}
color.rgb = min(color.rgb, vec3(1.0));
COLOR = color;
}