Monado OpenXR Runtime
Loading...
Searching...
No Matches
m_vec2.h
Go to the documentation of this file.
1// Copyright 2019, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief C vec2 math library.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 *
8 * @see xrt_vec2
9 * @ingroup aux_math
10 */
11
12#pragma once
13
14#include "xrt/xrt_defines.h"
15
16#include "m_mathinclude.h"
17#include "m_api.h"
18
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24
25static inline struct xrt_vec2
26m_vec2_mul(struct xrt_vec2 l, struct xrt_vec2 r)
27{
28 struct xrt_vec2 ret = {l.x * r.x, l.y * r.y};
29 return ret;
30}
31
32static inline struct xrt_vec2
33m_vec2_mul_scalar(struct xrt_vec2 l, float r)
34{
35 struct xrt_vec2 ret = {l.x * r, l.y * r};
36 return ret;
37}
38
39static inline struct xrt_vec2
40m_vec2_add(struct xrt_vec2 l, struct xrt_vec2 r)
41{
42 struct xrt_vec2 ret = {l.x + r.x, l.y + r.y};
43 return ret;
44}
45
46static inline struct xrt_vec2
47m_vec2_add_scalar(struct xrt_vec2 l, float r)
48{
49 struct xrt_vec2 ret = {l.x + r, l.y + r};
50 return ret;
51}
52
53static inline struct xrt_vec2
54m_vec2_sub(struct xrt_vec2 l, struct xrt_vec2 r)
55{
56 struct xrt_vec2 ret = {l.x - r.x, l.y - r.y};
57 return ret;
58}
59
60static inline struct xrt_vec2
61m_vec2_sub_scalar(struct xrt_vec2 l, float r)
62{
63 struct xrt_vec2 ret = {l.x - r, l.y - r};
64 return ret;
65}
66
67static inline struct xrt_vec2
68m_vec2_div(struct xrt_vec2 l, struct xrt_vec2 r)
69{
70 struct xrt_vec2 ret = {l.x / r.x, l.y / r.y};
71 return ret;
72}
73
74static inline struct xrt_vec2
75m_vec2_div_scalar(struct xrt_vec2 l, float r)
76{
77 struct xrt_vec2 ret = {l.x / r, l.y / r};
78 return ret;
79}
80
81static inline float
82m_vec2_len_sqrd(struct xrt_vec2 l)
83{
84 return l.x * l.x + l.y * l.y;
85}
86
87
88static inline float
89m_vec2_len(struct xrt_vec2 l)
90{
91 return sqrtf(m_vec2_len_sqrd(l));
92}
93
94static inline void
95m_vec2_normalize(struct xrt_vec2 *inout)
96{
97 *inout = m_vec2_div_scalar(*inout, m_vec2_len(*inout));
98}
99
100static inline float
101m_vec2_cross(struct xrt_vec2 l, struct xrt_vec2 r)
102{
103 return l.x * r.y - r.x * l.y;
104}
105
106static inline float
107m_vec2_dot(struct xrt_vec2 l, struct xrt_vec2 r)
108{
109 return l.x * r.x + l.y * r.y;
110}
111
112static inline struct xrt_vec2
113m_vec2_lerp(struct xrt_vec2 from, struct xrt_vec2 to, float amount)
114{
115 // Recommend amount being in [0,1]
116 return m_vec2_add(m_vec2_mul_scalar(from, 1.0f - amount), m_vec2_mul_scalar(to, amount));
117}
118
119static inline struct xrt_vec2
120m_vec2_clamp_scalar(struct xrt_vec2 in, float min, float max)
121{
122 return XRT_C11_COMPOUND(struct xrt_vec2){
123 .x = CLAMP(in.x, min, max),
124 .y = CLAMP(in.y, min, max),
125 };
126}
127
128typedef float m_vec2_float_arr[2];
129
130static inline m_vec2_float_arr *
131m_vec2_ptr_to_float_arr_ptr(struct xrt_vec2 *ptr)
132{
133 return (m_vec2_float_arr *)ptr;
134}
135
136
137#ifdef __cplusplus
138}
139
140
141static inline struct xrt_vec2
142operator+(const struct xrt_vec2 &a, const struct xrt_vec2 &b)
143{
144 return m_vec2_add(a, b);
145}
146
147static inline struct xrt_vec2
148operator-(const struct xrt_vec2 &a, const struct xrt_vec2 &b)
149{
150 return m_vec2_sub(a, b);
151}
152
153static inline struct xrt_vec2 // Until clang-format-11 is on the CI.
154operator*(const struct xrt_vec2 &a, const struct xrt_vec2 &b)
155{
156 return m_vec2_mul(a, b);
157}
158
159static inline struct xrt_vec2
160operator/(const struct xrt_vec2 &a, const struct xrt_vec2 &b)
161{
162 return m_vec2_div(a, b);
163}
164
165static inline void
166operator+=(struct xrt_vec2 &a, const struct xrt_vec2 &b)
167{
168 a = a + b;
169}
170
171static inline void
172operator-=(struct xrt_vec2 &a, const struct xrt_vec2 &b)
173{
174 a = a - b;
175}
176
177static inline void
178operator*=(struct xrt_vec2 &a, const struct xrt_vec2 &b)
179{
180 a = a * b;
181}
182
183static inline void
184operator/=(struct xrt_vec2 &a, const struct xrt_vec2 &b)
185{
186 a = a / b;
187}
188
189
190#endif
#define CLAMP(X, A, B)
X clamped to the range [A, B].
Definition m_api.h:78
C interface to math library.
Wrapper header for <math.h> to ensure pi-related math constants are defined.
A 2 element vector with single floats.
Definition xrt_defines.h:268
Common defines and enums for XRT.