1
0
Fork 0
cuberite-2a/src/ChunkDataCallback.h

138 lines
3.6 KiB
C
Raw Normal View History

2014-05-29 16:25:08 +00:00
// ChunkDataCallback.h
// Declares the cChunkDataCallback interface and several trivial descendants, for reading chunk data
2014-05-29 16:25:08 +00:00
#pragma once
2014-05-21 18:58:48 +00:00
#include "ChunkData.h"
2014-05-29 16:25:08 +00:00
/** Interface class used for getting data out of a chunk using the GetAllData() function.
Implementation must use the pointers immediately and NOT store any of them for later use
2015-07-31 14:49:10 +00:00
The virtual methods are called in the same order as they're declared here. */
class cChunkDataCallback abstract
{
public:
virtual ~cChunkDataCallback() {}
/** Called before any other callbacks to inform of the current coords
(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
2015-07-31 14:49:10 +00:00
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; }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called once to provide heightmap data */
virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) { UNUSED(a_HeightMap); }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called once to provide biome data */
virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) { UNUSED(a_BiomeMap); }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called once to let know if the chunk lighting is valid. Return value is ignored */
virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called once to export block info */
virtual void ChunkData(const cChunkData & a_Buffer) { UNUSED(a_Buffer); }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called for each entity in the chunk */
virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }
2016-02-05 21:45:45 +00:00
2015-07-31 14:49:10 +00:00
/** Called for each blockentity in the chunk */
virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
} ;
2014-05-29 16:25:08 +00:00
2015-07-31 14:49:10 +00:00
/** A simple implementation of the cChunkDataCallback interface that collects all block data into a single buffer */
2014-05-21 18:58:48 +00:00
class cChunkDataArrayCollector :
2014-05-24 12:33:40 +00:00
public cChunkDataCallback
{
public:
// Must be unsigned char instead of BLOCKTYPE or NIBBLETYPE, because it houses both.
unsigned char m_BlockData[cChunkDef::BlockDataSize];
protected:
2014-05-21 18:58:48 +00:00
virtual void ChunkData(const cChunkData & a_ChunkBuffer) override
{
2014-05-29 16:25:08 +00:00
a_ChunkBuffer.CopyBlockTypes(m_BlockData);
a_ChunkBuffer.CopyMetas(m_BlockData + cChunkDef::NumBlocks);
2014-05-24 12:33:40 +00:00
a_ChunkBuffer.CopyBlockLight(m_BlockData + 3 * cChunkDef::NumBlocks / 2);
a_ChunkBuffer.CopySkyLight(m_BlockData + 2 * cChunkDef::NumBlocks);
}
};
2014-05-29 16:25:08 +00:00
/** A simple implementation of the cChunkDataCallback interface that collects all block data into separate buffers */
class cChunkDataSeparateCollector :
2014-05-24 12:33:40 +00:00
public cChunkDataCallback
{
public:
cChunkDef::BlockTypes m_BlockTypes;
cChunkDef::BlockNibbles m_BlockMetas;
cChunkDef::BlockNibbles m_BlockLight;
cChunkDef::BlockNibbles m_BlockSkyLight;
protected:
2014-05-21 18:58:48 +00:00
virtual void ChunkData(const cChunkData & a_ChunkBuffer) override
{
2014-05-29 16:25:08 +00:00
a_ChunkBuffer.CopyBlockTypes(m_BlockTypes);
a_ChunkBuffer.CopyMetas(m_BlockMetas);
a_ChunkBuffer.CopyBlockLight(m_BlockLight);
a_ChunkBuffer.CopySkyLight(m_BlockSkyLight);
}
} ;
2014-05-29 16:25:08 +00:00
/** A simple implementation of the cChunkDataCallback interface that just copies the cChunkData */
class cChunkDataCopyCollector :
public cChunkDataCallback
{
public:
struct MemCallbacks:
cAllocationPool<cChunkData::sChunkSection>::cStarvationCallbacks
{
virtual void OnStartUsingReserve() override {}
virtual void OnEndUsingReserve() override {}
virtual void OnOutOfReserve() override {}
};
cChunkDataCopyCollector():
m_Pool(cpp14::make_unique<MemCallbacks>(), cChunkData::NumSections), // Keep 1 chunk worth of reserve
m_Data(m_Pool)
{
}
cListAllocationPool<cChunkData::sChunkSection> m_Pool;
cChunkData m_Data;
protected:
virtual void ChunkData(const cChunkData & a_ChunkBuffer) override
{
m_Data.Assign(a_ChunkBuffer);
}
};