1
0

vec2.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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_VEC2_ONE_INIT
  10. GLMS_VEC2_ZERO_INIT
  11. GLMS_VEC2_ONE
  12. GLMS_VEC2_ZERO
  13. Functions:
  14. CGLM_INLINE vec2s glms_vec2(vec3s v3)
  15. CGLM_INLINE void glms_vec2_pack(vec2s dst[], vec2 src[], size_t len)
  16. CGLM_INLINE void glms_vec2_unpack(vec2 dst[], vec2s src[], size_t len)
  17. CGLM_INLINE vec2s glms_vec2_zero(void)
  18. CGLM_INLINE vec2s glms_vec2_one(void)
  19. CGLM_INLINE float glms_vec2_dot(vec2s a, vec2s b)
  20. CGLM_INLINE float glms_vec2_cross(vec2s a, vec2s b)
  21. CGLM_INLINE float glms_vec2_norm2(vec2s v)
  22. CGLM_INLINE float glms_vec2_norm(vec2s v)
  23. CGLM_INLINE vec2s glms_vec2_add(vec2s a, vec2s b)
  24. CGLM_INLINE vec2s glms_vec2_adds(vec2s a, float s)
  25. CGLM_INLINE vec2s glms_vec2_sub(vec2s a, vec2s b)
  26. CGLM_INLINE vec2s glms_vec2_subs(vec2s a, float s)
  27. CGLM_INLINE vec2s glms_vec2_mul(vec2s a, vec2s b)
  28. CGLM_INLINE vec2s glms_vec2_scale(vec2s v, float s)
  29. CGLM_INLINE vec2s glms_vec2_scale_as(vec2s v, float s)
  30. CGLM_INLINE vec2s glms_vec2_div(vec2s a, vec2s b)
  31. CGLM_INLINE vec2s glms_vec2_divs(vec2s a, float s)
  32. CGLM_INLINE vec2s glms_vec2_addadd(vec2s a, vec2s b, vec2s dest)
  33. CGLM_INLINE vec2s glms_vec2_subadd(vec2s a, vec2s b, vec2s dest)
  34. CGLM_INLINE vec2s glms_vec2_muladd(vec2s a, vec2s b, vec2s dest)
  35. CGLM_INLINE vec2s glms_vec2_muladds(vec2s a, float s, vec2s dest)
  36. CGLM_INLINE vec2s glms_vec2_maxadd(vec2s a, vec2s b, vec2s dest)
  37. CGLM_INLINE vec2s glms_vec2_minadd(vec2s a, vec2s b, vec2s dest)
  38. CGLM_INLINE vec2s glms_vec2_subsub(vec2s a, vec2s b, vec2s dest)
  39. CGLM_INLINE vec2s glms_vec2_addsub(vec2s a, vec2s b, vec2s dest)
  40. CGLM_INLINE vec2s glms_vec2_mulsub(vec2s a, vec2s b, vec2s dest)
  41. CGLM_INLINE vec2s glms_vec2_mulsubs(vec2s a, float s, vec2s dest)
  42. CGLM_INLINE vec2s glms_vec2_maxsub(vec2s a, vec2s b, vec2s dest)
  43. CGLM_INLINE vec2s glms_vec2_minsub(vec2s a, vec2s b, vec2s dest)
  44. CGLM_INLINE vec2s glms_vec2_negate(vec2s v)
  45. CGLM_INLINE vec2s glms_vec2_normalize(vec2s v)
  46. CGLM_INLINE vec2s glms_vec2_rotate(vec2s v, float angle, vec2s axis)
  47. CGLM_INLINE vec2s glms_vec2_center(vec2s a, vec2s b)
  48. CGLM_INLINE float glms_vec2_distance(vec2s a, vec2s b)
  49. CGLM_INLINE float glms_vec2_distance2(vec2s a, vec2s b)
  50. CGLM_INLINE vec2s glms_vec2_maxv(vec2s a, vec2s b)
  51. CGLM_INLINE vec2s glms_vec2_minv(vec2s a, vec2s b)
  52. CGLM_INLINE vec2s glms_vec2_clamp(vec2s v, float minVal, float maxVal)
  53. CGLM_INLINE vec2s glms_vec2_lerp(vec2s from, vec2s to, float t)
  54. CGLM_INLINE vec2s glms_vec2_step(vec2s edge, vec2s x)
  55. CGLM_INLINE vec2s glms_vec2_make(float * restrict src)
  56. CGLM_INLINE vec2s glms_vec2_reflect(vec2s v, vec2s n)
  57. CGLM_INLINE bool glms_vec2_refract(vec2s v, vec2s n, float eta, vec2s *dest)
  58. */
  59. #ifndef cglms_vec2s_h
  60. #define cglms_vec2s_h
  61. #include "../common.h"
  62. #include "../types-struct.h"
  63. #include "../util.h"
  64. #include "../vec2.h"
  65. #include "vec2-ext.h"
  66. #define GLMS_VEC2_ONE_INIT {GLM_VEC2_ONE_INIT}
  67. #define GLMS_VEC2_ZERO_INIT {GLM_VEC2_ZERO_INIT}
  68. #define GLMS_VEC2_ONE ((vec2s)GLMS_VEC2_ONE_INIT)
  69. #define GLMS_VEC2_ZERO ((vec2s)GLMS_VEC2_ZERO_INIT)
  70. /*!
  71. * @brief init vec2 using vec2
  72. *
  73. * @param[in] v3 vector3
  74. * @returns destination
  75. */
  76. CGLM_INLINE
  77. vec2s
  78. glms_vec2(vec3s v3) {
  79. vec2s r;
  80. glm_vec2(v3.raw, r.raw);
  81. return r;
  82. }
  83. /*!
  84. * @brief pack an array of vec2 into an array of vec2s
  85. *
  86. * @param[out] dst array of vec2
  87. * @param[in] src array of vec2s
  88. * @param[in] len number of elements
  89. */
  90. CGLM_INLINE
  91. void
  92. glms_vec2_(pack)(vec2s dst[], vec2 src[], size_t len) {
  93. size_t i;
  94. for (i = 0; i < len; i++) {
  95. glm_vec2_copy(src[i], dst[i].raw);
  96. }
  97. }
  98. /*!
  99. * @brief unpack an array of vec2s into an array of vec2
  100. *
  101. * @param[out] dst array of vec2s
  102. * @param[in] src array of vec2
  103. * @param[in] len number of elements
  104. */
  105. CGLM_INLINE
  106. void
  107. glms_vec2_(unpack)(vec2 dst[], vec2s src[], size_t len) {
  108. size_t i;
  109. for (i = 0; i < len; i++) {
  110. glm_vec2_copy(src[i].raw, dst[i]);
  111. }
  112. }
  113. /*!
  114. * @brief make vector zero
  115. *
  116. * @returns zero vector
  117. */
  118. CGLM_INLINE
  119. vec2s
  120. glms_vec2_(zero)(void) {
  121. vec2s r;
  122. glm_vec2_zero(r.raw);
  123. return r;
  124. }
  125. /*!
  126. * @brief make vector one
  127. *
  128. * @returns one vector
  129. */
  130. CGLM_INLINE
  131. vec2s
  132. glms_vec2_(one)(void) {
  133. vec2s r;
  134. glm_vec2_one(r.raw);
  135. return r;
  136. }
  137. /*!
  138. * @brief vec2 dot product
  139. *
  140. * @param[in] a vector1
  141. * @param[in] b vector2
  142. *
  143. * @return dot product
  144. */
  145. CGLM_INLINE
  146. float
  147. glms_vec2_(dot)(vec2s a, vec2s b) {
  148. return glm_vec2_dot(a.raw, b.raw);
  149. }
  150. /*!
  151. * @brief vec2 cross product
  152. *
  153. * REF: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
  154. *
  155. * @param[in] a vector1
  156. * @param[in] b vector2
  157. *
  158. * @return Z component of cross product
  159. */
  160. CGLM_INLINE
  161. float
  162. glms_vec2_(cross)(vec2s a, vec2s b) {
  163. return glm_vec2_cross(a.raw, b.raw);
  164. }
  165. /*!
  166. * @brief norm * norm (magnitude) of vec
  167. *
  168. * we can use this func instead of calling norm * norm, because it would call
  169. * sqrtf function twice but with this func we can avoid func call, maybe this is
  170. * not good name for this func
  171. *
  172. * @param[in] v vector
  173. *
  174. * @return norm * norm
  175. */
  176. CGLM_INLINE
  177. float
  178. glms_vec2_(norm2)(vec2s v) {
  179. return glm_vec2_norm2(v.raw);
  180. }
  181. /*!
  182. * @brief norm (magnitude) of vec2
  183. *
  184. * @param[in] v vector
  185. *
  186. * @return norm
  187. */
  188. CGLM_INLINE
  189. float
  190. glms_vec2_(norm)(vec2s v) {
  191. return glm_vec2_norm(v.raw);
  192. }
  193. /*!
  194. * @brief add a vector to b vector store result in dest
  195. *
  196. * @param[in] a vector1
  197. * @param[in] b vector2
  198. * @returns destination vector
  199. */
  200. CGLM_INLINE
  201. vec2s
  202. glms_vec2_(add)(vec2s a, vec2s b) {
  203. vec2s r;
  204. glm_vec2_add(a.raw, b.raw, r.raw);
  205. return r;
  206. }
  207. /*!
  208. * @brief add scalar to v vector store result in dest (d = v + s)
  209. *
  210. * @param[in] a vector
  211. * @param[in] s scalar
  212. * @returns destination vector
  213. */
  214. CGLM_INLINE
  215. vec2s
  216. glms_vec2_(adds)(vec2s a, float s) {
  217. vec2s r;
  218. glm_vec2_adds(a.raw, s, r.raw);
  219. return r;
  220. }
  221. /*!
  222. * @brief subtract b vector from a vector store result in dest
  223. *
  224. * @param[in] a vector1
  225. * @param[in] b vector2
  226. * @returns destination vector
  227. */
  228. CGLM_INLINE
  229. vec2s
  230. glms_vec2_(sub)(vec2s a, vec2s b) {
  231. vec2s r;
  232. glm_vec2_sub(a.raw, b.raw, r.raw);
  233. return r;
  234. }
  235. /*!
  236. * @brief subtract scalar from v vector store result in dest (d = v - s)
  237. *
  238. * @param[in] a vector
  239. * @param[in] s scalar
  240. * @returns destination vector
  241. */
  242. CGLM_INLINE
  243. vec2s
  244. glms_vec2_(subs)(vec2s a, float s) {
  245. vec2s r;
  246. glm_vec2_subs(a.raw, s, r.raw);
  247. return r;
  248. }
  249. /*!
  250. * @brief multiply two vectors (component-wise multiplication)
  251. *
  252. * @param a vector1
  253. * @param b vector2
  254. * @returns result = (a[0] * b[0], a[1] * b[1])
  255. */
  256. CGLM_INLINE
  257. vec2s
  258. glms_vec2_(mul)(vec2s a, vec2s b) {
  259. vec2s r;
  260. glm_vec2_mul(a.raw, b.raw, r.raw);
  261. return r;
  262. }
  263. /*!
  264. * @brief multiply/scale vec2 vector with scalar: result = v * s
  265. *
  266. * @param[in] v vector
  267. * @param[in] s scalar
  268. * @returns destination vector
  269. */
  270. CGLM_INLINE
  271. vec2s
  272. glms_vec2_(scale)(vec2s v, float s) {
  273. vec2s r;
  274. glm_vec2_scale(v.raw, s, r.raw);
  275. return r;
  276. }
  277. /*!
  278. * @brief make vec2 vector scale as specified: result = unit(v) * s
  279. *
  280. * @param[in] v vector
  281. * @param[in] s scalar
  282. * @returns destination vector
  283. */
  284. CGLM_INLINE
  285. vec2s
  286. glms_vec2_(scale_as)(vec2s v, float s) {
  287. vec2s r;
  288. glm_vec2_scale_as(v.raw, s, r.raw);
  289. return r;
  290. }
  291. /*!
  292. * @brief div vector with another component-wise division: d = a / b
  293. *
  294. * @param[in] a vector 1
  295. * @param[in] b vector 2
  296. * @returns result = (a[0]/b[0], a[1]/b[1])
  297. */
  298. CGLM_INLINE
  299. vec2s
  300. glms_vec2_(div)(vec2s a, vec2s b) {
  301. vec2s r;
  302. glm_vec2_div(a.raw, b.raw, r.raw);
  303. return r;
  304. }
  305. /*!
  306. * @brief div vector with scalar: d = v / s
  307. *
  308. * @param[in] a vector
  309. * @param[in] s scalar
  310. * @returns result = (a[0]/s, a[1]/s)
  311. */
  312. CGLM_INLINE
  313. vec2s
  314. glms_vec2_(divs)(vec2s a, float s) {
  315. vec2s r;
  316. glm_vec2_divs(a.raw, s, r.raw);
  317. return r;
  318. }
  319. /*!
  320. * @brief add two vectors and add result to sum
  321. *
  322. * it applies += operator so dest must be initialized
  323. *
  324. * @param[in] a vector 1
  325. * @param[in] b vector 2
  326. * @returns dest += (a + b)
  327. */
  328. CGLM_INLINE
  329. vec2s
  330. glms_vec2_(addadd)(vec2s a, vec2s b, vec2s dest) {
  331. glm_vec2_addadd(a.raw, b.raw, dest.raw);
  332. return dest;
  333. }
  334. /*!
  335. * @brief sub two vectors and add result to dest
  336. *
  337. * it applies += operator so dest must be initialized
  338. *
  339. * @param[in] a vector 1
  340. * @param[in] b vector 2
  341. * @returns dest += (a + b)
  342. */
  343. CGLM_INLINE
  344. vec2s
  345. glms_vec2_(subadd)(vec2s a, vec2s b, vec2s dest) {
  346. glm_vec2_subadd(a.raw, b.raw, dest.raw);
  347. return dest;
  348. }
  349. /*!
  350. * @brief mul two vectors and add result to dest
  351. *
  352. * it applies += operator so dest must be initialized
  353. *
  354. * @param[in] a vector 1
  355. * @param[in] b vector 2
  356. * @returns dest += (a * b)
  357. */
  358. CGLM_INLINE
  359. vec2s
  360. glms_vec2_(muladd)(vec2s a, vec2s b, vec2s dest) {
  361. glm_vec2_muladd(a.raw, b.raw, dest.raw);
  362. return dest;
  363. }
  364. /*!
  365. * @brief mul vector with scalar and add result to sum
  366. *
  367. * it applies += operator so dest must be initialized
  368. *
  369. * @param[in] a vector
  370. * @param[in] s scalar
  371. * @returns dest += (a * b)
  372. */
  373. CGLM_INLINE
  374. vec2s
  375. glms_vec2_(muladds)(vec2s a, float s, vec2s dest) {
  376. glm_vec2_muladds(a.raw, s, dest.raw);
  377. return dest;
  378. }
  379. /*!
  380. * @brief add max of two vectors to result/dest
  381. *
  382. * it applies += operator so dest must be initialized
  383. *
  384. * @param[in] a vector 1
  385. * @param[in] b vector 2
  386. * @returns dest += max(a, b)
  387. */
  388. CGLM_INLINE
  389. vec2s
  390. glms_vec2_(maxadd)(vec2s a, vec2s b, vec2s dest) {
  391. glm_vec2_maxadd(a.raw, b.raw, dest.raw);
  392. return dest;
  393. }
  394. /*!
  395. * @brief add min of two vectors to result/dest
  396. *
  397. * it applies += operator so dest must be initialized
  398. *
  399. * @param[in] a vector 1
  400. * @param[in] b vector 2
  401. * @returns dest += min(a, b)
  402. */
  403. CGLM_INLINE
  404. vec2s
  405. glms_vec2_(minadd)(vec2s a, vec2s b, vec2s dest) {
  406. glm_vec2_minadd(a.raw, b.raw, dest.raw);
  407. return dest;
  408. }
  409. /*!
  410. * @brief sub two vectors and sub result to dest
  411. *
  412. * it applies -= operator so dest must be initialized
  413. *
  414. * @param[in] a vector 1
  415. * @param[in] b vector 2
  416. * @returns dest -= (a - b)
  417. */
  418. CGLM_INLINE
  419. vec2s
  420. glms_vec2_(subsub)(vec2s a, vec2s b, vec2s dest) {
  421. glm_vec2_subsub(a.raw, b.raw, dest.raw);
  422. return dest;
  423. }
  424. /*!
  425. * @brief add two vectors and sub result to dest
  426. *
  427. * it applies -= operator so dest must be initialized
  428. *
  429. * @param[in] a vector 1
  430. * @param[in] b vector 2
  431. * @returns dest -= (a + b)
  432. */
  433. CGLM_INLINE
  434. vec2s
  435. glms_vec2_(addsub)(vec2s a, vec2s b, vec2s dest) {
  436. glm_vec2_addsub(a.raw, b.raw, dest.raw);
  437. return dest;
  438. }
  439. /*!
  440. * @brief mul two vectors and sub result to dest
  441. *
  442. * it applies -= operator so dest must be initialized
  443. *
  444. * @param[in] a vector 1
  445. * @param[in] b vector 2
  446. * @returns dest -= (a * b)
  447. */
  448. CGLM_INLINE
  449. vec2s
  450. glms_vec2_(mulsub)(vec2s a, vec2s b, vec2s dest) {
  451. glm_vec2_mulsub(a.raw, b.raw, dest.raw);
  452. return dest;
  453. }
  454. /*!
  455. * @brief mul vector with scalar and sub result to dest
  456. *
  457. * it applies -= operator so dest must be initialized
  458. *
  459. * @param[in] a vector
  460. * @param[in] s scalar
  461. * @returns dest -= (a * b)
  462. */
  463. CGLM_INLINE
  464. vec2s
  465. glms_vec2_(mulsubs)(vec2s a, float s, vec2s dest) {
  466. glm_vec2_mulsubs(a.raw, s, dest.raw);
  467. return dest;
  468. }
  469. /*!
  470. * @brief sub max of two vectors to dest
  471. *
  472. * it applies += operator so dest must be initialized
  473. *
  474. * @param[in] a vector 1
  475. * @param[in] b vector 2
  476. * @returns dest -= max(a, b)
  477. */
  478. CGLM_INLINE
  479. vec2s
  480. glms_vec2_(maxsub)(vec2s a, vec2s b, vec2s dest) {
  481. glm_vec2_maxsub(a.raw, b.raw, dest.raw);
  482. return dest;
  483. }
  484. /*!
  485. * @brief sub min of two vectors to dest
  486. *
  487. * it applies -= operator so dest must be initialized
  488. *
  489. * @param[in] a vector 1
  490. * @param[in] b vector 2
  491. * @returns dest -= min(a, b)
  492. */
  493. CGLM_INLINE
  494. vec2s
  495. glms_vec2_(minsub)(vec2s a, vec2s b, vec2s dest) {
  496. glm_vec2_minsub(a.raw, b.raw, dest.raw);
  497. return dest;
  498. }
  499. /*!
  500. * @brief negate vector components
  501. *
  502. * @param[in] v vector
  503. * @returns negated vector
  504. */
  505. CGLM_INLINE
  506. vec2s
  507. glms_vec2_(negate)(vec2s v) {
  508. glm_vec2_negate(v.raw);
  509. return v;
  510. }
  511. /*!
  512. * @brief normalize vec2 and store result in same vec
  513. *
  514. * @param[in] v vector
  515. * @returns normalized vector
  516. */
  517. CGLM_INLINE
  518. vec2s
  519. glms_vec2_(normalize)(vec2s v) {
  520. glm_vec2_normalize(v.raw);
  521. return v;
  522. }
  523. /*!
  524. * @brief rotate vec2 by angle using Rodrigues' rotation formula
  525. *
  526. * @param[in] v vector
  527. * @param[in] angle angle by radians
  528. * @returns rotated vector
  529. */
  530. CGLM_INLINE
  531. vec2s
  532. glms_vec2_(rotate)(vec2s v, float angle) {
  533. vec2s r;
  534. glm_vec2_rotate(v.raw, angle, r.raw);
  535. return r;
  536. }
  537. /**
  538. * @brief find center point of two vector
  539. *
  540. * @param[in] a vector1
  541. * @param[in] b vector2
  542. * @returns center point
  543. */
  544. CGLM_INLINE
  545. vec2s
  546. glms_vec2_(center)(vec2s a, vec2s b) {
  547. vec2s r;
  548. glm_vec2_center(a.raw, b.raw, r.raw);
  549. return r;
  550. }
  551. /**
  552. * @brief distance between two vectors
  553. *
  554. * @param[in] a vector1
  555. * @param[in] b vector2
  556. * @return distance
  557. */
  558. CGLM_INLINE
  559. float
  560. glms_vec2_(distance)(vec2s a, vec2s b) {
  561. return glm_vec2_distance(a.raw, b.raw);
  562. }
  563. /**
  564. * @brief squared distance between two vectors
  565. *
  566. * @param[in] a vector1
  567. * @param[in] b vector2
  568. * @return squared distance (distance * distance)
  569. */
  570. CGLM_INLINE
  571. float
  572. glms_vec2_(distance2)(vec2s a, vec2s b) {
  573. return glm_vec2_distance2(a.raw, b.raw);
  574. }
  575. /*!
  576. * @brief max values of vectors
  577. *
  578. * @param[in] a vector1
  579. * @param[in] b vector2
  580. * @returns destination
  581. */
  582. CGLM_INLINE
  583. vec2s
  584. glms_vec2_(maxv)(vec2s a, vec2s b) {
  585. vec2s r;
  586. glm_vec2_maxv(a.raw, b.raw, r.raw);
  587. return r;
  588. }
  589. /*!
  590. * @brief min values of vectors
  591. *
  592. * @param[in] a vector1
  593. * @param[in] b vector2
  594. * @returns destination
  595. */
  596. CGLM_INLINE
  597. vec2s
  598. glms_vec2_(minv)(vec2s a, vec2s b) {
  599. vec2s r;
  600. glm_vec2_minv(a.raw, b.raw, r.raw);
  601. return r;
  602. }
  603. /*!
  604. * @brief clamp vector's individual members between min and max values
  605. *
  606. * @param[in] v vector
  607. * @param[in] minVal minimum value
  608. * @param[in] maxVal maximum value
  609. * @returns clamped vector
  610. */
  611. CGLM_INLINE
  612. vec2s
  613. glms_vec2_(clamp)(vec2s v, float minVal, float maxVal) {
  614. glm_vec2_clamp(v.raw, minVal, maxVal);
  615. return v;
  616. }
  617. /*!
  618. * @brief linear interpolation between two vectors
  619. *
  620. * formula: from + s * (to - from)
  621. *
  622. * @param[in] from from value
  623. * @param[in] to to value
  624. * @param[in] t interpolant (amount)
  625. * @returns destination
  626. */
  627. CGLM_INLINE
  628. vec2s
  629. glms_vec2_(lerp)(vec2s from, vec2s to, float t) {
  630. vec2s r;
  631. glm_vec2_lerp(from.raw, to.raw, t, r.raw);
  632. return r;
  633. }
  634. /*!
  635. * @brief threshold function
  636. *
  637. * @param[in] edge threshold
  638. * @param[in] x value to test against threshold
  639. * @returns destination
  640. */
  641. CGLM_INLINE
  642. vec2s
  643. glms_vec2_(step)(vec2s edge, vec2s x) {
  644. vec2s r;
  645. glm_vec2_step(edge.raw, x.raw, r.raw);
  646. return r;
  647. }
  648. /*!
  649. * @brief Create two dimensional vector from pointer
  650. *
  651. * @param[in] src pointer to an array of floats
  652. * @returns constructed 2D vector from raw pointer
  653. */
  654. CGLM_INLINE
  655. vec2s
  656. glms_vec2_(make)(const float * __restrict src) {
  657. vec2s dest;
  658. glm_vec2_make(src, dest.raw);
  659. return dest;
  660. }
  661. /*!
  662. * @brief reflection vector using an incident ray and a surface normal
  663. *
  664. * @param[in] I incident vector
  665. * @param[in] N normalized normal vector
  666. * @returns reflection result
  667. */
  668. CGLM_INLINE
  669. vec2s
  670. glms_vec2_(reflect)(vec2s v, vec2s n) {
  671. vec2s dest;
  672. glm_vec2_reflect(v.raw, n.raw, dest.raw);
  673. return dest;
  674. }
  675. /*!
  676. * @brief computes refraction vector for an incident vector and a surface normal.
  677. *
  678. * calculates the refraction vector based on Snell's law. If total internal reflection
  679. * occurs (angle too great given eta), dest is set to zero and returns false.
  680. * Otherwise, computes refraction vector, stores it in dest, and returns true.
  681. *
  682. * @param[in] v normalized incident vector
  683. * @param[in] n normalized normal vector
  684. * @param[in] eta ratio of indices of refraction (incident/transmitted)
  685. * @param[out] dest refraction vector if refraction occurs; zero vector otherwise
  686. *
  687. * @returns true if refraction occurs; false if total internal reflection occurs.
  688. */
  689. CGLM_INLINE
  690. bool
  691. glms_vec2_(refract)(vec2s v, vec2s n, float eta, vec2s * __restrict dest) {
  692. return glm_vec2_refract(v.raw, n.raw, eta, dest->raw);
  693. }
  694. #endif /* cglms_vec2s_h */