#version 460 #extension GL_GOOGLE_include_directive : require #include "shape2d.glsl" layout (location = 0) out vec2 outLocalPos; layout (location = 1) out vec2 outQuadPos; layout (location = 2) flat out uint outShapeIndex; const float EDGE_MARGIN = 1.0; const vec2 QUAD_CORNERS[6] = vec2[]( vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(1.0, 1.0), vec2(-1.0, -1.0), vec2(1.0, 1.0), vec2(-1.0, 1.0) ); vec2 rotate(vec2 position, float angle) { float cosAngle = cos(angle); float sinAngle = sin(angle); return vec2( position.x * cosAngle - position.y * sinAngle, position.x * sinAngle + position.y * cosAngle ); } void main() { Shape2D shape = pcs.shapeBuffer.shapes[gl_InstanceIndex]; vec2 corner = QUAD_CORNERS[gl_VertexIndex]; vec2 localPosition = corner * (shape.halfSize + EDGE_MARGIN); vec2 screenPosition = shape.center + rotate(localPosition, shape.rotation); gl_Position = pcs.projection * vec4(screenPosition, 0.0, 1.0); outLocalPos = localPosition; outQuadPos = localPosition / max(shape.halfSize, vec2(1e-6)) * 0.5 + 0.5; outShapeIndex = gl_InstanceIndex; }