Work on FilePager.

This commit is contained in:
David Williams 2013-06-22 10:16:33 +02:00
parent 288b448b9f
commit d9ebe96c5a

View File

@ -29,6 +29,7 @@ freely, subject to the following restrictions:
#include "PolyVoxCore/Pager.h" #include "PolyVoxCore/Pager.h"
#include <fstream> #include <fstream>
#include <stdexcept>
#include <string> #include <string>
namespace PolyVox namespace PolyVox
@ -37,18 +38,85 @@ namespace PolyVox
* Provides an interface for performing paging of data. * Provides an interface for performing paging of data.
*/ */
template <typename VoxelType> template <typename VoxelType>
class FilePager : public Pager class FilePager : public Pager<typename VoxelType>
{ {
public: public:
/// Constructor /// Constructor
FilePager(const std::string& strFolderName) FilePager(const std::string& strFolderName)
:Pager() :Pager()
,m_strFolderName(strFolderName)
{ {
} }
/// Destructor /// Destructor
virtual ~FilePager() {}; virtual ~FilePager() {};
virtual void pageIn(const Region& region, Block<VoxelType>* pBlockData)
{
POLYVOX_ASSERT(pBlockData, "Attempting to page in NULL block");
POLYVOX_ASSERT(pBlockData->m_bIsCompressed, "Attempting to page in uncompressed block");
std::stringstream ss;
ss << region.getLowerX() << "_" << region.getLowerY() << "_" << region.getLowerZ() << "_"
<< region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ();
std::string filename = m_strFolderName + ss.str();
// FIXME - This should be replaced by C++ style IO, but currently this causes problems with
// the gameplay-cubiquity integration. See: https://github.com/blackberry/GamePlay/issues/919
FILE* pFile = fopen(filename.c_str(), "rb");
if(pFile)
{
logTrace() << "Paging in data for " << region;
fread(pBlockData->m_pCompressedData, sizeof(uint8_t), pBlockData->m_uCompressedDataLength, pFile);
if(ferror(pFile))
{
POLYVOX_THROW(std::runtime_error, "Error reading in block data, even though a file exists.");
}
fclose(pFile);
}
else
{
logTrace() << "No data found for " << region << " during paging in.";
}
}
virtual void pageOut(const Region& region, Block<VoxelType>* pBlockData)
{
POLYVOX_ASSERT(pBlockData, "Attempting to page out NULL block");
POLYVOX_ASSERT(pBlockData->m_bIsCompressed, "Attempting to page out uncompressed block");
logTrace() << "Paging out data for " << region;
std::stringstream ss;
ss << region.getLowerX() << "_" << region.getLowerY() << "_" << region.getLowerZ() << "_"
<< region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ();
std::string filename = m_strFolderName + ss.str();
// FIXME - This should be replaced by C++ style IO, but currently this causes problems with
// the gameplay-cubiquity integration. See: https://github.com/blackberry/GamePlay/issues/919
FILE* pFile = fopen(filename.c_str(), "wb");
if(!pFile)
{
POLYVOX_THROW(std::runtime_error, "Unable to open file to write out block data.");
}
fwrite(pBlockData->m_pCompressedData, sizeof(uint8_t), pBlockData->m_uCompressedDataLength, pFile);
if(ferror(pFile))
{
POLYVOX_THROW(std::runtime_error, "Error writing out block data.");
}
fclose(pFile);
}
virtual void dataRequiredHandler(const ConstVolumeProxy<VoxelType>& volumeProxy, const Region& region) virtual void dataRequiredHandler(const ConstVolumeProxy<VoxelType>& volumeProxy, const Region& region)
{ {
} }