diff --git a/src/util/AreaMap2D.hpp b/src/util/AreaMap2D.hpp index 547b05b4..1c3041be 100644 --- a/src/util/AreaMap2D.hpp +++ b/src/util/AreaMap2D.hpp @@ -6,16 +6,17 @@ #include namespace util { - template - using OutCallback = std::function; template class AreaMap2D { + public: + using OutCallback = std::function; + private: TCoord offsetX, offsetY; TCoord sizeX, sizeY; std::vector firstBuffer; std::vector secondBuffer; - OutCallback outCallback; + OutCallback outCallback; size_t valuesCount = 0; @@ -93,7 +94,7 @@ namespace util { return true; } - void setOutCallback(const OutCallback& callback) { + void setOutCallback(const OutCallback& callback) { outCallback = callback; } diff --git a/src/world/generator/SurroundMap.cpp b/src/world/generator/SurroundMap.cpp index e54da0e0..fd31d3e7 100644 --- a/src/world/generator/SurroundMap.cpp +++ b/src/world/generator/SurroundMap.cpp @@ -4,114 +4,25 @@ #include #include -void SurroundMap::resetMarks() { - for (auto& [_, entry] : entries) { - entry.marked = false; - } +SurroundMap::SurroundMap(int loadDistance, ubyte maxLevel) + : areaMap((loadDistance + maxLevel) * 2 + 1, + (loadDistance + maxLevel) * 2 + 1), + levelCallbacks(maxLevel), + maxLevel(maxLevel) +{} + +void SurroundMap::setLevelCallback(int level, LevelCallback callback) { + levelCallbacks.at(level) = callback; } -bool SurroundMap::createEntry(const glm::ivec2& origin) { - auto& entry = entries[origin]; - if (entry.confirmed) { - return false; - } - entry.confirmed = true; - - // calculate initial number of surrounding entries (any level) - int bitOffset = 0; - for (int y = -1; y <= 1; y++) { - for (int x = -1; x <= 1; x++) { - if (x == y && x == 0) { - continue; - } - const auto& found = entries.find(origin + glm::ivec2(x, y)); - if (found != entries.end()) { - entry.surrounding |= (1 << bitOffset); - if (found->second.level == 0) { - found->second.surrounding |= (1 << (7 - bitOffset)); - } - } - bitOffset++; - } - } - return true; +void SurroundMap::setOutCallback(util::AreaMap2D::OutCallback callback) { + areaMap.setOutCallback(callback); } -std::vector SurroundMap::upgrade() { - std::vector expansion; - std::queue expanding; - for (const auto& [pos, entry] : entries) { - if (entry.confirmed && entry.surrounding != 0xFF) { - expanding.push(pos); - } - } - while (!expanding.empty()) { - assert(expanding.size() < 64); - - glm::ivec2 pos = expanding.front(); - expanding.pop(); - - const auto& found = entries.find(pos); - assert(found != entries.end() && "concurrent modification"); - - auto& entry = found->second; - int uplevelSurrounding = 0; - int bitOffset = 0; - for (int y = -1; y <= 1; y++) { - for (int x = -1; x <= 1; x++) { - if (x == y && x == 0) { - continue; - } - glm::ivec2 npos = {pos.x+x, pos.y+y}; - const auto& nfound = entries.find(npos); - - if (entry.surrounding & (1 << bitOffset)) { - auto& nentry = nfound->second; - if (nentry.level > entry.level) { - uplevelSurrounding |= (1 << bitOffset); - } - bitOffset++; - continue; - } - if (entry.level == 0) { - // neighbour entry does not exist - createEntry(npos); - expansion.push_back(npos); - } else{ - assert(nfound != entries.end() && "invalid map state"); - if (nfound->second.level == entry.level + 1) { - nfound->second.surrounding |= (1 << (7 - bitOffset)); - expanding.push(npos); - } - } - bitOffset++; - } - } - // level up - entry.surrounding = uplevelSurrounding; - entry.level++; - } - return expansion; +void SurroundMap::completeAt(int x, int y) { + // TODO } -void SurroundMap::getLevels(unsigned char* out, int width, int height, int ox, int oy) const { - std::memset(out, 0, width * height); - for (const auto& [pos, entry] : entries) { - int x = pos.x - ox; - int y = pos.y - oy; - if (x < 0 || x >= width || y < 0 || y >= height) { - continue; - } - - int surroundNum = 0; - for (int i = 0; i < 8; i++) { - if (entry.surrounding & (1 << i)) { - surroundNum++; - } - } - if (surroundNum) { - out[y * width + x] = surroundNum + 1; - } - out[y * width + x] = entry.level + 1; - } +void SurroundMap::setCenter(int x, int y) { + areaMap.setCenter(x, y); } diff --git a/src/world/generator/SurroundMap.hpp b/src/world/generator/SurroundMap.hpp index f8bca041..3a99817e 100644 --- a/src/world/generator/SurroundMap.hpp +++ b/src/world/generator/SurroundMap.hpp @@ -5,43 +5,23 @@ #define GLM_ENABLE_EXPERIMENTAL #include +#include "typedefs.hpp" +#include "util/AreaMap2D.hpp" + class SurroundMap { - struct Entry { - /// @brief Level is increased when all surrounding (8) entries having - // greather or equal confirmed level - int level = 0; - /// @brief bits storing surrounding entries having greather or equal - /// confirmed level. - /// 0 - is x=-1,y=-1 offset, 1 is x=0,y=-1, ... 7 is x=1,y=1 - /// (Prevents extra access to the entries hashmap) - uint8_t surrounding = 0x0; - /// @brief level confirmed status (entry is ready to expand) - bool confirmed = false; - /// @brief mark used on sweep event (extra isles garbage collection) - bool marked = false; - }; - std::unordered_map entries; public: - /// @brief Reset all isles marks - void resetMarks(); + using LevelCallback = std::function; +private: + util::AreaMap2D areaMap; + std::vector levelCallbacks; + ubyte maxLevel; +public: + SurroundMap(int loadDistance, ubyte maxLevel); - /// @brief Mark all connected entries - /// @param origin origin point - void markIsle(const glm::ivec2& origin); + void setLevelCallback(int level, LevelCallback callback); + void setOutCallback(util::AreaMap2D::OutCallback callback); - /// @brief Erase all non-marked isles - /// @return erased entries positions - std::vector sweep(); + void completeAt(int x, int y); - /// @brief Attempt to upgrade all confirmed entries with specified level - /// @param level target entries level - /// @return All upgraded entries positions - std::vector upgrade(); - - /// @brief Create entry if does not exist - /// @param origin entry position - /// @return true if new entry has been created - bool createEntry(const glm::ivec2& origin); - - void getLevels(unsigned char* out, int width, int height, int ox, int oy) const; + void setCenter(int x, int y); }; diff --git a/test/world/generator/SurroundMap.cpp b/test/world/generator/SurroundMap.cpp index b9e0bbb2..dc29ea03 100644 --- a/test/world/generator/SurroundMap.cpp +++ b/test/world/generator/SurroundMap.cpp @@ -3,11 +3,5 @@ #include "world/generator/SurroundMap.hpp" TEST(SurroundMap, InitTest) { - int w = 8; - int h = 8; - - SurroundMap map; - map.createEntry({w/2, h/2}); - map.createEntry({w/2+1, h/2+1}); - EXPECT_EQ(map.upgrade().size(), 12); + SurroundMap map(50, 8); }