summaryrefslogtreecommitdiffstats
path: root/game/client/world/chunk_quad.hh
blob: c15bb7a993b377edde8173b08d6758214a17057e (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
#pragma once

#include "core/math/constexpr.hh"

#include "shared/world/voxel_registry.hh"

namespace world
{
// [0] XXXXXXXXYYYYYYYYZZZZZZZZWWWWHHHH
// [1] FFFFTTTTTTTTTTTAAAAA------------
using ChunkQuad = std::array<std::uint32_t, 2>;
} // namespace world

namespace world
{
constexpr inline static ChunkQuad make_chunk_quad(const glm::fvec3& position, const glm::fvec2& size, voxel_facing facing,
    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>(facing)) << 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;
}
} // namespace world