From 868cd94ee9a5a0638c014a4cc42224f01ff234c8 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 5 Mar 2021 13:03:55 +0000 Subject: Prepare ChunkData for BlockState storage (#5105) * Rename ChunkData Creatable test * Add missing Y-check in RedstoneWireHandler * Remove ChunkDef.h dependency in Scoreboard * Prepare ChunkData for BlockState storage + Split chunk block, meta, block & sky light storage + Load the height map from disk - Reduce duplicated code in ChunkData - Remove saving MCSBiomes, there aren't any - Remove the allocation pool, ref #4315, #3864 * fixed build * fixed test * fixed the debug compile Co-authored-by: 12xx12 <44411062+12xx12@users.noreply.github.com> --- src/ChunkDataCallback.h | 95 ++++++++----------------------------------------- 1 file changed, 14 insertions(+), 81 deletions(-) (limited to 'src/ChunkDataCallback.h') diff --git a/src/ChunkDataCallback.h b/src/ChunkDataCallback.h index 0f120bfb1..49b3f1e2b 100644 --- a/src/ChunkDataCallback.h +++ b/src/ChunkDataCallback.h @@ -29,17 +29,17 @@ public: If false is returned, the chunk is skipped. */ virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; } - /** Called once to provide heightmap data */ - virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) { UNUSED(a_HeightMap); } - - /** Called once to provide biome data */ - virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) { UNUSED(a_BiomeMap); } - /** Called once to let know if the chunk lighting is valid. Return value is ignored */ virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); } - /** Called once to export block info */ - virtual void ChunkData(const cChunkData & a_Buffer) { UNUSED(a_Buffer); } + /** Called once to export block data. */ + virtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) { UNUSED(a_BlockData); UNUSED(a_LightData); } + + /** Called once to provide heightmap data. */ + virtual void HeightMap(const cChunkDef::HeightMap & a_HeightMap) { UNUSED(a_HeightMap); } + + /** Called once to provide biome data. */ + virtual void BiomeMap(const cChunkDef::BiomeMap & a_BiomeMap) { UNUSED(a_BiomeMap); } /** Called for each entity in the chunk */ virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); } @@ -51,87 +51,20 @@ public: - -/** A simple implementation of the cChunkDataCallback interface that collects all block data into a single buffer */ -class cChunkDataArrayCollector : - public cChunkDataCallback -{ -public: - - // Must be unsigned char instead of BLOCKTYPE or NIBBLETYPE, because it houses both. - unsigned char m_BlockData[cChunkDef::BlockDataSize]; - -protected: - - virtual void ChunkData(const cChunkData & a_ChunkBuffer) override - { - a_ChunkBuffer.CopyBlockTypes(m_BlockData); - a_ChunkBuffer.CopyMetas(m_BlockData + cChunkDef::NumBlocks); - a_ChunkBuffer.CopyBlockLight(m_BlockData + 3 * cChunkDef::NumBlocks / 2); - a_ChunkBuffer.CopySkyLight(m_BlockData + 2 * cChunkDef::NumBlocks); - } -}; - - - - - -/** A simple implementation of the cChunkDataCallback interface that collects all block data into separate buffers */ -class cChunkDataSeparateCollector : - public cChunkDataCallback -{ -public: - - cChunkDef::BlockTypes m_BlockTypes; - cChunkDef::BlockNibbles m_BlockMetas; - cChunkDef::BlockNibbles m_BlockLight; - cChunkDef::BlockNibbles m_BlockSkyLight; - -protected: - - virtual void ChunkData(const cChunkData & a_ChunkBuffer) override - { - a_ChunkBuffer.CopyBlockTypes(m_BlockTypes); - a_ChunkBuffer.CopyMetas(m_BlockMetas); - a_ChunkBuffer.CopyBlockLight(m_BlockLight); - a_ChunkBuffer.CopySkyLight(m_BlockSkyLight); - } -} ; - - - - /** A simple implementation of the cChunkDataCallback interface that just copies the cChunkData */ class cChunkDataCopyCollector : public cChunkDataCallback { public: - struct MemCallbacks: - cAllocationPool::cStarvationCallbacks - { - virtual void OnStartUsingReserve() override {} - virtual void OnEndUsingReserve() override {} - virtual void OnOutOfReserve() override {} - }; - - cChunkDataCopyCollector(): - m_Pool(std::make_unique(), 0, cChunkData::NumSections), // Keep 1 chunk worth of reserve - m_Data(m_Pool) - { - } + ChunkBlockData m_BlockData; + ChunkLightData m_LightData; - cListAllocationPool m_Pool; - cChunkData m_Data; +private: -protected: - - virtual void ChunkData(const cChunkData & a_ChunkBuffer) override + virtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) override { - m_Data.Assign(a_ChunkBuffer); + m_BlockData.Assign(a_BlockData); + m_LightData.Assign(a_LightData); } }; - - - - -- cgit v1.2.3