Shader para criar progressbars usando máscaras para obter outros formatos
shader_type canvas_item;
uniform sampler2D mask_texture;
uniform float progress : hint_range(0.0, 1.0);
uniform vec4 fill_color : source_color;
uniform vec4 empty_color : source_color;
uniform int fill_direction : hint_enum("Vertical", "Horizontal") = 0;
void fragment() {
vec4 mask = texture(mask_texture, UV);
if (mask.a < 0.01) {
discard;
}
float uv_pos;
// Define qual eixo vai ser usado pro preenchimento
if (fill_direction == 0) {
// Vertical (de baixo pra cima)
uv_pos = 1.0 - UV.y;
} else {
// Horizontal (da esquerda pra direita)
uv_pos = UV.x;
}
// Define se o pixel está preenchido
float is_filled = step(uv_pos, progress);
// Mistura as cores conforme o preenchimento
vec4 chosen = mix(empty_color, fill_color, is_filled);
COLOR = vec4(chosen.rgb, mask.a * chosen.a);
}