A hackable template for creating small and fast browser games.
1import {Mat4, Vec3} from "./math.js";
2
3export function vec3_set(out: Vec3, x: number, y: number, z: number) {
4 out[0] = x;
5 out[1] = y;
6 out[2] = z;
7 return out;
8}
9
10export function vec3_copy(out: Vec3, a: Vec3) {
11 out[0] = a[0];
12 out[1] = a[1];
13 out[2] = a[2];
14 return out;
15}
16
17export function vec3_add(out: Vec3, a: Vec3, b: Vec3) {
18 out[0] = a[0] + b[0];
19 out[1] = a[1] + b[1];
20 out[2] = a[2] + b[2];
21 return out;
22}
23
24export function vec3_subtract(out: Vec3, a: Vec3, b: Vec3) {
25 out[0] = a[0] - b[0];
26 out[1] = a[1] - b[1];
27 out[2] = a[2] - b[2];
28 return out;
29}
30
31export function vec3_scale(out: Vec3, a: Vec3, b: number) {
32 out[0] = a[0] * b;
33 out[1] = a[1] * b;
34 out[2] = a[2] * b;
35 return out;
36}
37
38export function vec3_negate(out: Vec3, a: Vec3) {
39 out[0] = -a[0];
40 out[1] = -a[1];
41 out[2] = -a[2];
42 return out;
43}
44
45export function vec3_normalize(out: Vec3, a: Vec3) {
46 let x = a[0];
47 let y = a[1];
48 let z = a[2];
49 let len = x * x + y * y + z * z;
50
51 if (len > 0) {
52 //TODO: evaluate use of glm_invsqrt here?
53 len = 1 / Math.sqrt(len);
54 }
55
56 out[0] = a[0] * len;
57 out[1] = a[1] * len;
58 out[2] = a[2] * len;
59 return out;
60}
61
62export function vec3_dot(a: Vec3, b: Vec3) {
63 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
64}
65
66export function vec3_cross(out: Vec3, a: Vec3, b: Vec3) {
67 let ax = a[0],
68 ay = a[1],
69 az = a[2];
70 let bx = b[0],
71 by = b[1],
72 bz = b[2];
73
74 out[0] = ay * bz - az * by;
75 out[1] = az * bx - ax * bz;
76 out[2] = ax * by - ay * bx;
77 return out;
78}
79
80export function vec3_transform_position(out: Vec3, a: Vec3, m: Mat4) {
81 let x = a[0];
82 let y = a[1];
83 let z = a[2];
84 let w = m[3] * x + m[7] * y + m[11] * z + m[15] || 1;
85
86 out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
87 out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
88 out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
89 return out;
90}
91
92export function vec3_transform_direction(out: Vec3, a: Vec3, m: Mat4) {
93 let x = a[0];
94 let y = a[1];
95 let z = a[2];
96
97 out[0] = m[0] * x + m[4] * y + m[8] * z;
98 out[1] = m[1] * x + m[5] * y + m[9] * z;
99 out[2] = m[2] * x + m[6] * y + m[10] * z;
100 return out;
101}
102
103export function vec3_length(a: Vec3) {
104 let x = a[0];
105 let y = a[1];
106 let z = a[2];
107 return Math.hypot(x, y, z);
108}
109
110export function vec3_distance(a: Vec3, b: Vec3) {
111 let x = b[0] - a[0];
112 let y = b[1] - a[1];
113 let z = b[2] - a[2];
114 return Math.hypot(x, y, z);
115}
116
117export function vec3_distance_squared(a: Vec3, b: Vec3) {
118 let x = b[0] - a[0];
119 let y = b[1] - a[1];
120 let z = b[2] - a[2];
121 return x * x + y * y + z * z;
122}
123
124export function vec3_manhattan(a: Vec3, b: Vec3) {
125 return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) + Math.abs(a[2] - b[2]);
126}
127
128export function vec3_lerp(out: Vec3, a: Vec3, b: Vec3, t: number) {
129 let ax = a[0];
130 let ay = a[1];
131 let az = a[2];
132 out[0] = ax + t * (b[0] - ax);
133 out[1] = ay + t * (b[1] - ay);
134 out[2] = az + t * (b[2] - az);
135 return out;
136}