载入中...
搜索中...
未找到
GreedyMesher.h
浏览该文件的文档.
1#pragma once
2
4#include "voxel/FaceDir.h"
5#include "voxel/VoxelPack.h"
6
7#include <cstdint>
8#include <vector>
9
10namespace eve::voxel {
11
18using ChunkSampler = uint8_t (*)(void *userData, int chunkX, int chunkY, int chunkZ,
19 int localX, int localY, int localZ);
20
34public:
36 static void meshChunk(const uint8_t *voxels, std::vector<PackedRect> outFaces[6],
38 ChunkSampler sampler = nullptr, void *samplerUserData = nullptr,
39 int chunkX = 0, int chunkY = 0, int chunkZ = 0,
40 std::vector<uint32_t> aoOut[6] = nullptr);
41
43 static void meshFace(const uint8_t *voxels, FaceDir dir, std::vector<PackedRect> &out,
45 ChunkSampler sampler = nullptr, void *samplerUserData = nullptr,
46 int chunkX = 0, int chunkY = 0, int chunkZ = 0,
47 std::vector<uint32_t> *aoOut = nullptr);
48
49private:
50 static uint8_t at(const uint8_t *v, int x, int y, int z);
52 static uint8_t neighborAt(const uint8_t *voxels, ChunkSampler sampler, void *userData,
53 int chunkX, int chunkY, int chunkZ, int nx, int ny, int nz);
55 static uint8_t outsideVoxel(const uint8_t *voxels, ChunkSampler sampler, void *userData,
56 int chunkX, int chunkY, int chunkZ, FaceDir dir, int slice,
57 int gu, int gv);
59 static uint8_t vertexAO(const uint8_t *voxels, ChunkSampler sampler, void *userData,
60 int chunkX, int chunkY, int chunkZ, FaceDir dir, int slice, int gu,
61 int gv);
63 static uint32_t rectAOWord(const uint8_t *voxels, ChunkSampler sampler, void *userData,
64 int chunkX, int chunkY, int chunkZ, FaceDir dir, int slice, int x,
65 int y, int z, int w, int h);
66 static bool isSolid(uint8_t id) { return id != 0; }
67 static void greedy2D(int mask[kChunkSize][kChunkSize], FaceDir dir, int slice,
68 std::vector<PackedRect> &out, std::vector<uint32_t> *aoOut,
69 const uint8_t *voxels, ChunkSampler sampler, void *userData,
70 int chunkX, int chunkY, int chunkZ);
71};
72
73} // namespace eve::voxel
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
int h
int w
int v
V3 dir
Definition TreeMesh.cpp:121
static const CubeTypeRegistry & empty()
进程级空注册表(默认参数与向后兼容回退用)。
Greedy rectangle mesher for one 32³ dense voxel volume. Voxel storage: index = x + y*32 + z*32*32....
static void meshFace(const uint8_t *voxels, FaceDir dir, std::vector< PackedRect > &out, const CubeTypeRegistry &types=CubeTypeRegistry::empty(), ChunkSampler sampler=nullptr, void *samplerUserData=nullptr, int chunkX=0, int chunkY=0, int chunkZ=0, std::vector< uint32_t > *aoOut=nullptr)
Mesh a single face direction into out (appended; caller may clear).
static void meshChunk(const uint8_t *voxels, std::vector< PackedRect > outFaces[6], const CubeTypeRegistry &types=CubeTypeRegistry::empty(), ChunkSampler sampler=nullptr, void *samplerUserData=nullptr, int chunkX=0, int chunkY=0, int chunkZ=0, std::vector< uint32_t > aoOut[6]=nullptr)
Mesh all six faces. Clears and fills outFaces[6].
方块类型定义:名字、各面图集纹理、方向性、组合声明。 方向性方块在注册时按 orientation 绕 Y 轴展开成多个"具体类型"变体, 每个变体持有旋转后的各面纹理;渲染端只消费纹理 id,不接触 ...
Definition Chunk.h:12
constexpr int kChunkSize
Chunk edge length in voxels (fixed).
Definition VoxelPack.h:8
uint8_t(*)(void *userData, int chunkX, int chunkY, int chunkZ, int localX, int localY, int localZ) ChunkSampler
Optional out-of-chunk neighbor sampler for seam culling. Receives chunk coordinates plus the (possibl...
FaceDir
Six axis-aligned face directions. Each chunk keeps a separate instance buffer per direction so camera...
Definition FaceDir.h:17