blob: 3fc37504804754ecbbeb24772697daff924bbd84 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
// SPDX-License-Identifier: BSD-2-Clause
// Copyright (c) 2025 Kirill Dmitrievich
// File: chunk_quad.hh
// Description: Packed quad vertex format
#ifndef CLIENT_WORLD_CHUNK_QUAD_HH
#define CLIENT_WORLD_CHUNK_QUAD_HH
#pragma once
#include "core/math/constexpr.hh"
#include "shared/world/voxel_registry.hh"
// [0] XXXXXXXXYYYYYYYYZZZZZZZZWWWWHHHH
// [1] FFFFTTTTTTTTTTTAAAAA------------
using ChunkQuad = std::array<std::uint32_t, 2>;
constexpr inline static ChunkQuad make_chunk_quad(const glm::fvec3& position, const glm::fvec2& size, VoxelFace face, std::size_t texture,
std::size_t frames)
{
ChunkQuad result = {};
result[0] = 0x00000000;
result[1] = 0x00000000;
// [0] XXXXXXXXYYYYYYYYZZZZZZZZ--------
result[0] |= (0x000000FFU & static_cast<std::uint32_t>(position.x * 16.0f)) << 24U;
result[0] |= (0x000000FFU & static_cast<std::uint32_t>(position.y * 16.0f)) << 16U;
result[0] |= (0x000000FFU & static_cast<std::uint32_t>(position.z * 16.0f)) << 8U;
// [0] ------------------------WWWWHHHH
result[0] |= (0x0000000FU & static_cast<std::uint32_t>(size.x * 16.0f - 1.0f)) << 4U;
result[0] |= (0x0000000FU & static_cast<std::uint32_t>(size.y * 16.0f - 1.0f));
// [1] FFFF----------------------------
result[1] |= (0x0000000FU & static_cast<std::uint32_t>(face)) << 28U;
// [1] ----TTTTTTTTTTTAAAAA------------
result[1] |= (0x000007FFU & static_cast<std::uint32_t>(texture)) << 17U;
result[1] |= (0x0000001FU & static_cast<std::uint32_t>(frames)) << 12U;
return result;
}
#endif
|