Files
c-prime/binaries/assets/shaders/multiQuad.vertex
2025-11-17 10:28:09 +01:00

165 lines
2.0 KiB
Plaintext

#version 460
layout ( packed, binding = 0 ) uniform events
{
vec2 mouse;
vec2 window;
};
layout ( packed, binding = 1 ) uniform orientation
{
vec2 quadPosition;
};
struct quad{
vec2 position;
vec2 size;
vec3 color;
float zIndex;
float opacity;
int textureIndex;
int features;
int elementIndex;
//int characters[];
};
layout( std430, binding = 2 ) readonly buffer meshes
{
quad meshArray[100];
};
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 textureCoordinates;
layout(location = 2) in int meshIndex;
out vec2 vertex_textureCoordinates;
out float vertex_meshIndex;
out vec3 quad_color;
out vec2 quad_position;
out vec2 quad_size;
flat out int quad_textureIndex;
flat out int quad_useTexture;
flat out float quad_opacity;
int checkFeature( int features, int currentFeature ) {
if ( ( features & currentFeature ) > 0 ) {
return 1;
} else {
return -1;
}
}
void main() {
quad currentMesh = meshArray[ meshIndex ];
vec2 quadPosition = ( position.xy );
// vec2( -1.0, -1.0 ) -> vec2( 1.0, 1.0 )
quadPosition += vec2( 1.0 );
quadPosition /= 2.0;
// vec2( 0, 0 ) -> vec2( 1.0, 1.0 )
vec2 bias = vec2(0, 0); // ??????
quadPosition *= currentMesh.size;
quadPosition += currentMesh.position.xy;
quadPosition += bias;
quadPosition /= window;
quadPosition *= 2.0;
quadPosition -= vec2( 1.0 );
//quadPosition.y += .02;
quadPosition.y *= -1;
quad_color = currentMesh.color;
quad_size = currentMesh.size;
quad_position = currentMesh.position.xy;
quad_opacity = currentMesh.opacity;
gl_Position.xy = quadPosition;
const int useTexture = 1;
quad_useTexture = checkFeature( currentMesh.features, useTexture );
quad_textureIndex = currentMesh.textureIndex;
vertex_textureCoordinates = textureCoordinates;
vertex_meshIndex = float( meshIndex );
gl_Position.w = 1.0;
gl_Position.z = -currentMesh.zIndex / 10000;
}