diff --git a/src/graphics/render/BlockWrapsRenderer.cpp b/src/graphics/render/BlockWrapsRenderer.cpp index 0ed4157e4..fb72d3347 100644 --- a/src/graphics/render/BlockWrapsRenderer.cpp +++ b/src/graphics/render/BlockWrapsRenderer.cpp @@ -102,10 +102,13 @@ void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) { wrapper.texRegions[i] = texRegion; wrapper.uvRegions[i] = texRegion.region; - auto& wrappers = renderOrder[texRegion.texture]; - if (std::find(wrappers.begin(), wrappers.end(), &wrapper) == - wrappers.end()) { - wrappers.emplace_back(&wrapper); + auto range = renderOrder.equal_range(texRegion.texture); + auto it = + std::find_if(range.first, range.second, [&wrapper](auto& elem) { + return elem.second == &wrapper; + }); + if (it == range.second) { + renderOrder.emplace(texRegion.texture, &wrapper); } } wrapper.dirtySides = 0x0; @@ -147,12 +150,9 @@ void BlockWrapsRenderer::draw(const DrawContext& pctx) { refreshWrapper(*wrapper); } } - - for (const auto& [texture, wrappersArray] : renderOrder) { + for (const auto& [texture, wrapper] : renderOrder) { batch->setTexture(texture); - for (auto wrapper : wrappersArray) { - draw(*wrapper, texture); - } + draw(*wrapper, texture); } batch->flush(); } @@ -192,11 +192,7 @@ void BlockWrapsRenderer::remove(u64id_t id) { void BlockWrapsRenderer::clearOrder(const BlockWrapper* const wrapper) { auto it = renderOrder.begin(); while (it != renderOrder.end()) { - it->second.erase( - std::remove(it->second.begin(), it->second.end(), wrapper), - it->second.end() - ); - if (it->second.empty()) { + if (it->second == wrapper) { it = renderOrder.erase(it); } else { ++it; diff --git a/src/graphics/render/BlockWrapsRenderer.hpp b/src/graphics/render/BlockWrapsRenderer.hpp index 632fe90cb..0f2ed8f7e 100644 --- a/src/graphics/render/BlockWrapsRenderer.hpp +++ b/src/graphics/render/BlockWrapsRenderer.hpp @@ -9,6 +9,7 @@ #include #include #include +#include class Assets; class Content; @@ -36,7 +37,7 @@ class BlockWrapsRenderer { const Chunks& chunks; std::unique_ptr batch; - std::unordered_map> renderOrder; + std::multimap renderOrder; std::unordered_map> wrappers; u64id_t nextWrapper = 1;