载入中...
搜索中...
未找到
VoxelWorld.h
浏览该文件的文档.
1#pragma once
2
3#include "voxel/Chunk.h"
5#include "voxel/FaceDir.h"
6#include "voxel/Frustum.h"
7#include "voxel/VoxelPack.h"
8
9#include <cmath>
10#include <cstdint>
11#include <functional>
12#include <memory>
13#include <string>
14#include <unordered_map>
15#include <vector>
16
17namespace eve::procgen {
18class TerrainSampler;
19}
20
21namespace eve::graphics {
22class IGraphics3D;
23class Texture;
24} // namespace eve::graphics
25
26namespace eve::data {
27class ByteData;
28} // namespace eve::data
29
30namespace eve::voxel {
31
34 int created = 0; // chunks allocated + filled this pass
35 int evicted = 0; // chunks unloaded outside the radius
36};
37
39struct DrawBatch {
40 const Chunk *chunk = nullptr;
42 const uint32_t *packed = nullptr;
43 const uint32_t *ao = nullptr;
44 int count = 0;
45};
46
53public:
54 VoxelWorld() = default;
56 explicit VoxelWorld(const CubeTypeRegistry &types) : types_(types) {}
57
58 Chunk *getOrCreateChunk(int cx, int cy, int cz);
59 Chunk *getChunk(int cx, int cy, int cz);
60 const Chunk *getChunk(int cx, int cy, int cz) const;
61 bool hasChunk(int cx, int cy, int cz) const;
62 void removeChunk(int cx, int cy, int cz);
63 void clear();
64
65 int getChunkCount() const { return int(chunks_.size()); }
66
72 int unloadChunksOutside(int centerX, int centerY, int centerZ, int radiusChunks);
73
82 StreamStats streamAround(int centerX, int centerY, int centerZ, int radiusChunks,
83 const std::function<void(Chunk &, int, int, int)> &generator = {});
84
90 void setTerrainParams(uint32_t seed, uint8_t top, uint8_t sub, uint8_t stone, float baseHeight, float amplitude,
91 float scale);
92 void disableTerrain() { terrainEnabled_ = false; }
93 bool terrainEnabled() const { return terrainEnabled_; }
94
96 int terrainHeightAt(int wx, int wz) const;
97
103 void serializeWorld(std::vector<uint8_t> &out) const;
104 bool deserializeWorld(const uint8_t *data, size_t size);
105
107 data::ByteData *saveWorld() const;
108 bool loadWorld(data::ByteData *bytes);
109
116 int remeshDirty(int maxThreads = 0);
117
125 void selectVisible(const float *viewProj16, float eyeX, float eyeY, float eyeZ, float viewRange,
126 bool faceCull = true);
127
128 int getVisibleBatchCount() const { return int(visible_.size()); }
129 const DrawBatch &getVisibleBatch(int index) const { return visible_[size_t(index)]; }
130
132 int getVisibleChunkCount() const { return int(visibleChunkKeys_.size()); }
133 void getVisibleChunkCoord(int index, int &cx, int &cy, int &cz) const;
134 int getVisibleRectCount() const;
135
140 void drawVisible(graphics::IGraphics3D *gfx, graphics::Texture *atlas, int tilesPerRow = 16);
141
144 uint8_t getVoxel(int wx, int wy, int wz) const;
145 void setVoxel(int wx, int wy, int wz, uint8_t texId);
146
153 bool raycast(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist,
154 int &hitX, int &hitY, int &hitZ, int &prevX, int &prevY, int &prevZ,
155 int &faceX, int &faceY, int &faceZ) const;
156
158 bool raycastScript(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist);
159 bool lastRaycastHit() const { return raycastHit_; }
160 int lastRaycastHitX() const { return raycastHitX_; }
161 int lastRaycastHitY() const { return raycastHitY_; }
162 int lastRaycastHitZ() const { return raycastHitZ_; }
163 int lastRaycastPrevX() const { return raycastPrevX_; }
164 int lastRaycastPrevY() const { return raycastPrevY_; }
165 int lastRaycastPrevZ() const { return raycastPrevZ_; }
166 int lastRaycastFaceX() const { return raycastFaceX_; }
167 int lastRaycastFaceY() const { return raycastFaceY_; }
168 int lastRaycastFaceZ() const { return raycastFaceZ_; }
169
174 void setVoxelByName(int wx, int wy, int wz, const std::string &name, int orientation = 0);
175
177 std::string getCubeTypeName(int wx, int wy, int wz) const;
179 uint8_t getCubeTypeTex(int wx, int wy, int wz, const std::string &faceDir) const;
180
182 const CubeTypeRegistry &cubeTypes() const { return types_; }
183
184private:
185 static int floorDiv(int v) {
186 return v >= 0 ? (v >> 5) : -(((-v - 1) >> 5) + 1);
187 }
188
189 static uint64_t key(int cx, int cy, int cz) {
190 const uint64_t ux = uint64_t(uint32_t(cx) & 0x1FFFFFu);
191 const uint64_t uy = uint64_t(uint32_t(cy) & 0x1FFFFFu);
192 const uint64_t uz = uint64_t(uint32_t(cz) & 0x1FFFFFu);
193 return ux | (uy << 21) | (uz << 42);
194 }
195
196 static void unpackKey(uint64_t k, int &cx, int &cy, int &cz) {
197 auto signExtend21 = [](uint32_t v) -> int {
198 if (v & 0x100000u) return int(v | 0xFFE00000u);
199 return int(v);
200 };
201 cx = signExtend21(uint32_t(k & 0x1FFFFFu));
202 cy = signExtend21(uint32_t((k >> 21) & 0x1FFFFFu));
203 cz = signExtend21(uint32_t((k >> 42) & 0x1FFFFFu));
204 }
205
207 static uint8_t chunkNeighborSampler(void *userData, int chunkX, int chunkY, int chunkZ,
208 int localX, int localY, int localZ);
209
211 void markNeighborChunksDirty(int cx, int cy, int cz, int lx, int ly, int lz);
212
213 std::unordered_map<uint64_t, std::unique_ptr<Chunk>> chunks_;
214 std::vector<DrawBatch> visible_;
215 std::vector<uint64_t> visibleChunkKeys_;
216 CubeTypeRegistry types_;
217 std::unique_ptr<procgen::TerrainSampler> terrainSampler_;
218 uint8_t terrainTop_ = 1;
219 uint8_t terrainSub_ = 2;
220 uint8_t terrainStone_ = 3;
221 float terrainBase_ = 8.f;
222 float terrainAmplitude_ = 14.f;
223 bool terrainEnabled_ = false;
224
225 bool raycastHit_ = false;
226 int raycastHitX_ = 0;
227 int raycastHitY_ = 0;
228 int raycastHitZ_ = 0;
229 int raycastPrevX_ = 0;
230 int raycastPrevY_ = 0;
231 int raycastPrevZ_ = 0;
232 int raycastFaceX_ = 0;
233 int raycastFaceY_ = 0;
234 int raycastFaceZ_ = 0;
235};
236
237} // namespace eve::voxel
float cx
Definition CardTypes.cpp:31
float cy
Definition CardTypes.cpp:32
uint32_t seed
const char * name
Definition RockMesh.cpp:21
int v
float scale
Definition TreeMesh.cpp:122
In-memory byte buffer implementing eve::Data (ref-counted).
Definition ByteData.h:11
3D frame / mesh / light / shadow rendering surface.
Definition IGraphics3D.h:28
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:17
One 32³ voxel chunk with six direction-sorted packed-rect instance buffers. Coordinates: chunk (cx,...
Definition Chunk.h:18
Sparse chunk map + visibility selection (frustum + distance + face orientation). Meshing is neighbor-...
Definition VoxelWorld.h:52
int lastRaycastHitY() const
Definition VoxelWorld.h:161
data::ByteData * saveWorld() const
Script-facing wrappers around serialize/deserialize.
int terrainHeightAt(int wx, int wz) const
Terrain height (world blocks) at a column for the configured seed.
bool terrainEnabled() const
Definition VoxelWorld.h:93
StreamStats streamAround(int centerX, int centerY, int centerZ, int radiusChunks, const std::function< void(Chunk &, int, int, int)> &generator={})
Player-centered streaming: evict chunks outside radiusChunks, then allocate + fill + mesh missing chu...
void setVoxelByName(int wx, int wy, int wz, const std::string &name, int orientation=0)
按方块名 + orientation(0..3) 设置体素;内部解析为具体类型 id 后写 Chunk。 未注册的名字按空气(0)处理。
void setTerrainParams(uint32_t seed, uint8_t top, uint8_t sub, uint8_t stone, float baseHeight, float amplitude, float scale)
Configure the built-in terrain generator used by streamAround(). The sampling itself lives in procgen...
uint8_t getCubeTypeTex(int wx, int wy, int wz, const std::string &faceDir) const
该体素在某面方向上的纹理 id(faceDir 如 "posX"/"+y"/"negZ")。
int lastRaycastHitZ() const
Definition VoxelWorld.h:162
uint8_t getVoxel(int wx, int wy, int wz) const
World-space voxel get/set. Air (0) never allocates a chunk; a border edit also invalidates the adjace...
bool lastRaycastHit() const
Definition VoxelWorld.h:159
VoxelWorld(const CubeTypeRegistry &types)
Definition VoxelWorld.h:56
Chunk * getOrCreateChunk(int cx, int cy, int cz)
int getVisibleChunkCount() const
Script accessors for the last selectVisible result.
Definition VoxelWorld.h:132
bool raycast(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist, int &hitX, int &hitY, int &hitZ, int &prevX, int &prevY, int &prevZ, int &faceX, int &faceY, int &faceZ) const
Voxel raycast (Amanatides & Woo DDA). Returns true when a solid voxel is found within maxDist world u...
int lastRaycastHitX() const
Definition VoxelWorld.h:160
bool deserializeWorld(const uint8_t *data, size_t size)
void drawVisible(graphics::IGraphics3D *gfx, graphics::Texture *atlas, int tilesPerRow=16)
Issue Graphics::drawVoxelFaceInstances for every visible batch. Requires begin3DFrame + setMesh3DView...
void setVoxel(int wx, int wy, int wz, uint8_t texId)
bool raycastScript(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist)
Script-facing raycast: stores the last result, returns hit/miss.
int getVisibleBatchCount() const
Definition VoxelWorld.h:128
int getChunkCount() const
Definition VoxelWorld.h:65
int lastRaycastFaceX() const
Definition VoxelWorld.h:166
int lastRaycastPrevY() const
Definition VoxelWorld.h:164
int lastRaycastFaceZ() const
Definition VoxelWorld.h:168
std::string getCubeTypeName(int wx, int wy, int wz) const
该体素所属方块类型名(未注册或空气返回空串)。
bool loadWorld(data::ByteData *bytes)
int lastRaycastPrevX() const
Definition VoxelWorld.h:163
void selectVisible(const float *viewProj16, float eyeX, float eyeY, float eyeZ, float viewRange, bool faceCull=true)
Select chunks/faces to draw.
void removeChunk(int cx, int cy, int cz)
Chunk * getChunk(int cx, int cy, int cz)
void getVisibleChunkCoord(int index, int &cx, int &cy, int &cz) const
bool hasChunk(int cx, int cy, int cz) const
int lastRaycastFaceY() const
Definition VoxelWorld.h:167
int getVisibleRectCount() const
const DrawBatch & getVisibleBatch(int index) const
Definition VoxelWorld.h:129
int lastRaycastPrevZ() const
Definition VoxelWorld.h:165
int unloadChunksOutside(int centerX, int centerY, int centerZ, int radiusChunks)
Streaming eviction: drop chunks whose center is farther than radiusChunks chunk units from (centerX,...
int remeshDirty(int maxThreads=0)
Remesh every dirty chunk. Returns number remeshed.
void serializeWorld(std::vector< uint8_t > &out) const
Persistence: serialize every chunk (coords + raw voxels) into out. Format is portable little-endian: ...
const CubeTypeRegistry & cubeTypes() const
本世界持有的方块类型注册表(副本)。
Definition VoxelWorld.h:182
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6
方块类型定义:名字、各面图集纹理、方向性、组合声明。 方向性方块在注册时按 orientation 绕 Y 轴展开成多个"具体类型"变体, 每个变体持有旋转后的各面纹理;渲染端只消费纹理 id,不接触 ...
Definition Chunk.h:12
FaceDir
Six axis-aligned face directions. Each chunk keeps a separate instance buffer per direction so camera...
Definition FaceDir.h:17
One draw batch: all packed rects of one face direction for one chunk.
Definition VoxelWorld.h:39
const uint32_t * packed
Definition VoxelWorld.h:42
const Chunk * chunk
Definition VoxelWorld.h:40
const uint32_t * ao
Definition VoxelWorld.h:43
Result of a streaming pass.
Definition VoxelWorld.h:33