载入中...
搜索中...
未找到
Chunk.h
浏览该文件的文档.
1#pragma once
2
4#include "voxel/FaceDir.h"
6#include "voxel/VoxelPack.h"
7
8#include <cstdint>
9#include <cstring>
10#include <vector>
11
12namespace eve::voxel {
13
18class Chunk {
19public:
20 Chunk(int cx = 0, int cy = 0, int cz = 0) : cx_(cx), cy_(cy), cz_(cz) {
21 std::memset(voxels_, 0, sizeof(voxels_));
22 }
23
24 int cx() const { return cx_; }
25 int cy() const { return cy_; }
26 int cz() const { return cz_; }
27
28 float originX() const { return float(cx_ * kChunkSize); }
29 float originY() const { return float(cy_ * kChunkSize); }
30 float originZ() const { return float(cz_ * kChunkSize); }
31
32 void worldAABB(float &minX, float &minY, float &minZ, float &maxX, float &maxY,
33 float &maxZ) const {
34 minX = originX();
35 minY = originY();
36 minZ = originZ();
37 maxX = minX + float(kChunkSize);
38 maxY = minY + float(kChunkSize);
39 maxZ = minZ + float(kChunkSize);
40 }
41
42 uint8_t get(int x, int y, int z) const {
43 if (x < 0 || y < 0 || z < 0 || x >= kChunkSize || y >= kChunkSize || z >= kChunkSize)
44 return 0;
45 return voxels_[index(x, y, z)];
46 }
47
48 void set(int x, int y, int z, uint8_t texId) {
49 if (x < 0 || y < 0 || z < 0 || x >= kChunkSize || y >= kChunkSize || z >= kChunkSize) return;
50 voxels_[index(x, y, z)] = texId;
51 dirty_ = true;
52 }
53
54 void fill(uint8_t texId) {
55 std::memset(voxels_, texId, sizeof(voxels_));
56 dirty_ = true;
57 }
58
59 void clear() { fill(0); }
60
62 void setVoxelData(const uint8_t *src) {
63 std::memcpy(voxels_, src, sizeof(voxels_));
64 dirty_ = true;
65 }
66
67 bool isDirty() const { return dirty_; }
68
70 void markDirty() { dirty_ = true; }
71
74 ChunkSampler sampler = nullptr,
75 void *samplerUserData = nullptr) {
76 GreedyMesher::meshChunk(voxels_, faces_, types, sampler, samplerUserData, cx_, cy_, cz_,
77 ao_);
78 dirty_ = false;
79 }
80
83 ChunkSampler sampler = nullptr,
84 void *samplerUserData = nullptr) {
85 if (dirty_) remesh(types, sampler, samplerUserData);
86 }
87
88 const std::vector<PackedRect> &faceRects(FaceDir dir) const {
89 return faces_[int(dir)];
90 }
91
92 int faceRectCount(FaceDir dir) const { return int(faces_[int(dir)].size()); }
93
94 const uint32_t *facePackedData(FaceDir dir) const {
95 const auto &v = faces_[int(dir)];
96 return v.empty() ? nullptr : reinterpret_cast<const uint32_t *>(v.data());
97 }
98
103 const uint32_t *faceAOPackedData(FaceDir dir) const {
104 const auto &v = ao_[int(dir)];
105 return v.empty() ? nullptr : v.data();
106 }
107
108 int totalRectCount() const {
109 int n = 0;
110 for (int i = 0; i < faceDirCount(); ++i) n += int(faces_[i].size());
111 return n;
112 }
113
114 const uint8_t *rawVoxels() const { return voxels_; }
115
116private:
117 static int index(int x, int y, int z) {
118 return x + y * kChunkSize + z * kChunkSize * kChunkSize;
119 }
120
121 int cx_ = 0;
122 int cy_ = 0;
123 int cz_ = 0;
124 uint8_t voxels_[kChunkSize * kChunkSize * kChunkSize]{};
125 std::vector<PackedRect> faces_[6];
126 std::vector<uint32_t> ao_[6];
127 bool dirty_ = true;
128};
129
130} // namespace eve::voxel
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
glm::vec3 n
Definition Grass.cpp:64
int v
V3 dir
Definition TreeMesh.cpp:121
One 32³ voxel chunk with six direction-sorted packed-rect instance buffers. Coordinates: chunk (cx,...
Definition Chunk.h:18
const uint32_t * faceAOPackedData(FaceDir dir) const
Definition Chunk.h:103
int cy() const
Definition Chunk.h:25
float originZ() const
Definition Chunk.h:30
void setVoxelData(const uint8_t *src)
Definition Chunk.h:62
void ensureMeshed(const CubeTypeRegistry &types=CubeTypeRegistry::empty(), ChunkSampler sampler=nullptr, void *samplerUserData=nullptr)
Ensure mesh is up to date; remesh if dirty.
Definition Chunk.h:82
void fill(uint8_t texId)
Definition Chunk.h:54
void worldAABB(float &minX, float &minY, float &minZ, float &maxX, float &maxY, float &maxZ) const
Definition Chunk.h:32
const std::vector< PackedRect > & faceRects(FaceDir dir) const
Definition Chunk.h:88
const uint32_t * facePackedData(FaceDir dir) const
Definition Chunk.h:94
float originX() const
Definition Chunk.h:28
void clear()
Definition Chunk.h:59
bool isDirty() const
Definition Chunk.h:67
int faceRectCount(FaceDir dir) const
Definition Chunk.h:92
float originY() const
Definition Chunk.h:29
void markDirty()
Definition Chunk.h:70
int totalRectCount() const
Definition Chunk.h:108
int cz() const
Definition Chunk.h:26
int cx() const
Definition Chunk.h:24
uint8_t get(int x, int y, int z) const
Definition Chunk.h:42
void remesh(const CubeTypeRegistry &types=CubeTypeRegistry::empty(), ChunkSampler sampler=nullptr, void *samplerUserData=nullptr)
Rebuild six face instance buffers via greedy meshing.
Definition Chunk.h:73
void set(int x, int y, int z, uint8_t texId)
Definition Chunk.h:48
const uint8_t * rawVoxels() const
Definition Chunk.h:114
Chunk(int cx=0, int cy=0, int cz=0)
Definition Chunk.h:20
static const CubeTypeRegistry & empty()
进程级空注册表(默认参数与向后兼容回退用)。
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
constexpr int faceDirCount()
Definition FaceDir.h:27
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