Started moving compression code into separate class.
This commit is contained in:
parent
c3c4ead1f3
commit
f54532a905
@ -71,6 +71,8 @@ SET(CORE_INC_FILES
|
|||||||
include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl
|
include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl
|
||||||
include/PolyVoxCore/Material.h
|
include/PolyVoxCore/Material.h
|
||||||
include/PolyVoxCore/MaterialDensityPair.h
|
include/PolyVoxCore/MaterialDensityPair.h
|
||||||
|
include/PolyVoxCore/MinizBlockCompressor.h
|
||||||
|
include/PolyVoxCore/MinizBlockCompressor.inl
|
||||||
include/PolyVoxCore/MinizCompressor.h
|
include/PolyVoxCore/MinizCompressor.h
|
||||||
include/PolyVoxCore/Pager.h
|
include/PolyVoxCore/Pager.h
|
||||||
include/PolyVoxCore/PolyVoxForwardDeclarations.h
|
include/PolyVoxCore/PolyVoxForwardDeclarations.h
|
||||||
|
@ -100,6 +100,9 @@ namespace PolyVox
|
|||||||
UncompressedBlock(uint16_t uSideLength);
|
UncompressedBlock(uint16_t uSideLength);
|
||||||
~UncompressedBlock();
|
~UncompressedBlock();
|
||||||
|
|
||||||
|
VoxelType* getData(void) const;
|
||||||
|
uint32_t getDataSizeInBytes(void) const;
|
||||||
|
|
||||||
VoxelType getVoxel(uint16_t uXPos, uint16_t uYPos, uint16_t uZPos) const;
|
VoxelType getVoxel(uint16_t uXPos, uint16_t uYPos, uint16_t uZPos) const;
|
||||||
VoxelType getVoxel(const Vector3DUint16& v3dPos) const;
|
VoxelType getVoxel(const Vector3DUint16& v3dPos) const;
|
||||||
|
|
||||||
|
@ -115,6 +115,18 @@ namespace PolyVox
|
|||||||
m_tData = 0;
|
m_tData = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename VoxelType>
|
||||||
|
VoxelType* UncompressedBlock<VoxelType>::getData(void) const
|
||||||
|
{
|
||||||
|
return m_tData;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename VoxelType>
|
||||||
|
uint32_t UncompressedBlock<VoxelType>::getDataSizeInBytes(void) const
|
||||||
|
{
|
||||||
|
return m_uSideLength * m_uSideLength * m_uSideLength * sizeof(VoxelType);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename VoxelType>
|
template <typename VoxelType>
|
||||||
VoxelType UncompressedBlock<VoxelType>::getVoxel(uint16_t uXPos, uint16_t uYPos, uint16_t uZPos) const
|
VoxelType UncompressedBlock<VoxelType>::getVoxel(uint16_t uXPos, uint16_t uYPos, uint16_t uZPos) const
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@ freely, subject to the following restrictions:
|
|||||||
#include "PolyVoxCore/BaseVolume.h"
|
#include "PolyVoxCore/BaseVolume.h"
|
||||||
#include "Impl/Block.h"
|
#include "Impl/Block.h"
|
||||||
#include "PolyVoxCore/Compressor.h"
|
#include "PolyVoxCore/Compressor.h"
|
||||||
|
#include "PolyVoxCore/MinizBlockCompressor.h" //Shouldn't include the implementation here.
|
||||||
#include "PolyVoxCore/Pager.h"
|
#include "PolyVoxCore/Pager.h"
|
||||||
#include "PolyVoxCore/Region.h"
|
#include "PolyVoxCore/Region.h"
|
||||||
#include "PolyVoxCore/Vector.h"
|
#include "PolyVoxCore/Vector.h"
|
||||||
@ -357,6 +358,7 @@ namespace PolyVox
|
|||||||
|
|
||||||
// The compressor used by the Blocks to compress their data if required.
|
// The compressor used by the Blocks to compress their data if required.
|
||||||
Compressor* m_pCompressor;
|
Compressor* m_pCompressor;
|
||||||
|
MinizBlockCompressor<VoxelType>* m_pBlockCompressor;
|
||||||
Pager<VoxelType>* m_pPager;
|
Pager<VoxelType>* m_pPager;
|
||||||
|
|
||||||
// Compressed data for an empty block (sometimes needed for initialisation).
|
// Compressed data for an empty block (sometimes needed for initialisation).
|
||||||
|
@ -559,6 +559,8 @@ namespace PolyVox
|
|||||||
|
|
||||||
delete[] pZeros;
|
delete[] pZeros;
|
||||||
delete[] pCompressedZeros;
|
delete[] pCompressedZeros;
|
||||||
|
|
||||||
|
m_pBlockCompressor = new MinizBlockCompressor<VoxelType>;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename VoxelType>
|
template <typename VoxelType>
|
||||||
@ -795,7 +797,7 @@ namespace PolyVox
|
|||||||
// FIXME - multiple getCompressedBlock() calls (including the one above)
|
// FIXME - multiple getCompressedBlock() calls (including the one above)
|
||||||
CompressedBlock<VoxelType>* pBlock = getCompressedBlock(uBlockX, uBlockY, uBlockZ);
|
CompressedBlock<VoxelType>* pBlock = getCompressedBlock(uBlockX, uBlockY, uBlockZ);
|
||||||
|
|
||||||
const void* pSrcData = reinterpret_cast<const void*>(pBlock->getData());
|
/*const void* pSrcData = reinterpret_cast<const void*>(pBlock->getData());
|
||||||
void* pDstData = reinterpret_cast<void*>(pUncompressedBlock->m_tData);
|
void* pDstData = reinterpret_cast<void*>(pUncompressedBlock->m_tData);
|
||||||
uint32_t uSrcLength = pBlock->getDataSizeInBytes();
|
uint32_t uSrcLength = pBlock->getDataSizeInBytes();
|
||||||
uint32_t uDstLength = m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType);
|
uint32_t uDstLength = m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType);
|
||||||
@ -804,7 +806,9 @@ namespace PolyVox
|
|||||||
//RLECompressor<VoxelType, uint16_t> compressor;
|
//RLECompressor<VoxelType, uint16_t> compressor;
|
||||||
uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength);
|
uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength);
|
||||||
|
|
||||||
POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed.");
|
POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed.");*/
|
||||||
|
|
||||||
|
m_pBlockCompressor->decompress(pBlock, pUncompressedBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add our new block to the map.
|
// Add our new block to the map.
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright (c) 2005-2013 David Williams and Matthew Williams
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __PolyVox_MinizBlockCompressor_H__
|
||||||
|
#define __PolyVox_MinizBlockCompressor_H__
|
||||||
|
|
||||||
|
#include "PolyVoxCore/Impl/Block.h"
|
||||||
|
|
||||||
|
#include "PolyVoxCore/MinizCompressor.h"
|
||||||
|
|
||||||
|
namespace PolyVox
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Provides an interface for performing paging of data.
|
||||||
|
*/
|
||||||
|
template <typename VoxelType>
|
||||||
|
class MinizBlockCompressor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MinizBlockCompressor();
|
||||||
|
~MinizBlockCompressor();
|
||||||
|
|
||||||
|
void compress(UncompressedBlock<VoxelType>* pSrcBlock, CompressedBlock<VoxelType>* pDstBlock);
|
||||||
|
void decompress(CompressedBlock<VoxelType>* pSrcBlock, UncompressedBlock<VoxelType>* pDstBlock);
|
||||||
|
|
||||||
|
MinizCompressor* m_pCompressor;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "PolyVoxCore/MinizBlockCompressor.inl"
|
||||||
|
|
||||||
|
#endif //__PolyVox_MinizBlockCompressor_H__
|
@ -0,0 +1,57 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright (c) 2005-2013 David Williams and Matthew Williams
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
namespace PolyVox
|
||||||
|
{
|
||||||
|
template <typename VoxelType>
|
||||||
|
MinizBlockCompressor<VoxelType>::MinizBlockCompressor()
|
||||||
|
{
|
||||||
|
m_pCompressor = new MinizCompressor;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename VoxelType>
|
||||||
|
MinizBlockCompressor<VoxelType>::~MinizBlockCompressor()
|
||||||
|
{
|
||||||
|
delete m_pCompressor;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename VoxelType>
|
||||||
|
void MinizBlockCompressor<VoxelType>::compress(UncompressedBlock<VoxelType>* pSrcBlock, CompressedBlock<VoxelType>* pDstBlock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename VoxelType>
|
||||||
|
void MinizBlockCompressor<VoxelType>::decompress(CompressedBlock<VoxelType>* pSrcBlock, UncompressedBlock<VoxelType>* pDstBlock)
|
||||||
|
{
|
||||||
|
const void* pSrcData = reinterpret_cast<const void*>(pSrcBlock->getData());
|
||||||
|
void* pDstData = reinterpret_cast<void*>(pDstBlock->getData());
|
||||||
|
uint32_t uSrcLength = pSrcBlock->getDataSizeInBytes();
|
||||||
|
uint32_t uDstLength = pDstBlock->getDataSizeInBytes();
|
||||||
|
|
||||||
|
|
||||||
|
//RLECompressor<VoxelType, uint16_t> compressor;
|
||||||
|
uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength);
|
||||||
|
|
||||||
|
POLYVOX_ASSERT(uUncompressedLength == pDstBlock->getDataSizeInBytes(), "Destination length has changed.");
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user