ivec3.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  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. Macros:
  9. GLM_IVEC3_ONE_INIT
  10. GLM_IVEC3_ZERO_INIT
  11. GLM_IVEC3_ONE
  12. GLM_IVEC3_ZERO
  13. Functions:
  14. CGLM_INLINE void glm_ivec3(ivec4 v4, ivec3 dest)
  15. CGLM_INLINE void glm_ivec3_copy(ivec3 a, ivec3 dest)
  16. CGLM_INLINE void glm_ivec3_zero(ivec3 v)
  17. CGLM_INLINE void glm_ivec3_one(ivec3 v)
  18. CGLM_INLINE int glm_ivec3_dot(ivec3 a, ivec3 b)
  19. CGLM_INLINE int glm_ivec3_norm2(ivec3 v)
  20. CGLM_INLINE int glm_ivec3_norm(ivec3 v)
  21. CGLM_INLINE void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
  22. CGLM_INLINE void glm_ivec3_adds(ivec3 v, int s, ivec3 dest)
  23. CGLM_INLINE void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest)
  24. CGLM_INLINE void glm_ivec3_subs(ivec3 v, int s, ivec3 dest)
  25. CGLM_INLINE void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest)
  26. CGLM_INLINE void glm_ivec3_scale(ivec3 v, int s, ivec3 dest)
  27. CGLM_INLINE void glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest)
  28. CGLM_INLINE void glm_ivec3_divs(ivec3 v, int s, ivec3 dest)
  29. CGLM_INLINE void glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest)
  30. CGLM_INLINE void glm_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest)
  31. CGLM_INLINE void glm_ivec3_addadds(ivec3 a, int s, ivec3 dest)
  32. CGLM_INLINE void glm_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest)
  33. CGLM_INLINE void glm_ivec3_subadds(ivec3 a, int s, ivec3 dest)
  34. CGLM_INLINE void glm_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest)
  35. CGLM_INLINE void glm_ivec3_muladds(ivec3 a, int s, ivec3 dest)
  36. CGLM_INLINE void glm_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest)
  37. CGLM_INLINE void glm_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest)
  38. CGLM_INLINE void glm_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest)
  39. CGLM_INLINE void glm_ivec3_subsubs(ivec3 a, int s, ivec3 dest)
  40. CGLM_INLINE void glm_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest)
  41. CGLM_INLINE void glm_ivec3_addsubs(ivec3 a, int s, ivec3 dest)
  42. CGLM_INLINE void glm_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest)
  43. CGLM_INLINE void glm_ivec3_mulsubs(ivec3 a, int s, ivec3 dest)
  44. CGLM_INLINE void glm_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest)
  45. CGLM_INLINE void glm_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest)
  46. CGLM_INLINE int glm_ivec3_distance2(ivec3 a, ivec3 b)
  47. CGLM_INLINE float glm_ivec3_distance(ivec3 a, ivec3 b)
  48. CGLM_INLINE void glm_ivec3_fill(ivec3 v, int val);
  49. CGLM_INLINE bool glm_ivec3_eq(ivec3 v, int val);
  50. CGLM_INLINE bool glm_ivec3_eqv(ivec3 a, ivec3 b);
  51. CGLM_INLINE void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
  52. CGLM_INLINE void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest)
  53. CGLM_INLINE void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal)
  54. CGLM_INLINE void glm_ivec3_abs(ivec3 v, ivec3 dest)
  55. */
  56. #ifndef cglm_ivec3_h
  57. #define cglm_ivec3_h
  58. #include "common.h"
  59. #include "util.h"
  60. #define GLM_IVEC3_ONE_INIT {1, 1, 1}
  61. #define GLM_IVEC3_ZERO_INIT {0, 0, 0}
  62. #define GLM_IVEC3_ONE ((ivec3)GLM_IVEC3_ONE_INIT)
  63. #define GLM_IVEC3_ZERO ((ivec3)GLM_IVEC3_ZERO_INIT)
  64. /*!
  65. * @brief init ivec3 using ivec4
  66. *
  67. * @param[in] v4 vector4
  68. * @param[out] dest destination
  69. */
  70. CGLM_INLINE
  71. void
  72. glm_ivec3(ivec4 v4, ivec3 dest) {
  73. dest[0] = v4[0];
  74. dest[1] = v4[1];
  75. dest[2] = v4[2];
  76. }
  77. /*!
  78. * @brief copy all members of [a] to [dest]
  79. *
  80. * @param[in] a source vector
  81. * @param[out] dest destination
  82. */
  83. CGLM_INLINE
  84. void
  85. glm_ivec3_copy(ivec3 a, ivec3 dest) {
  86. dest[0] = a[0];
  87. dest[1] = a[1];
  88. dest[2] = a[2];
  89. }
  90. /*!
  91. * @brief set all members of [v] to zero
  92. *
  93. * @param[out] v vector
  94. */
  95. CGLM_INLINE
  96. void
  97. glm_ivec3_zero(ivec3 v) {
  98. v[0] = v[1] = v[2] = 0;
  99. }
  100. /*!
  101. * @brief set all members of [v] to one
  102. *
  103. * @param[out] v vector
  104. */
  105. CGLM_INLINE
  106. void
  107. glm_ivec3_one(ivec3 v) {
  108. v[0] = v[1] = v[2] = 1;
  109. }
  110. /*!
  111. * @brief ivec3 dot product
  112. *
  113. * @param[in] a vector1
  114. * @param[in] b vector2
  115. *
  116. * @return dot product
  117. */
  118. CGLM_INLINE
  119. int
  120. glm_ivec3_dot(ivec3 a, ivec3 b) {
  121. return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
  122. }
  123. /*!
  124. * @brief norm * norm (magnitude) of vec
  125. *
  126. * we can use this func instead of calling norm * norm, because it would call
  127. * sqrtf function twice but with this func we can avoid func call, maybe this is
  128. * not good name for this func
  129. *
  130. * @param[in] v vector
  131. *
  132. * @return norm * norm
  133. */
  134. CGLM_INLINE
  135. int
  136. glm_ivec3_norm2(ivec3 v) {
  137. return glm_ivec3_dot(v, v);
  138. }
  139. /*!
  140. * @brief euclidean norm (magnitude), also called L2 norm
  141. * this will give magnitude of vector in euclidean space
  142. *
  143. * @param[in] v vector
  144. *
  145. * @return norm
  146. */
  147. CGLM_INLINE
  148. int
  149. glm_ivec3_norm(ivec3 v) {
  150. return (int)sqrtf((float)glm_ivec3_norm2(v));
  151. }
  152. /*!
  153. * @brief add vector [a] to vector [b] and store result in [dest]
  154. *
  155. * @param[in] a first vector
  156. * @param[in] b second vector
  157. * @param[out] dest destination
  158. */
  159. CGLM_INLINE
  160. void
  161. glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest) {
  162. dest[0] = a[0] + b[0];
  163. dest[1] = a[1] + b[1];
  164. dest[2] = a[2] + b[2];
  165. }
  166. /*!
  167. * @brief add scalar s to vector [v] and store result in [dest]
  168. *
  169. * @param[in] v vector
  170. * @param[in] s scalar
  171. * @param[out] dest destination
  172. */
  173. CGLM_INLINE
  174. void
  175. glm_ivec3_adds(ivec3 v, int s, ivec3 dest) {
  176. dest[0] = v[0] + s;
  177. dest[1] = v[1] + s;
  178. dest[2] = v[2] + s;
  179. }
  180. /*!
  181. * @brief subtract vector [b] from vector [a] and store result in [dest]
  182. *
  183. * @param[in] a first vector
  184. * @param[in] b second vector
  185. * @param[out] dest destination
  186. */
  187. CGLM_INLINE
  188. void
  189. glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest) {
  190. dest[0] = a[0] - b[0];
  191. dest[1] = a[1] - b[1];
  192. dest[2] = a[2] - b[2];
  193. }
  194. /*!
  195. * @brief subtract scalar s from vector [v] and store result in [dest]
  196. *
  197. * @param[in] v vector
  198. * @param[in] s scalar
  199. * @param[out] dest destination
  200. */
  201. CGLM_INLINE
  202. void
  203. glm_ivec3_subs(ivec3 v, int s, ivec3 dest) {
  204. dest[0] = v[0] - s;
  205. dest[1] = v[1] - s;
  206. dest[2] = v[2] - s;
  207. }
  208. /*!
  209. * @brief multiply vector [a] with vector [b] and store result in [dest]
  210. *
  211. * @param[in] a first vector
  212. * @param[in] b second vector
  213. * @param[out] dest destination
  214. */
  215. CGLM_INLINE
  216. void
  217. glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest) {
  218. dest[0] = a[0] * b[0];
  219. dest[1] = a[1] * b[1];
  220. dest[2] = a[2] * b[2];
  221. }
  222. /*!
  223. * @brief multiply vector [a] with scalar s and store result in [dest]
  224. *
  225. * @param[in] v vector
  226. * @param[in] s scalar
  227. * @param[out] dest destination
  228. */
  229. CGLM_INLINE
  230. void
  231. glm_ivec3_scale(ivec3 v, int s, ivec3 dest) {
  232. dest[0] = v[0] * s;
  233. dest[1] = v[1] * s;
  234. dest[2] = v[2] * s;
  235. }
  236. /*!
  237. * @brief div vector with another component-wise division: d = a / b
  238. *
  239. * @param[in] a vector 1
  240. * @param[in] b vector 2
  241. * @param[out] dest result = (a[0]/b[0], a[1]/b[1], a[2]/b[2])
  242. */
  243. CGLM_INLINE
  244. void
  245. glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest) {
  246. dest[0] = a[0] / b[0];
  247. dest[1] = a[1] / b[1];
  248. dest[2] = a[2] / b[2];
  249. }
  250. /*!
  251. * @brief div vector with scalar: d = v / s
  252. *
  253. * @param[in] v vector
  254. * @param[in] s scalar
  255. * @param[out] dest result = (a[0]/s, a[1]/s, a[2]/s)
  256. */
  257. CGLM_INLINE
  258. void
  259. glm_ivec3_divs(ivec3 v, int s, ivec3 dest) {
  260. dest[0] = v[0] / s;
  261. dest[1] = v[1] / s;
  262. dest[2] = v[2] / s;
  263. }
  264. /*!
  265. * @brief Element-wise modulo operation on ivec3 vectors: dest = a % b
  266. *
  267. * Performs element-wise modulo on each component of vectors `a` and `b`.
  268. *
  269. * @param[in] a vector 1
  270. * @param[in] b vector 2
  271. * @param[out] dest result = (a[0]%b[0], a[1]%b[1], a[2]%b[2])
  272. */
  273. CGLM_INLINE
  274. void
  275. glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest) {
  276. dest[0] = a[0] % b[0];
  277. dest[1] = a[1] % b[1];
  278. dest[2] = a[2] % b[2];
  279. }
  280. /*!
  281. * @brief add vector [a] with vector [b] and add result to vector [dest]
  282. *
  283. * applies += operator so dest must be initialized
  284. *
  285. * @param[in] a first vector
  286. * @param[in] b second vector
  287. * @param[out] dest dest += (a + b)
  288. */
  289. CGLM_INLINE
  290. void
  291. glm_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest) {
  292. dest[0] += a[0] + b[0];
  293. dest[1] += a[1] + b[1];
  294. dest[2] += a[2] + b[2];
  295. }
  296. /*!
  297. * @brief add scalar [s] onto vector [a] and add result to vector [dest]
  298. *
  299. * applies += operator so dest must be initialized
  300. *
  301. * @param[in] a vector
  302. * @param[in] s scalar
  303. * @param[out] dest dest += (a + s)
  304. */
  305. CGLM_INLINE
  306. void
  307. glm_ivec3_addadds(ivec3 a, int s, ivec3 dest) {
  308. dest[0] += a[0] + s;
  309. dest[1] += a[1] + s;
  310. dest[2] += a[2] + s;
  311. }
  312. /*!
  313. * @brief subtract vector [a] from vector [b] and add result to [dest]
  314. *
  315. * applies += operator so dest must be initialized
  316. *
  317. * @param[in] a first vector
  318. * @param[in] b second vector
  319. * @param[out] dest dest += (a - b)
  320. */
  321. CGLM_INLINE
  322. void
  323. glm_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest) {
  324. dest[0] += a[0] - b[0];
  325. dest[1] += a[1] - b[1];
  326. dest[2] += a[2] - b[2];
  327. }
  328. /*!
  329. * @brief subtract scalar [s] from vector [a] and add result to [dest]
  330. *
  331. * applies += operator so dest must be initialized
  332. *
  333. * @param[in] a first
  334. * @param[in] s scalar
  335. * @param[out] dest dest += (a - s)
  336. */
  337. CGLM_INLINE
  338. void
  339. glm_ivec3_subadds(ivec3 a, int s, ivec3 dest) {
  340. dest[0] += a[0] - s;
  341. dest[1] += a[1] - s;
  342. dest[2] += a[2] - s;
  343. }
  344. /*!
  345. * @brief multiply vector [a] with vector [b] and add result to [dest]
  346. *
  347. * applies += operator so dest must be initialized
  348. *
  349. * @param[in] a first vector
  350. * @param[in] b second vector
  351. * @param[out] dest dest += (a * b)
  352. */
  353. CGLM_INLINE
  354. void
  355. glm_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest) {
  356. dest[0] += a[0] * b[0];
  357. dest[1] += a[1] * b[1];
  358. dest[2] += a[2] * b[2];
  359. }
  360. /*!
  361. * @brief multiply vector [a] with scalar [s] and add result to [dest]
  362. *
  363. * applies += operator so dest must be initialized
  364. *
  365. * @param[in] a vector
  366. * @param[in] s scalar
  367. * @param[out] dest dest += (a * s)
  368. */
  369. CGLM_INLINE
  370. void
  371. glm_ivec3_muladds(ivec3 a, int s, ivec3 dest) {
  372. dest[0] += a[0] * s;
  373. dest[1] += a[1] * s;
  374. dest[2] += a[2] * s;
  375. }
  376. /*!
  377. * @brief add maximum of vector [a] and vector [b] to vector [dest]
  378. *
  379. * applies += operator so dest must be initialized
  380. *
  381. * @param[in] a first vector
  382. * @param[in] b second vector
  383. * @param[out] dest dest += max(a, b)
  384. */
  385. CGLM_INLINE
  386. void
  387. glm_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest) {
  388. dest[0] += glm_imax(a[0], b[0]);
  389. dest[1] += glm_imax(a[1], b[1]);
  390. dest[2] += glm_imax(a[2], b[2]);
  391. }
  392. /*!
  393. * @brief add minimum of vector [a] and vector [b] to vector [dest]
  394. *
  395. * applies += operator so dest must be initialized
  396. *
  397. * @param[in] a first vector
  398. * @param[in] b second vector
  399. * @param[out] dest dest += min(a, b)
  400. */
  401. CGLM_INLINE
  402. void
  403. glm_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest) {
  404. dest[0] += glm_imin(a[0], b[0]);
  405. dest[1] += glm_imin(a[1], b[1]);
  406. dest[2] += glm_imin(a[2], b[2]);
  407. }
  408. /*!
  409. * @brief subtract vector [a] from vector [b] and subtract result from [dest]
  410. *
  411. * applies -= operator so dest must be initialized
  412. *
  413. * @param[in] a first vector
  414. * @param[in] b second vector
  415. * @param[out] dest dest -= (a - b)
  416. */
  417. CGLM_INLINE
  418. void
  419. glm_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest) {
  420. dest[0] -= a[0] - b[0];
  421. dest[1] -= a[1] - b[1];
  422. dest[2] -= a[2] - b[2];
  423. }
  424. /*!
  425. * @brief subtract scalar [s] from vector [a] and subtract result from [dest]
  426. *
  427. * applies -= operator so dest must be initialized
  428. *
  429. * @param[in] a vector
  430. * @param[in] s scalar
  431. * @param[out] dest dest -= (a - s)
  432. */
  433. CGLM_INLINE
  434. void
  435. glm_ivec3_subsubs(ivec3 a, int s, ivec3 dest) {
  436. dest[0] -= a[0] - s;
  437. dest[1] -= a[1] - s;
  438. dest[2] -= a[2] - s;
  439. }
  440. /*!
  441. * @brief add vector [a] to vector [b] and subtract the result from [dest]
  442. *
  443. * applies -= operator so dest must be initialized
  444. *
  445. * @param[in] a vector
  446. * @param[in] b scalar
  447. * @param[out] dest dest -= (a + b)
  448. */
  449. CGLM_INLINE
  450. void
  451. glm_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest) {
  452. dest[0] -= a[0] + b[0];
  453. dest[1] -= a[1] + b[1];
  454. dest[2] -= a[2] + b[2];
  455. }
  456. /*!
  457. * @brief add scalar [s] to vector [a] and subtract the result from [dest]
  458. *
  459. * applies -= operator so dest must be initialized
  460. *
  461. * @param[in] a vector
  462. * @param[in] s scalar
  463. * @param[out] dest dest -= (a + b)
  464. */
  465. CGLM_INLINE
  466. void
  467. glm_ivec3_addsubs(ivec3 a, int s, ivec3 dest) {
  468. dest[0] -= a[0] + s;
  469. dest[1] -= a[1] + s;
  470. dest[2] -= a[2] + s;
  471. }
  472. /*!
  473. * @brief multiply vector [a] and vector [b] and subtract the result from [dest]
  474. *
  475. * applies -= operator so dest must be initialized
  476. *
  477. * @param[in] a vector
  478. * @param[in] b scalar
  479. * @param[out] dest dest -= (a * b)
  480. */
  481. CGLM_INLINE
  482. void
  483. glm_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest) {
  484. dest[0] -= a[0] * b[0];
  485. dest[1] -= a[1] * b[1];
  486. dest[2] -= a[2] * b[2];
  487. }
  488. /*!
  489. * @brief multiply vector [a] with scalar [s] and subtract the result from [dest]
  490. *
  491. * applies -= operator so dest must be initialized
  492. *
  493. * @param[in] a vector
  494. * @param[in] s scalar
  495. * @param[out] dest dest -= (a * s)
  496. */
  497. CGLM_INLINE
  498. void
  499. glm_ivec3_mulsubs(ivec3 a, int s, ivec3 dest) {
  500. dest[0] -= a[0] * s;
  501. dest[1] -= a[1] * s;
  502. dest[2] -= a[2] * s;
  503. }
  504. /*!
  505. * @brief subtract maximum of vector [a] and vector [b] from vector [dest]
  506. *
  507. * applies += operator so dest must be initialized
  508. *
  509. * @param[in] a first vector
  510. * @param[in] b second vector
  511. * @param[out] dest dest -= max(a, b)
  512. */
  513. CGLM_INLINE
  514. void
  515. glm_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest) {
  516. dest[0] -= glm_imax(a[0], b[0]);
  517. dest[1] -= glm_imax(a[1], b[1]);
  518. dest[2] -= glm_imax(a[2], b[2]);
  519. }
  520. /*!
  521. * @brief subtract minimum of vector [a] and vector [b] from vector [dest]
  522. *
  523. * applies -= operator so dest must be initialized
  524. *
  525. * @param[in] a first vector
  526. * @param[in] b second vector
  527. * @param[out] dest dest -= min(a, b)
  528. */
  529. CGLM_INLINE
  530. void
  531. glm_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest) {
  532. dest[0] -= glm_imin(a[0], b[0]);
  533. dest[1] -= glm_imin(a[1], b[1]);
  534. dest[2] -= glm_imin(a[2], b[2]);
  535. }
  536. /*!
  537. * @brief squared distance between two vectors
  538. *
  539. * @param[in] a first vector
  540. * @param[in] b second vector
  541. * @return returns squared distance (distance * distance)
  542. */
  543. CGLM_INLINE
  544. int
  545. glm_ivec3_distance2(ivec3 a, ivec3 b) {
  546. int xd, yd, zd;
  547. xd = a[0] - b[0];
  548. yd = a[1] - b[1];
  549. zd = a[2] - b[2];
  550. return xd * xd + yd * yd + zd * zd;
  551. }
  552. /*!
  553. * @brief distance between two vectors
  554. *
  555. * @param[in] a first vector
  556. * @param[in] b second vector
  557. * @return returns distance
  558. */
  559. CGLM_INLINE
  560. float
  561. glm_ivec3_distance(ivec3 a, ivec3 b) {
  562. return sqrtf((float)glm_ivec3_distance2(a, b));
  563. }
  564. /*!
  565. * @brief fill a vector with specified value
  566. *
  567. * @param[out] v dest
  568. * @param[in] val value
  569. */
  570. CGLM_INLINE
  571. void
  572. glm_ivec3_fill(ivec3 v, int val) {
  573. v[0] = v[1] = v[2] = val;
  574. }
  575. /*!
  576. * @brief check if vector is equal to value
  577. *
  578. * @param[in] v vector
  579. * @param[in] val value
  580. */
  581. CGLM_INLINE
  582. bool
  583. glm_ivec3_eq(ivec3 v, int val) {
  584. return v[0] == val && v[0] == v[1] && v[0] == v[2];
  585. }
  586. /*!
  587. * @brief check if vector is equal to another
  588. *
  589. * @param[in] a vector
  590. * @param[in] b vector
  591. */
  592. CGLM_INLINE
  593. bool
  594. glm_ivec3_eqv(ivec3 a, ivec3 b) {
  595. return a[0] == b[0]
  596. && a[1] == b[1]
  597. && a[2] == b[2];
  598. }
  599. /*!
  600. * @brief set each member of dest to greater of vector a and b
  601. *
  602. * @param[in] a first vector
  603. * @param[in] b second vector
  604. * @param[out] dest destination
  605. */
  606. CGLM_INLINE
  607. void
  608. glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest) {
  609. dest[0] = a[0] > b[0] ? a[0] : b[0];
  610. dest[1] = a[1] > b[1] ? a[1] : b[1];
  611. dest[2] = a[2] > b[2] ? a[2] : b[2];
  612. }
  613. /*!
  614. * @brief set each member of dest to lesser of vector a and b
  615. *
  616. * @param[in] a first vector
  617. * @param[in] b second vector
  618. * @param[out] dest destination
  619. */
  620. CGLM_INLINE
  621. void
  622. glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest) {
  623. dest[0] = a[0] < b[0] ? a[0] : b[0];
  624. dest[1] = a[1] < b[1] ? a[1] : b[1];
  625. dest[2] = a[2] < b[2] ? a[2] : b[2];
  626. }
  627. /*!
  628. * @brief clamp each member of [v] between minVal and maxVal (inclusive)
  629. *
  630. * @param[in, out] v vector
  631. * @param[in] minVal minimum value
  632. * @param[in] maxVal maximum value
  633. */
  634. CGLM_INLINE
  635. void
  636. glm_ivec3_clamp(ivec3 v, int minVal, int maxVal) {
  637. if (v[0] < minVal)
  638. v[0] = minVal;
  639. else if(v[0] > maxVal)
  640. v[0] = maxVal;
  641. if (v[1] < minVal)
  642. v[1] = minVal;
  643. else if(v[1] > maxVal)
  644. v[1] = maxVal;
  645. if (v[2] < minVal)
  646. v[2] = minVal;
  647. else if(v[2] > maxVal)
  648. v[2] = maxVal;
  649. }
  650. /*!
  651. * @brief absolute value of v
  652. *
  653. * @param[in] v vector
  654. * @param[out] dest destination
  655. */
  656. CGLM_INLINE
  657. void
  658. glm_ivec3_abs(ivec3 v, ivec3 dest) {
  659. dest[0] = abs(v[0]);
  660. dest[1] = abs(v[1]);
  661. dest[2] = abs(v[2]);
  662. }
  663. #endif /* cglm_ivec3_h */