mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 14:42:24 +01:00
Simplify getBlockNodeIdMapping
since commit 0f9c78c3ebf920fac65030e66367b9940055075f nodedef->get() will never return an entry with empty name, so we can drop the related parts.
This commit is contained in:
parent
d8190e1c5f
commit
1b89d4d541
@ -215,21 +215,22 @@ void MapBlock::expireIsAirCache()
|
|||||||
|
|
||||||
// List relevant id-name pairs for ids in the block using nodedef
|
// List relevant id-name pairs for ids in the block using nodedef
|
||||||
// Renumbers the content IDs (starting at 0 and incrementing)
|
// Renumbers the content IDs (starting at 0 and incrementing)
|
||||||
|
// Note that there's no technical reason why we *have to* renumber the IDs,
|
||||||
|
// but we do it anyway as it also helps compressability.
|
||||||
static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
||||||
const NodeDefManager *nodedef)
|
const NodeDefManager *nodedef)
|
||||||
{
|
{
|
||||||
// The static memory requires about 65535 * sizeof(int) RAM in order to be
|
// The static memory requires about 65535 * 2 bytes RAM in order to be
|
||||||
// sure we can handle all content ids. But it's absolutely worth it as it's
|
// sure we can handle all content ids. But it's absolutely worth it as it's
|
||||||
// a speedup of 4 for one of the major time consuming functions on storing
|
// a speedup of 4 for one of the major time consuming functions on storing
|
||||||
// mapblocks.
|
// mapblocks.
|
||||||
thread_local std::unique_ptr<content_t[]> mapping;
|
thread_local std::unique_ptr<content_t[]> mapping;
|
||||||
static_assert(sizeof(content_t) == 2, "content_t must be 16-bit");
|
static_assert(sizeof(content_t) == 2, "content_t must be 16-bit");
|
||||||
if (!mapping)
|
if (!mapping)
|
||||||
mapping = std::make_unique<content_t[]>(USHRT_MAX + 1);
|
mapping = std::make_unique<content_t[]>(CONTENT_MAX + 1);
|
||||||
|
|
||||||
memset(mapping.get(), 0xFF, (USHRT_MAX + 1) * sizeof(content_t));
|
memset(mapping.get(), 0xFF, (CONTENT_MAX + 1) * sizeof(content_t));
|
||||||
|
|
||||||
std::unordered_set<content_t> unknown_contents;
|
|
||||||
content_t id_counter = 0;
|
content_t id_counter = 0;
|
||||||
for (u32 i = 0; i < MapBlock::nodecount; i++) {
|
for (u32 i = 0; i < MapBlock::nodecount; i++) {
|
||||||
content_t global_id = nodes[i].getContent();
|
content_t global_id = nodes[i].getContent();
|
||||||
@ -243,21 +244,13 @@ static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
|
|||||||
id = id_counter++;
|
id = id_counter++;
|
||||||
mapping[global_id] = id;
|
mapping[global_id] = id;
|
||||||
|
|
||||||
const ContentFeatures &f = nodedef->get(global_id);
|
const auto &name = nodedef->get(global_id).name;
|
||||||
const std::string &name = f.name;
|
nimap->set(id, name);
|
||||||
if (name.empty())
|
|
||||||
unknown_contents.insert(global_id);
|
|
||||||
else
|
|
||||||
nimap->set(id, name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the MapNode
|
// Update the MapNode
|
||||||
nodes[i].setContent(id);
|
nodes[i].setContent(id);
|
||||||
}
|
}
|
||||||
for (u16 unknown_content : unknown_contents) {
|
|
||||||
errorstream << "getBlockNodeIdMapping(): IGNORING ERROR: "
|
|
||||||
<< "Name for node id " << unknown_content << " not known" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Correct ids in the block to match nodedef based on names.
|
// Correct ids in the block to match nodedef based on names.
|
||||||
|
@ -21,8 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <set>
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <cassert>
|
||||||
#include "irrlichttypes_bloated.h"
|
#include "irrlichttypes_bloated.h"
|
||||||
|
|
||||||
typedef std::unordered_map<u16, std::string> IdToNameMap;
|
typedef std::unordered_map<u16, std::string> IdToNameMap;
|
||||||
@ -42,6 +42,7 @@ public:
|
|||||||
|
|
||||||
void set(u16 id, const std::string &name)
|
void set(u16 id, const std::string &name)
|
||||||
{
|
{
|
||||||
|
assert(!name.empty());
|
||||||
m_id_to_name[id] = name;
|
m_id_to_name[id] = name;
|
||||||
m_name_to_id[name] = id;
|
m_name_to_id[name] = id;
|
||||||
}
|
}
|
||||||
@ -67,8 +68,7 @@ public:
|
|||||||
}
|
}
|
||||||
bool getName(u16 id, std::string &result) const
|
bool getName(u16 id, std::string &result) const
|
||||||
{
|
{
|
||||||
IdToNameMap::const_iterator i;
|
auto i = m_id_to_name.find(id);
|
||||||
i = m_id_to_name.find(id);
|
|
||||||
if (i == m_id_to_name.end())
|
if (i == m_id_to_name.end())
|
||||||
return false;
|
return false;
|
||||||
result = i->second;
|
result = i->second;
|
||||||
@ -76,8 +76,7 @@ public:
|
|||||||
}
|
}
|
||||||
bool getId(const std::string &name, u16 &result) const
|
bool getId(const std::string &name, u16 &result) const
|
||||||
{
|
{
|
||||||
NameToIdMap::const_iterator i;
|
auto i = m_name_to_id.find(name);
|
||||||
i = m_name_to_id.find(name);
|
|
||||||
if (i == m_name_to_id.end())
|
if (i == m_name_to_id.end())
|
||||||
return false;
|
return false;
|
||||||
result = i->second;
|
result = i->second;
|
||||||
|
Loading…
Reference in New Issue
Block a user