#pragma once

#include <cstdint>
#include <cstring>

/*
    Воксели рендерятся точками, которые распаковываются в квадратные плоскости

    В чанке по оси 256 вокселей, и 257 позиций вершин (включая дальнюю границу чанка)
    9 бит на позицию *3 оси = 27 бит
    Указание материала 16 бит
*/

namespace LV::Client::VK {

struct VoxelVertexPoint {
    uint32_t 
        FX : 9, FY : 9, FZ : 9, // Позиция
        Place : 3,              // Положение распространения xz, xy, zy, и обратные
        N1 : 1,                 // Не занято
        LS : 1,                 // Масштаб карты освещения (1м/16 или 1м)
        TX : 8, TY : 8,         // Размер+1
        VoxMtl : 16,            // Материал вокселя DefVoxelId_t
        LU : 14, LV : 14,       // Позиция на карте освещения
        N2 : 2;                 // Не занято
};

/*
    Максимальный размер меша 14^3 м от центра ноды
    Координатное пространство то же, что и у вокселей + 8 позиций с двух сторон
    Рисуется полигонами

    В будущем - хранить данные освещения в отдельных буферах. Основные данные пусть спокойно индексируются
*/

struct NodeVertexStatic {
    uint32_t
        FX : 11, FY : 11, N1 : 10, // Позиция, 64 позиции на метр, +3.5м запас
        FZ : 11,                 // Позиция
        LS : 1,                  // Масштаб карты освещения (1м/16 или 1м)
        Tex : 18,                // Текстура
        N2 : 2,                  // Не занято
        TU : 16, TV : 16;        // UV на текстуре

    bool operator==(const NodeVertexStatic& other) const {
        return std::memcmp(this, &other, sizeof(*this)) == 0;
    }

    bool operator<=>(const NodeVertexStatic&) const = default;
};

}
