/* Copyright (c) 2021, Sascha Willems
 *
 * SPDX-License-Identifier: MIT
 *
 */

#version 450
#extension GL_EXT_mesh_shader : require

layout (binding = 0) uniform UBO 
{
	mat4 projection;
	mat4 model;
	mat4 view;
} ubo;

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(triangles, max_vertices = 3, max_primitives = 1) out;

layout(location = 0) out VertexOutput
{
	vec4 color;
} vertexOutput[];

const vec4[3] positions = {
	vec4( 0.0, -1.0, 0.0, 1.0),
	vec4(-1.0,  1.0, 0.0, 1.0),
	vec4( 1.0,  1.0, 0.0, 1.0)
};

const vec4[3] colors = {
	vec4(0.0, 1.0, 0.0, 1.0),
	vec4(0.0, 0.0, 1.0, 1.0),
	vec4(1.0, 0.0, 0.0, 1.0)
};

void main()
{
	uint iid = gl_LocalInvocationID.x;

	vec4 offset = vec4(0.0, 0.0, gl_GlobalInvocationID.x, 0.0);

	SetMeshOutputsEXT(3, 1);
	mat4 mvp = ubo.projection * ubo.view * ubo.model;
	gl_MeshVerticesEXT[0].gl_Position = mvp * (positions[0] + offset);
	gl_MeshVerticesEXT[1].gl_Position = mvp * (positions[1] + offset);
	gl_MeshVerticesEXT[2].gl_Position = mvp * (positions[2] + offset);
	vertexOutput[0].color = colors[0];
	vertexOutput[1].color = colors[1];
	vertexOutput[2].color = colors[2];
	gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] =  uvec3(0, 1, 2);
}
