7#include "geometry_common.h"
36 static constexpr auto direction_count = 8;
44 static constexpr const int direction_value[] = { 1, 1, 0, -1, -1, -1, 0, 1 };
47 constexpr direction operator+(direction dir,
int d) {
return (direction)((
int(dir) +
d) % 8); }
48 constexpr direction operator-(direction dir,
int d) {
return (direction)((
int(dir) + (8 + (
d % 8))) % 8); }
50 constexpr direction& operator++(direction& dir) {
return dir = dir + 1; }
51 constexpr direction& operator--(direction& dir) {
return dir = dir + 7; }
53 constexpr direction operator++(direction& dir,
int) {
auto res = dir; ++dir;
return res; }
54 constexpr direction operator--(direction& dir,
int) {
auto res = dir; --dir;
return res; }
56 constexpr direction opposite(direction dir) {
return dir + 4; }
57 constexpr direction next_cardinal(direction dir) {
return direction(
int(dir) & (~1)) + 2; }
58 constexpr direction prev_cardinal(direction dir) {
return direction(
int(dir) & (~1)) + 6; }
60 constexpr inline static direction_set all_cardinal_directions{ direction::left, direction::right, direction::up, direction::down };
61 constexpr inline static direction_set all_diagonal_directions{ direction::left_up, direction::right_up, direction::right_down, direction::left_down };
62 constexpr inline static direction_set all_directions{ direction::left, direction::right, direction::up, direction::down, direction::left_up, direction::right_up, direction::right_down, direction::left_down };
64 constexpr bool is_valid(direction dir) {
return int(dir) >= 0 &&
int(dir) <= 7; }
65 constexpr bool is_cardinal(direction dir) {
return (
int(dir) & 1) == 0; }
66 constexpr bool is_diagonal(direction dir) {
return (
int(dir) & 1) != 0; }
68 constexpr int horizontal(direction dir) {
return detail::direction_value[(
int)dir]; }
69 constexpr int vertical(direction dir) {
return detail::direction_value[
int(dir + 6)]; }
71 constexpr degrees to_angle(direction
val)
73 return degrees{ (
float(
val) * 45.0f) };
80 constexpr glm::ivec2 to_ivec(direction
val) {
return { horizontal(
val), vertical(
val) }; }
81 constexpr glm::vec2 to_vec(direction
val) {
const glm::vec2
d = to_ivec(
val);
return is_diagonal(
val) ?
d * std::numbers::sqrt2_v<float> :
d; }
89 inline direction to_direction(degrees
angle)
91 return direction(
int(glm::mod(
angle.get() + (45.0 / 2.0), 360.0) / 45.0) % 8);
94 inline direction to_direction(glm::vec2
val);
95 inline direction to_direction(glm::ivec2 vec)
97 constexpr const int vec_value[] = { 5, 6, 7, 4, -1, 0, 3, 2, 1 };
98 return (direction)
vec_value[glm::sign(vec.x) + glm::sign(vec.y) * 3 + 4];
align
Represents an alignment in both axes (horizontal and veritcal)
constexpr auto bit_count
Equal to the number of bits in the type.
The below code is based on Sun's libm library code, which is licensed under the following license:
enum_flags< direction, uint8_t > direction_set
TODO: names, compass name.
A (constexpr) value struct that represents a set of bits mapped to an enum (implemented as a bitset)