1
0

ivec4.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  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_IVEC4_ONE_INIT
  10. GLM_IVEC4_ZERO_INIT
  11. GLM_IVEC4_ONE
  12. GLM_IVEC4_ZERO
  13. Functions:
  14. CGLM_INLINE void glm_ivec4(ivec3 v3, int last, ivec4 dest)
  15. CGLM_INLINE void glm_ivec4_copy(ivec4 a, ivec4 dest)
  16. CGLM_INLINE void glm_ivec4_zero(ivec4 v)
  17. CGLM_INLINE void glm_ivec4_one(ivec4 v)
  18. CGLM_INLINE void glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest)
  19. CGLM_INLINE void glm_ivec4_adds(ivec4 v, int s, ivec4 dest)
  20. CGLM_INLINE void glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest)
  21. CGLM_INLINE void glm_ivec4_subs(ivec4 v, int s, ivec4 dest)
  22. CGLM_INLINE void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest)
  23. CGLM_INLINE void glm_ivec4_scale(ivec4 v, int s, ivec4 dest)
  24. CGLM_INLINE void glm_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest)
  25. CGLM_INLINE void glm_ivec4_addadds(ivec4 a, int s, ivec4 dest)
  26. CGLM_INLINE void glm_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest)
  27. CGLM_INLINE void glm_ivec4_subadds(ivec4 a, int s, ivec4 dest)
  28. CGLM_INLINE void glm_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest)
  29. CGLM_INLINE void glm_ivec4_muladds(ivec4 a, int s, ivec4 dest)
  30. CGLM_INLINE void glm_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest)
  31. CGLM_INLINE void glm_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest)
  32. CGLM_INLINE void glm_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest)
  33. CGLM_INLINE void glm_ivec4_subsubs(ivec4 a, int s, ivec4 dest)
  34. CGLM_INLINE void glm_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest)
  35. CGLM_INLINE void glm_ivec4_addsubs(ivec4 a, int s, ivec4 dest)
  36. CGLM_INLINE void glm_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest)
  37. CGLM_INLINE void glm_ivec4_mulsubs(ivec4 a, int s, ivec4 dest)
  38. CGLM_INLINE void glm_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest)
  39. CGLM_INLINE void glm_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest)
  40. CGLM_INLINE int glm_ivec4_distance2(ivec4 a, ivec4 b)
  41. CGLM_INLINE float glm_ivec4_distance(ivec4 a, ivec4 b)
  42. CGLM_INLINE void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest)
  43. CGLM_INLINE void glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest)
  44. CGLM_INLINE void glm_ivec4_clamp(ivec4 v, int minVal, int maxVal)
  45. CGLM_INLINE void glm_ivec4_abs(ivec4 v, ivec4 dest)
  46. */
  47. #ifndef cglm_ivec4_h
  48. #define cglm_ivec4_h
  49. #include "common.h"
  50. #include "util.h"
  51. #define GLM_IVEC4_ONE_INIT {1, 1, 1, 1}
  52. #define GLM_IVEC4_ZERO_INIT {0, 0, 0, 0}
  53. #define GLM_IVEC4_ONE ((ivec4)GLM_IVEC4_ONE_INIT)
  54. #define GLM_IVEC4_ZERO ((ivec4)GLM_IVEC4_ZERO_INIT)
  55. /*!
  56. * @brief init ivec4 using ivec3
  57. *
  58. * @param[in] v3 vector3
  59. * @param[in] last last item
  60. * @param[out] dest destination
  61. */
  62. CGLM_INLINE
  63. void
  64. glm_ivec4(ivec3 v3, int last, ivec4 dest) {
  65. dest[0] = v3[0];
  66. dest[1] = v3[1];
  67. dest[2] = v3[2];
  68. dest[3] = last;
  69. }
  70. /*!
  71. * @brief copy all members of [a] to [dest]
  72. *
  73. * @param[in] a source vector
  74. * @param[out] dest destination
  75. */
  76. CGLM_INLINE
  77. void
  78. glm_ivec4_copy(ivec4 a, ivec4 dest) {
  79. dest[0] = a[0];
  80. dest[1] = a[1];
  81. dest[2] = a[2];
  82. dest[3] = a[3];
  83. }
  84. /*!
  85. * @brief set all members of [v] to zero
  86. *
  87. * @param[out] v vector
  88. */
  89. CGLM_INLINE
  90. void
  91. glm_ivec4_zero(ivec4 v) {
  92. v[0] = v[1] = v[2] = v[3] = 0;
  93. }
  94. /*!
  95. * @brief set all members of [v] to one
  96. *
  97. * @param[out] v vector
  98. */
  99. CGLM_INLINE
  100. void
  101. glm_ivec4_one(ivec4 v) {
  102. v[0] = v[1] = v[2] = v[3] = 1;
  103. }
  104. /*!
  105. * @brief add vector [a] to vector [b] and store result in [dest]
  106. *
  107. * @param[in] a first vector
  108. * @param[in] b second vector
  109. * @param[out] dest destination
  110. */
  111. CGLM_INLINE
  112. void
  113. glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest) {
  114. dest[0] = a[0] + b[0];
  115. dest[1] = a[1] + b[1];
  116. dest[2] = a[2] + b[2];
  117. dest[3] = a[3] + b[3];
  118. }
  119. /*!
  120. * @brief add scalar s to vector [v] and store result in [dest]
  121. *
  122. * @param[in] v vector
  123. * @param[in] s scalar
  124. * @param[out] dest destination
  125. */
  126. CGLM_INLINE
  127. void
  128. glm_ivec4_adds(ivec4 v, int s, ivec4 dest) {
  129. dest[0] = v[0] + s;
  130. dest[1] = v[1] + s;
  131. dest[2] = v[2] + s;
  132. dest[3] = v[3] + s;
  133. }
  134. /*!
  135. * @brief subtract vector [b] from vector [a] and store result in [dest]
  136. *
  137. * @param[in] a first vector
  138. * @param[in] b second vector
  139. * @param[out] dest destination
  140. */
  141. CGLM_INLINE
  142. void
  143. glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest) {
  144. dest[0] = a[0] - b[0];
  145. dest[1] = a[1] - b[1];
  146. dest[2] = a[2] - b[2];
  147. dest[3] = a[3] - b[3];
  148. }
  149. /*!
  150. * @brief subtract scalar s from vector [v] and store result in [dest]
  151. *
  152. * @param[in] v vector
  153. * @param[in] s scalar
  154. * @param[out] dest destination
  155. */
  156. CGLM_INLINE
  157. void
  158. glm_ivec4_subs(ivec4 v, int s, ivec4 dest) {
  159. dest[0] = v[0] - s;
  160. dest[1] = v[1] - s;
  161. dest[2] = v[2] - s;
  162. dest[3] = v[3] - s;
  163. }
  164. /*!
  165. * @brief multiply vector [a] with vector [b] and store result in [dest]
  166. *
  167. * @param[in] a first vector
  168. * @param[in] b second vector
  169. * @param[out] dest destination
  170. */
  171. CGLM_INLINE
  172. void
  173. glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest) {
  174. dest[0] = a[0] * b[0];
  175. dest[1] = a[1] * b[1];
  176. dest[2] = a[2] * b[2];
  177. dest[3] = a[3] * b[3];
  178. }
  179. /*!
  180. * @brief multiply vector [a] with scalar s and store result in [dest]
  181. *
  182. * @param[in] v vector
  183. * @param[in] s scalar
  184. * @param[out] dest destination
  185. */
  186. CGLM_INLINE
  187. void
  188. glm_ivec4_scale(ivec4 v, int s, ivec4 dest) {
  189. dest[0] = v[0] * s;
  190. dest[1] = v[1] * s;
  191. dest[2] = v[2] * s;
  192. dest[3] = v[3] * s;
  193. }
  194. /*!
  195. * @brief add vector [a] with vector [b] and add result to vector [dest]
  196. *
  197. * applies += operator so dest must be initialized
  198. *
  199. * @param[in] a first vector
  200. * @param[in] b second vector
  201. * @param[out] dest dest += (a + b)
  202. */
  203. CGLM_INLINE
  204. void
  205. glm_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest) {
  206. dest[0] += a[0] + b[0];
  207. dest[1] += a[1] + b[1];
  208. dest[2] += a[2] + b[2];
  209. dest[3] += a[3] + b[3];
  210. }
  211. /*!
  212. * @brief add scalar [s] onto vector [a] and add result to vector [dest]
  213. *
  214. * applies += operator so dest must be initialized
  215. *
  216. * @param[in] a vector
  217. * @param[in] s scalar
  218. * @param[out] dest dest += (a + s)
  219. */
  220. CGLM_INLINE
  221. void
  222. glm_ivec4_addadds(ivec4 a, int s, ivec4 dest) {
  223. dest[0] += a[0] + s;
  224. dest[1] += a[1] + s;
  225. dest[2] += a[2] + s;
  226. dest[3] += a[3] + s;
  227. }
  228. /*!
  229. * @brief subtract vector [a] from vector [b] and add result to [dest]
  230. *
  231. * applies += operator so dest must be initialized
  232. *
  233. * @param[in] a first vector
  234. * @param[in] b second vector
  235. * @param[out] dest dest += (a - b)
  236. */
  237. CGLM_INLINE
  238. void
  239. glm_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest) {
  240. dest[0] += a[0] - b[0];
  241. dest[1] += a[1] - b[1];
  242. dest[2] += a[2] - b[2];
  243. dest[3] += a[3] - b[3];
  244. }
  245. /*!
  246. * @brief subtract scalar [s] from vector [a] and add result to [dest]
  247. *
  248. * applies += operator so dest must be initialized
  249. *
  250. * @param[in] a first
  251. * @param[in] s scalar
  252. * @param[out] dest dest += (a - s)
  253. */
  254. CGLM_INLINE
  255. void
  256. glm_ivec4_subadds(ivec4 a, int s, ivec4 dest) {
  257. dest[0] += a[0] - s;
  258. dest[1] += a[1] - s;
  259. dest[2] += a[2] - s;
  260. dest[3] += a[3] - s;
  261. }
  262. /*!
  263. * @brief multiply vector [a] with vector [b] and add result to [dest]
  264. *
  265. * applies += operator so dest must be initialized
  266. *
  267. * @param[in] a first vector
  268. * @param[in] b second vector
  269. * @param[out] dest dest += (a * b)
  270. */
  271. CGLM_INLINE
  272. void
  273. glm_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest) {
  274. dest[0] += a[0] * b[0];
  275. dest[1] += a[1] * b[1];
  276. dest[2] += a[2] * b[2];
  277. dest[3] += a[3] * b[3];
  278. }
  279. /*!
  280. * @brief multiply vector [a] with scalar [s] and add result to [dest]
  281. *
  282. * applies += operator so dest must be initialized
  283. *
  284. * @param[in] a vector
  285. * @param[in] s scalar
  286. * @param[out] dest dest += (a * s)
  287. */
  288. CGLM_INLINE
  289. void
  290. glm_ivec4_muladds(ivec4 a, int s, ivec4 dest) {
  291. dest[0] += a[0] * s;
  292. dest[1] += a[1] * s;
  293. dest[2] += a[2] * s;
  294. dest[3] += a[3] * s;
  295. }
  296. /*!
  297. * @brief add maximum of vector [a] and vector [b] to vector [dest]
  298. *
  299. * applies += operator so dest must be initialized
  300. *
  301. * @param[in] a first vector
  302. * @param[in] b second vector
  303. * @param[out] dest dest += max(a, b)
  304. */
  305. CGLM_INLINE
  306. void
  307. glm_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest) {
  308. dest[0] += glm_imax(a[0], b[0]);
  309. dest[1] += glm_imax(a[1], b[1]);
  310. dest[2] += glm_imax(a[2], b[2]);
  311. dest[3] += glm_imax(a[3], b[3]);
  312. }
  313. /*!
  314. * @brief add minimum of vector [a] and vector [b] to vector [dest]
  315. *
  316. * applies += operator so dest must be initialized
  317. *
  318. * @param[in] a first vector
  319. * @param[in] b second vector
  320. * @param[out] dest dest += min(a, b)
  321. */
  322. CGLM_INLINE
  323. void
  324. glm_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest) {
  325. dest[0] += glm_imin(a[0], b[0]);
  326. dest[1] += glm_imin(a[1], b[1]);
  327. dest[2] += glm_imin(a[2], b[2]);
  328. dest[3] += glm_imin(a[3], b[3]);
  329. }
  330. /*!
  331. * @brief subtract vector [a] from vector [b] and subtract result from [dest]
  332. *
  333. * applies -= operator so dest must be initialized
  334. *
  335. * @param[in] a first vector
  336. * @param[in] b second vector
  337. * @param[out] dest dest -= (a - b)
  338. */
  339. CGLM_INLINE
  340. void
  341. glm_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest) {
  342. dest[0] -= a[0] - b[0];
  343. dest[1] -= a[1] - b[1];
  344. dest[2] -= a[2] - b[2];
  345. dest[3] -= a[3] - b[3];
  346. }
  347. /*!
  348. * @brief subtract scalar [s] from vector [a] and subtract result from [dest]
  349. *
  350. * applies -= operator so dest must be initialized
  351. *
  352. * @param[in] a vector
  353. * @param[in] s scalar
  354. * @param[out] dest dest -= (a - s)
  355. */
  356. CGLM_INLINE
  357. void
  358. glm_ivec4_subsubs(ivec4 a, int s, ivec4 dest) {
  359. dest[0] -= a[0] - s;
  360. dest[1] -= a[1] - s;
  361. dest[2] -= a[2] - s;
  362. dest[3] -= a[3] - s;
  363. }
  364. /*!
  365. * @brief add vector [a] to vector [b] and subtract the result from [dest]
  366. *
  367. * applies -= operator so dest must be initialized
  368. *
  369. * @param[in] a vector
  370. * @param[in] b scalar
  371. * @param[out] dest dest -= (a + b)
  372. */
  373. CGLM_INLINE
  374. void
  375. glm_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest) {
  376. dest[0] -= a[0] + b[0];
  377. dest[1] -= a[1] + b[1];
  378. dest[2] -= a[2] + b[2];
  379. dest[3] -= a[3] + b[3];
  380. }
  381. /*!
  382. * @brief add scalar [s] to vector [a] and subtract the result from [dest]
  383. *
  384. * applies -= operator so dest must be initialized
  385. *
  386. * @param[in] a vector
  387. * @param[in] s scalar
  388. * @param[out] dest dest -= (a + b)
  389. */
  390. CGLM_INLINE
  391. void
  392. glm_ivec4_addsubs(ivec4 a, int s, ivec4 dest) {
  393. dest[0] -= a[0] + s;
  394. dest[1] -= a[1] + s;
  395. dest[2] -= a[2] + s;
  396. dest[3] -= a[3] + s;
  397. }
  398. /*!
  399. * @brief multiply vector [a] and vector [b] and subtract the result from [dest]
  400. *
  401. * applies -= operator so dest must be initialized
  402. *
  403. * @param[in] a vector
  404. * @param[in] b scalar
  405. * @param[out] dest dest -= (a * b)
  406. */
  407. CGLM_INLINE
  408. void
  409. glm_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest) {
  410. dest[0] -= a[0] * b[0];
  411. dest[1] -= a[1] * b[1];
  412. dest[2] -= a[2] * b[2];
  413. dest[3] -= a[3] * b[3];
  414. }
  415. /*!
  416. * @brief multiply vector [a] with scalar [s] and subtract the result from [dest]
  417. *
  418. * applies -= operator so dest must be initialized
  419. *
  420. * @param[in] a vector
  421. * @param[in] s scalar
  422. * @param[out] dest dest -= (a * s)
  423. */
  424. CGLM_INLINE
  425. void
  426. glm_ivec4_mulsubs(ivec4 a, int s, ivec4 dest) {
  427. dest[0] -= a[0] * s;
  428. dest[1] -= a[1] * s;
  429. dest[2] -= a[2] * s;
  430. dest[3] -= a[3] * s;
  431. }
  432. /*!
  433. * @brief subtract maximum of vector [a] and vector [b] from vector [dest]
  434. *
  435. * applies += operator so dest must be initialized
  436. *
  437. * @param[in] a first vector
  438. * @param[in] b second vector
  439. * @param[out] dest dest -= max(a, b)
  440. */
  441. CGLM_INLINE
  442. void
  443. glm_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest) {
  444. dest[0] -= glm_imax(a[0], b[0]);
  445. dest[1] -= glm_imax(a[1], b[1]);
  446. dest[2] -= glm_imax(a[2], b[2]);
  447. dest[3] -= glm_imax(a[3], b[3]);
  448. }
  449. /*!
  450. * @brief subtract minimum of vector [a] and vector [b] from vector [dest]
  451. *
  452. * applies -= operator so dest must be initialized
  453. *
  454. * @param[in] a first vector
  455. * @param[in] b second vector
  456. * @param[out] dest dest -= min(a, b)
  457. */
  458. CGLM_INLINE
  459. void
  460. glm_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest) {
  461. dest[0] -= glm_imin(a[0], b[0]);
  462. dest[1] -= glm_imin(a[1], b[1]);
  463. dest[2] -= glm_imin(a[2], b[2]);
  464. dest[3] -= glm_imin(a[3], b[3]);
  465. }
  466. /*!
  467. * @brief squared distance between two vectors
  468. *
  469. * @param[in] a first vector
  470. * @param[in] b second vector
  471. * @return returns squared distance (distance * distance)
  472. */
  473. CGLM_INLINE
  474. int
  475. glm_ivec4_distance2(ivec4 a, ivec4 b) {
  476. int xd, yd, zd, wd;
  477. xd = a[0] - b[0];
  478. yd = a[1] - b[1];
  479. zd = a[2] - b[2];
  480. wd = a[3] - b[3];
  481. return xd * xd + yd * yd + zd * zd + wd * wd;
  482. }
  483. /*!
  484. * @brief distance between two vectors
  485. *
  486. * @param[in] a first vector
  487. * @param[in] b second vector
  488. * @return returns distance
  489. */
  490. CGLM_INLINE
  491. float
  492. glm_ivec4_distance(ivec4 a, ivec4 b) {
  493. return sqrtf((float)glm_ivec4_distance2(a, b));
  494. }
  495. /*!
  496. * @brief set each member of dest to greater of vector a and b
  497. *
  498. * @param[in] a first vector
  499. * @param[in] b second vector
  500. * @param[out] dest destination
  501. */
  502. CGLM_INLINE
  503. void
  504. glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest) {
  505. dest[0] = a[0] > b[0] ? a[0] : b[0];
  506. dest[1] = a[1] > b[1] ? a[1] : b[1];
  507. dest[2] = a[2] > b[2] ? a[2] : b[2];
  508. dest[3] = a[3] > b[3] ? a[3] : b[3];
  509. }
  510. /*!
  511. * @brief set each member of dest to lesser of vector a and b
  512. *
  513. * @param[in] a first vector
  514. * @param[in] b second vector
  515. * @param[out] dest destination
  516. */
  517. CGLM_INLINE
  518. void
  519. glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest) {
  520. dest[0] = a[0] < b[0] ? a[0] : b[0];
  521. dest[1] = a[1] < b[1] ? a[1] : b[1];
  522. dest[2] = a[2] < b[2] ? a[2] : b[2];
  523. dest[3] = a[3] < b[3] ? a[3] : b[3];
  524. }
  525. /*!
  526. * @brief clamp each member of [v] between minVal and maxVal (inclusive)
  527. *
  528. * @param[in, out] v vector
  529. * @param[in] minVal minimum value
  530. * @param[in] maxVal maximum value
  531. */
  532. CGLM_INLINE
  533. void
  534. glm_ivec4_clamp(ivec4 v, int minVal, int maxVal) {
  535. if (v[0] < minVal)
  536. v[0] = minVal;
  537. else if(v[0] > maxVal)
  538. v[0] = maxVal;
  539. if (v[1] < minVal)
  540. v[1] = minVal;
  541. else if(v[1] > maxVal)
  542. v[1] = maxVal;
  543. if (v[2] < minVal)
  544. v[2] = minVal;
  545. else if(v[2] > maxVal)
  546. v[2] = maxVal;
  547. if (v[3] < minVal)
  548. v[3] = minVal;
  549. else if(v[3] > maxVal)
  550. v[3] = maxVal;
  551. }
  552. /*!
  553. * @brief absolute value of v
  554. *
  555. * @param[in] v vector
  556. * @param[out] dest destination
  557. */
  558. CGLM_INLINE
  559. void
  560. glm_ivec4_abs(ivec4 v, ivec4 dest) {
  561. dest[0] = abs(v[0]);
  562. dest[1] = abs(v[1]);
  563. dest[2] = abs(v[2]);
  564. dest[3] = abs(v[3]);
  565. }
  566. #endif /* cglm_ivec4_h */