1#include "transform.h"
2
3#ifdef _MSC_VER
4 #define _USE_MATH_DEFINES
5#endif
6#include <math.h>
7
8static Mat4 matrixMultiply(Mat4 *a, Mat4 *b);
9
10Mat4 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
22Mat4 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
38Mat4 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
47Mat4 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
61Mat4 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
71static 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