fix and refactor ContentLUT

This commit is contained in:
MihailRis
2024-06-25 23:36:07 +03:00
parent ee9f1639e9
commit 1acced4475
5 changed files with 99 additions and 107 deletions
+9 -50
View File
@@ -6,43 +6,12 @@
#include "../coders/json.hpp"
#include "../voxels/Block.hpp"
#include "../items/ItemDef.hpp"
#include "../data/dynamic.hpp"
#include <memory>
template<typename I, class T>
static void init(std::vector<I>& ids, std::vector<std::string>& names,
const ContentUnitIndices<T>& indices, size_t count) {
for (size_t i = 0; i < count; i++) {
ids.push_back(i);
}
for (size_t i = 0; i < indices.count(); i++) {
names.push_back(indices.get(i)->name);
}
for (size_t i = indices.count(); i < count; i++) {
names.emplace_back("");
}
}
ContentLUT::ContentLUT(const Content* content, size_t blocksCount, size_t itemsCount) {
auto* indices = content->getIndices();
init(blocks, blockNames, indices->blocks, blocksCount);
init(items, itemNames, indices->items, itemsCount);
}
template<class T>
static void setup_lut(ContentLUT* lut, const ContentUnitDefs<T>& defs, dynamic::List* list) {
if (list) {
for (size_t i = 0; i < list->size(); i++) {
std::string name = list->str(i);
if (auto def = defs.find(name)) {
lut->setBlock(i, name, def->rt.id);
} else {
lut->setBlock(i, name, BLOCK_VOID);
}
}
}
}
ContentLUT::ContentLUT(const ContentIndices* indices, size_t blocksCount, size_t itemsCount)
: blocks(blocksCount, indices->blocks, BLOCK_VOID, contenttype::block),
items(itemsCount, indices->items, ITEM_VOID, contenttype::item)
{}
template<class T> static constexpr size_t get_entries_count(
const ContentUnitIndices<T>& indices, dynamic::List* list) {
@@ -61,10 +30,10 @@ std::shared_ptr<ContentLUT> ContentLUT::create(
size_t blocks_c = get_entries_count(indices->blocks, blocklist);
size_t items_c = get_entries_count(indices->items, itemlist);
auto lut = std::make_shared<ContentLUT>(content, blocks_c, items_c);
auto lut = std::make_shared<ContentLUT>(indices, blocks_c, items_c);
setup_lut(lut.get(), content->blocks, blocklist);
setup_lut(lut.get(), content->items, itemlist);
lut->blocks.setup(blocklist, content->blocks);
lut->items.setup(itemlist, content->items);
if (lut->hasContentReorder() || lut->hasMissingContent()) {
return lut;
@@ -75,17 +44,7 @@ std::shared_ptr<ContentLUT> ContentLUT::create(
std::vector<contententry> ContentLUT::getMissingContent() const {
std::vector<contententry> entries;
for (size_t i = 0; i < blocks.size(); i++) {
if (blocks[i] == BLOCK_VOID) {
auto& name = blockNames[i];
entries.push_back(contententry {contenttype::block, name});
}
}
for (size_t i = 0; i < items.size(); i++) {
if (items[i] == ITEM_VOID) {
auto& name = itemNames[i];
entries.push_back(contententry {contenttype::item, name});
}
}
blocks.getMissingContent(entries);
items.getMissingContent(entries);
return entries;
}