struct Output
{
    float4 Color : TEXCOORD0;
    float4 Position : SV_Position;
};

#include "RootConstants.hlsl"

Output main(uint vertexIndex : SV_VertexID)
{
    Output output;

    // Retrieve the vertex buffer using SM6.6 bindless syntax
    ByteAddressBuffer buffer = ResourceDescriptorHeap[BufferIndex];

    // VertexOffset is used as vertex offset for consolidated buffer (depth-tested at 0, overlay at halfMax)
    uint actualVertexIndex = vertexIndex + VertexOffset;

    // Vertex layout: float3 Position (12 bytes) + float4 Color (16 bytes) = 28 bytes stride
    uint stride = 28;
    uint offset = actualVertexIndex * stride;

    float3 pos = asfloat(buffer.Load3(offset));
    float4 col = asfloat(buffer.Load4(offset + 12));

    // Standard row-major transformation
    output.Position = mul(ViewProjection, float4(pos, 1.0f));
    output.Color = col;
    return output;
}
