70 Chunk *getOrCreateChunk(
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);
92 int unloadChunksOutside(
int centerX,
int centerY,
int centerZ,
int radiusChunks);
100 void setStreamCacheChunks(
int extraChunks);
117 StreamStats streamAround(
int centerX,
int centerY,
int centerZ,
int radiusChunks,
119 const std::function<
void(
Chunk &,
int,
int,
int)> &generator = {},
127 void setTerrainParams(uint32_t
seed, uint8_t
top, uint8_t sub, uint8_t stone,
float baseHeight,
float amplitude,
139 void setTerrainParam(
const std::string &
key,
float value);
142 void disableTerrain();
147 bool loadTerrainAsset(
data::ByteData *
bytes,
float heightOffset = 0.f,
float heightScale = 1.f);
152 void setTerrainAssetMaterials(uint8_t vegetation, uint8_t sand, uint8_t snow,
153 uint8_t alpine, uint8_t riverbed);
158 int terrainHeightAt(
int wx,
int wz)
const;
165 void serializeWorld(std::vector<uint8_t> &out)
const;
167 bool deserializeWorld(
const uint8_t *data,
size_t size);
182 int remeshDirty(
int maxThreads = 0,
int maxChunks = 0);
184 int getDirtyCount()
const;
186 int getInflightStreamCount()
const;
196 void selectVisible(
const float *viewProj16,
float eyeX,
float eyeY,
float eyeZ,
float viewRange,
197 bool faceCull =
true);
207 void getVisibleChunkCoord(
int index,
int &
cx,
int &
cy,
int &cz)
const;
209 int getVisibleRectCount()
const;
221 uint8_t getVoxel(
int wx,
int wy,
int wz)
const;
223 void setVoxel(
int wx,
int wy,
int wz, uint8_t texId);
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;
236 bool raycastScript(
float ox,
float oy,
float oz,
float dx,
float dy,
float dz,
float maxDist);
262 void setVoxelByName(
int wx,
int wy,
int wz,
const std::string &
name,
int orientation = 0);
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;
273 static int floorDiv(
int v) {
274 return v >= 0 ? (
v >> 5) : -(((-
v - 1) >> 5) + 1);
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);
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);
289 cx = signExtend21(uint32_t(k & 0x1FFFFFu));
290 cy = signExtend21(uint32_t((k >> 21) & 0x1FFFFFu));
291 cz = signExtend21(uint32_t((k >> 42) & 0x1FFFFFu));
295 static uint8_t chunkNeighborSampler(
void *userData,
int chunkX,
int chunkY,
int chunkZ,
296 int localX,
int localY,
int localZ);
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);
314 std::unique_ptr<Chunk> chunk;
315 thread::Job *job =
nullptr;
318 std::vector<StreamJob> inflight_;
319 std::vector<StreamJob> retired_;
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;
332 float sandLevel_ = 0.f;
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;
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;
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.