1 /*
2 * Copyright (c), Recep Aslantas.
3 *
4 * MIT License (MIT), http://opensource.org/licenses/MIT
5 * Full license can be found in the LICENSE file
6 */
7
8 /*
9 Functions:
10 CGLM_INLINE void glm_vec2_fill(vec2 v, float val)
11 CGLM_INLINE bool glm_vec2_eq(vec2 v, float val);
12 CGLM_INLINE bool glm_vec2_eq_eps(vec2 v, float val);
13 CGLM_INLINE bool glm_vec2_eq_all(vec2 v);
14 CGLM_INLINE bool glm_vec2_eqv(vec2 a, vec2 b);
15 CGLM_INLINE bool glm_vec2_eqv_eps(vec2 a, vec2 b);
16 CGLM_INLINE float glm_vec2_max(vec2 v);
17 CGLM_INLINE float glm_vec2_min(vec2 v);
18 CGLM_INLINE bool glm_vec2_isnan(vec2 v);
19 CGLM_INLINE bool glm_vec2_isinf(vec2 v);
20 CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
21 CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
22 CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
23 */
24
25 #ifndef cglm_vec2_ext_h
26 #define cglm_vec2_ext_h
27
28 #include "common.h"
29 #include "util.h"
30
31 /*!
32 * @brief fill a vector with specified value
33 *
34 * @param[out] v dest
35 * @param[in] val value
36 */
37 CGLM_INLINE
38 void
glm_vec2_fill(vec2 v,float val)39 glm_vec2_fill(vec2 v, float val) {
40 v[0] = v[1] = val;
41 }
42
43 /*!
44 * @brief check if vector is equal to value (without epsilon)
45 *
46 * @param[in] v vector
47 * @param[in] val value
48 */
49 CGLM_INLINE
50 bool
glm_vec2_eq(vec2 v,float val)51 glm_vec2_eq(vec2 v, float val) {
52 return v[0] == val && v[0] == v[1];
53 }
54
55 /*!
56 * @brief check if vector is equal to value (with epsilon)
57 *
58 * @param[in] v vector
59 * @param[in] val value
60 */
61 CGLM_INLINE
62 bool
glm_vec2_eq_eps(vec2 v,float val)63 glm_vec2_eq_eps(vec2 v, float val) {
64 return fabsf(v[0] - val) <= GLM_FLT_EPSILON
65 && fabsf(v[1] - val) <= GLM_FLT_EPSILON;
66 }
67
68 /*!
69 * @brief check if vectors members are equal (without epsilon)
70 *
71 * @param[in] v vector
72 */
73 CGLM_INLINE
74 bool
glm_vec2_eq_all(vec2 v)75 glm_vec2_eq_all(vec2 v) {
76 return glm_vec2_eq_eps(v, v[0]);
77 }
78
79 /*!
80 * @brief check if vector is equal to another (without epsilon)
81 *
82 * @param[in] a vector
83 * @param[in] b vector
84 */
85 CGLM_INLINE
86 bool
glm_vec2_eqv(vec2 a,vec2 b)87 glm_vec2_eqv(vec2 a, vec2 b) {
88 return a[0] == b[0] && a[1] == b[1];
89 }
90
91 /*!
92 * @brief check if vector is equal to another (with epsilon)
93 *
94 * @param[in] a vector
95 * @param[in] b vector
96 */
97 CGLM_INLINE
98 bool
glm_vec2_eqv_eps(vec2 a,vec2 b)99 glm_vec2_eqv_eps(vec2 a, vec2 b) {
100 return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
101 && fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON;
102 }
103
104 /*!
105 * @brief max value of vector
106 *
107 * @param[in] v vector
108 */
109 CGLM_INLINE
110 float
glm_vec2_max(vec2 v)111 glm_vec2_max(vec2 v) {
112 return glm_max(v[0], v[1]);
113 }
114
115 /*!
116 * @brief min value of vector
117 *
118 * @param[in] v vector
119 */
120 CGLM_INLINE
121 float
glm_vec2_min(vec2 v)122 glm_vec2_min(vec2 v) {
123 return glm_min(v[0], v[1]);
124 }
125
126 /*!
127 * @brief check if all items are NaN (not a number)
128 * you should only use this in DEBUG mode or very critical asserts
129 *
130 * @param[in] v vector
131 */
132 CGLM_INLINE
133 bool
glm_vec2_isnan(vec2 v)134 glm_vec2_isnan(vec2 v) {
135 return isnan(v[0]) || isnan(v[1]);
136 }
137
138 /*!
139 * @brief check if all items are INFINITY
140 * you should only use this in DEBUG mode or very critical asserts
141 *
142 * @param[in] v vector
143 */
144 CGLM_INLINE
145 bool
glm_vec2_isinf(vec2 v)146 glm_vec2_isinf(vec2 v) {
147 return isinf(v[0]) || isinf(v[1]);
148 }
149
150 /*!
151 * @brief check if all items are valid number
152 * you should only use this in DEBUG mode or very critical asserts
153 *
154 * @param[in] v vector
155 */
156 CGLM_INLINE
157 bool
glm_vec2_isvalid(vec2 v)158 glm_vec2_isvalid(vec2 v) {
159 return !glm_vec2_isnan(v) && !glm_vec2_isinf(v);
160 }
161
162 /*!
163 * @brief get sign of 32 bit float as +1, -1, 0
164 *
165 * Important: It returns 0 for zero/NaN input
166 *
167 * @param v vector
168 */
169 CGLM_INLINE
170 void
glm_vec2_sign(vec2 v,vec2 dest)171 glm_vec2_sign(vec2 v, vec2 dest) {
172 dest[0] = glm_signf(v[0]);
173 dest[1] = glm_signf(v[1]);
174 }
175
176 /*!
177 * @brief square root of each vector item
178 *
179 * @param[in] v vector
180 * @param[out] dest destination vector
181 */
182 CGLM_INLINE
183 void
glm_vec2_sqrt(vec2 v,vec2 dest)184 glm_vec2_sqrt(vec2 v, vec2 dest) {
185 dest[0] = sqrtf(v[0]);
186 dest[1] = sqrtf(v[1]);
187 }
188
189 #endif /* cglm_vec2_ext_h */
190