// line_vert.msl.h - Metal Shading Language del vertex shader de línies
// © 2026 JailDesigner
//
// IMPORTANT: mantenir sincronitzat a mà amb shaders/line.vert.glsl. SDL3 GPU
// compila aquest string MSL en runtime; no hi ha generador automàtic. Qualsevol
// canvi al UBO o al layout de vèrtex cal replicar-lo ací al mateix commit.
//
// Mapping SDL3 GPU → Metal (segons src/gpu/metal/SDL_gpu_metal.m upstream):
//   - Vertex buffers d'usuari: [[buffer(14 + slot)]] (METAL_FIRST_VERTEX_BUFFER_SLOT=14).
//     A través de [[stage_in]] amb [[attribute(N)]], Metal resol automàticament
//     a partir del MTLVertexDescriptor del pipeline state (transparent al MSL).
//   - Vertex UBO slot 0 SDL  → [[buffer(0)]] MSL (sense offset).

#pragma once
#ifdef __APPLE__

namespace Rendering::GPU::Msl {

inline constexpr const char* LINE_VERT_MSL = R"(
#include <metal_stdlib>
using namespace metal;

struct VIn {
    float2 in_position [[attribute(0)]];
    float4 in_color    [[attribute(1)]];
    float  in_edge_dist[[attribute(2)]];
};

struct VOut {
    float4 pos       [[position]];
    float4 color;
    float  edge_dist;
};

struct LineUBO {
    float2 viewport_size;
    float2 _padding;
};

vertex VOut line_vs(VIn in [[stage_in]],
                    constant LineUBO& ubo [[buffer(0)]]) {
    float2 ndc = (in.in_position / ubo.viewport_size) * 2.0 - 1.0;
    ndc.y = -ndc.y;
    VOut out;
    out.pos       = float4(ndc, 0.0, 1.0);
    out.color     = in.in_color;
    out.edge_dist = in.in_edge_dist;
    return out;
}
)";

}  // namespace Rendering::GPU::Msl

#endif  // __APPLE__
