editor/src/shaders/gui.vert.glsl
2025-08-17 15:09:40 +10:00

57 lines
1.4 KiB
GLSL

#version 460
#extension GL_GOOGLE_include_directive : require
#include "gui.layout"
layout (location = 0) in vec2 in_dst_start;
layout (location = 1) in vec2 in_dst_end;
layout (location = 2) in vec2 in_src_start;
layout (location = 3) in vec2 in_src_end;
layout (location = 4) in vec4 in_col;
layout (location = 0) out struct FragDataOut {
vec4 color;
vec2 uv;
} FragData;
vec2 Vertices[4] = vec2[4](
vec2(-1.0, +1.0),
vec2(-1.0, -1.0),
vec2(+1.0, +1.0),
vec2(+1.0, -1.0)
);
vec2 rotate(vec2 coords, float theta)
{
return mat2(cos(theta), sin(theta), -sin(theta), cos(theta)) * coords;
}
void main()
{
ivec2 tex_size = textureSize(sampler2D(SpriteAtlas, SamplerNearest), 0);
vec2 dst_half_size = (in_dst_end - in_dst_start) / 2;
vec2 dst_center = (in_dst_end + in_dst_start) / 2;
vec2 dst_pos = (Vertices[gl_VertexIndex] * dst_half_size + dst_center);
vec2 src_half_size = (in_src_end - in_src_start) / 2;
vec2 src_center = (in_src_end + in_src_start) / 2;
vec2 src_pos = (Vertices[gl_VertexIndex] * src_half_size + src_center);
vec2 uvs[4] = vec2[4](
vec2(in_src_start.x, in_src_start.y),
vec2(in_src_start.x, in_src_end.y),
vec2(in_src_end.x, in_src_start.y),
vec2(in_src_end.x, in_src_end.y)
);
FragData.color = in_col;
FragData.uv = uvs[gl_VertexIndex] / tex_size;
gl_Position = vec4(2 * dst_pos.x / PC.res.x - 1,
2 * dst_pos.y / PC.res.y - 1,
0,
1);
}