Added the parts of boost which we need to access shared_ptr and weak_ptr. This will allow for improved memory management of large volumes.
This commit is contained in:
@ -154,7 +154,7 @@ namespace PolyVox
|
||||
for(uint32 ct = 1; ct < uNoOfVoxels; ++ct)
|
||||
{
|
||||
++currentVoxel;
|
||||
if(*currentVoxel != firstVoxel)
|
||||
if(*currentVoxel != firstVal)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -27,6 +27,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
#include "PolyVoxCStdInt.h"
|
||||
|
||||
#include "boost/shared_ptr.hpp"
|
||||
#include "boost/weak_ptr.hpp"
|
||||
|
||||
#include <map>
|
||||
#pragma endregion
|
||||
|
||||
@ -36,22 +39,12 @@ namespace PolyVox
|
||||
class Block
|
||||
{
|
||||
public:
|
||||
BlockData<VoxelType>* m_pBlockData;
|
||||
boost::shared_ptr< BlockData<VoxelType> > m_pBlockData;
|
||||
VoxelType m_pHomogenousValue;
|
||||
bool m_bIsShared;
|
||||
bool m_bIsPotentiallySharable;
|
||||
};
|
||||
|
||||
template <typename VoxelType>
|
||||
class ReferenceCountedBlockData
|
||||
{
|
||||
public:
|
||||
ReferenceCountedBlockData() : m_pBlockData(0), m_uReferenceCount(0) {}
|
||||
|
||||
BlockData<VoxelType>* m_pBlockData;
|
||||
uint32 m_uReferenceCount;
|
||||
};
|
||||
|
||||
template <typename VoxelType>
|
||||
class Volume
|
||||
{
|
||||
@ -79,10 +72,10 @@ namespace PolyVox
|
||||
VolumeIterator<VoxelType> lastVoxel(void);
|
||||
|
||||
private:
|
||||
BlockData<VoxelType>* getHomogenousBlockData(VoxelType tHomogenousValue) const;
|
||||
boost::shared_ptr< BlockData<VoxelType> > getHomogenousBlockData(VoxelType tHomogenousValue) const;
|
||||
|
||||
Block<VoxelType>* m_pBlocks;
|
||||
mutable std::map<VoxelType, ReferenceCountedBlockData<VoxelType> > m_pHomogenousBlockData;
|
||||
mutable std::map<VoxelType, boost::weak_ptr< BlockData<VoxelType> > > m_pHomogenousBlockData;
|
||||
|
||||
uint32 m_uNoOfBlocksInVolume;
|
||||
uint16 m_uSideLengthInBlocks;
|
||||
|
@ -102,7 +102,7 @@ namespace PolyVox
|
||||
template <typename VoxelType>
|
||||
Volume<VoxelType>::~Volume()
|
||||
{
|
||||
for(uint32 i = 0; i < m_uNoOfBlocksInVolume; ++i)
|
||||
/*for(uint32 i = 0; i < m_uNoOfBlocksInVolume; ++i)
|
||||
{
|
||||
if(m_pBlocks[i].m_bIsShared == false)
|
||||
{
|
||||
@ -110,7 +110,7 @@ namespace PolyVox
|
||||
m_pBlocks[i].m_pBlockData = 0;
|
||||
}
|
||||
}
|
||||
delete[] m_pBlocks;
|
||||
delete[] m_pBlocks;*/
|
||||
/*delete[] m_bIsShared;
|
||||
delete[] m_bIsPotentiallySharable;
|
||||
delete[] m_pHomogenousValue;*/
|
||||
@ -153,7 +153,7 @@ namespace PolyVox
|
||||
const uint16 yOffset = uYPos - (blockY << m_uBlockSideLengthPower);
|
||||
const uint16 zOffset = uZPos - (blockZ << m_uBlockSideLengthPower);
|
||||
|
||||
const BlockData<VoxelType>* block = m_pBlocks
|
||||
const boost::shared_ptr< BlockData<VoxelType> > block = m_pBlocks
|
||||
[
|
||||
blockX +
|
||||
blockY * m_uSideLengthInBlocks +
|
||||
@ -197,7 +197,8 @@ namespace PolyVox
|
||||
const VoxelType tHomogenousValue = m_pBlocks[uBlockIndex].m_pHomogenousValue;
|
||||
if(tHomogenousValue != tValue)
|
||||
{
|
||||
m_pBlocks[uBlockIndex].m_pBlockData = new BlockData<VoxelType>(m_uBlockSideLength);
|
||||
boost::shared_ptr< BlockData<VoxelType> > temp(new BlockData<VoxelType>(m_uBlockSideLength));
|
||||
m_pBlocks[uBlockIndex].m_pBlockData = temp;
|
||||
m_pBlocks[uBlockIndex].m_bIsShared = false;
|
||||
m_pBlocks[uBlockIndex].m_pBlockData->fill(tHomogenousValue);
|
||||
m_pBlocks[uBlockIndex].m_pBlockData->setVoxelAt(xOffset,yOffset,zOffset, tValue);
|
||||
@ -238,7 +239,7 @@ namespace PolyVox
|
||||
|
||||
for(uint32 i = 0; i < m_uNoOfBlocksInVolume; ++i)
|
||||
{
|
||||
Block block = m_pBlocks[i];
|
||||
Block<VoxelType> block = m_pBlocks[i];
|
||||
if(block.m_bIsPotentiallySharable)
|
||||
{
|
||||
bool isSharable = block.m_pBlockData->isHomogeneous();
|
||||
@ -294,22 +295,24 @@ namespace PolyVox
|
||||
|
||||
#pragma region Private Implementation
|
||||
template <typename VoxelType>
|
||||
BlockData<VoxelType>* Volume<VoxelType>::getHomogenousBlockData(VoxelType tHomogenousValue) const
|
||||
boost::shared_ptr< BlockData<VoxelType> > Volume<VoxelType>::getHomogenousBlockData(VoxelType tHomogenousValue) const
|
||||
{
|
||||
typename std::map<VoxelType, ReferenceCountedBlockData<VoxelType> >::iterator iterResult = m_pHomogenousBlockData.find(tHomogenousValue);
|
||||
typename std::map<VoxelType, boost::weak_ptr< BlockData<VoxelType> > >::iterator iterResult = m_pHomogenousBlockData.find(tHomogenousValue);
|
||||
if(iterResult == m_pHomogenousBlockData.end())
|
||||
{
|
||||
ReferenceCountedBlockData<VoxelType> referenceCountedBlockData;
|
||||
referenceCountedBlockData.m_pBlockData = new BlockData<VoxelType>(m_uBlockSideLength);
|
||||
referenceCountedBlockData.m_uReferenceCount++;
|
||||
referenceCountedBlockData.m_pBlockData->fill(tHomogenousValue);
|
||||
m_pHomogenousBlockData.insert(std::make_pair(tHomogenousValue, referenceCountedBlockData));
|
||||
return referenceCountedBlockData.m_pBlockData;
|
||||
Block<VoxelType> block;
|
||||
boost::shared_ptr< BlockData<VoxelType> > temp(new BlockData<VoxelType>(m_uBlockSideLength));
|
||||
block.m_pBlockData = temp;
|
||||
//block.m_uReferenceCount++;
|
||||
block.m_pBlockData->fill(tHomogenousValue);
|
||||
m_pHomogenousBlockData.insert(std::make_pair(tHomogenousValue, temp));
|
||||
return block.m_pBlockData;
|
||||
}
|
||||
else
|
||||
{
|
||||
iterResult->second.m_uReferenceCount++;
|
||||
return iterResult->second.m_pBlockData;
|
||||
//iterResult->second.m_uReferenceCount++;
|
||||
boost::shared_ptr< BlockData<VoxelType> > result(iterResult->second);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#pragma endregion
|
||||
|
@ -201,7 +201,7 @@ namespace PolyVox
|
||||
mBlockIndexInVolume = mXBlock +
|
||||
mYBlock * mVolume.m_uSideLengthInBlocks +
|
||||
mZBlock * mVolume.m_uSideLengthInBlocks * mVolume.m_uSideLengthInBlocks;
|
||||
BlockData<VoxelType>* currentBlock = mVolume.m_pBlocks[mBlockIndexInVolume].m_pBlockData;
|
||||
boost::shared_ptr< BlockData<VoxelType> > currentBlock = mVolume.m_pBlocks[mBlockIndexInVolume].m_pBlockData;
|
||||
|
||||
mVoxelIndexInBlock = mXPosInBlock +
|
||||
mYPosInBlock * mVolume.m_uBlockSideLength +
|
||||
@ -257,7 +257,7 @@ namespace PolyVox
|
||||
mVoxelIndexInBlock = mXPosInBlock +
|
||||
mYPosInBlock * mVolume.m_uBlockSideLength +
|
||||
mZPosInBlock * mVolume.m_uBlockSideLength * mVolume.m_uBlockSideLength;
|
||||
BlockData<VoxelType>* currentBlock = mVolume.m_pBlocks[mBlockIndexInVolume];
|
||||
boost::shared_ptr< BlockData<VoxelType> > currentBlock = mVolume.m_pBlocks[mBlockIndexInVolume];
|
||||
mCurrentVoxel = currentBlock->m_tData + mVoxelIndexInBlock;
|
||||
|
||||
mYPosInBlock++;
|
||||
|
Reference in New Issue
Block a user