52 lines
2.2 KiB
C++
52 lines
2.2 KiB
C++
#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 : 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;
|
||
};
|
||
|
||
} |