summaryrefslogtreecommitdiffstats
path: root/src/Section.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Section.cpp')
-rw-r--r--src/Section.cpp250
1 files changed, 134 insertions, 116 deletions
diff --git a/src/Section.cpp b/src/Section.cpp
index b2d9ac9..3fb100f 100644
--- a/src/Section.cpp
+++ b/src/Section.cpp
@@ -1,97 +1,120 @@
#include "Section.hpp"
-
-Section::Section(Vector position, byte *dataBlocks, size_t dataBlocksLength, byte *dataLight, byte *dataSky,
- byte bitsPerBlock,
- std::vector<unsigned short> palette) {
- worldPosition = position;
-
- m_dataBlocksLen = dataBlocksLength;
- m_dataBlocks = new byte[m_dataBlocksLen];
- std::copy(dataBlocks, dataBlocks + m_dataBlocksLen, m_dataBlocks);
-
- m_dataLight = new byte[2048];
- std::copy(dataLight, dataLight + 2048, m_dataLight);
-
- if (dataSky) {
- m_dataSkyLight = new byte[2048];
- std::copy(dataSky, dataSky + 2048, m_dataSkyLight);
- }
-
- m_palette = palette;
- m_bitsPerBlock = bitsPerBlock;
-}
-
Section::~Section() {
- delete[] m_dataBlocks;
- m_dataBlocksLen = 0;
- m_dataBlocks = nullptr;
- delete[] m_dataLight;
- m_dataLight = nullptr;
- delete[] m_dataSkyLight;
- m_dataSkyLight = nullptr;
}
Block &Section::GetBlock(Vector pos) {
- return m_blocks[pos.y * 256 + pos.z * 16 + pos.x];
+ return blocks[pos.y * 256 + pos.z * 16 + pos.x];
+}
+
+Block Section::GetBlock(Vector pos) const
+{
+ return blocks[pos.y * 256 + pos.z * 16 + pos.x];
}
double totalParsingTime = 0;
-void Section::Parse() {
- if (!m_blocks.empty())
- return;
-
- long long *longArray = reinterpret_cast<long long *>(m_dataBlocks);
- for (size_t i = 0; i < m_dataBlocksLen / 8; i++)
- endswap(&longArray[i]);
- std::vector<unsigned short> blocks;
- blocks.reserve(4096);
- {
- auto begin = std::chrono::steady_clock::now();
- int bitPos = 0;
- unsigned short t = 0;
- for (size_t i = 0; i < m_dataBlocksLen; i++) {
- for (int j = 0; j < 8; j++) {
- t |= (m_dataBlocks[i] & 0x01) ? 0x80 : 0x00;
- t >>= 1;
- m_dataBlocks[i] >>= 1;
- bitPos++;
- if (bitPos >= m_bitsPerBlock) {
- bitPos = 0;
- t >>= m_bitsPerBlock - 1;
- blocks.push_back(t);
- t = 0;
- }
- }
- }
- auto end = std::chrono::steady_clock::now();
- std::chrono::duration<double, std::milli> time = end - begin;
- totalParsingTime += time.count();
- }
- std::vector<byte> light;
- light.reserve(4096);
- for (int i = 0; i < 2048; i++) {
- byte t = m_dataLight[i];
- byte first = t & 0b11110000;
- byte second = t >> 4;
- light.push_back(first);
- light.push_back(second);
- }
- for (int i = 0; i < 4096; i++) {
- unsigned short blockId = m_palette.size() > 0 ? m_palette[blocks[i]] : blocks[i];
- Block block(blockId >> 4, blockId & 0xF);
- m_blocks.push_back(block);
- }
- delete[] m_dataBlocks;
- m_dataBlocksLen = 0;
- m_dataBlocks = nullptr;
- delete[] m_dataLight;
- m_dataLight = nullptr;
- delete[] m_dataSkyLight;
- m_dataSkyLight = nullptr;
-
- parseWaiter.notify_all();
+//void Section::Parse() {
+// if (!m_blocks.empty())
+// return;
+//
+// long long *longArray = reinterpret_cast<long long *>(m_dataBlocks);
+// for (size_t i = 0; i < m_dataBlocksLen / 8; i++)
+// endswap(&longArray[i]);
+// std::vector<unsigned short> blocks;
+// blocks.reserve(4096);
+// {
+// auto begin = std::chrono::steady_clock::now();
+// int bitPos = 0;
+// unsigned short t = 0;
+// for (size_t i = 0; i < m_dataBlocksLen; i++) {
+// for (int j = 0; j < 8; j++) {
+// t |= (m_dataBlocks[i] & 0x01) ? 0x80 : 0x00;
+// t >>= 1;
+// m_dataBlocks[i] >>= 1;
+// bitPos++;
+// if (bitPos >= m_bitsPerBlock) {
+// bitPos = 0;
+// t >>= m_bitsPerBlock - 1;
+// blocks.push_back(t);
+// t = 0;
+// }
+// }
+// }
+// auto end = std::chrono::steady_clock::now();
+// std::chrono::duration<double, std::milli> time = end - begin;
+// totalParsingTime += time.count();
+// }
+// std::vector<byte> light;
+// light.reserve(4096);
+// for (int i = 0; i < 2048; i++) {
+// byte t = m_dataLight[i];
+// byte first = t & 0b11110000;
+// byte second = t >> 4;
+// light.push_back(first);
+// light.push_back(second);
+// }
+// for (int i = 0; i < 4096; i++) {
+// unsigned short blockId = m_palette.size() > 0 ? m_palette[blocks[i]] : blocks[i];
+// Block block(blockId >> 4, blockId & 0xF);
+// m_blocks.push_back(block);
+// }
+// delete[] m_dataBlocks;
+// m_dataBlocksLen = 0;
+// m_dataBlocks = nullptr;
+// delete[] m_dataLight;
+// m_dataLight = nullptr;
+// delete[] m_dataSkyLight;
+// m_dataSkyLight = nullptr;
+//
+// parseWaiter.notify_all();
+//}
+
+Section::Section(PackedSection data)
+{
+ worldPosition = data.position;
+
+ long long *longArray = reinterpret_cast<long long *>(data.blocks.data());
+ for (size_t i = 0; i < data.blocks.size() / 8; i++)
+ endswap(&longArray[i]);
+ std::vector<unsigned short> blocks;
+ blocks.reserve(4096);
+ {
+ auto begin = std::chrono::steady_clock::now();
+ int bitPos = 0;
+ unsigned short t = 0;
+ for (size_t i = 0; i < data.blocks.size(); i++) {
+ for (int j = 0; j < 8; j++) {
+ t |= (data.blocks.data()[i] & 0x01) ? 0x80 : 0x00;
+ t >>= 1;
+ data.blocks.data()[i] >>= 1;
+ bitPos++;
+ if (bitPos >= data.bitsPerBlock) {
+ bitPos = 0;
+ t >>= data.bitsPerBlock - 1;
+ blocks.push_back(t);
+ t = 0;
+ }
+ }
+ }
+ auto end = std::chrono::steady_clock::now();
+ std::chrono::duration<double, std::milli> time = end - begin;
+ totalParsingTime += time.count();
+ }
+ std::vector<byte> light;
+ light.reserve(4096);
+ for (int i = 0; i < 2048; i++) {
+ byte t = data.light[i];
+ byte first = t & 0b11110000;
+ byte second = t >> 4;
+ light.push_back(first);
+ light.push_back(second);
+ }
+ for (int i = 0; i < 4096; i++) {
+ unsigned short blockId = data.palette.size() > 0 ? data.palette[blocks[i]] : blocks[i];
+ Block block(blockId >> 4, blockId & 0xF);
+ this->blocks.push_back(block);
+ }
}
Section &Section::operator=(Section other) {
@@ -101,47 +124,42 @@ Section &Section::operator=(Section other) {
void swap(Section &a, Section &b) {
using std::swap;
- swap(a.m_dataBlocksLen, b.m_dataBlocksLen);
- swap(a.m_dataBlocks, b.m_dataBlocks);
- swap(a.m_dataLight, b.m_dataLight);
- swap(a.m_dataSkyLight, b.m_dataSkyLight);
- swap(a.m_blocks, b.m_blocks);
- swap(a.m_palette, b.m_palette);
- swap(a.m_bitsPerBlock, b.m_bitsPerBlock);
+ swap(a.blocks, b.blocks);
}
Section::Section(const Section &other) {
- worldPosition = other.worldPosition;
- m_dataBlocksLen = other.m_dataBlocksLen;
- if (other.m_blocks.empty()) {
- m_dataBlocks = new byte[m_dataBlocksLen];
- std::copy(other.m_dataBlocks, other.m_dataBlocks + m_dataBlocksLen, m_dataBlocks);
-
- m_dataLight = new byte[2048];
- std::copy(other.m_dataLight, other.m_dataLight + 2048, m_dataLight);
-
- if (other.m_dataSkyLight) {
- m_dataSkyLight = new byte[2048];
- std::copy(other.m_dataSkyLight, other.m_dataSkyLight + 2048, m_dataSkyLight);
- }
- } else {
- std::copy(other.m_blocks.begin(), other.m_blocks.end(), std::back_inserter(m_blocks));
- }
-
- m_palette = other.m_palette;
- m_bitsPerBlock = other.m_bitsPerBlock;
+ worldPosition = other.worldPosition;
+ this->blocks = other.blocks;
+ //std::copy(other.blocks.begin(), other.blocks.end(), std::back_inserter(blocks));
}
-Vector Section::GetPosition() {
+Vector Section::GetPosition() const {
return worldPosition;
}
-size_t Section::GetHash() {
- if (m_blocks.empty()) return 0;
+size_t Section::GetHash() const {
+ if (blocks.empty()) return 0;
- unsigned char *from = reinterpret_cast<unsigned char *>(m_blocks.data());
- size_t length = m_blocks.size() * sizeof(Block);
+ const unsigned char *from = reinterpret_cast<const unsigned char *>(blocks.data());
+ size_t length = blocks.size() * sizeof(Block);
std::string str(from, from + length);
return std::hash<std::string>{}(str);
-} \ No newline at end of file
+}
+
+PackedSection::PackedSection(Vector position, byte * dataBlocks, size_t dataBlocksLength, byte * dataLight, byte * dataSky, byte bitsPerBlock, std::vector<unsigned short> palette)
+{
+ this->position = position;
+
+ this->palette = palette;
+
+ this->bitsPerBlock = bitsPerBlock;
+
+ blocks.assign(dataBlocks, dataBlocks + dataBlocksLength);
+
+ light.assign(dataLight, dataLight + 2048);
+
+ if (dataSky != nullptr) {
+ sky.assign(dataSky, dataSky + 2048);
+ }
+}