ivec4.h 14 KB

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