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