Hyprland/src/render/shaders/Border.hpp

80 lines
2.1 KiB
C++
Raw Normal View History

2022-06-26 19:39:56 +02:00
#pragma once
#include <string>
// makes a stencil without corners
inline const std::string FRAGBORDER1 = R"#(
precision mediump float;
varying vec4 v_color;
varying vec2 v_texcoord;
uniform vec2 topLeft;
uniform vec2 fullSize;
uniform float radius;
uniform float thick;
uniform int primitiveMultisample;
2022-11-21 19:09:47 +01:00
void main() {
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
highp vec2 pixCoord = vec2(gl_FragCoord);
vec2 originalPixCoord = fullSize * v_texcoord;
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
vec4 pixColor = v_color;
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
bool done = false;
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
pixCoord -= topLeft + fullSize * 0.5;
pixCoord *= vec2(lessThan(pixCoord, vec2(0.0))) * -2.0 + 1.0;
pixCoord -= fullSize * 0.5 - radius;
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
if (min(pixCoord.x, pixCoord.y) > 0.0) {
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
float dist = length(pixCoord);
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
if (dist > radius || dist < radius - thick - 1.0)
discard;
2022-06-26 19:39:56 +02:00
2022-11-21 19:09:47 +01:00
if (primitiveMultisample == 1 && (dist > radius - 1.0 || dist < radius - thick + 1.0)) {
float distances = 0.0;
float len = length(pixCoord + vec2(0.25, 0.25));
distances += float(len < radius && len > radius - thick);
len = length(pixCoord + vec2(0.75, 0.25));
distances += float(len < radius && len > radius - thick);
len = length(pixCoord + vec2(0.25, 0.75));
distances += float(len < radius && len > radius - thick);
len = length(pixCoord + vec2(0.75, 0.75));
distances += float(len < radius && len > radius - thick);
2022-09-25 20:07:48 +02:00
2022-11-21 19:09:47 +01:00
if (distances == 0.0)
discard;
distances /= 4.0;
pixColor = pixColor * distances;
2022-06-26 19:39:56 +02:00
}
2022-11-21 19:09:47 +01:00
done = true;
2022-06-26 19:39:56 +02:00
}
// now check for other shit
if (!done) {
// distance to all straight bb borders
2022-11-21 19:09:47 +01:00
float distanceT = originalPixCoord[1];
float distanceB = fullSize[1] - originalPixCoord[1];
float distanceL = originalPixCoord[0];
float distanceR = fullSize[0] - originalPixCoord[0];
2022-06-26 19:39:56 +02:00
// get the smallest
float smallest = min(min(distanceT, distanceB), min(distanceL, distanceR));
2022-11-21 19:09:47 +01:00
if (smallest > thick)
discard;
2022-06-26 19:39:56 +02:00
}
2022-11-21 19:09:47 +01:00
if (pixColor[3] == 0.0)
discard;
2022-06-26 19:39:56 +02:00
gl_FragColor = pixColor;
}
2022-09-25 20:07:48 +02:00
)#";