summaryrefslogtreecommitdiff
path: root/include/cglm/affine2d-post.h
blob: c6605a89763156e76d91ca10b519d19ac336368e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright (c), Recep Aslantas.
 *
 * MIT License (MIT), http://opensource.org/licenses/MIT
 * Full license can be found in the LICENSE file
 */

#ifndef cglm_affine2d_post_h
#define cglm_affine2d_post_h

/*
 Functions:
   CGLM_INLINE void glm_translated2d(mat3 m, vec2 v);
   CGLM_INLINE void glm_translated2d_x(mat3 m, float to);
   CGLM_INLINE void glm_translated2d_y(mat3 m, float to);
   CGLM_INLINE void glm_rotated2d(mat3 m, float angle);
   CGLM_INLINE void glm_scaled2d(mat3 m, vec2 v);
   CGLM_INLINE void glm_scaled2d_uni(mat3 m, float s);
 */

#include "vec2.h"

/*!
 * @brief translate existing transform matrix by v vector
 *        and store result in same matrix
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]  m  affine transform
 * @param[in]       v  translate vector [x, y]
 */
CGLM_INLINE
void
glm_translated2d(mat3 m, vec2 v) {
  glm_vec2_add(m[2], v, m[2]);
}

/*!
 * @brief translate existing transform matrix by x factor
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]  m  affine transform
 * @param[in]       x  x factor
 */
CGLM_INLINE
void
glm_translated2d_x(mat3 m, float x) {
  m[2][0] += x;
}

/*!
 * @brief translate existing transform matrix by y factor
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]  m  affine transform
 * @param[in]       y  y factor
 */
CGLM_INLINE
void
glm_translated2d_y(mat3 m, float y) {
  m[2][1] += y;
}

/*!
 * @brief rotate existing transform matrix by angle
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]   m      affine transform
 * @param[in]   angle  angle (radians)
 */
CGLM_INLINE
void
glm_rotated2d(mat3 m, float angle) {
  float c = cosf(angle),
        s = sinf(angle),

        m00 = m[0][0], m10 = m[1][0], m20 = m[2][0],
        m01 = m[0][1], m11 = m[1][1], m21 = m[2][1];

  m[0][0] = c * m00 - s * m01;
  m[1][0] = c * m10 - s * m11;
  m[2][0] = c * m20 - s * m21;

  m[0][1] = s * m00 + c * m01;
  m[1][1] = s * m10 + c * m11;
  m[2][1] = s * m20 + c * m21;
}

/*!
 * @brief scale existing 2d transform matrix by v vector
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]   m      affine transform
 * @param[in]   v  scale vector [x, y]
 */
CGLM_INLINE
void
glm_scaled2d(mat3 m, vec2 v) {
  m[0][0] *= v[0];
  m[1][0] *= v[0];
  m[2][0] *= v[0];

  m[0][1] *= v[1];
  m[1][1] *= v[1];
  m[2][1] *= v[1];
}

/*!
 * @brief applies uniform scale to existing 2d transform matrix v = [s, s]
 *
 *  this is POST transform, applies to existing transform as last transform
 *
 * @param[in, out]  m  affine transform
 * @param[in]       s  scale factor
 */
CGLM_INLINE
void
glm_scaled2d_uni(mat3 m, float s) {
  m[0][0] *= s;
  m[1][0] *= s;
  m[2][0] *= s;

  m[0][1] *= s;
  m[1][1] *= s;
  m[2][1] *= s;
}

#endif /* cglm_affine2d_post_h */