1 | #include "transform.h" |
2 | |
3 | #ifdef _MSC_VER |
4 | #define _USE_MATH_DEFINES |
5 | #endif |
6 | #include <math.h> |
7 | |
8 | static Mat4 matrixMultiply(Mat4 *a, Mat4 *b); |
9 | |
10 | Mat4 identity(void) |
11 | { |
12 | Mat4 result; |
13 | |
14 | result.cols[0].x = 1.0f; result.cols[0].y = 0.0f; result.cols[0].z = 0.0f; result.cols[0].w = 0.0f; |
15 | result.cols[1].x = 0.0f; result.cols[1].y = 1.0f; result.cols[1].z = 0.0f; result.cols[1].w = 0.0f; |
16 | result.cols[2].x = 0.0f; result.cols[2].y = 0.0f; result.cols[2].z = 1.0f; result.cols[2].w = 0.0f; |
17 | result.cols[3].x = 0.0f; result.cols[3].y = 0.0f; result.cols[3].z = 0.0f; result.cols[3].w = 1.0f; |
18 | |
19 | return result; |
20 | } |
21 | |
22 | Mat4 ortho(double left, double right, double bottom, double top) |
23 | { |
24 | const double NEAR = 0.0; |
25 | const double FAR = 1.0; |
26 | |
27 | Mat4 result = identity(); |
28 | result.cols[0].x = (float)(2.0 / (right - left)); |
29 | result.cols[1].y = (float)(2.0 / (top - bottom)); |
30 | result.cols[2].z = (float)(-2.0 / (FAR - NEAR)); |
31 | result.cols[3].x = (float)(-(right + left) / (right - left)); |
32 | result.cols[3].y = (float)(-(top + bottom) / (top - bottom)); |
33 | result.cols[3].z = (float)(-(FAR + NEAR) / (FAR - NEAR)); |
34 | |
35 | return result; |
36 | } |
37 | |
38 | Mat4 translate(Mat4 *mat, double x, double y) |
39 | { |
40 | Mat4 t = identity(); |
41 | t.cols[3].x = (float)x; |
42 | t.cols[3].y = (float)y; |
43 | |
44 | return matrixMultiply(&t, mat); |
45 | } |
46 | |
47 | Mat4 rotate(Mat4 *mat, double degrees) |
48 | { |
49 | Mat4 r = identity(); |
50 | float radians = (float)(M_PI * degrees) / 180.0f; |
51 | float s = sinf(radians); |
52 | float c = cosf(radians); |
53 | r.cols[0].x = c; |
54 | r.cols[0].y = s; |
55 | r.cols[1].x = -s; |
56 | r.cols[1].y = c; |
57 | |
58 | return matrixMultiply(&r, mat); |
59 | } |
60 | |
61 | Mat4 scale(Mat4 *mat, double x, double y) |
62 | { |
63 | Mat4 s = identity(); |
64 | s.cols[0].x = (float)x; |
65 | s.cols[1].y = (float)y; |
66 | s.cols[2].z = 1.0f; |
67 | |
68 | return matrixMultiply(&s, mat); |
69 | } |
70 | |
71 | static Mat4 matrixMultiply(Mat4 *a, Mat4 *b) |
72 | { |
73 | Mat4 c; |
74 | c.cols[0].x = a -> cols[0].x * b -> cols[0].x + a -> cols[0].y * b -> cols[1].x + a -> cols[0].z * b -> cols[2].x + a -> cols[0].w * b -> cols[3].x; |
75 | c.cols[0].y = a -> cols[0].x * b -> cols[0].y + a -> cols[0].y * b -> cols[1].y + a -> cols[0].z * b -> cols[2].y + a -> cols[0].w * b -> cols[3].y; |
76 | c.cols[0].z = a -> cols[0].x * b -> cols[0].z + a -> cols[0].y * b -> cols[1].z + a -> cols[0].z * b -> cols[2].z + a -> cols[0].w * b -> cols[3].z; |
77 | c.cols[0].w = a -> cols[0].x * b -> cols[0].w + a -> cols[0].y * b -> cols[1].w + a -> cols[0].z * b -> cols[2].w + a -> cols[0].w * b -> cols[3].w; |
78 | c.cols[1].x = a -> cols[1].x * b -> cols[0].x + a -> cols[1].y * b -> cols[1].x + a -> cols[1].z * b -> cols[2].x + a -> cols[1].w * b -> cols[3].x; |
79 | c.cols[1].y = a -> cols[1].x * b -> cols[0].y + a -> cols[1].y * b -> cols[1].y + a -> cols[1].z * b -> cols[2].y + a -> cols[1].w * b -> cols[3].y; |
80 | c.cols[1].z = a -> cols[1].x * b -> cols[0].z + a -> cols[1].y * b -> cols[1].z + a -> cols[1].z * b -> cols[2].z + a -> cols[1].w * b -> cols[3].z; |
81 | c.cols[1].w = a -> cols[1].x * b -> cols[0].w + a -> cols[1].y * b -> cols[1].w + a -> cols[1].z * b -> cols[2].w + a -> cols[1].w * b -> cols[3].w; |
82 | c.cols[2].x = a -> cols[2].x * b -> cols[0].x + a -> cols[2].y * b -> cols[1].x + a -> cols[2].z * b -> cols[2].x + a -> cols[2].w * b -> cols[3].x; |
83 | c.cols[2].y = a -> cols[2].x * b -> cols[0].y + a -> cols[2].y * b -> cols[1].y + a -> cols[2].z * b -> cols[2].y + a -> cols[2].w * b -> cols[3].y; |
84 | c.cols[2].z = a -> cols[2].x * b -> cols[0].z + a -> cols[2].y * b -> cols[1].z + a -> cols[2].z * b -> cols[2].z + a -> cols[2].w * b -> cols[3].z; |
85 | c.cols[2].w = a -> cols[2].x * b -> cols[0].w + a -> cols[2].y * b -> cols[1].w + a -> cols[2].z * b -> cols[2].w + a -> cols[2].w * b -> cols[3].w; |
86 | c.cols[3].x = a -> cols[3].x * b -> cols[0].x + a -> cols[3].y * b -> cols[1].x + a -> cols[3].z * b -> cols[2].x + a -> cols[3].w * b -> cols[3].x; |
87 | c.cols[3].y = a -> cols[3].x * b -> cols[0].y + a -> cols[3].y * b -> cols[1].y + a -> cols[3].z * b -> cols[2].y + a -> cols[3].w * b -> cols[3].y; |
88 | c.cols[3].z = a -> cols[3].x * b -> cols[0].z + a -> cols[3].y * b -> cols[1].z + a -> cols[3].z * b -> cols[2].z + a -> cols[3].w * b -> cols[3].z; |
89 | c.cols[3].w = a -> cols[3].x * b -> cols[0].w + a -> cols[3].y * b -> cols[1].w + a -> cols[3].z * b -> cols[2].w + a -> cols[3].w * b -> cols[3].w; |
90 | return c; |
91 | } |
92 | |