#include "Section.hpp" Section::~Section() { } Block &Section::GetBlock(Vector pos) { 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(m_dataBlocks); // for (size_t i = 0; i < m_dataBlocksLen / 8; i++) // endswap(&longArray[i]); // std::vector 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 time = end - begin; // totalParsingTime += time.count(); // } // std::vector 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(data.blocks.data()); for (size_t i = 0; i < data.blocks.size() / 8; i++) endswap(&longArray[i]); std::vector 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 time = end - begin; totalParsingTime += time.count(); } std::vector 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) { std::swap(*this, other); return *this; } void swap(Section &a, Section &b) { using std::swap; swap(a.blocks, b.blocks); } Section::Section(const Section &other) { worldPosition = other.worldPosition; this->blocks = other.blocks; //std::copy(other.blocks.begin(), other.blocks.end(), std::back_inserter(blocks)); } Vector Section::GetPosition() const { return worldPosition; } size_t Section::GetHash() const { if (blocks.empty()) return 0; const unsigned char *from = reinterpret_cast(blocks.data()); size_t length = blocks.size() * sizeof(Block); std::string str(from, from + length); return std::hash{}(str); } PackedSection::PackedSection(Vector position, byte * dataBlocks, size_t dataBlocksLength, byte * dataLight, byte * dataSky, byte bitsPerBlock, std::vector 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); } }