Tidying up and refactoring of block class.

This commit is contained in:
Daviw Williams 2013-06-25 16:45:53 +02:00
parent c346d19d77
commit baed7ddccc
4 changed files with 29 additions and 30 deletions

View File

@ -38,7 +38,7 @@ namespace PolyVox
class Block class Block
{ {
public: public:
Block(uint16_t uSideLength = 0); Block(uint16_t uSideLength, Compressor* pCompressor);
const uint8_t* const getCompressedData(void) const; const uint8_t* const getCompressedData(void) const;
const uint32_t getCompressedDataLength(void) const; const uint32_t getCompressedDataLength(void) const;
@ -56,9 +56,10 @@ namespace PolyVox
uint32_t calculateSizeInBytes(void); uint32_t calculateSizeInBytes(void);
public: public:
void compress(Compressor* pCompressor); void compress();
void uncompress(Compressor* pCompressor); void uncompress();
Compressor* m_pCompressor;
uint8_t* m_pCompressedData; uint8_t* m_pCompressedData;
uint32_t m_uCompressedDataLength; uint32_t m_uCompressedDataLength;
VoxelType* m_tUncompressedData; VoxelType* m_tUncompressedData;

View File

@ -36,8 +36,9 @@ freely, subject to the following restrictions:
namespace PolyVox namespace PolyVox
{ {
template <typename VoxelType> template <typename VoxelType>
Block<VoxelType>::Block(uint16_t uSideLength) Block<VoxelType>::Block(uint16_t uSideLength, Compressor* pCompressor)
:m_pCompressedData(0) :m_pCompressor(pCompressor)
,m_pCompressedData(0)
,m_uCompressedDataLength(0) ,m_uCompressedDataLength(0)
,m_tUncompressedData(0) ,m_tUncompressedData(0)
,m_uSideLength(0) ,m_uSideLength(0)
@ -47,7 +48,7 @@ namespace PolyVox
{ {
if(uSideLength == 0) if(uSideLength == 0)
{ {
POLYVOX_THROW(std::invalid_argument, "Block side cannot be zero."); POLYVOX_THROW(std::invalid_argument, "Block side length cannot be zero.");
} }
if(!isPowerOf2(uSideLength)) if(!isPowerOf2(uSideLength))
@ -55,6 +56,11 @@ namespace PolyVox
POLYVOX_THROW(std::invalid_argument, "Block side length must be a power of two."); POLYVOX_THROW(std::invalid_argument, "Block side length must be a power of two.");
} }
if(pCompressor == 0)
{
POLYVOX_THROW(std::invalid_argument, "Block must be provided with a valid compressor.");
}
//Compute the side length //Compute the side length
m_uSideLength = uSideLength; m_uSideLength = uSideLength;
m_uSideLengthPower = logBase2(uSideLength); m_uSideLengthPower = logBase2(uSideLength);
@ -169,18 +175,13 @@ namespace PolyVox
} }
template <typename VoxelType> template <typename VoxelType>
void Block<VoxelType>::compress(Compressor* pCompressor) void Block<VoxelType>::compress()
{ {
if(m_bIsCompressed) if(m_bIsCompressed)
{ {
POLYVOX_THROW(invalid_operation, "Attempted to compress block which is already flagged as compressed."); POLYVOX_THROW(invalid_operation, "Attempted to compress block which is already flagged as compressed.");
} }
if(!pCompressor)
{
POLYVOX_THROW(std::invalid_argument, "A valid compressor must be provided");
}
POLYVOX_ASSERT(m_tUncompressedData != 0, "No uncompressed data is present."); POLYVOX_ASSERT(m_tUncompressedData != 0, "No uncompressed data is present.");
//If the uncompressed data hasn't actually been //If the uncompressed data hasn't actually been
@ -202,7 +203,7 @@ namespace PolyVox
try try
{ {
uCompressedLength = pCompressor->compress(pSrcData, uSrcLength, pDstData, uDstLength); uCompressedLength = m_pCompressor->compress(pSrcData, uSrcLength, pDstData, uDstLength);
// Create new compressed data and copy across // Create new compressed data and copy across
m_pCompressedData = new uint8_t[uCompressedLength]; m_pCompressedData = new uint8_t[uCompressedLength];
@ -214,7 +215,9 @@ namespace PolyVox
// It is possible for the compression to fail. A common cause for this would be if the destination // It is possible for the compression to fail. A common cause for this would be if the destination
// buffer is not big enough. So now we try again using a buffer that is definitely big enough. // buffer is not big enough. So now we try again using a buffer that is definitely big enough.
// Note that ideally we will choose our earlier buffer size so that this almost never happens. // Note that ideally we will choose our earlier buffer size so that this almost never happens.
uint32_t uMaxCompressedSize = pCompressor->getMaxCompressedSize(uSrcLength); logWarning() << "The compressor failed to compress the block, proabaly due to the buffer being too small.";
logWarning() << "The compression will be tried again with a larger buffer";
uint32_t uMaxCompressedSize = m_pCompressor->getMaxCompressedSize(uSrcLength);
uint8_t* buffer = new uint8_t[ uMaxCompressedSize ]; uint8_t* buffer = new uint8_t[ uMaxCompressedSize ];
pDstData = reinterpret_cast<void*>( buffer ); pDstData = reinterpret_cast<void*>( buffer );
@ -222,7 +225,7 @@ namespace PolyVox
try try
{ {
uCompressedLength = pCompressor->compress(pSrcData, uSrcLength, pDstData, uDstLength); uCompressedLength = m_pCompressor->compress(pSrcData, uSrcLength, pDstData, uDstLength);
// Create new compressed data and copy across // Create new compressed data and copy across
m_pCompressedData = new uint8_t[uCompressedLength]; m_pCompressedData = new uint8_t[uCompressedLength];
@ -248,18 +251,13 @@ namespace PolyVox
} }
template <typename VoxelType> template <typename VoxelType>
void Block<VoxelType>::uncompress(Compressor* pCompressor) void Block<VoxelType>::uncompress()
{ {
if(!m_bIsCompressed) if(!m_bIsCompressed)
{ {
POLYVOX_THROW(invalid_operation, "Attempted to uncompress block which is not flagged as compressed."); POLYVOX_THROW(invalid_operation, "Attempted to uncompress block which is not flagged as compressed.");
} }
if(!pCompressor)
{
POLYVOX_THROW(std::invalid_argument, "A valid compressor must be provided");
}
POLYVOX_ASSERT(m_tUncompressedData == 0, "Uncompressed data already exists."); POLYVOX_ASSERT(m_tUncompressedData == 0, "Uncompressed data already exists.");
m_tUncompressedData = new VoxelType[m_uSideLength * m_uSideLength * m_uSideLength]; m_tUncompressedData = new VoxelType[m_uSideLength * m_uSideLength * m_uSideLength];
@ -271,7 +269,7 @@ namespace PolyVox
//MinizCompressor compressor; //MinizCompressor compressor;
//RLECompressor<VoxelType, uint16_t> compressor; //RLECompressor<VoxelType, uint16_t> compressor;
uint32_t uUncompressedLength = pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength); uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength);
POLYVOX_ASSERT(uUncompressedLength == m_uSideLength * m_uSideLength * m_uSideLength * sizeof(VoxelType), "Destination length has changed."); POLYVOX_ASSERT(uUncompressedLength == m_uSideLength * m_uSideLength * m_uSideLength * sizeof(VoxelType), "Destination length has changed.");

View File

@ -234,8 +234,8 @@ namespace PolyVox
struct LoadedBlock struct LoadedBlock
{ {
public: public:
LoadedBlock(uint16_t uSideLength = 0) LoadedBlock(uint16_t uSideLength, Compressor* pCompressor)
:block(uSideLength) :block(uSideLength, pCompressor)
,timestamp(0) ,timestamp(0)
{ {
} }

View File

@ -471,7 +471,7 @@ namespace PolyVox
{ {
for(uint32_t ct = 0; ct < m_vecUncompressedBlockCache.size(); ct++) for(uint32_t ct = 0; ct < m_vecUncompressedBlockCache.size(); ct++)
{ {
m_vecUncompressedBlockCache[ct]->block.compress(m_pCompressor); m_vecUncompressedBlockCache[ct]->block.compress();
} }
m_vecUncompressedBlockCache.clear(); m_vecUncompressedBlockCache.clear();
} }
@ -552,7 +552,7 @@ namespace PolyVox
if(m_vecUncompressedBlockCache[ct] == &(itBlock->second)) if(m_vecUncompressedBlockCache[ct] == &(itBlock->second))
{ {
// TODO: compression is unneccessary? or will not compressing this cause a memleak? // TODO: compression is unneccessary? or will not compressing this cause a memleak?
itBlock->second.block.compress(m_pCompressor); itBlock->second.block.compress();
// put last object in cache here // put last object in cache here
m_vecUncompressedBlockCache[ct] = m_vecUncompressedBlockCache.back(); m_vecUncompressedBlockCache[ct] = m_vecUncompressedBlockCache.back();
// decrease cache size by one since last element is now in here twice // decrease cache size by one since last element is now in here twice
@ -630,12 +630,12 @@ namespace PolyVox
} }
// create the new block // create the new block
LoadedBlock newBlock(m_uBlockSideLength); LoadedBlock newBlock(m_uBlockSideLength, m_pCompressor);
// Blocks start out compressed - should we change this? // Blocks start out compressed - should we change this?
// Or maybe we should just 'seed' them with compressed data, // Or maybe we should just 'seed' them with compressed data,
// rather than creating an empty block and then compressing? // rather than creating an empty block and then compressing?
newBlock.block.compress(m_pCompressor); newBlock.block.compress();
itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, newBlock)).first; itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, newBlock)).first;
@ -688,7 +688,7 @@ namespace PolyVox
} }
//Compress the least recently used block. //Compress the least recently used block.
m_vecUncompressedBlockCache[leastRecentlyUsedBlockIndex]->block.compress(m_pCompressor); m_vecUncompressedBlockCache[leastRecentlyUsedBlockIndex]->block.compress();
//We don't actually remove any elements from this vector, we //We don't actually remove any elements from this vector, we
//simply change the pointer to point at the new uncompressed bloack. //simply change the pointer to point at the new uncompressed bloack.
@ -699,7 +699,7 @@ namespace PolyVox
m_vecUncompressedBlockCache.push_back(&loadedBlock); m_vecUncompressedBlockCache.push_back(&loadedBlock);
} }
loadedBlock.block.uncompress(m_pCompressor); loadedBlock.block.uncompress();
m_pLastAccessedBlock = &(loadedBlock.block); m_pLastAccessedBlock = &(loadedBlock.block);
POLYVOX_ASSERT(m_pLastAccessedBlock->m_tUncompressedData, "Block has no uncompressed data"); POLYVOX_ASSERT(m_pLastAccessedBlock->m_tUncompressedData, "Block has no uncompressed data");