summaryrefslogtreecommitdiff
path: root/glm/v3.ha
blob: e7f1a8eef0be89eaf4cdfd7de709e4df04575572 (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use fmt;
use math;

export def V3_ZERO: v3 = [0.0, 0.0, 0.0];
export def V3_ONE: v3 = [1.0, 1.0, 1.0];

export fn v3_new(x: f32, y: f32, z: f32) v3 = {
	return [x, y, z];
};

export fn v3_new_fill(x: f32) v3 = {
	return [x, x, x];
};

export fn v3_new_zero() v3 = {
	return [0.0, 0.0, 0.0];
};

export fn v3_copy(v: *v3) v3 = {
	return [v[0], v[1], v[2]];
};

export fn v3_copy_to(v: *v3, dest: *v3) void = {
	dest[0] = v[0];
	dest[1] = v[1];
	dest[2] = v[2];
};

export fn v3_valptr(v: *v3) *const f32 = {
	return &v[0];
};

export fn v3_print(v: *v3) void = {
	fmt::printfln("[ {}, {}, {} ]", v[0], v[1], v[2])!;
};

export fn v3_negate(v: *v3) void = {
	v[0] *= -1.0;
	v[1] *= -1.0;
	v[2] *= -1.0;
};

export fn v3_negate_to(v: *v3, dest: *v3) void = {
	dest[0] = v[0] * -1.0;
	dest[1] = v[1] * -1.0;
	dest[2] = v[2] * -1.0;
};

export fn v3_add(a: *v3, b: *v3) v3 = {
	return [
		a[0] + b[0],
		a[1] + b[1],
		a[2] + b[2],
	];
};

export fn v3_sub(a: *v3, b: *v3) v3 = {
	return [
		a[0] - b[0],
		a[1] - b[1],
		a[2] - b[2],
	];
};

export fn v3_normalize(v: *v3) void = {
	const norm = v3_norm(v);

	if (norm == 0.0) {
		v[0] = 0.0;
		v[1] = 0.0;
		v[2] = 0.0;
		return;
	};

	v3_scale(v, 1.0 / norm);
};

export fn v3_normalize_to(v: *v3, dest: *v3) void = {
	const norm = v3_norm(v);

	if (norm == 0.0) {
		dest[0] = 0.0;
		dest[1] = 0.0;
		dest[2] = 0.0;
		return;
	};

	v3_scale_to(v, 1.0 / norm, dest);
};

export fn v3_dot(a: *v3, b: *v3) f32 = {
	return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
};

export fn v3_norm2(v: *v3) f32 = {
	return v3_dot(v, v);
};

export fn v3_norm(v: *v3) f32 = {
	return math::sqrtf64(v3_norm2(v)): f32;
};

export fn v3_scale(v: *v3, s: f32) void = {
	v[0] = v[0] * s;
	v[1] = v[1] * s;
	v[2] = v[2] * s;
};

export fn v3_scale_to(v: *v3, s: f32, dest: *v3) void = {
	dest[0] = v[0] * s;
	dest[1] = v[1] * s;
	dest[2] = v[2] * s;
};

export fn v3_cross(a: *v3, b: *v3) v3 = {
	return [
		a[1] * b[2] - a[2] * b[1],
		a[2] * b[0] - a[0] * b[2],
		a[0] * b[1] - a[1] * b[0],
	];
};

export fn v3_crossn(a: *v3, b: *v3) v3 = {
	let res = v3_cross(a, b);
	v3_normalize(&res);
	return res;
};