Worlds indexing
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user