Backlog/engine/_archive/ui/shaders/PapyrusRect.frag

112 lines
3.1 KiB
GLSL

#version 460
//shader input
layout (location = 0) in vec4 fragColor;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec2 panelPixelPosition; // relative to the topleft
layout (location = 3) flat in int instanceId;
layout (location = 0) out vec4 outFragColor;
layout (set = 1, binding = 0) uniform sampler2D tex;
#include "PapyrusRectShared.glsl"
#include "FragmentHelpers.glsl"
void main()
{
vec2 imageSize = objectBuffer.objects[instanceId].imageSize;
vec4 rounding = objectBuffer.objects[instanceId].rounding;
vec4 borderColor = objectBuffer.objects[instanceId].borderColor;
float borderWidth = objectBuffer.objects[instanceId].borderWidth;
float alpha = fragColor.w;
uint usesImage = objectBuffer.objects[instanceId].flags & 1;
// check to discard topleft
vec3 color = fragColor.xyz;
if(panelPixelPosition.x < rounding.x && panelPixelPosition.y < rounding.y)
{
float dist = distance(panelPixelPosition, vec2(rounding.x, rounding.x));
if(dist > (rounding.x ))
{
discard;
}
else if(somewhatEqual(dist, rounding.x))
{
color = borderColor.xyz;
alpha = borderColor.w;
}
}
// top right
if(panelPixelPosition.x > imageSize.x - rounding.y && panelPixelPosition.y < rounding.y )
{
float dist = distance(panelPixelPosition, vec2(imageSize.x - rounding.y, rounding.y));
if(dist > rounding.y)
{
discard;
}
else if(somewhatEqual(dist, rounding.y))
{
color = borderColor.xyz;
alpha = borderColor.w;
}
}
// bottom Left
if(panelPixelPosition.x < rounding.x && panelPixelPosition.y > imageSize.y - rounding.y)
{
float dist = distance(panelPixelPosition, vec2(rounding.x, imageSize.y - rounding.y));
if(dist > rounding.y)
{
discard;
}
else if(somewhatEqual(dist, rounding.y))
{
color = borderColor.xyz;
alpha = borderColor.w;
}
}
// bottom right
if(panelPixelPosition.x > imageSize.x - rounding.a && imageSize.y - panelPixelPosition.y < rounding.a )
{
float dist = distance(panelPixelPosition, vec2(imageSize.x - rounding.x, imageSize.y - rounding.y));
if(dist > rounding.y)
{
discard;
}
else if(somewhatEqual(dist, rounding.y))
{
color = borderColor.xyz;
alpha = borderColor.w;
}
}
// check to discard topright
// determine border colors
if( panelPixelPosition.x < borderWidth
|| panelPixelPosition.x > imageSize.x - borderWidth
|| panelPixelPosition.y < borderWidth
|| panelPixelPosition.y > imageSize.y - borderWidth
)
{
color = borderColor.xyz;
alpha = borderColor.w;
}
// scale the color
if(usesImage > 0)
{
vec4 sampledColor = texture(tex, vec2(texCoord.x, 1 - texCoord.y));
outFragColor = vec4(sampledColor.rgb, sampledColor.a * alpha);
}
else
{
outFragColor = vec4(pow(color, vec3(2.2)), alpha);
}
}