#include using namespace metal; struct Uniforms { float4x4 model; float4x4 view_proj; float4x4 normal_mat; }; struct VertexInput { float3 position [[attribute(0)]]; float3 normal [[attribute(1)]]; float2 uv [[attribute(2)]]; }; struct VertexOutput { float4 position [[position]]; float2 uv [[user(locn0)]]; float3 normal [[user(locn1)]]; }; vertex VertexOutput transform(VertexInput input [[stage_in]], constant Uniforms& uniforms [[buffer(0)]]) { VertexOutput __luma_output; float3 pos = input.position; float4 world_pos = (uniforms.model * float4(pos, 1.0)); float4 clip_pos = (uniforms.view_proj * world_pos); __luma_output.position = clip_pos; __luma_output.uv = input.uv; __luma_output.normal = normalize((uniforms.normal_mat * float4(input.normal, 0.0)).xyz); return __luma_output; }