From b767d9b89661e84fa4462599a3fb8f9d9bd5b194 Mon Sep 17 00:00:00 2001 From: David Williams Date: Thu, 25 Jul 2013 17:07:50 +0200 Subject: [PATCH] Tidying up. --- .../include/PolyVoxCore/Impl/Block.h | 2 +- .../include/PolyVoxCore/LargeVolume.inl | 105 +++++++++++------- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/Impl/Block.h b/library/PolyVoxCore/include/PolyVoxCore/Impl/Block.h index 3d795e26..aeb309cc 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/Impl/Block.h +++ b/library/PolyVoxCore/include/PolyVoxCore/Impl/Block.h @@ -42,7 +42,7 @@ namespace PolyVox public: Block() :m_uBlockLastAccessed(0) - ,m_bDataModified(false) + ,m_bDataModified(true) { } diff --git a/library/PolyVoxCore/include/PolyVoxCore/LargeVolume.inl b/library/PolyVoxCore/include/PolyVoxCore/LargeVolume.inl index 65bbbed3..f0d15bdc 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/LargeVolume.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/LargeVolume.inl @@ -625,6 +625,9 @@ namespace PolyVox // Copy the resulting compressed data into the compressed block pCompressedBlock->setData(pDstData, uDstLength); + + // The compressed data has been updated, so the uncompressed data is no longer modified with respect to it. + pUncompressedBlock->m_bDataModified = false; } catch(std::exception&) { @@ -646,6 +649,9 @@ namespace PolyVox // Copy the resulting compressed data into the compressed block pCompressedBlock->setData(pDstData, uDstLength); + + // The compressed data has been updated, so the uncompressed data is no longer modified with respect to it. + pUncompressedBlock->m_bDataModified = false; } catch(std::exception&) { @@ -670,7 +676,28 @@ namespace PolyVox { Vector3DInt32 v3dBlockPos(uBlockX, uBlockY, uBlockZ); + CompressedBlock* pBlock = 0; + typename CompressedBlockMap::iterator itBlock = m_pBlocks.find(v3dBlockPos); + if(itBlock != m_pBlocks.end()) + { + pBlock = itBlock->second; + } + /*else if(check on disk) + { + }*/ + else + { + pBlock = new CompressedBlock; + pBlock->m_uBlockLastAccessed = ++m_uTimestamper; + itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, pBlock)).first; + } + + pBlock->m_uBlockLastAccessed = ++m_uTimestamper; + + return pBlock; + + /*typename CompressedBlockMap::iterator itBlock = m_pBlocks.find(v3dBlockPos); // check whether the block is already loaded if(itBlock == m_pBlocks.end()) { @@ -701,7 +728,7 @@ namespace PolyVox block->m_uBlockLastAccessed = ++m_uTimestamper; //m_v3dLastAccessedBlockPos = v3dBlockPos; - return block; + return block;*/ } template @@ -718,63 +745,59 @@ namespace PolyVox return m_pLastAccessedBlock; }*/ - UncompressedBlock* pUncompressedBlock = 0; - typename UncompressedBlockMap::iterator itUncompressedBlock = m_pUncompressedBlockCache.find(v3dBlockPos); // check whether the block is already loaded if(itUncompressedBlock != m_pUncompressedBlockCache.end()) { - pUncompressedBlock = itUncompressedBlock->second; - + UncompressedBlock* pUncompressedBlock = itUncompressedBlock->second; + + pUncompressedBlock->m_uBlockLastAccessed = ++m_uTimestamper; + m_pLastAccessedBlock = pUncompressedBlock; + m_v3dLastAccessedBlockPos = v3dBlockPos; + + return pUncompressedBlock; } - //else if(check compressed list...) - //{ - //} else { // At this point we just create a new block. - pUncompressedBlock = new UncompressedBlock(m_uBlockSideLength); - - m_pUncompressedBlockCache.insert(std::make_pair(v3dBlockPos, pUncompressedBlock)); - - // Our block cache may now have grown too large. Flush some entries is necessary. - // FIXME - Watch out for flushing the block we just created! - //flushExcessiveCacheEntries(); - } - - pUncompressedBlock->m_uBlockLastAccessed = ++m_uTimestamper; - - //Gets the block and marks that we accessed it - /*CompressedBlock* block = getCompressedBlock(uBlockX, uBlockY, uBlockZ); - - typename UncompressedBlockMap::iterator itUncompressedBlock = m_pUncompressedBlockCache.find(v3dBlockPos); - // check whether the block is already loaded - if(itUncompressedBlock == m_pUncompressedBlockCache.end()) - { UncompressedBlock* pUncompressedBlock = new UncompressedBlock(m_uBlockSideLength); + + // It's important to set the timestamp before we flush later. pUncompressedBlock->m_uBlockLastAccessed = ++m_uTimestamper; - const void* pSrcData = reinterpret_cast(block->getData()); - void* pDstData = reinterpret_cast(pUncompressedBlock->m_tData); - uint32_t uSrcLength = block->getDataSizeInBytes(); - uint32_t uDstLength = m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType); + // We set these before flushing because the flush can cause block to be erased, and there + // is a test to make sure the block which is being erase is not the last accessed block. + m_pLastAccessedBlock = pUncompressedBlock; + m_v3dLastAccessedBlockPos = v3dBlockPos; - //MinizCompressor compressor; - //RLECompressor compressor; - uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength); + // An uncompressed bock is always backed by a compressed one, and this is created by getCompressedBlock() if it doesn't + // already exist. If it does already exist and has data then we bring this across into the ucompressed version. + if(getCompressedBlock(uBlockX, uBlockY, uBlockZ)->getData() != 0) + { + // FIXME - multiple getCompressedBlock() calls (including the one above) + CompressedBlock* pBlock = getCompressedBlock(uBlockX, uBlockY, uBlockZ); - POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed."); + const void* pSrcData = reinterpret_cast(pBlock->getData()); + void* pDstData = reinterpret_cast(pUncompressedBlock->m_tData); + uint32_t uSrcLength = pBlock->getDataSizeInBytes(); + uint32_t uDstLength = m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType); - itUncompressedBlock = m_pUncompressedBlockCache.insert(std::make_pair(v3dBlockPos, pUncompressedBlock)).first; + //MinizCompressor compressor; + //RLECompressor compressor; + uint32_t uUncompressedLength = m_pCompressor->decompress(pSrcData, uSrcLength, pDstData, uDstLength); - // Our block cache may now have grown too large. Fluch some entries is necessary. + POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed."); + } + + // Addd our new block to the map. + m_pUncompressedBlockCache.insert(std::make_pair(v3dBlockPos, pUncompressedBlock)); + + // Our block cache may now have grown too large. Flush some entries if necessary. + // FIXME - Watch out for flushing the block we just created! flushExcessiveCacheEntries(); - }*/ - m_pLastAccessedBlock = pUncompressedBlock; - m_v3dLastAccessedBlockPos = v3dBlockPos; - - return m_pLastAccessedBlock; + return pUncompressedBlock; + } } ////////////////////////////////////////////////////////////////////////////////