summaryrefslogtreecommitdiffstats
path: root/src/game/client/chunk_quad.hh
blob: cb2c03dfc0cfb577ee18a40600b576cca29ecee9 (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
#ifndef CLIENT_CHUNK_QUAD_HH
#define CLIENT_CHUNK_QUAD_HH 1
#pragma once

#include "core/constexpr.hh"

#include "shared/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, 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;
}

#endif // CLIENT_CHUNK_QUAD_HH