Moved common code into function.

This commit is contained in:
David Williams 2015-03-21 16:22:23 +01:00
parent 778238d11d
commit b027cf1a0c
3 changed files with 15 additions and 37 deletions

View File

@ -280,7 +280,8 @@ namespace PolyVox
/// Assignment operator /// Assignment operator
PagedVolume& operator=(const PagedVolume& rhs); PagedVolume& operator=(const PagedVolume& rhs);
private: private:
bool canReuseLastAccessedChunk(int32_t iChunkX, int32_t iChunkY, int32_t iChunkZ) const;
Chunk* getChunk(int32_t uChunkX, int32_t uChunkY, int32_t uChunkZ) const; Chunk* getChunk(int32_t uChunkX, int32_t uChunkY, int32_t uChunkZ) const;
// Storing these properties individually has proved to be faster than keeping // Storing these properties individually has proved to be faster than keeping

View File

@ -123,18 +123,7 @@ namespace PolyVox
const uint16_t yOffset = static_cast<uint16_t>(uYPos & m_iChunkMask); const uint16_t yOffset = static_cast<uint16_t>(uYPos & m_iChunkMask);
const uint16_t zOffset = static_cast<uint16_t>(uZPos & m_iChunkMask); const uint16_t zOffset = static_cast<uint16_t>(uZPos & m_iChunkMask);
Chunk* pChunk; auto pChunk = canReuseLastAccessedChunk(chunkX, chunkY, chunkZ) ? m_pLastAccessedChunk : getChunk(chunkX, chunkY, chunkZ);
if ((chunkX == m_v3dLastAccessedChunkX) &&
(chunkY == m_v3dLastAccessedChunkY) &&
(chunkZ == m_v3dLastAccessedChunkZ) &&
(m_pLastAccessedChunk != 0))
{
pChunk = m_pLastAccessedChunk;
}
else
{
pChunk = getChunk(chunkX, chunkY, chunkZ);
}
return pChunk->getVoxel(xOffset, yOffset, zOffset); return pChunk->getVoxel(xOffset, yOffset, zOffset);
} }
@ -167,18 +156,7 @@ namespace PolyVox
const uint16_t yOffset = static_cast<uint16_t>(uYPos - (chunkY << m_uChunkSideLengthPower)); const uint16_t yOffset = static_cast<uint16_t>(uYPos - (chunkY << m_uChunkSideLengthPower));
const uint16_t zOffset = static_cast<uint16_t>(uZPos - (chunkZ << m_uChunkSideLengthPower)); const uint16_t zOffset = static_cast<uint16_t>(uZPos - (chunkZ << m_uChunkSideLengthPower));
Chunk* pChunk; auto pChunk = canReuseLastAccessedChunk(chunkX, chunkY, chunkZ) ? m_pLastAccessedChunk : getChunk(chunkX, chunkY, chunkZ);
if ((chunkX == m_v3dLastAccessedChunkX) &&
(chunkY == m_v3dLastAccessedChunkY) &&
(chunkZ == m_v3dLastAccessedChunkZ) &&
(m_pLastAccessedChunk != 0))
{
pChunk = m_pLastAccessedChunk;
}
else
{
pChunk = getChunk(chunkX, chunkY, chunkZ);
}
pChunk->setVoxel(xOffset, yOffset, zOffset, tValue); pChunk->setVoxel(xOffset, yOffset, zOffset, tValue);
} }
@ -280,6 +258,15 @@ namespace PolyVox
} }
} }
template <typename VoxelType>
bool PagedVolume<VoxelType>::canReuseLastAccessedChunk(int32_t iChunkX, int32_t iChunkY, int32_t iChunkZ) const
{
return ((iChunkX == m_v3dLastAccessedChunkX) &&
(iChunkY == m_v3dLastAccessedChunkY) &&
(iChunkZ == m_v3dLastAccessedChunkZ) &&
(m_pLastAccessedChunk));
}
template <typename VoxelType> template <typename VoxelType>
typename PagedVolume<VoxelType>::Chunk* PagedVolume<VoxelType>::getChunk(int32_t uChunkX, int32_t uChunkY, int32_t uChunkZ) const typename PagedVolume<VoxelType>::Chunk* PagedVolume<VoxelType>::getChunk(int32_t uChunkX, int32_t uChunkY, int32_t uChunkZ) const
{ {

View File

@ -110,18 +110,8 @@ namespace PolyVox
uYPosInChunk * this->mVolume->m_uChunkSideLength + uYPosInChunk * this->mVolume->m_uChunkSideLength +
uZPosInChunk * this->mVolume->m_uChunkSideLength * this->mVolume->m_uChunkSideLength; uZPosInChunk * this->mVolume->m_uChunkSideLength * this->mVolume->m_uChunkSideLength;
Chunk* pCurrentChunk; auto pCurrentChunk = this->mVolume->canReuseLastAccessedChunk(uXChunk, uYChunk, uZChunk) ?
if ((uXChunk == this->mVolume->m_v3dLastAccessedChunkX) && this->mVolume->m_pLastAccessedChunk : this->mVolume->getChunk(uXChunk, uYChunk, uZChunk);
(uYChunk == this->mVolume->m_v3dLastAccessedChunkY) &&
(uZChunk == this->mVolume->m_v3dLastAccessedChunkZ) &&
(this->mVolume->m_pLastAccessedChunk != 0))
{
pCurrentChunk = this->mVolume->m_pLastAccessedChunk;
}
else
{
pCurrentChunk = this->mVolume->getChunk(uXChunk, uYChunk, uZChunk);
}
mCurrentVoxel = pCurrentChunk->m_tData + uVoxelIndexInChunk; mCurrentVoxel = pCurrentChunk->m_tData + uVoxelIndexInChunk;
} }