#version 460 core
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
layout(location = 2) in vec2 inUV;
layout(location = 0) out vec3 outFragPos;
layout(location = 1) out vec4 outShadowPos;
layout(location = 2) out vec3 outNormal;
layout(location = 3) out vec2 outUV;
layout(set = 0, binding = 0) uniform SceneInfo {
mat4 vp, lightSpace;
} sceneInfo;
layout(push_constant) uniform PushConstants {
mat4 m;
vec3 c;
} pushConstants;
const mat4 biasMat = mat4(
0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.5, 0.5, 0.0, 1.0);
void main() {
gl_Position = sceneInfo.vp * pushConstants.m * vec4(inPosition, 1.0);
outFragPos = vec3(pushConstants.m * vec4(inPosition, 1.0));
outShadowPos = (biasMat * sceneInfo.lightSpace) * vec4(inPosition, 1.0);
outNormal = mat3(transpose(inverse(pushConstants.m))) * inNormal;
outUV = inUV;
}