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 math;
export fn v4_new(x: f32, y: f32, z: f32, w: f32) v4 = {
return [x, y, z, w];
};
export fn v4_new_fill(x: f32) v4 = {
return [x, x, x, x];
};
export fn v4_new_zero() v4 = {
return [0.0, 0.0, 0.0, 0.0];
};
export fn v4_copy(v: *v4) v4 = {
return [v[0], v[1], v[2], v[3]];
};
export fn v4_copy_to(v: *v4, dest: *v4) void = {
dest[0] = v[0];
dest[1] = v[1];
dest[2] = v[2];
dest[3] = v[3];
};
export fn v4_valptr(v: *v4) *const f32 = {
return &v[0];
};
export fn v4_print(v: v4) void = {
fmt::printfln("[ {}, {}, {}, {} ]", v[0], v[1], v[2], v[3])!;
};
export fn v4_negate(v: *v4) void = {
v[0] *= -1.0;
v[1] *= -1.0;
v[2] *= -1.0;
v[3] *= -1.0;
};
export fn v4_negate_to(v: *v4, dest: *v4) void = {
dest[0] = v[0] * -1.0;
dest[1] = v[1] * -1.0;
dest[2] = v[2] * -1.0;
dest[3] = v[3] * -1.0;
};
export fn v4_add(a: *v4, b: *v4) v4 = {
return [
a[0] + b[0],
a[1] + b[1],
a[2] + b[2],
a[3] + b[3],
];
};
export fn v4_sub(a: *v4, b: *v4) v4 = {
return [
a[0] - b[0],
a[1] - b[1],
a[2] - b[2],
a[3] - b[3],
];
};
export fn v4_normalize(v: *v4) void = {
const norm = v4_norm(v);
if (norm == 0.0) {
v[0] = 0.0;
v[1] = 0.0;
v[2] = 0.0;
v[3] = 0.0;
return;
};
v4_scale(v, 1.0 / norm);
};
export fn v4_dot(a: *v4, b: *v4) f32 = {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
};
export fn v4_norm2(v: *v4) f32 = {
return v4_dot(v, v);
};
export fn v4_norm(v: *v4) f32 = {
return math::sqrtf64(v4_norm2(v)): f32;
};
export fn v4_scale(v: *v4, s: f32) void = {
v[0] = v[0] * s;
v[1] = v[1] * s;
v[2] = v[2] * s;
v[3] = v[3] * s;
};
export fn v4_scale_to(v: *v4, s: f32, dest: *v4) void = {
dest[0] = v[0] * s;
dest[1] = v[1] * s;
dest[2] = v[2] * s;
dest[3] = v[3] * s;
};
|