#pragma once #include #include /* Воксели рендерятся точками, которые распаковываются в квадратные плоскости В чанке по оси 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 : 9, FY : 9, FZ : 9, // Позиция -224 ~ 288; 64 позиций в одной ноде, 7.5 метров в ряд N1 : 4, // Не занято LS : 1, // Масштаб карты освещения (1м/16 или 1м) Tex : 18, // Текстура N2 : 14, // Не занято 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; }; }