载入中...
搜索中...
未找到
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:
21 Chunk(int cx = 0, int cy = 0, int cz = 0) : cx_(cx), cy_(cy), cz_(cz) {
23 std::memset(voxels_, 0, sizeof(voxels_));
24 }
25
27 int cx() const { return cx_; }
29 int cy() const { return cy_; }
31 int cz() const { return cz_; }
32
34 float originX() const { return float(cx_ * kChunkSize); }
36 float originY() const { return float(cy_ * kChunkSize); }
38 float originZ() const { return float(cz_ * kChunkSize); }
39
41 void worldAABB(float &minX, float &minY, float &minZ, float &maxX, float &maxY,
42 float &maxZ) const {
43 minX = originX();
44 minY = originY();
45 minZ = originZ();
46 maxX = minX + float(kChunkSize);
47 maxY = minY + float(kChunkSize);
48 maxZ = minZ + float(kChunkSize);
49 }
50
52 uint8_t get(int x, int y, int z) const {
53 if (x < 0 || y < 0 || z < 0 || x >= kChunkSize || y >= kChunkSize || z >= kChunkSize)
54 return 0;
55 return voxels_[index(x, y, z)];
56 }
57
59 void set(int x, int y, int z, uint8_t texId) {
60 if (x < 0 || y < 0 || z < 0 || x >= kChunkSize || y >= kChunkSize || z >= kChunkSize) return;
61 voxels_[index(x, y, z)] = texId;
62 dirty_ = true;
63 }
64
66 void fill(uint8_t texId) {
68 std::memset(voxels_, texId, sizeof(voxels_));
69 dirty_ = true;
70 }
71
73 void clear() { fill(0); }
74
77 void setVoxelData(const uint8_t *src) {
79 std::memcpy(voxels_, src, sizeof(voxels_));
80 dirty_ = true;
81 }
82
84 bool isDirty() const { return dirty_; }
85
88 void markDirty() { dirty_ = true; }
89
92 ChunkSampler sampler = nullptr,
93 void *samplerUserData = nullptr) {
95 GreedyMesher::meshChunk(voxels_, faces_, types, sampler, samplerUserData, cx_, cy_, cz_,
96 ao_);
97 dirty_ = false;
98 }
99
102 ChunkSampler sampler = nullptr,
103 void *samplerUserData = nullptr) {
104 if (dirty_) remesh(types, sampler, samplerUserData);
105 }
106
108 const std::vector<PackedRect> &faceRects(FaceDir dir) const {
109 return faces_[int(dir)];
110 }
111
113 int faceRectCount(FaceDir dir) const { return int(faces_[int(dir)].size()); }
114
116 const uint32_t *facePackedData(FaceDir dir) const {
117 const auto &v = faces_[int(dir)];
118 return v.empty() ? nullptr : reinterpret_cast<const uint32_t *>(v.data());
119 }
120
126 const uint32_t *faceAOPackedData(FaceDir dir) const {
127 const auto &v = ao_[int(dir)];
128 return v.empty() ? nullptr : v.data();
129 }
130
132 int totalRectCount() const {
133 int n = 0;
134 for (int i = 0; i < faceDirCount(); ++i) n += int(faces_[i].size());
135 return n;
136 }
137
139 const uint8_t *rawVoxels() const { return voxels_; }
140
141private:
142 static int index(int x, int y, int z) {
143 return x + y * kChunkSize + z * kChunkSize * kChunkSize;
144 }
145
146 int cx_ = 0;
147 int cy_ = 0;
148 int cz_ = 0;
149 uint8_t voxels_[kChunkSize * kChunkSize * kChunkSize]{};
150 std::vector<PackedRect> faces_[6];
151 std::vector<uint32_t> ao_[6];
152 bool dirty_ = true;
153};
154
155} // namespace eve::voxel
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
vk::UniqueSampler sampler
glm::vec3 n
Definition Grass.cpp:63
float v
float size
Definition TreeMesh.cpp:156
V3 dir
Definition TreeMesh.cpp:150
uint32_t index
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
Face ao packed data.
Definition Chunk.h:126
int cy() const
Cy.
Definition Chunk.h:29
float originZ() const
Origin z.
Definition Chunk.h:38
void setVoxelData(const uint8_t *src)
Sets the voxel data.
Definition Chunk.h:77
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:101
void fill(uint8_t texId)
Fill.
Definition Chunk.h:66
void worldAABB(float &minX, float &minY, float &minZ, float &maxX, float &maxY, float &maxZ) const
World aabb.
Definition Chunk.h:41
const std::vector< PackedRect > & faceRects(FaceDir dir) const
Face rects.
Definition Chunk.h:108
const uint32_t * facePackedData(FaceDir dir) const
Face packed data.
Definition Chunk.h:116
float originX() const
Origin x.
Definition Chunk.h:34
void clear()
Clears .
Definition Chunk.h:73
bool isDirty() const
True when dirty.
Definition Chunk.h:84
int faceRectCount(FaceDir dir) const
Face rect count.
Definition Chunk.h:113
float originY() const
Origin y.
Definition Chunk.h:36
void markDirty()
Mark dirty.
Definition Chunk.h:88
int totalRectCount() const
Total rect count.
Definition Chunk.h:132
int cz() const
Cz.
Definition Chunk.h:31
int cx() const
Cx.
Definition Chunk.h:27
uint8_t get(int x, int y, int z) const
Returns the value.
Definition Chunk.h:52
void remesh(const CubeTypeRegistry &types=CubeTypeRegistry::empty(), ChunkSampler sampler=nullptr, void *samplerUserData=nullptr)
Rebuild six face instance buffers via greedy meshing.
Definition Chunk.h:91
void set(int x, int y, int z, uint8_t texId)
Sets the value.
Definition Chunk.h:59
const uint8_t * rawVoxels() const
Raw voxels.
Definition Chunk.h:139
Chunk(int cx=0, int cy=0, int cz=0)
Constructs a Chunk.
Definition Chunk.h:21
EVENGINE_API_DOMAINS public API.
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()
Face dir count.
Definition FaceDir.h:28
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