112 lines
3.1 KiB
GLSL
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);
|
|
}
|
|
}
|