5 void mat_identity(float *mat)
7 memset(mat, 0, 16 * sizeof *mat);
8 mat[0] = mat[5] = mat[10] = mat[15] = 1.0f;
11 void mat_copy(float *dest, float *src)
13 memcpy(dest, src, 16 * sizeof *dest);
16 #define M(i,j) (((i) << 2) + (j))
17 void mat_mul(float *res, float *m2)
22 memcpy(m1, res, sizeof m1);
26 *res++ = m1[M(0,j)] * m2[M(i,0)] +
27 m1[M(1,j)] * m2[M(i,1)] +
28 m1[M(2,j)] * m2[M(i,2)] +
29 m1[M(3,j)] * m2[M(i,3)];
34 void mat_translate(float *mat, float x, float y, float z)
36 float m[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
43 void mat_rotate(float *mat, float deg, float x, float y, float z)
45 float m[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
47 float angle = M_PI * deg / 180.0f;
48 float sina = sin(angle);
49 float cosa = cos(angle);
50 float one_minus_cosa = 1.0f - cosa;
55 m[0] = nxsq + (1.0f - nxsq) * cosa;
56 m[4] = x * y * one_minus_cosa - z * sina;
57 m[8] = x * z * one_minus_cosa + y * sina;
58 m[1] = x * y * one_minus_cosa + z * sina;
59 m[5] = nysq + (1.0 - nysq) * cosa;
60 m[9] = y * z * one_minus_cosa - x * sina;
61 m[2] = x * z * one_minus_cosa - y * sina;
62 m[6] = y * z * one_minus_cosa + x * sina;
63 m[10] = nzsq + (1.0 - nzsq) * cosa;
69 void mat_perspective(float *mat, float vfov_deg, float aspect, float znear, float zfar)
71 float m[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
73 float vfov = M_PI * vfov_deg / 180.0f;
74 float s = 1.0f / tan(vfov * 0.5f);
75 float range = znear - zfar;
79 m[10] = (znear + zfar) / range;
81 m[14] = 2.0f * znear * zfar / range;
86 void mat_transform(float *mat, float *vec)
88 float x = mat[0] * vec[0] + mat[4] * vec[1] + mat[8] * vec[2] + mat[12];
89 float y = mat[1] * vec[0] + mat[5] * vec[1] + mat[9] * vec[2] + mat[13];
90 float z = mat[2] * vec[0] + mat[6] * vec[1] + mat[10] * vec[2] + mat[14];