From 778238d11dc0292e8331cbd29f896428f10e12da Mon Sep 17 00:00:00 2001 From: David Williams Date: Sat, 21 Mar 2015 14:57:48 +0100 Subject: [PATCH] Moved the test for whether we are accessing the same voxel as last time. --- include/PolyVox/PagedVolume.inl | 32 ++++++++++++++++++++++---- include/PolyVox/PagedVolumeSampler.inl | 13 ++++++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/include/PolyVox/PagedVolume.inl b/include/PolyVox/PagedVolume.inl index 5d1288c0..081e9b17 100644 --- a/include/PolyVox/PagedVolume.inl +++ b/include/PolyVox/PagedVolume.inl @@ -123,7 +123,19 @@ namespace PolyVox const uint16_t yOffset = static_cast(uYPos & m_iChunkMask); const uint16_t zOffset = static_cast(uZPos & m_iChunkMask); - auto pChunk = getChunk(chunkX, chunkY, chunkZ); + Chunk* pChunk; + 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); } @@ -155,7 +167,19 @@ namespace PolyVox const uint16_t yOffset = static_cast(uYPos - (chunkY << m_uChunkSideLengthPower)); const uint16_t zOffset = static_cast(uZPos - (chunkZ << m_uChunkSideLengthPower)); - auto pChunk = getChunk(chunkX, chunkY, chunkZ); + Chunk* pChunk; + 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); } @@ -263,13 +287,13 @@ namespace PolyVox //the time stamp. If we updated it everytime then that would be every time we touched //a voxel, which would overflow a uint32_t and require us to use a uint64_t instead. //This check should also provide a significant speed boost as usually it is true. - if ((uChunkX == m_v3dLastAccessedChunkX) && + /*if ((uChunkX == m_v3dLastAccessedChunkX) && (uChunkY == m_v3dLastAccessedChunkY) && (uChunkZ == m_v3dLastAccessedChunkZ) && (m_pLastAccessedChunk != 0)) { return m_pLastAccessedChunk; - } + }*/ Vector3DInt32 v3dChunkPos(uChunkX, uChunkY, uChunkZ); diff --git a/include/PolyVox/PagedVolumeSampler.inl b/include/PolyVox/PagedVolumeSampler.inl index 3de9ca10..71cb633a 100644 --- a/include/PolyVox/PagedVolumeSampler.inl +++ b/include/PolyVox/PagedVolumeSampler.inl @@ -110,7 +110,18 @@ namespace PolyVox uYPosInChunk * this->mVolume->m_uChunkSideLength + uZPosInChunk * this->mVolume->m_uChunkSideLength * this->mVolume->m_uChunkSideLength; - auto pCurrentChunk = this->mVolume->getChunk(uXChunk, uYChunk, uZChunk); + Chunk* pCurrentChunk; + if ((uXChunk == this->mVolume->m_v3dLastAccessedChunkX) && + (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; }