// SPDX-License-Identifier: BSD-2-Clause // Copyright (c) 2025 Kirill Dmitrievich // File: voxel_storage.cc // Description: Storage for voxels in a chunk #include "shared/pch.hh" #include "shared/world/voxel_storage.hh" #include "core/io/buffer.hh" void VoxelStorage::serialize(WriteBuffer& buffer) const { auto bound = mz_compressBound(sizeof(VoxelStorage)); auto zdata = std::vector(bound); VoxelStorage net_storage; for(std::size_t i = 0; i < CHUNK_VOLUME; ++i) { // Convert voxel indices into network byte order; // We're going to compress them but we still want // the order to be consistent across all the platforms net_storage[i] = ENET_HOST_TO_NET_16(at(i)); } mz_compress(zdata.data(), &bound, reinterpret_cast(net_storage.data()), sizeof(VoxelStorage)); buffer.write(bound); // Write all the compressed data into the buffer for(std::size_t i = 0; i < bound; buffer.write(zdata[i++])) { // empty } } void VoxelStorage::deserialize(ReadBuffer& buffer) { auto size = static_cast(sizeof(VoxelStorage)); auto bound = static_cast(buffer.read()); auto zdata = std::vector(bound); // Read all the compressed data from the buffer for(std::size_t i = 0; i < bound; zdata[i++] = buffer.read()) { // empty } mz_uncompress(reinterpret_cast(data()), &size, zdata.data(), bound); for(std::size_t i = 0; i < CHUNK_VOLUME; ++i) { // Convert voxel indices back into the host byte order at(i) = ENET_NET_TO_HOST_16(at(i)); } }