bring back multimap

This commit is contained in:
clasher113 2026-03-16 18:34:50 +02:00
parent 019fe68b48
commit 818a6bd6ae
2 changed files with 12 additions and 15 deletions

View file

@ -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;

View file

@ -9,6 +9,7 @@
#include <string>
#include <memory>
#include <unordered_map>
#include <map>
class Assets;
class Content;
@ -36,7 +37,7 @@ class BlockWrapsRenderer {
const Chunks& chunks;
std::unique_ptr<MainBatch> batch;
std::unordered_map<const Texture*, std::vector<BlockWrapper*>> renderOrder;
std::multimap<const Texture*, BlockWrapper*> renderOrder;
std::unordered_map<u64id_t, std::unique_ptr<BlockWrapper>> wrappers;
u64id_t nextWrapper = 1;