Work on compression interface.

This commit is contained in:
Daviw Williams 2013-01-31 16:35:50 +01:00
parent 36676433be
commit a81ec68714
5 changed files with 21 additions and 9 deletions

View File

@ -129,9 +129,6 @@ namespace PolyVox
const uint32_t uNoOfVoxels = m_uSideLength * m_uSideLength * m_uSideLength; const uint32_t uNoOfVoxels = m_uSideLength * m_uSideLength * m_uSideLength;
std::fill(m_tUncompressedData, m_tUncompressedData + uNoOfVoxels, VoxelType()); std::fill(m_tUncompressedData, m_tUncompressedData + uNoOfVoxels, VoxelType());
m_bIsUncompressedDataModified = true; m_bIsUncompressedDataModified = true;
//For some reason blocks start out compressed. We should probably change this.
compress(0);
} }
template <typename VoxelType> template <typename VoxelType>
@ -159,8 +156,8 @@ namespace PolyVox
uint32_t uDstLength = 1000000; uint32_t uDstLength = 1000000;
//MinizCompressor compressor; //MinizCompressor compressor;
RLECompressor<VoxelType, uint16_t> compressor; //RLECompressor<VoxelType, uint16_t> compressor;
uint32_t uCompressedLength = compressor.compress(pSrcData, uSrcLength, pDstData, uDstLength); uint32_t uCompressedLength = pCompressor->compress(pSrcData, uSrcLength, pDstData, uDstLength);
m_pCompressedData = reinterpret_cast<void*>( new uint8_t[uCompressedLength] ); m_pCompressedData = reinterpret_cast<void*>( new uint8_t[uCompressedLength] );
memcpy(m_pCompressedData, pDstData, uCompressedLength); memcpy(m_pCompressedData, pDstData, uCompressedLength);
@ -178,7 +175,7 @@ namespace PolyVox
template <typename VoxelType> template <typename VoxelType>
void Block<VoxelType>::uncompress(Compressor* pCompressor) void Block<VoxelType>::uncompress(Compressor* pCompressor)
{ {
//POLYVOX_ASSERT(pCompressor, "Compressor is not valid"); POLYVOX_ASSERT(pCompressor, "Compressor is not valid");
POLYVOX_ASSERT(m_bIsCompressed == true, "Attempted to uncompress block which is not flagged as compressed."); POLYVOX_ASSERT(m_bIsCompressed == true, "Attempted to uncompress block which is not flagged as compressed.");
POLYVOX_ASSERT(m_tUncompressedData == 0, "Uncompressed data already exists."); POLYVOX_ASSERT(m_tUncompressedData == 0, "Uncompressed data already exists.");
@ -190,8 +187,8 @@ namespace PolyVox
uint32_t uDstLength = m_uSideLength * m_uSideLength * m_uSideLength * sizeof(VoxelType); uint32_t uDstLength = m_uSideLength * m_uSideLength * m_uSideLength * sizeof(VoxelType);
//MinizCompressor compressor; //MinizCompressor compressor;
RLECompressor<VoxelType, uint16_t> compressor; //RLECompressor<VoxelType, uint16_t> compressor;
uint32_t uUncompressedLength = compressor.decompress(pSrcData, uSrcLength, pDstData, uDstLength); uint32_t uUncompressedLength = 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

@ -618,6 +618,10 @@ namespace PolyVox
// create the new block // create the new block
LoadedBlock newBlock(m_uBlockSideLength); LoadedBlock newBlock(m_uBlockSideLength);
//Blocks start out compressed - should we change this?
newBlock.block.compress(m_pCompressor);
itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, newBlock)).first; itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, newBlock)).first;
//We have created the new block. If paging is enabled it should be used to //We have created the new block. If paging is enabled it should be used to

View File

@ -60,6 +60,11 @@ namespace PolyVox
typedef Array<3,int32_t> Array3DInt32; typedef Array<3,int32_t> Array3DInt32;
typedef Array<3,uint32_t> Array3DUint32; typedef Array<3,uint32_t> Array3DUint32;
////////////////////////////////////////////////////////////////////////////////
// Compressor
////////////////////////////////////////////////////////////////////////////////
class Compressor;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// CubicSurfaceExtractor // CubicSurfaceExtractor
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -25,6 +25,7 @@ freely, subject to the following restrictions:
#include "PolyVoxCore/LargeVolume.h" #include "PolyVoxCore/LargeVolume.h"
#include "PolyVoxCore/RawVolume.h" #include "PolyVoxCore/RawVolume.h"
#include "PolyVoxCore/RLECompressor.h"
#include "PolyVoxCore/SimpleVolume.h" #include "PolyVoxCore/SimpleVolume.h"
#include <QtGlobal> #include <QtGlobal>
@ -269,10 +270,12 @@ TestVolume::TestVolume()
{ {
Region region(-57, -31, 12, 64, 96, 131); // Deliberatly awkward size Region region(-57, -31, 12, 64, 96, 131); // Deliberatly awkward size
m_pCompressor = new RLECompressor<int32_t, uint16_t>;
//Create the volumes //Create the volumes
m_pRawVolume = new RawVolume<int32_t>(region); m_pRawVolume = new RawVolume<int32_t>(region);
m_pSimpleVolume = new SimpleVolume<int32_t>(region); m_pSimpleVolume = new SimpleVolume<int32_t>(region);
m_pLargeVolume = new LargeVolume<int32_t>(region); m_pLargeVolume = new LargeVolume<int32_t>(region, m_pCompressor);
// LargeVolume currently fails a test if compression is enabled. It // LargeVolume currently fails a test if compression is enabled. It
// may be related to accessing the data through more than one sampler? // may be related to accessing the data through more than one sampler?
@ -299,6 +302,8 @@ TestVolume::~TestVolume()
delete m_pRawVolume; delete m_pRawVolume;
delete m_pSimpleVolume; delete m_pSimpleVolume;
delete m_pLargeVolume; delete m_pLargeVolume;
delete m_pCompressor;
} }
/* /*

View File

@ -65,6 +65,7 @@ private slots:
void testLargeVolumeSamplersWithExternalBackwards(); void testLargeVolumeSamplersWithExternalBackwards();
private: private:
PolyVox::Compressor* m_pCompressor;
PolyVox::RawVolume<int32_t>* m_pRawVolume; PolyVox::RawVolume<int32_t>* m_pRawVolume;
PolyVox::SimpleVolume<int32_t>* m_pSimpleVolume; PolyVox::SimpleVolume<int32_t>* m_pSimpleVolume;
PolyVox::LargeVolume<int32_t>* m_pLargeVolume; PolyVox::LargeVolume<int32_t>* m_pLargeVolume;