Added API documentation regarding compression.

This commit is contained in:
Daviw Williams 2013-03-04 15:17:19 +01:00
parent 74b4caba6b
commit b4fcb3daf8
4 changed files with 63 additions and 3 deletions

View File

@ -35,6 +35,10 @@ namespace PolyVox
* The main purpose of this is to allow the user to change the compression algorithm which is used by a LargeVolume, * The main purpose of this is to allow the user to change the compression algorithm which is used by a LargeVolume,
* based on the kind of voxel data it is storing. Users may also wish to use Compressor subclasses in more general * based on the kind of voxel data it is storing. Users may also wish to use Compressor subclasses in more general
* compression-related scenarios but this is not well tested. * compression-related scenarios but this is not well tested.
*
* If you wish to implement your own compression algorithms for use in PolyVox then you should begin by subclassing this class.
*
* \sa MinizCompressor, RLECompressor
*/ */
class Compressor class Compressor
{ {
@ -49,14 +53,43 @@ namespace PolyVox
/// If necessary you can use this as a destination buffer size, though it may be somewhat /// If necessary you can use this as a destination buffer size, though it may be somewhat
/// wasteful. It is not guarenteed that compression actually shrinks the data, so the /// wasteful. It is not guarenteed that compression actually shrinks the data, so the
/// worst-case value returned by this function may be bigger than the input size. /// worst-case value returned by this function may be bigger than the input size.
/// \param The size of the uncompressed input data ///
/// \param uUncompressedInputSize The size of the uncompressed input data
/// \return The largest possible size of the compressed output data. /// \return The largest possible size of the compressed output data.
///
virtual uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize) = 0; virtual uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize) = 0;
/// Compresses the data. /// Compresses the data.
///
/// Performs compression of the data pointed to by pSrcData and stores the result in pDstData.
/// The user is responsible for allocating both buffers and for making sure that the destination
/// buffer is large enough to hold the result. If you don't know how big the compressed data
/// will be (and you probably won't know this) then you can call getMaxCompressedSize() to get
/// an upper bound. The *actual* compressed size is then returned by this function and you can
/// use this to copy your compressed data to a more suitably size buffer.
///
/// \param pSrcData A pointer to the data to be compressed.
/// \param uSrcLength The length of the data to be compressed.
/// \param pDstData A pointer to the memory where the result should be stored.
/// \param uDstLength The length of the destination buffer (compression will fail if this isn't big enough).
/// \return The size of the resulting compressed data.
///
virtual uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength) = 0; virtual uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength) = 0;
/// Decompresses the data. /// Decompresses the data.
///
/// Performs decompression of the data pointed to by pSrcData and stores the result in pDstData.
/// The user is responsible for allocating both buffers and for making sure that the destination
/// buffer is large enough to hold the result. This means you need to know how large the resulting
/// data might be, so before you compress the data it may be worth storing this information somewhere.
/// The *actual* decompressed size is then returned by this function
///
/// \param pSrcData A pointer to the data to be decompressed.
/// \param uSrcLength The length of the data to be decompressed.
/// \param pDstData A pointer to the memory where the result should be stored.
/// \param uDstLength The length of the destination buffer (decompression will fail if this isn't big enough).
/// \return The size of the resulting uncompressed data.
///
virtual uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength) = 0; virtual uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength) = 0;
}; };
} }

View File

@ -5,12 +5,25 @@
namespace PolyVox namespace PolyVox
{ {
/**
* Performs compression of data using the miniz library.
*
* This compressor implements the DEFLATE (http://en.wikipedia.org/wiki/Deflate) compression algorithm via the pubic domain
* 'miniz' library (https://code.google.com/p/miniz/). This is a general purpose compression algorithm, and within PolyVox it
* is intended for situations in which the alternative RLECompressor is not appropriate. It is a good default choice if you
* are not sure which compressor is best for your needs.
*
* \sa RLECompressor
*/
class MinizCompressor : public Compressor class MinizCompressor : public Compressor
{ {
public: public:
/// Constructor
MinizCompressor(int iCompressionLevel = 6); // Miniz defines MZ_DEFAULT_LEVEL = 6 so we use the same here MinizCompressor(int iCompressionLevel = 6); // Miniz defines MZ_DEFAULT_LEVEL = 6 so we use the same here
/// Destructor
~MinizCompressor(); ~MinizCompressor();
// API documentation is in base class and gets inherited by Doxygen.
uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize); uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize);
uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength); uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength);
uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength); uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength);

View File

@ -5,6 +5,15 @@
namespace PolyVox namespace PolyVox
{ {
/**
* Performs compression of data using Run Length Encoding (RLE).
*
* This compressor is designed for voxel data which contains long runs of the same value. Minecraft-style terrain and other
* cubic-style terrains are likely to fall under this category, whereas density fields for Marching Cubes terrain will not. Please
* see the following article if you want more details of how RLE compression works: http://en.wikipedia.org/wiki/Run-length_encoding
*
* \sa MinizCompressor
*/
template<typename ValueType, typename LengthType> template<typename ValueType, typename LengthType>
class RLECompressor : public Compressor class RLECompressor : public Compressor
{ {
@ -14,9 +23,12 @@ namespace PolyVox
LengthType length; LengthType length;
}; };
public: public:
/// Constructor
RLECompressor(); RLECompressor();
/// Destructor
~RLECompressor(); ~RLECompressor();
// API documentation is in base class and gets inherited by Doxygen.
uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize); uint32_t getMaxCompressedSize(uint32_t uUncompressedInputSize);
uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength); uint32_t compress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength);
uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength); uint32_t decompress(void* pSrcData, uint32_t uSrcLength, void* pDstData, uint32_t uDstLength);

View File

@ -29,7 +29,9 @@ using namespace std;
namespace PolyVox namespace PolyVox
{ {
// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow) /// You can specify a compression level when constructing this compressor. This controls the tradeoff between speed and compression
/// rate. Levels 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow).
/// \param iCompressionLevel The desired compression level.
MinizCompressor::MinizCompressor(int iCompressionLevel) MinizCompressor::MinizCompressor(int iCompressionLevel)
:m_pDeflator(0) :m_pDeflator(0)
{ {