1
0

affine2d.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. Functions:
  9. CGLM_INLINE void glm_translate2d(mat3 m, vec2 v)
  10. CGLM_INLINE void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
  11. CGLM_INLINE void glm_translate2d_x(mat3 m, float x)
  12. CGLM_INLINE void glm_translate2d_y(mat3 m, float y)
  13. CGLM_INLINE void glm_translate2d_make(mat3 m, vec2 v)
  14. CGLM_INLINE void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
  15. CGLM_INLINE void glm_scale2d_make(mat3 m, vec2 v)
  16. CGLM_INLINE void glm_scale2d(mat3 m, vec2 v)
  17. CGLM_INLINE void glm_scale2d_uni(mat3 m, float s)
  18. CGLM_INLINE void glm_rotate2d_make(mat3 m, float angle)
  19. CGLM_INLINE void glm_rotate2d(mat3 m, float angle)
  20. CGLM_INLINE void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
  21. */
  22. #ifndef cglm_affine2d_h
  23. #define cglm_affine2d_h
  24. #include "common.h"
  25. #include "util.h"
  26. #include "vec2.h"
  27. #include "mat3.h"
  28. /*!
  29. * @brief translate existing 2d transform matrix by v vector
  30. * and stores result in same matrix
  31. *
  32. * @param[in, out] m affine transform
  33. * @param[in] v translate vector [x, y]
  34. */
  35. CGLM_INLINE
  36. void
  37. glm_translate2d(mat3 m, vec2 v) {
  38. m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0];
  39. m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1];
  40. m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2];
  41. }
  42. /*!
  43. * @brief translate existing 2d transform matrix by v vector
  44. * and store result in dest
  45. *
  46. * source matrix will remain same
  47. *
  48. * @param[in] m affine transform
  49. * @param[in] v translate vector [x, y]
  50. * @param[out] dest translated matrix
  51. */
  52. CGLM_INLINE
  53. void
  54. glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
  55. glm_mat3_copy(m, dest);
  56. glm_translate2d(dest, v);
  57. }
  58. /*!
  59. * @brief translate existing 2d transform matrix by x factor
  60. *
  61. * @param[in, out] m affine transform
  62. * @param[in] x x factor
  63. */
  64. CGLM_INLINE
  65. void
  66. glm_translate2d_x(mat3 m, float x) {
  67. m[2][0] = m[0][0] * x + m[2][0];
  68. m[2][1] = m[0][1] * x + m[2][1];
  69. m[2][2] = m[0][2] * x + m[2][2];
  70. }
  71. /*!
  72. * @brief translate existing 2d transform matrix by y factor
  73. *
  74. * @param[in, out] m affine transform
  75. * @param[in] y y factor
  76. */
  77. CGLM_INLINE
  78. void
  79. glm_translate2d_y(mat3 m, float y) {
  80. m[2][0] = m[1][0] * y + m[2][0];
  81. m[2][1] = m[1][1] * y + m[2][1];
  82. m[2][2] = m[1][2] * y + m[2][2];
  83. }
  84. /*!
  85. * @brief creates NEW translate 2d transform matrix by v vector
  86. *
  87. * @param[out] m affine transform
  88. * @param[in] v translate vector [x, y]
  89. */
  90. CGLM_INLINE
  91. void
  92. glm_translate2d_make(mat3 m, vec2 v) {
  93. glm_mat3_identity(m);
  94. m[2][0] = v[0];
  95. m[2][1] = v[1];
  96. }
  97. /*!
  98. * @brief scale existing 2d transform matrix by v vector
  99. * and store result in dest
  100. *
  101. * @param[in] m affine transform
  102. * @param[in] v scale vector [x, y]
  103. * @param[out] dest scaled matrix
  104. */
  105. CGLM_INLINE
  106. void
  107. glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
  108. dest[0][0] = m[0][0] * v[0];
  109. dest[0][1] = m[0][1] * v[0];
  110. dest[0][2] = m[0][2] * v[0];
  111. dest[1][0] = m[1][0] * v[1];
  112. dest[1][1] = m[1][1] * v[1];
  113. dest[1][2] = m[1][2] * v[1];
  114. dest[2][0] = m[2][0];
  115. dest[2][1] = m[2][1];
  116. dest[2][2] = m[2][2];
  117. }
  118. /*!
  119. * @brief creates NEW 2d scale matrix by v vector
  120. *
  121. * @param[out] m affine transform
  122. * @param[in] v scale vector [x, y]
  123. */
  124. CGLM_INLINE
  125. void
  126. glm_scale2d_make(mat3 m, vec2 v) {
  127. glm_mat3_identity(m);
  128. m[0][0] = v[0];
  129. m[1][1] = v[1];
  130. }
  131. /*!
  132. * @brief scales existing 2d transform matrix by v vector
  133. * and stores result in same matrix
  134. *
  135. * @param[in, out] m affine transform
  136. * @param[in] v scale vector [x, y]
  137. */
  138. CGLM_INLINE
  139. void
  140. glm_scale2d(mat3 m, vec2 v) {
  141. m[0][0] = m[0][0] * v[0];
  142. m[0][1] = m[0][1] * v[0];
  143. m[0][2] = m[0][2] * v[0];
  144. m[1][0] = m[1][0] * v[1];
  145. m[1][1] = m[1][1] * v[1];
  146. m[1][2] = m[1][2] * v[1];
  147. }
  148. /*!
  149. * @brief applies uniform scale to existing 2d transform matrix v = [s, s]
  150. * and stores result in same matrix
  151. *
  152. * @param[in, out] m affine transform
  153. * @param[in] s scale factor
  154. */
  155. CGLM_INLINE
  156. void
  157. glm_scale2d_uni(mat3 m, float s) {
  158. m[0][0] = m[0][0] * s;
  159. m[0][1] = m[0][1] * s;
  160. m[0][2] = m[0][2] * s;
  161. m[1][0] = m[1][0] * s;
  162. m[1][1] = m[1][1] * s;
  163. m[1][2] = m[1][2] * s;
  164. }
  165. /*!
  166. * @brief creates NEW rotation matrix by angle around Z axis
  167. *
  168. * @param[out] m affine transform
  169. * @param[in] angle angle (radians)
  170. */
  171. CGLM_INLINE
  172. void
  173. glm_rotate2d_make(mat3 m, float angle) {
  174. float c, s;
  175. s = sinf(angle);
  176. c = cosf(angle);
  177. m[0][0] = c;
  178. m[0][1] = s;
  179. m[0][2] = 0;
  180. m[1][0] = -s;
  181. m[1][1] = c;
  182. m[1][2] = 0;
  183. m[2][0] = 0.0f;
  184. m[2][1] = 0.0f;
  185. m[2][2] = 1.0f;
  186. }
  187. /*!
  188. * @brief rotate existing 2d transform matrix around Z axis by angle
  189. * and store result in same matrix
  190. *
  191. * @param[in, out] m affine transform
  192. * @param[in] angle angle (radians)
  193. */
  194. CGLM_INLINE
  195. void
  196. glm_rotate2d(mat3 m, float angle) {
  197. float m00 = m[0][0], m10 = m[1][0],
  198. m01 = m[0][1], m11 = m[1][1],
  199. m02 = m[0][2], m12 = m[1][2];
  200. float c, s;
  201. s = sinf(angle);
  202. c = cosf(angle);
  203. m[0][0] = m00 * c + m10 * s;
  204. m[0][1] = m01 * c + m11 * s;
  205. m[0][2] = m02 * c + m12 * s;
  206. m[1][0] = m00 * -s + m10 * c;
  207. m[1][1] = m01 * -s + m11 * c;
  208. m[1][2] = m02 * -s + m12 * c;
  209. }
  210. /*!
  211. * @brief rotate existing 2d transform matrix around Z axis by angle
  212. * and store result in dest
  213. *
  214. * @param[in] m affine transform
  215. * @param[in] angle angle (radians)
  216. * @param[out] dest destination
  217. */
  218. CGLM_INLINE
  219. void
  220. glm_rotate2d_to(mat3 m, float angle, mat3 dest) {
  221. float m00 = m[0][0], m10 = m[1][0],
  222. m01 = m[0][1], m11 = m[1][1],
  223. m02 = m[0][2], m12 = m[1][2];
  224. float c, s;
  225. s = sinf(angle);
  226. c = cosf(angle);
  227. dest[0][0] = m00 * c + m10 * s;
  228. dest[0][1] = m01 * c + m11 * s;
  229. dest[0][2] = m02 * c + m12 * s;
  230. dest[1][0] = m00 * -s + m10 * c;
  231. dest[1][1] = m01 * -s + m11 * c;
  232. dest[1][2] = m02 * -s + m12 * c;
  233. dest[2][0] = m[2][0];
  234. dest[2][1] = m[2][1];
  235. dest[2][2] = m[2][2];
  236. }
  237. #endif /* cglm_affine2d_h */