A hackable template for creating small and fast browser games.
1export type Model = Float32Array;
2
3export function load(path: string): Promise<Array<Model>> {
4 return fetch(path)
5 .then((response) => response.arrayBuffer())
6 .then((buffer) => {
7 let buffer_array = new Uint16Array(buffer);
8 let model_data: Array<Model> = [];
9 let i = 0;
10
11 while (i < buffer_array.length) {
12 let size: number[] = [0, 0, 0];
13 let model_start = i + 1;
14 let model_length = buffer_array[i];
15 let model_end = model_start + model_length;
16 let model = [];
17
18 for (i = model_start; i < model_end; i++) {
19 let voxel = buffer_array[i];
20 model.push(
21 (voxel & 15) >> 0,
22 (voxel & 240) >> 4,
23 (voxel & 3840) >> 8,
24 (voxel & 61440) >> 12,
25 );
26 }
27
28 for (let j = 0; j < model.length; j++) {
29 if (size[j % 4] < model[j] + 1) {
30 size[j % 4] = model[j] + 1;
31 }
32 }
33
34 model_data.push(
35 new Float32Array(model).map((val, idx) => {
36 switch (idx % 4) {
37 case 0:
38 return val - size[0] / 2 + 0.5;
39 case 1:
40 return val - size[1] / 2 + 0.5;
41 case 2:
42 return val - size[2] / 2 + 0.5;
43 default:
44 return val;
45 }
46 }),
47 );
48 }
49
50 return model_data;
51 });
52}