Monado OpenXR Runtime
m_vec3.h
Go to the documentation of this file.
1 // Copyright 2019-2020, 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  *
10  * @see xrt_vec3
11  * @ingroup aux_math
12  */
13 
14 #pragma once
15 
16 #include "xrt/xrt_defines.h"
17 
18 #include <math.h>
19 #include <float.h>
20 
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 
27 /*!
28  * @ingroup aux_math
29  * @{
30  */
31 
32 static inline struct xrt_vec3
33 m_vec3_mul(struct xrt_vec3 l, struct xrt_vec3 r)
34 {
35  struct xrt_vec3 ret = {l.x * r.x, l.y * r.y, l.z * r.z};
36  return ret;
37 }
38 
39 static inline struct xrt_vec3
40 m_vec3_mul_scalar(struct xrt_vec3 l, float r)
41 {
42  struct xrt_vec3 ret = {l.x * r, l.y * r, l.z * r};
43  return ret;
44 }
45 
46 static inline struct xrt_vec3
47 m_vec3_add(struct xrt_vec3 l, struct xrt_vec3 r)
48 {
49  struct xrt_vec3 ret = {l.x + r.x, l.y + r.y, l.z + r.z};
50  return ret;
51 }
52 
53 static inline struct xrt_vec3
54 m_vec3_sub(struct xrt_vec3 l, struct xrt_vec3 r)
55 {
56  struct xrt_vec3 ret = {l.x - r.x, l.y - r.y, l.z - r.z};
57  return ret;
58 }
59 
60 static inline struct xrt_vec3
61 m_vec3_div(struct xrt_vec3 l, struct xrt_vec3 r)
62 {
63  struct xrt_vec3 ret = {l.x / r.x, l.y / r.y, l.z / r.z};
64  return ret;
65 }
66 
67 static inline struct xrt_vec3
68 m_vec3_div_scalar(struct xrt_vec3 l, float r)
69 {
70  struct xrt_vec3 ret = {l.x / r, l.y / r, l.z / r};
71  return ret;
72 }
73 
74 static inline float
75 m_vec3_dot(struct xrt_vec3 l, struct xrt_vec3 r)
76 {
77  return l.x * r.x + l.y * r.y + l.z * r.z;
78 }
79 
80 static inline float
81 m_vec3_len_sqrd(struct xrt_vec3 l)
82 {
83  return m_vec3_dot(l, l);
84 }
85 
86 static inline float
87 m_vec3_len(struct xrt_vec3 l)
88 {
89  return sqrtf(m_vec3_len_sqrd(l));
90 }
91 
92 static inline struct xrt_vec3
93 m_vec3_normalize(struct xrt_vec3 l)
94 {
95  float len = m_vec3_len(l);
96  if (len <= FLT_EPSILON) {
97  return l;
98  }
99 
100  return (struct xrt_vec3){
101  l.x / len,
102  l.y / len,
103  l.z / len,
104  };
105 }
106 
107 static inline float
108 m_vec3_angle(struct xrt_vec3 l, struct xrt_vec3 r)
109 {
110  float dot = m_vec3_dot(l, r);
111  float lengths = m_vec3_len_sqrd(l) * m_vec3_len_sqrd(r);
112 
113  if (lengths == 0) {
114  return 0;
115  }
116 
117  return acosf(dot / lengths);
118 }
119 
120 /*!
121  * @}
122  */
123 
124 
125 #ifdef __cplusplus
126 }
127 #endif
A 3 element vector with single floats.
Definition: xrt_defines.h:133
float z
Definition: xrt_defines.h:137
uint8_t len
Definition: vive_protocol.h:211
float y
Definition: xrt_defines.h:136
Common defines and enums for XRT.
float x
Definition: xrt_defines.h:135