Worlds indexing

This commit is contained in:
MihailRis
2023-12-08 21:00:15 +03:00
parent eea920d98f
commit f513c094a9
19 changed files with 383 additions and 141 deletions
+34 -3
View File
@@ -122,7 +122,7 @@ WorldRegion* WorldFiles::getOrCreateRegion(
return region;
}
ubyte* WorldFiles::compress(ubyte* src, size_t srclen, size_t& len) {
ubyte* WorldFiles::compress(const ubyte* src, size_t srclen, size_t& len) {
len = extrle::encode(src, srclen, compressionBuffer);
ubyte* data = new ubyte[len];
for (size_t i = 0; i < len; i++) {
@@ -131,12 +131,27 @@ ubyte* WorldFiles::compress(ubyte* src, size_t srclen, size_t& len) {
return data;
}
ubyte* WorldFiles::decompress(ubyte* src, size_t srclen, size_t dstlen) {
ubyte* WorldFiles::decompress(const ubyte* src, size_t srclen, size_t dstlen) {
ubyte* decompressed = new ubyte[dstlen];
extrle::decode(src, srclen, decompressed);
return decompressed;
}
void WorldFiles::put(int x, int z, const ubyte* voxelData) {
int regionX = floordiv(x, REGION_SIZE);
int regionZ = floordiv(z, REGION_SIZE);
int localX = x - (regionX * REGION_SIZE);
int localZ = z - (regionZ * REGION_SIZE);
/* Writing Voxels */ {
WorldRegion* region = getOrCreateRegion(regions, regionX, regionZ);
region->setUnsaved(true);
size_t compressedSize;
ubyte* data = compress(voxelData, CHUNK_DATA_LEN, compressedSize);
region->put(localX, localZ, data, compressedSize);
}
}
void WorldFiles::put(Chunk* chunk){
assert(chunk != nullptr);
@@ -176,6 +191,21 @@ path WorldFiles::getRegionFilename(int x, int y) const {
return path(filename);
}
bool WorldFiles::parseRegionFilename(const string& name, int& x, int& y) {
size_t sep = name.find('_');
if (sep == string::npos || sep == 0 || sep == name.length()-1)
return false;
try {
x = std::stoi(name.substr(0, sep));
y = std::stoi(name.substr(sep+1));
} catch (std::invalid_argument& err) {
return false;
} catch (std::out_of_range& err) {
return false;
}
return true;
}
path WorldFiles::getPlayerFile() const {
return directory/path("player.json");
}
@@ -338,7 +368,8 @@ void WorldFiles::write(const World* world, const Content* content) {
fs::create_directories(directory);
}
}
writeWorldInfo(world);
if (world)
writeWorldInfo(world);
if (generatorTestMode)
return;
writeIndices(content->indices);