R-Type 0.1
Loading...
Searching...
No Matches
Position.hpp
1#pragma once
2
3#include <cmath>
4#include <cstdint>
5#include <limits>
6#include <numbers>
7
8#include "BigEndian.hpp"
9
10namespace rtype::protocol {
17inline constexpr float POSITION_SCALE = 4.0f;
19inline constexpr float POSITION_OFFSET = 8192.0f;
21inline constexpr float MIN_POSITION = -POSITION_OFFSET;
23inline constexpr float MAX_POSITION =
24 static_cast<float>(std::numeric_limits<std::uint16_t>::max()) /
27
33inline be16 encodePosition(float position) {
34 if (!std::isfinite(position))
35 position = 0.0f;
36 if (position < MIN_POSITION)
37 position = MIN_POSITION;
38 if (position > MAX_POSITION)
39 position = MAX_POSITION;
40
41 return static_cast<std::uint16_t>(
42 std::lround((position + POSITION_OFFSET) * POSITION_SCALE));
43}
44
50inline float decodePosition(be16 encoded) {
51 return static_cast<float>(encoded.get()) / POSITION_SCALE - POSITION_OFFSET;
52}
53
59inline be16 encodeRotation(float radians) {
60 constexpr float turn = 2.0f * std::numbers::pi_v<float>;
61
62 if (!std::isfinite(radians))
63 radians = 0.0f;
64
65 float turns = std::fmod(radians, turn) / turn;
66 if (turns < 0.0f)
67 turns += 1.0f;
68
69 return static_cast<std::uint16_t>(std::lround(turns * 65536.0f) & 0xFFFF);
70}
71
77inline float decodeRotation(be16 encoded) {
78 return static_cast<float>(encoded.get()) / 65536.0f * 2.0f *
79 std::numbers::pi_v<float>;
80}
81
83} // namespace rtype::protocol
float decodePosition(be16 encoded)
Decodes a position encoded by encodePosition().
Definition Position.hpp:50
constexpr float MIN_POSITION
Smallest position that can be encoded, in pixels.
Definition Position.hpp:21
float decodeRotation(be16 encoded)
Decodes an angle encoded by encodeRotation().
Definition Position.hpp:77
constexpr float MAX_POSITION
Largest position that can be encoded, in pixels.
Definition Position.hpp:23
constexpr float POSITION_OFFSET
Offset added before encoding so that negative positions fit.
Definition Position.hpp:19
be16 encodePosition(float position)
Encodes a position as a 16-bit fixed point value.
Definition Position.hpp:33
constexpr float POSITION_SCALE
Number of encoded steps per pixel, giving a 0.25 pixel resolution.
Definition Position.hpp:17
be16 encodeRotation(float radians)
Encodes an angle as a fraction of a full turn on 16 bits.
Definition Position.hpp:59
constexpr T get() const
Returns the value in host byte order.
Definition BigEndian.hpp:76