Improvements to Node name/ID mapping code

* Clean m_nameMap between blocks
* Warn about invalid node name IDs
* Early drop of non-significant blocks
This commit is contained in:
Christophe Le Roy 2016-09-24 21:08:26 +02:00 committed by sfan5
parent 09945caa14
commit c45965eb8d
1 changed files with 8 additions and 2 deletions

View File

@ -441,6 +441,7 @@ void TileGenerator::renderMap()
m_blockAirId = -1; m_blockAirId = -1;
m_blockIgnoreId = -1; m_blockIgnoreId = -1;
m_nameMap.clear();
// Read mapping // Read mapping
if (version >= 22) { if (version >= 22) {
dataOffset++; // mapping version dataOffset++; // mapping version
@ -463,6 +464,9 @@ void TileGenerator::renderMap()
} }
dataOffset += nameLen; dataOffset += nameLen;
} }
// Skip block if made of only air or ignore nodes
if (m_nameMap.empty())
continue;
} }
// Node timers // Node timers
@ -518,12 +522,14 @@ inline void TileGenerator::renderMapBlock(const ustring &mapBlock, const BlockPo
for (int y = maxY; y >= minY; --y) { for (int y = maxY; y >= minY; --y) {
int position = x + (y << 4) + (z << 8); int position = x + (y << 4) + (z << 8);
int content = readBlockContent(mapData, version, position); int content = readBlockContent(mapData, version, position);
if (content == m_blockIgnoreId || content == m_blockAirId) { if (content == m_blockAirId || content == m_blockIgnoreId) {
continue; continue;
} }
NameMap::iterator blockName = m_nameMap.find(content); NameMap::iterator blockName = m_nameMap.find(content);
if (blockName == m_nameMap.end()) if (blockName == m_nameMap.end()) {
std::cerr << "Skipping node with invalid ID." << std::endl;
continue; continue;
}
const string &name = blockName->second; const string &name = blockName->second;
ColorMap::const_iterator color = m_colorMap.find(name); ColorMap::const_iterator color = m_colorMap.find(name);
if (color != m_colorMap.end()) { if (color != m_colorMap.end()) {