plugify 1.2.8
Loading...
Searching...
No Matches
numerics.hpp
1#pragma once
2
3#include "plg/config.hpp"
4
5namespace plg {
6 PLUGIFY_WARN_PUSH()
7
8#if PLUGIFY_COMPILER_CLANG
9 PLUGIFY_WARN_IGNORE("-Wgnu-anonymous-struct")
10 PLUGIFY_WARN_IGNORE("-Wnested-anon-types")
11#elif PLUGIFY_COMPILER_GCC
12 PLUGIFY_WARN_IGNORE("-Wpedantic")
13#elif PLUGIFY_COMPILER_MSVC
14 PLUGIFY_WARN_IGNORE(4201)
15#endif
16
17 extern "C" {
18 struct vec2 {
19 union {
20 struct {
21 float x;
22 float y;
23 };
24 float data[2];
25 };
26 };
27
28 struct vec3 {
29 union {
30 struct {
31 float x;
32 float y;
33 float z;
34 };
35 float data[3];
36 };
37 };
38
39 struct vec4 {
40 union {
41 struct {
42 float x;
43 float y;
44 float z;
45 float w;
46 };
47 float data[4];
48 };
49 };
50
51 struct mat4x4 {
52 union {
53 struct {
54 float m00, m01, m02, m03;
55 float m10, m11, m12, m13;
56 float m20, m21, m22, m23;
57 float m30, m31, m32, m33;
58 };
59 float m[4][4];
60 float data[16];
61 };
62 };
63 }
64
65 PLUGIFY_WARN_POP()
66
67 constexpr float epsilon = 1e-5f;
68
69 // TODO: Replace by std::fabs in C++23
70 constexpr float fabs(float x) noexcept {
71 return x < 0 ? -x : x;
72 }
73
74 constexpr bool operator==(vec2 lhs, vec2 rhs) {
75 return fabs(lhs.x - rhs.x) < epsilon && fabs(lhs.y - rhs.y) < epsilon;
76 }
77
78 constexpr bool operator==(vec3 lhs, vec3 rhs) {
79 return fabs(lhs.x - rhs.x) < epsilon && fabs(lhs.y - rhs.y) < epsilon && fabs(lhs.z - rhs.z) < epsilon;
80 }
81
82 constexpr bool operator==(vec4 lhs, vec4 rhs) {
83 return fabs(lhs.x - rhs.x) < epsilon && fabs(lhs.y - rhs.y) < epsilon && fabs(lhs.z - rhs.z) < epsilon && fabs(lhs.w - rhs.w) < epsilon;
84 }
85
86 constexpr bool operator==(const mat4x4& lhs, const mat4x4& rhs) {
87 for (int i = 0; i < 16; ++i) {
88 if (fabs(lhs.data[i] - rhs.data[i]) > epsilon)
89 return false;
90 }
91 return true;
92 }
93} // namespace plg