From 210f651807847c290ab7ba14c64f9eff1c47284e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 24 Jul 2018 20:00:16 +0200 Subject: World: factor out Section handling to a generic interface --- src/World/Section.hpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/World/Section.hpp (limited to 'src/World/Section.hpp') diff --git a/src/World/Section.hpp b/src/World/Section.hpp new file mode 100644 index 0000000..a4686e3 --- /dev/null +++ b/src/World/Section.hpp @@ -0,0 +1,110 @@ +/* + Copyright (c) 2015-2018, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#pragma once + + +#include "../NBT/ByteArrayTag.hpp" +#include "../NBT/CompoundTag.hpp" +#include "../Resource/BlockType.hpp" + +#include +#include + + +namespace MinedMap { +namespace World { + +class Section { +public: + static const size_t SIZE = 16; + +private: + size_t Y; + std::shared_ptr blockLight; + +protected: + static size_t getIndex(size_t x, size_t y, size_t z) { + if (x >= SIZE || y >= SIZE || z >= SIZE) + throw std::range_error("Chunk::getIndex(): bad coordinates"); + + return SIZE*SIZE*y + SIZE*z + x; + } + + static uint8_t getHalf(const uint8_t *v, size_t x, size_t y, size_t z) { + size_t i = getIndex(x, y, z); + + if (i % 2) + return (v[i/2] >> 4); + else + return (v[i/2] & 0xf); + } + + Section(const std::shared_ptr §ion); + +public: + virtual ~Section() {} + + size_t getY() const { return Y; }; + + virtual const Resource::BlockType * getBlockStateAt(size_t x, size_t y, size_t z) const = 0; + + uint8_t getBlockLightAt(size_t x, size_t y, size_t z) const { + if (!blockLight) + return 0; + + return getHalf(blockLight->getValue(), x, y, z); + } + + static std::unique_ptr
makeSection(const std::shared_ptr §ion); +}; + +class LegacySection : public Section { +private: + std::shared_ptr blocks; + std::shared_ptr data; + + + uint8_t getBlockAt(size_t x, size_t y, size_t z) const { + return blocks->getValue()[getIndex(x, y, z)]; + } + + uint8_t getDataAt(size_t x, size_t y, size_t z) const { + return getHalf(data->getValue(), x, y, z); + } + +public: + LegacySection( + const std::shared_ptr §ion, + std::shared_ptr &&blocks0, + std::shared_ptr &&data0 + ) : Section(section), blocks(blocks0), data(data0) {} + + virtual const Resource::BlockType * getBlockStateAt(size_t x, size_t y, size_t z) const; +}; + +} +} -- cgit v1.2.3