summaryrefslogblamecommitdiffstats
path: root/src/Section.cpp
blob: 3fb100f2456a89f53577a20fe6b83d5b5615de73 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12

                      
                     


                                      





                                                        



                            




































































































                                                                                                 








                                            
                                 


                                        


                                                                                          

 
                                     


                             

                                     
 

                                                                                           


                                             

















                                                                                                                                                                                   
#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<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) {
	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<const unsigned char *>(blocks.data());
	size_t length = blocks.size() * sizeof(Block);

	std::string str(from, from + length);
	return std::hash<std::string>{}(str);
}

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);
    }
}