34 template <
typename VoxelType>
36 :m_tUncompressedData(0)
38 ,m_uSideLengthPower(0)
39 ,m_bIsCompressed(true)
40 ,m_bIsUncompressedDataModified(true)
48 template <
typename VoxelType>
54 template <
typename VoxelType>
57 assert(uXPos < m_uSideLength);
58 assert(uYPos < m_uSideLength);
59 assert(uZPos < m_uSideLength);
61 assert(m_tUncompressedData);
63 return m_tUncompressedData
66 uYPos * m_uSideLength +
67 uZPos * m_uSideLength * m_uSideLength
71 template <
typename VoxelType>
74 return getVoxelAt(v3dPos.
getX(), v3dPos.
getY(), v3dPos.
getZ());
77 template <
typename VoxelType>
80 assert(uXPos < m_uSideLength);
81 assert(uYPos < m_uSideLength);
82 assert(uZPos < m_uSideLength);
84 assert(m_tUncompressedData);
89 uYPos * m_uSideLength +
90 uZPos * m_uSideLength * m_uSideLength
93 m_bIsUncompressedDataModified =
true;
96 template <
typename VoxelType>
99 setVoxelAt(v3dPos.
getX(), v3dPos.
getY(), v3dPos.
getZ(), tValue);
102 template <
typename VoxelType>
109 const uint32_t uNoOfVoxels = m_uSideLength * m_uSideLength * m_uSideLength;
110 std::fill(m_tUncompressedData, m_tUncompressedData + uNoOfVoxels, tValue);
112 m_bIsUncompressedDataModified =
true;
116 RunlengthEntry<uint16_t> rle;
117 rle.length = m_uSideLength*m_uSideLength*m_uSideLength;
119 m_vecCompressedData.clear();
120 m_vecCompressedData.push_back(rle);
124 template <
typename VoxelType>
133 throw std::invalid_argument(
"Block side length must be a power of two.");
137 m_uSideLength = uSideLength;
138 m_uSideLengthPower =
logBase2(uSideLength);
143 template <
typename VoxelType>
147 uSizeInBytes += m_vecCompressedData.capacity() *
sizeof(RunlengthEntry<uint16_t>);
151 template <
typename VoxelType>
154 assert(m_bIsCompressed ==
false);
155 assert(m_tUncompressedData != 0);
159 if(m_bIsUncompressedDataModified)
161 uint32_t uNoOfVoxels = m_uSideLength * m_uSideLength * m_uSideLength;
162 m_vecCompressedData.clear();
164 RunlengthEntry<uint16_t> entry;
166 entry.value = m_tUncompressedData[0];
168 for(uint32_t ct = 1; ct < uNoOfVoxels; ++ct)
170 VoxelType value = m_tUncompressedData[ct];
171 if((value == entry.value) && (entry.length < entry.maxRunlength()))
177 m_vecCompressedData.push_back(entry);
183 m_vecCompressedData.push_back(entry);
188 std::vector< RunlengthEntry<uint16_t> >(m_vecCompressedData).swap(m_vecCompressedData);
192 delete[] m_tUncompressedData;
193 m_tUncompressedData = 0;
194 m_bIsCompressed =
true;
197 template <
typename VoxelType>
200 assert(m_bIsCompressed ==
true);
201 assert(m_tUncompressedData == 0);
202 m_tUncompressedData =
new VoxelType[m_uSideLength * m_uSideLength * m_uSideLength];
204 VoxelType* pUncompressedData = m_tUncompressedData;
205 for(uint32_t ct = 0; ct < m_vecCompressedData.size(); ++ct)
207 std::fill(pUncompressedData, pUncompressedData + m_vecCompressedData[ct].length, m_vecCompressedData[ct].value);
208 pUncompressedData += m_vecCompressedData[ct].length;
211 m_bIsCompressed =
false;
212 m_bIsUncompressedDataModified =
false;