42 lines
1.1 KiB
GLSL
42 lines
1.1 KiB
GLSL
#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;
|
|
}
|