summaryrefslogtreecommitdiff
path: root/glm/m4.ha
blob: 6b283e20f345d975e7ece8576ce0e45b1e2427a7 (plain)
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
use fmt;
use rt;

export def M4_IDENT: m4 = [
	[1.0, 0.0, 0.0, 0.0],
	[0.0, 1.0, 0.0, 0.0],
	[0.0, 0.0, 1.0, 0.0],
	[0.0, 0.0, 0.0, 1.0],
];

export def M4_ZERO: m4 = [
	[0.0, 0.0, 0.0, 0.0],
	[0.0, 0.0, 0.0, 0.0],
	[0.0, 0.0, 0.0, 0.0],
	[0.0, 0.0, 0.0, 0.0],
];

export fn m4_new(diag: f32) m4 = {
	return [
		[diag, 0.0, 0.0, 0.0],
		[0.0, diag, 0.0, 0.0],
		[0.0, 0.0, diag, 0.0],
		[0.0, 0.0, 0.0, diag],
	];
};

export fn m4_new_ident() m4 = {
	return m4_new(1.0);
};

export fn m4_new_zero() m4 = {
	return m4_new(0.0);
};

export fn m4_valptr(m: *m4) *const f32 = {
	return &m[0][0];
};

export fn m4_print(m: *m4) void = {
	fmt::printfln("[ {}, {}, {}, {}, ", m[0][0], m[1][0], m[2][0], m[3][0])!;
	fmt::printfln("  {}, {}, {}, {}, ", m[0][1], m[1][1], m[2][1], m[3][1])!;
	fmt::printfln("  {}, {}, {}, {}, ", m[0][2], m[1][2], m[2][2], m[3][2])!;
	fmt::printfln("  {}, {}, {}, {} ]", m[0][3], m[1][3], m[2][3], m[3][3])!;
};

export fn m4_set_ident(m: *m4) *m4 = {
	m4_set_zero(m);
	m[0][0] = 1.0;
	m[1][1] = 1.0;
	m[2][2] = 1.0;
	m[3][3] = 1.0;
	return m;
};

export fn m4_set_zero(m: *m4) *m4 = {
	rt::memset(m, 0, 4 * 4 * 4);
	return m;
};

export fn m4_col(m: *m4, col: int) *v4 = {
	return (&m[col]: *[4]f32): *v4;
};

export fn m4_mul_to(a: *m4, b: *m4, dest: *m4) void = {
	const a = *a;
	const b = *b;
	dest[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] +
		a[2][0] * b[0][2] + a[3][0] * b[0][3];
	dest[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] +
		a[2][1] * b[0][2] + a[3][1] * b[0][3];
	dest[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] +
		a[2][2] * b[0][2] + a[3][2] * b[0][3];
	dest[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] +
		a[2][3] * b[0][2] + a[3][3] * b[0][3];
	dest[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] +
		a[2][0] * b[1][2] + a[3][0] * b[1][3];
	dest[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] +
		a[2][1] * b[1][2] + a[3][1] * b[1][3];
	dest[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] +
		a[2][2] * b[1][2] + a[3][2] * b[1][3];
	dest[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] +
		a[2][3] * b[1][2] + a[3][3] * b[1][3];
	dest[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] +
		a[2][0] * b[2][2] + a[3][0] * b[2][3];
	dest[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] +
		a[2][1] * b[2][2] + a[3][1] * b[2][3];
	dest[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] +
		a[2][2] * b[2][2] + a[3][2] * b[2][3];
	dest[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] +
		a[2][3] * b[2][2] + a[3][3] * b[2][3];
	dest[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] +
		a[2][0] * b[3][2] + a[3][0] * b[3][3];
	dest[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] +
		a[2][1] * b[3][2] + a[3][1] * b[3][3];
	dest[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] +
		a[2][2] * b[3][2] + a[3][2] * b[3][3];
	dest[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] +
		a[2][3] * b[3][2] + a[3][3] * b[3][3];
};

export fn m4_mul(a: *m4, b: *m4) m4 = {
	let res = m4_new_zero();
	m4_mul_to(a, b, &res);
	return res;
};