32 lines
1.0 KiB
Plaintext
32 lines
1.0 KiB
Plaintext
shader_type canvas_item;
|
|
|
|
// Spotlight rect in viewport pixel coordinates
|
|
// vec4(x, y, width, height) — set to vec4(0,0,0,0) to dim everything
|
|
uniform vec4 spotlight = vec4(0.0, 0.0, 0.0, 0.0);
|
|
uniform vec2 viewport_size = vec2(1366.0, 720.0);
|
|
uniform float dim_alpha : hint_range(0.0, 1.0) = 0.72;
|
|
uniform float padding : hint_range(0.0, 32.0) = 8.0;
|
|
|
|
void fragment() {
|
|
bool has_spotlight = spotlight.z > 1.0 && spotlight.w > 1.0;
|
|
|
|
if (has_spotlight) {
|
|
// Convert spotlight rect to UV space
|
|
float left = (spotlight.x - padding) / viewport_size.x;
|
|
float top = (spotlight.y - padding) / viewport_size.y;
|
|
float right = (spotlight.x + spotlight.z + padding) / viewport_size.x;
|
|
float bottom = (spotlight.y + spotlight.w + padding) / viewport_size.y;
|
|
|
|
bool in_hole = (UV.x >= left) && (UV.x <= right)
|
|
&& (UV.y >= top) && (UV.y <= bottom);
|
|
|
|
if (in_hole) {
|
|
COLOR = vec4(0.0, 0.0, 0.0, 0.0); // transparent — element shows through
|
|
} else {
|
|
COLOR = vec4(0.0, 0.0, 0.0, dim_alpha);
|
|
}
|
|
} else {
|
|
COLOR = vec4(0.0, 0.0, 0.0, dim_alpha);
|
|
}
|
|
}
|