// BVLE Voxels - Smooth Surface Nets Vertex Shader (Phase 5.1)
// Vertex pulling from StructuredBuffer<SmoothVertex>.
// Passes primaryMat + chunkIndex for per-pixel blending in PS.

#include "voxelCommon.hlsli"

struct SmoothVtx {
    float3 position;    // world-space position (chunk origin already added)
    float3 normal;      // face normal
    uint   matPacked;   // materialID(8) | secondaryMat(8) | blendWeight(8) | pad(8)
    uint   chunkIndex;  // packed: chunkIndex in low 16 bits
};

StructuredBuffer<SmoothVtx> smoothVertices : register(t6);

struct VSOutput {
    float4 position : SV_POSITION;
    float3 worldPos : WORLDPOS;
    float3 normal   : NORMAL;
    nointerpolation uint primaryMat   : PRIMARYMAT;
    nointerpolation uint chunkIndex   : CHUNKINDEX;
};

[RootSignature(VOXEL_ROOTSIG)]
VSOutput main(uint vertexID : SV_VertexID) {
    SmoothVtx vtx = smoothVertices[vertexID];

    VSOutput output;
    output.position   = mul(viewProjection, float4(vtx.position, 1.0));
    output.worldPos   = vtx.position;
    output.normal     = vtx.normal;
    output.primaryMat = vtx.matPacked & 0xFF;
    output.chunkIndex = vtx.chunkIndex & 0xFFFF;
    return output;
}
