summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/LightingThread.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/LightingThread.cpp b/src/LightingThread.cpp
index 39b22f748..ccefdfef2 100644
--- a/src/LightingThread.cpp
+++ b/src/LightingThread.cpp
@@ -20,21 +20,31 @@ class cReader :
virtual void ChunkData(const cChunkData & a_ChunkBuffer) override
{
BLOCKTYPE * OutputRows = m_BlockTypes;
- int InputIdx = 0;
int OutputIdx = m_ReadingChunkX + m_ReadingChunkZ * cChunkDef::Width * 3;
- int MaxHeight = std::min(+cChunkDef::Height, m_MaxHeight + 16); // Need 16 blocks above the highest
- for (int y = 0; y < MaxHeight; y++)
+ for (size_t i = 0; i != cChunkData::NumSections; ++i)
{
- for (int z = 0; z < cChunkDef::Width; z++)
+ auto * Section = a_ChunkBuffer.GetSection(i);
+ if (Section == nullptr)
+ {
+ // Skip to the next section
+ OutputIdx += 9 * cChunkData::SectionHeight * cChunkDef::Width;
+ continue;
+ }
+
+ for (size_t OffsetY = 0; OffsetY != cChunkData::SectionHeight; ++OffsetY)
{
- a_ChunkBuffer.CopyBlockTypes(OutputRows + OutputIdx * 16, static_cast<size_t>(InputIdx * 16), 16);
- InputIdx++;
- OutputIdx += 3;
- } // for z
- // Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows
- // We've already walked cChunkDef::Width * 3 in the "for z" cycle, that makes cChunkDef::Width * 6 rows left to skip
- OutputIdx += cChunkDef::Width * 6;
- } // for y
+ for (size_t Z = 0; Z != cChunkDef::Width; ++Z)
+ {
+ auto InPtr = Section->m_BlockTypes + Z * cChunkDef::Width + OffsetY * cChunkDef::Width * cChunkDef::Width;
+ std::copy_n(InPtr, cChunkDef::Width, OutputRows + OutputIdx * cChunkDef::Width);
+
+ OutputIdx += 3;
+ }
+ // Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows
+ // We've already walked cChunkDef::Width * 3 in the "for z" cycle, that makes cChunkDef::Width * 6 rows left to skip
+ OutputIdx += cChunkDef::Width * 6;
+ }
+ }
} // BlockTypes()
@@ -78,6 +88,7 @@ public:
m_BlockTypes(a_BlockTypes),
m_HeightMap(a_HeightMap)
{
+ std::fill_n(m_BlockTypes, cChunkDef::NumBlocks * 9, E_BLOCK_AIR);
}
} ;