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); } }