载入中...
搜索中...
未找到
VoxelWorld.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "voxel/Chunk.h"
7#include "voxel/FaceDir.h"
8#include "voxel/Frustum.h"
9#include "voxel/VoxelPack.h"
10
12#include <cmath>
13#include <cstdint>
14#include <functional>
15#include <memory>
16#include <string>
17#include <unordered_map>
18#include <vector>
19
20namespace eve::procgen {
21class TerrainSampler;
22}
23
24namespace eve::graphics {
25class Graphics;
26class Texture;
27} // namespace eve::graphics
28
29namespace eve::data {
30class ByteData;
31} // namespace eve::data
32
33namespace eve::thread {
34class Job;
35}
36
37namespace eve::voxel {
38
41 int created = 0; // chunks allocated + filled this pass
42 int evicted = 0; // chunks unloaded outside the radius
43 int pending = 0; // still missing inside the radius after this pass
44};
45
47struct DrawBatch {
48 const Chunk *chunk = nullptr;
50 const uint32_t *packed = nullptr;
51 const uint32_t *ao = nullptr;
52 int count = 0;
53};
54
61public:
67 explicit VoxelWorld(const CubeTypeRegistry &types);
68
70 Chunk *getOrCreateChunk(int cx, int cy, int cz);
72 Chunk *getChunk(int cx, int cy, int cz);
74 const Chunk *getChunk(int cx, int cy, int cz) const;
76 bool hasChunk(int cx, int cy, int cz) const;
78 void removeChunk(int cx, int cy, int cz);
80 void clear();
81
83 int getChunkCount() const { return int(chunks_.size()); }
85 uint64_t getRevision() const { return revision_; }
86
92 int unloadChunksOutside(int centerX, int centerY, int centerZ, int radiusChunks);
93
100 void setStreamCacheChunks(int extraChunks);
102 int getStreamCacheChunks() const { return streamCacheChunks_; }
103
117 StreamStats streamAround(int centerX, int centerY, int centerZ, int radiusChunks,
119 const std::function<void(Chunk &, int, int, int)> &generator = {},
120 int maxCreates = 0);
121
127 void setTerrainParams(uint32_t seed, uint8_t top, uint8_t sub, uint8_t stone, float baseHeight, float amplitude,
128 float scale);
129
139 void setTerrainParam(const std::string &key, float value);
140
142 void disableTerrain();
144 bool terrainEnabled() const { return terrainEnabled_ || terrainAssetEnabled_; }
145
147 bool loadTerrainAsset(data::ByteData *bytes, float heightOffset = 0.f, float heightScale = 1.f);
149 procgen::TerrainStreamStats streamTerrainAssetAround(int worldX, int worldZ, int radiusChunks,
150 int maxLoads = 0);
152 void setTerrainAssetMaterials(uint8_t vegetation, uint8_t sand, uint8_t snow,
153 uint8_t alpine, uint8_t riverbed);
155 int getTerrainAssetResidentCount() const { return terrainAsset_.getResidentCount(); }
156
158 int terrainHeightAt(int wx, int wz) const;
159
165 void serializeWorld(std::vector<uint8_t> &out) const;
167 bool deserializeWorld(const uint8_t *data, size_t size);
168
170 data::ByteData *saveWorld() const;
172 bool loadWorld(data::ByteData *bytes);
173
182 int remeshDirty(int maxThreads = 0, int maxChunks = 0);
184 int getDirtyCount() const;
186 int getInflightStreamCount() const;
187
196 void selectVisible(const float *viewProj16, float eyeX, float eyeY, float eyeZ, float viewRange,
197 bool faceCull = true);
198
200 int getVisibleBatchCount() const { return int(visible_.size()); }
202 const DrawBatch &getVisibleBatch(int index) const { return visible_[size_t(index)]; }
203
205 int getVisibleChunkCount() const { return int(visibleChunkKeys_.size()); }
207 void getVisibleChunkCoord(int index, int &cx, int &cy, int &cz) const;
209 int getVisibleRectCount() const;
210
217 void drawVisible(graphics::Graphics *gfx, graphics::Texture *atlas, int tilesPerRow = 16);
218
221 uint8_t getVoxel(int wx, int wy, int wz) const;
223 void setVoxel(int wx, int wy, int wz, uint8_t texId);
224
231 bool raycast(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist,
232 int &hitX, int &hitY, int &hitZ, int &prevX, int &prevY, int &prevZ,
233 int &faceX, int &faceY, int &faceZ) const;
234
236 bool raycastScript(float ox, float oy, float oz, float dx, float dy, float dz, float maxDist);
238 bool lastRaycastHit() const { return raycastHit_; }
240 int lastRaycastHitX() const { return raycastHitX_; }
242 int lastRaycastHitY() const { return raycastHitY_; }
244 int lastRaycastHitZ() const { return raycastHitZ_; }
246 int lastRaycastPrevX() const { return raycastPrevX_; }
248 int lastRaycastPrevY() const { return raycastPrevY_; }
250 int lastRaycastPrevZ() const { return raycastPrevZ_; }
252 int lastRaycastFaceX() const { return raycastFaceX_; }
254 int lastRaycastFaceY() const { return raycastFaceY_; }
256 int lastRaycastFaceZ() const { return raycastFaceZ_; }
257
262 void setVoxelByName(int wx, int wy, int wz, const std::string &name, int orientation = 0);
263
265 std::string getCubeTypeName(int wx, int wy, int wz) const;
267 uint8_t getCubeTypeTex(int wx, int wy, int wz, const std::string &faceDir) const;
268
270 const CubeTypeRegistry &cubeTypes() const { return types_; }
271
272private:
273 static int floorDiv(int v) {
274 return v >= 0 ? (v >> 5) : -(((-v - 1) >> 5) + 1);
275 }
276
277 static uint64_t key(int cx, int cy, int cz) {
278 const uint64_t ux = uint64_t(uint32_t(cx) & 0x1FFFFFu);
279 const uint64_t uy = uint64_t(uint32_t(cy) & 0x1FFFFFu);
280 const uint64_t uz = uint64_t(uint32_t(cz) & 0x1FFFFFu);
281 return ux | (uy << 21) | (uz << 42);
282 }
283
284 static void unpackKey(uint64_t k, int &cx, int &cy, int &cz) {
285 auto signExtend21 = [](uint32_t v) -> int {
286 if (v & 0x100000u) return int(v | 0xFFE00000u);
287 return int(v);
288 };
289 cx = signExtend21(uint32_t(k & 0x1FFFFFu));
290 cy = signExtend21(uint32_t((k >> 21) & 0x1FFFFFu));
291 cz = signExtend21(uint32_t((k >> 42) & 0x1FFFFFu));
292 }
293
295 static uint8_t chunkNeighborSampler(void *userData, int chunkX, int chunkY, int chunkZ,
296 int localX, int localY, int localZ);
297
299 void markNeighborChunksDirty(int cx, int cy, int cz, int lx, int ly, int lz);
300 uint8_t terrainSurfaceAt(int wx, int wz) const;
301 void fillChunkTerrain(Chunk &chunk, int nx, int ny, int nz) const;
302 void remeshChunks(const std::vector<Chunk *> &chunks, int maxThreads);
303 void waitStreamJobs();
304 void reapRetiredStreamJobs();
305 void restoreRetiredInside(int centerX, int centerY, int centerZ, int radiusChunks);
306 bool isStreamJob(int cx, int cy, int cz) const;
307 int harvestStreamJobs(int centerX, int centerY, int centerZ, int radiusChunks, int maxHarvest);
308 void dropStreamJobsOutside(int centerX, int centerY, int centerZ, int radiusChunks);
309
310 struct StreamJob {
311 int cx = 0;
312 int cy = 0;
313 int cz = 0;
314 std::unique_ptr<Chunk> chunk;
315 thread::Job *job = nullptr;
316 };
317
318 std::vector<StreamJob> inflight_;
319 std::vector<StreamJob> retired_;
320
321 std::unordered_map<uint64_t, std::unique_ptr<Chunk>> chunks_;
322 int streamCacheChunks_ = 0;
323 uint64_t revision_ = 0;
324 std::vector<DrawBatch> visible_;
325 std::vector<uint64_t> visibleChunkKeys_;
326 CubeTypeRegistry types_;
327 std::unique_ptr<procgen::TerrainSampler> terrainSampler_;
328 uint8_t terrainTop_ = 1;
329 uint8_t terrainSub_ = 2;
330 uint8_t terrainStone_ = 3;
331 uint8_t terrainSand_ = 0; // 0 = 沙滩带关闭
332 float sandLevel_ = 0.f; // 归一化采样高度阈值;≤0 关闭
333 float terrainBase_ = 8.f;
334 float terrainAmplitude_ = 14.f;
335 bool terrainEnabled_ = false;
336 procgen::TerrainStreamingCache terrainAsset_;
337 bool terrainAssetEnabled_ = false;
338 float terrainAssetOffset_ = 0.f;
339 float terrainAssetScale_ = 1.f;
340 uint8_t terrainVegetation_ = 1;
341 uint8_t terrainAssetSand_ = 1;
342 uint8_t terrainSnow_ = 1;
343 uint8_t terrainAlpine_ = 3;
344 uint8_t terrainRiverbed_ = 2;
345
346 bool raycastHit_ = false;
347 int raycastHitX_ = 0;
348 int raycastHitY_ = 0;
349 int raycastHitZ_ = 0;
350 int raycastPrevX_ = 0;
351 int raycastPrevY_ = 0;
352 int raycastPrevZ_ = 0;
353 int raycastFaceX_ = 0;
354 int raycastFaceY_ = 0;
355 int raycastFaceZ_ = 0;
356};
357
358} // namespace eve::voxel
double value
SQInteger top
float cx
Definition CardTypes.cpp:33
float cy
Definition CardTypes.cpp:34
float nx
float nz
float ny
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::uint32_t key
float v
std::array< float, 3 > scale
std::uint64_t bytes
std::string name
std::uint32_t seed
Definition PointSet.cpp:807
float dz
float dy
float dx
float size
Definition TreeMesh.cpp:156
uint32_t index
double oy
double ox
float wz
float wx
float wy
In-memory byte buffer implementing eve::Data (ref-counted).
Definition ByteData.h:13
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:18
One 32³ voxel chunk with six direction-sorted packed-rect instance buffers. Coordinates: chunk (cx,...
Definition Chunk.h:18
EVENGINE_API_DOMAINS public API.
Sparse chunk map + visibility selection (frustum + distance + face orientation). Meshing is neighbor-...
Definition VoxelWorld.h:60
int lastRaycastHitY() const
Last raycast hit y.
Definition VoxelWorld.h:242
bool terrainEnabled() const
Terrain enabled.
Definition VoxelWorld.h:144
int getTerrainAssetResidentCount() const
Returns the terrain asset resident count.
Definition VoxelWorld.h:155
int lastRaycastHitZ() const
Last raycast hit z.
Definition VoxelWorld.h:244
bool lastRaycastHit() const
Last raycast hit.
Definition VoxelWorld.h:238
int getVisibleChunkCount() const
Script accessors for the last selectVisible result.
Definition VoxelWorld.h:205
int lastRaycastHitX() const
Last raycast hit x.
Definition VoxelWorld.h:240
int getVisibleBatchCount() const
Returns the visible batch count.
Definition VoxelWorld.h:200
int getChunkCount() const
Returns the chunk count.
Definition VoxelWorld.h:83
int lastRaycastFaceX() const
Last raycast face x.
Definition VoxelWorld.h:252
int lastRaycastPrevY() const
Last raycast prev y.
Definition VoxelWorld.h:248
int lastRaycastFaceZ() const
Last raycast face z.
Definition VoxelWorld.h:256
uint64_t getRevision() const
Monotonic content revision incremented by voxel/chunk mutations.
Definition VoxelWorld.h:85
VoxelWorld()
Voxel world.
int lastRaycastPrevX() const
Last raycast prev x.
Definition VoxelWorld.h:246
int lastRaycastFaceY() const
Last raycast face y.
Definition VoxelWorld.h:254
const DrawBatch & getVisibleBatch(int index) const
Returns the visible batch.
Definition VoxelWorld.h:202
int lastRaycastPrevZ() const
Last raycast prev z.
Definition VoxelWorld.h:250
int getStreamCacheChunks() const
Returns the stream cache chunks.
Definition VoxelWorld.h:102
const CubeTypeRegistry & cubeTypes() const
本世界持有的方块类型注册表(副本)。
Definition VoxelWorld.h:270
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
方块类型定义:名字、各面图集纹理、方向性、组合声明。 方向性方块在注册时按 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
TerrainStreamStats public API.
One draw batch: all packed rects of one face direction for one chunk.
Definition VoxelWorld.h:47
const uint32_t * packed
Definition VoxelWorld.h:50
const Chunk * chunk
Definition VoxelWorld.h:48
const uint32_t * ao
Definition VoxelWorld.h:51
Result of a streaming pass.
Definition VoxelWorld.h:40