awv3
Version:
⚡ AWV3 embedded CAD
97 lines (87 loc) • 2.66 kB
JavaScript
import { inflate } from 'pako/lib/inflate';
import base64 from 'base64-arraybuffer';
export function min(vec, v) {
vec[0] = Math.min(vec[0], v[0]);
vec[1] = Math.min(vec[1], v[1]);
vec[2] = Math.min(vec[2], v[2]);
}
export function max(vec, v) {
vec[0] = Math.max(vec[0], v[0]);
vec[1] = Math.max(vec[1], v[1]);
vec[2] = Math.max(vec[2], v[2]);
}
export function expand(vecMin, vecMax, v) {
min(vecMin, v);
max(vecMax, v);
}
export function cross(vec, v) {
let [x, y, z] = vec;
vec[0] = y * v[2] - z * v[1];
vec[1] = z * v[0] - x * v[2];
vec[2] = x * v[1] - y * v[0];
}
export function applyMatrix(vec, e) {
let [x, y, z] = vec;
vec[0] = e[0] * x + e[4] * y + e[8] * z + e[12];
vec[1] = e[1] * x + e[5] * y + e[9] * z + e[13];
vec[2] = e[2] * x + e[6] * y + e[10] * z + e[14];
}
export function distance(v1, v2) {
let [x1, y1, z1] = v1;
let [x2, y2, z2] = v2;
let dx = x1 - x2, dy = y1 - y2, dz = z1 - z2;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}
function utf8ArrayToStr(array) {
let out, i, len, c;
let char2, char3;
out = '';
len = array.length;
i = 0;
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode((c & 0x1f) << 6 | char2 & 0x3f);
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode((c & 0x0f) << 12 | (char2 & 0x3f) << 6 | (char3 & 0x3f) << 0);
break;
}
}
return out;
}
function decodeBuffer(buffer, length) {
let data = '';
if (typeof TextDecoder !== 'undefined') {
let dataView = new DataView(buffer.buffer), decoder = new TextDecoder('utf-8');
data = decoder.decode(dataView);
} else
data = utf8ArrayToStr(buffer);
return data.slice(0, length);
}
export function unpack(blob) {
let stream = blob.data;
if (!(stream instanceof Uint8Array)) stream = base64.decode(blob.data);
stream = inflate(stream, { raw: true });
stream = decodeBuffer(stream, blob.length || stream.length);
blob.data = JSON.parse(stream);
blob.size = stream.length;
}