Files
step3/shaders/ccs_cases_2/reel_spin.gdshader
T

43 lines
1.7 KiB
Plaintext

shader_type canvas_item;
uniform sampler2D tex : repeat_enable;
uniform float n_rows = 6.0;
uniform float y_offset = 0.0;
uniform float x_offset = 0.0;
uniform float win_intensity : hint_range(0.0, 1.0) = 0.0;
uniform vec4 win_glow_color : source_color = vec4(1.0, 0.62, 0.08, 1.0);
void fragment() {
vec2 uv = UV;
uv.x += x_offset;
uv.y /= n_rows;
uv.y += y_offset;
vec4 base = texture(tex, uv);
if (win_intensity <= 0.001) {
COLOR = base;
} else {
// Derive a compact halo from the existing symbol alpha so no replacement
// sprite or second texture is needed.
vec2 pixel = 1.0 / vec2(textureSize(tex, 0));
vec2 radius = pixel * 5.0;
float nearby_alpha = 0.0;
nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(radius.x, 0.0)).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv - vec2(radius.x, 0.0)).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(0.0, radius.y)).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv - vec2(0.0, radius.y)).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv + radius).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv - radius).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(radius.x, -radius.y)).a);
nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(-radius.x, radius.y)).a);
float halo = max(nearby_alpha - base.a, 0.0) * win_intensity;
float flash = smoothstep(0.82, 1.0, win_intensity);
vec3 rich_color = min(base.rgb * 1.18 + win_glow_color.rgb * 0.12, vec3(1.0));
vec3 symbol_color = mix(base.rgb, rich_color, win_intensity);
symbol_color = mix(symbol_color, vec3(1.0), flash * 0.34 * base.a);
vec3 final_rgb = symbol_color * base.a + win_glow_color.rgb * halo;
COLOR = vec4(final_rgb, max(base.a, halo * 0.9));
}
}