A hackable template for creating small and fast browser games.
at main 52 lines 1.8 kB view raw
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}