Monado OpenXR Runtime
m_vec3.h
Go to the documentation of this file.
1 // Copyright 2019-2021, Collabora, Ltd.
2 // Copyright 2020, Nova King.
3 // SPDX-License-Identifier: BSL-1.0
4 /*!
5  * @file
6  * @brief C vec3 math library.
7  * @author Jakob Bornecrantz <jakob@collabora.com>
8  * @author Nova King <technobaboo@gmail.com>
9  * @author Moses Turner <moses@collabora.com>>
10  *
11  * @see xrt_vec3
12  * @ingroup aux_math
13  */
14 
15 #pragma once
16 
17 #include "xrt/xrt_defines.h"
18 
19 #include "m_mathinclude.h"
20 #include <float.h>
21 
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 
28 static inline struct xrt_vec3
29 m_vec3_mul(struct xrt_vec3 l, struct xrt_vec3 r)
30 {
31  struct xrt_vec3 ret = {l.x * r.x, l.y * r.y, l.z * r.z};
32  return ret;
33 }
34 
35 static inline struct xrt_vec3
36 m_vec3_mul_scalar(struct xrt_vec3 l, float r)
37 {
38  struct xrt_vec3 ret = {l.x * r, l.y * r, l.z * r};
39  return ret;
40 }
41 
42 static inline struct xrt_vec3
43 m_vec3_add(struct xrt_vec3 l, struct xrt_vec3 r)
44 {
45  struct xrt_vec3 ret = {l.x + r.x, l.y + r.y, l.z + r.z};
46  return ret;
47 }
48 
49 static inline struct xrt_vec3
50 m_vec3_sub(struct xrt_vec3 l, struct xrt_vec3 r)
51 {
52  struct xrt_vec3 ret = {l.x - r.x, l.y - r.y, l.z - r.z};
53  return ret;
54 }
55 
56 static inline struct xrt_vec3
57 m_vec3_div(struct xrt_vec3 l, struct xrt_vec3 r)
58 {
59  struct xrt_vec3 ret = {l.x / r.x, l.y / r.y, l.z / r.z};
60  return ret;
61 }
62 
63 static inline struct xrt_vec3
64 m_vec3_div_scalar(struct xrt_vec3 l, float r)
65 {
66  struct xrt_vec3 ret = {l.x / r, l.y / r, l.z / r};
67  return ret;
68 }
69 
70 static inline float
71 m_vec3_dot(struct xrt_vec3 l, struct xrt_vec3 r)
72 {
73  return l.x * r.x + l.y * r.y + l.z * r.z;
74 }
75 
76 static inline float
77 m_vec3_len_sqrd(struct xrt_vec3 l)
78 {
79  return m_vec3_dot(l, l);
80 }
81 
82 static inline float
83 m_vec3_len(struct xrt_vec3 l)
84 {
85  return sqrtf(m_vec3_len_sqrd(l));
86 }
87 
88 static inline struct xrt_vec3
89 m_vec3_normalize(struct xrt_vec3 l)
90 {
91  float len = m_vec3_len(l);
92  if (len <= FLT_EPSILON) {
93  return l;
94  }
95 
96  struct xrt_vec3 ret = {
97  l.x / len,
98  l.y / len,
99  l.z / len,
100  };
101  return ret;
102 }
103 
104 static inline float
105 m_vec3_angle(struct xrt_vec3 l, struct xrt_vec3 r)
106 {
107  float dot = m_vec3_dot(l, r);
108  float lengths = m_vec3_len_sqrd(l) * m_vec3_len_sqrd(r);
109 
110  if (lengths == 0) {
111  return 0;
112  }
113  lengths = sqrtf(lengths);
114 
115  return acosf(dot / lengths);
116 }
117 
118 static inline struct xrt_vec3
119 m_vec3_project(struct xrt_vec3 project_this, struct xrt_vec3 onto_this)
120 {
121 
122  float amnt = (m_vec3_dot(project_this, onto_this) / m_vec3_len_sqrd(onto_this));
123 
124  return m_vec3_mul_scalar(onto_this, amnt);
125 }
126 
127 static inline struct xrt_vec3
128 m_vec3_orthonormalize(struct xrt_vec3 leave_this_alone, struct xrt_vec3 change_this_one)
129 {
130  return m_vec3_normalize(m_vec3_sub(change_this_one, m_vec3_project(change_this_one, leave_this_alone)));
131 }
132 
133 static inline struct xrt_vec3
134 m_vec3_lerp(struct xrt_vec3 from, struct xrt_vec3 to, float amount)
135 {
136  // Recommend amount being in [0,1]
137  return m_vec3_add(m_vec3_mul_scalar(from, 1.0f - amount), m_vec3_mul_scalar(to, amount));
138 }
139 
140 static inline bool
141 m_vec3_equal_exact(struct xrt_vec3 l, struct xrt_vec3 r)
142 {
143  return l.x == r.x && l.y == r.y && l.z == r.z;
144 }
145 
146 typedef float m_vec3_float_arr[3];
147 
148 static inline m_vec3_float_arr *
149 m_vec3_ptr_to_float_arr_ptr(struct xrt_vec3 *ptr)
150 {
151  return (m_vec3_float_arr *)ptr;
152 }
153 
154 
155 #ifdef __cplusplus
156 }
157 
158 
159 static inline struct xrt_vec3
160 operator+(const struct xrt_vec3 &a, const struct xrt_vec3 &b)
161 {
162  return m_vec3_add(a, b);
163 }
164 
165 static inline struct xrt_vec3
166 operator-(const struct xrt_vec3 &a, const struct xrt_vec3 &b)
167 {
168  return m_vec3_sub(a, b);
169 }
170 
171 static inline struct xrt_vec3
172 operator*(const struct xrt_vec3 &a, const float &b)
173 {
174  return m_vec3_mul_scalar(a, b);
175 }
176 
177 static inline struct xrt_vec3
178 operator*(const struct xrt_vec3 &a, const struct xrt_vec3 &b)
179 {
180  return m_vec3_mul(a, b);
181 }
182 
183 static inline struct xrt_vec3
184 operator/(const struct xrt_vec3 &a, const struct xrt_vec3 &b)
185 {
186  return m_vec3_div(a, b);
187 }
188 
189 static inline struct xrt_vec3
190 operator/(const struct xrt_vec3 &a, const float &b)
191 {
192  return m_vec3_div_scalar(a, b);
193 }
194 
195 static inline void
196 operator+=(struct xrt_vec3 &a, const struct xrt_vec3 &b)
197 {
198  a = a + b;
199 }
200 
201 static inline void
202 operator-=(struct xrt_vec3 &a, const struct xrt_vec3 &b)
203 {
204  a = a - b;
205 }
206 
207 static inline void
208 operator*=(struct xrt_vec3 &a, const struct xrt_vec3 &b)
209 {
210  a = a * b;
211 }
212 
213 static inline void
214 operator*=(struct xrt_vec3 &a, const float &b)
215 {
216  a = a * b;
217 }
218 
219 static inline void
220 operator/=(struct xrt_vec3 &a, const struct xrt_vec3 &b)
221 {
222  a = a / b;
223 }
224 
225 
226 #endif
Wrapper header for <math.h> to ensure pi-related math constants are defined.
A 3 element vector with single floats.
Definition: xrt_defines.h:271
Common defines and enums for XRT.