// // Created by Vicente Ferrari Smith on 27.02.26. // #pragma once #include using namespace simd; struct vertex_p2_s2_uv2_c4_a1 { float2 pos; float2 scale; float2 uv; float4 color; float alpha; static MTL::VertexDescriptor* vertexDescriptor() { MTL::VertexDescriptor* vd = MTL::VertexDescriptor::alloc()->init(); // ATTRIBUTE 0 — float2 pos vd->attributes()->object(0)->setFormat(MTL::VertexFormatFloat2); vd->attributes()->object(0)->setOffset(offsetof(vertex_p2_s2_uv2_c4_a1, pos)); vd->attributes()->object(0)->setBufferIndex(0); // ATTRIBUTE 1 — float2 scale vd->attributes()->object(1)->setFormat(MTL::VertexFormatFloat2); vd->attributes()->object(1)->setOffset(offsetof(vertex_p2_s2_uv2_c4_a1, scale)); vd->attributes()->object(1)->setBufferIndex(0); // ATTRIBUTE 2 — float2 uv vd->attributes()->object(2)->setFormat(MTL::VertexFormatFloat2); vd->attributes()->object(2)->setOffset(offsetof(vertex_p2_s2_uv2_c4_a1, uv)); vd->attributes()->object(2)->setBufferIndex(0); // ATTRIBUTE 3 — float4 color vd->attributes()->object(3)->setFormat(MTL::VertexFormatFloat4); vd->attributes()->object(3)->setOffset(offsetof(vertex_p2_s2_uv2_c4_a1, color)); vd->attributes()->object(3)->setBufferIndex(0); // ATTRIBUTE 4 — float alpha vd->attributes()->object(4)->setFormat(MTL::VertexFormatFloat); vd->attributes()->object(4)->setOffset(offsetof(vertex_p2_s2_uv2_c4_a1, alpha)); vd->attributes()->object(4)->setBufferIndex(0); // Layout for buffer 0 vd->layouts()->object(0)->setStride(sizeof(vertex_p2_s2_uv2_c4_a1)); vd->layouts()->object(0)->setStepFunction(MTL::VertexStepFunctionPerVertex); return vd; } }; struct TransformationData { float4x4 model_matrix; float4x4 view_matrix; float4x4 perspective_matrix; };