#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); }