mirror of
https://github.com/neocturne/MinedMap.git
synced 2025-03-04 17:23:33 +01:00
Info: make tile existence map mor efficient for sparse worlds
Explicitly list the coordinates where tiles exist instead of including a full array with the size of the bounding box.
This commit is contained in:
parent
0ebc895ec0
commit
d2802b73f5
3 changed files with 50 additions and 19 deletions
40
src/Info.cpp
40
src/Info.cpp
|
@ -47,6 +47,9 @@ void Info::writeJSON(const char *filename) const {
|
|||
std::fprintf(f, "\"mipmaps\":[");
|
||||
|
||||
for (size_t level = 0; level < regions.size(); level++) {
|
||||
if (level != 0)
|
||||
std::fprintf(f, ",");
|
||||
|
||||
int minX, maxX, minZ, maxZ;
|
||||
std::tie(minX, maxX, minZ, maxZ) = getBounds(level);
|
||||
|
||||
|
@ -57,30 +60,33 @@ void Info::writeJSON(const char *filename) const {
|
|||
std::fprintf(f, "\"minZ\":%i,", minZ);
|
||||
std::fprintf(f, "\"maxZ\":%i", maxZ);
|
||||
std::fprintf(f, "},");
|
||||
std::fprintf(f, "\"regions\":[");
|
||||
std::fprintf(f, "\"regions\":{");
|
||||
|
||||
for (int z = minZ; z <= maxZ; z++) {
|
||||
std::fprintf(f, "[");
|
||||
|
||||
for (int x = minX; x <= maxX; x++) {
|
||||
std::fprintf(f, "%s", regions[level].count(std::make_pair(x, z)) ? "true" : "false");
|
||||
|
||||
if (x < maxX)
|
||||
bool first_z = true;
|
||||
for (const auto &item : regions[level]) {
|
||||
if (!first_z)
|
||||
std::fprintf(f, ",");
|
||||
}
|
||||
first_z = false;
|
||||
|
||||
if (z < maxZ)
|
||||
std::fprintf(f, "],");
|
||||
else
|
||||
std::fprintf(f, "]");
|
||||
int z = item.first;
|
||||
const std::set<int> &z_regions = item.second;
|
||||
|
||||
std::fprintf(f, "\"%d\":[", z);
|
||||
|
||||
bool first_x = true;
|
||||
for (int x : z_regions) {
|
||||
if (!first_x)
|
||||
std::fprintf(f, ",");
|
||||
first_x = false;
|
||||
|
||||
|
||||
std::fprintf(f, "%d", x);
|
||||
}
|
||||
|
||||
std::fprintf(f, "]");
|
||||
}
|
||||
|
||||
if (level < regions.size() - 1)
|
||||
std::fprintf(f, "},");
|
||||
else
|
||||
std::fprintf(f, "}");
|
||||
std::fprintf(f, "}}");
|
||||
}
|
||||
|
||||
std::fprintf(f, "],");
|
||||
|
|
10
src/Info.hpp
10
src/Info.hpp
|
@ -29,6 +29,7 @@
|
|||
#include <climits>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
@ -39,7 +40,7 @@ namespace MinedMap {
|
|||
|
||||
class Info {
|
||||
private:
|
||||
std::vector<std::set<std::pair<int, int>>> regions;
|
||||
std::vector<std::map<int, std::set<int>>> regions;
|
||||
std::vector<std::tuple<int, int, int, int>> bounds;
|
||||
|
||||
int32_t spawnX, spawnZ;
|
||||
|
@ -54,7 +55,12 @@ public:
|
|||
}
|
||||
|
||||
void addRegion(int x, int z, size_t level) {
|
||||
regions[level].insert(std::make_pair(x, z));
|
||||
auto &level_r = regions[level];
|
||||
auto z_regions = level_r.emplace(
|
||||
std::piecewise_construct,
|
||||
std::make_tuple(z),
|
||||
std::make_tuple()).first;
|
||||
z_regions->second.insert(x);
|
||||
|
||||
std::tuple<int, int, int, int> &b = bounds[level];
|
||||
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// bsearch-based array element check
|
||||
function contains(array, elem) {
|
||||
var min = 0, max = array.length, i, cur;
|
||||
|
||||
while (min < max) {
|
||||
i = min + Math.floor((max-min)/2);
|
||||
cur = array[i];
|
||||
|
||||
if (cur === elem)
|
||||
return true;
|
||||
else if (cur < elem)
|
||||
min = i + 1;
|
||||
else
|
||||
max = i;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
var MinedMapLayer = L.GridLayer.extend({
|
||||
initialize: function (mipmaps, layer) {
|
||||
this.mipmaps = mipmaps;
|
||||
|
@ -43,7 +62,7 @@ var MinedMapLayer = L.GridLayer.extend({
|
|||
|
||||
if (coords.x >= mipmap.info.minX && coords.x <= mipmap.info.maxX &&
|
||||
coords.y >= mipmap.info.minZ && coords.y <= mipmap.info.maxZ &&
|
||||
mipmap.regions[coords.y-mipmap.info.minZ][coords.x-mipmap.info.minX])
|
||||
contains(mipmap.regions[coords.y] || [], coords.x))
|
||||
tile.src = 'data/'+this.layer+'/'+z+'/r.'+coords.x+'.'+coords.y+'.png';
|
||||
|
||||
if (z === 0)
|
||||
|
|
Loading…
Add table
Reference in a new issue