Files
tbd-station-14/Resources/Textures/Shaders/gradient_circle_mask.swsl
2022-07-06 17:58:14 +10:00

37 lines
1.3 KiB
Plaintext

// Has 2 circles, an inner one that is unaffected and an outer one. Anything past the outer one is full red
// and in-between is a gradient.
light_mode unshaded;
uniform highp vec3 color;
uniform highp float time;
// Uniforms because it makes testing way easier. If needed make it const.
uniform highp float outerCircleRadius;
uniform highp float outerCircleMaxRadius;
uniform highp float innerCircleRadius;
uniform highp float innerCircleMaxRadius;
uniform highp float darknessAlphaOuter;
const highp float darknessAlphaInner = 0.0;
void fragment() {
highp vec2 pixelSize = vec2(1.0/SCREEN_PIXEL_SIZE.x, 1.0/SCREEN_PIXEL_SIZE.y);
highp vec2 pixelCenter = pixelSize*0.5;
highp float distance = length(FRAGCOORD.xy - pixelCenter);
highp float innerRadius = innerCircleRadius + time * (innerCircleMaxRadius - innerCircleRadius);
highp float outerRadius = outerCircleRadius + time * (outerCircleMaxRadius - outerCircleRadius);
if(distance > outerRadius) {
COLOR = vec4(color.x, color.y, color.z, darknessAlphaOuter);
}
else if(distance < innerRadius) {
COLOR = vec4(0.0, 0.0, 0.0, darknessAlphaInner);
}
else {
highp float ratio = (distance - innerRadius) / (outerRadius - innerRadius);
highp float alpha = darknessAlphaInner + (darknessAlphaOuter - darknessAlphaInner) * ratio;
COLOR = vec4(color.x, color.y, color.z, alpha);
}
}