var __defProp = Object.defineProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true, configurable: true, set: (newValue) => all[name] = () => newValue }); }; // node_modules/gl-matrix/esm/quat.js var exports_quat = {}; __export(exports_quat, { str: () => { { return str2; } }, squaredLength: () => { { return squaredLength3; } }, sqrLen: () => { { return sqrLen2; } }, sqlerp: () => { { return sqlerp; } }, slerp: () => { { return slerp; } }, setAxisAngle: () => { { return setAxisAngle; } }, setAxes: () => { { return setAxes; } }, set: () => { { return set3; } }, scale: () => { { return scale3; } }, rotationTo: () => { { return rotationTo; } }, rotateZ: () => { { return rotateZ2; } }, rotateY: () => { { return rotateY2; } }, rotateX: () => { { return rotateX2; } }, random: () => { { return random2; } }, pow: () => { { return pow; } }, normalize: () => { { return normalize3; } }, multiply: () => { { return multiply2; } }, mul: () => { { return mul2; } }, ln: () => { { return ln; } }, lerp: () => { { return lerp3; } }, length: () => { { return length3; } }, len: () => { { return len2; } }, invert: () => { { return invert; } }, identity: () => { { return identity; } }, getAxisAngle: () => { { return getAxisAngle; } }, getAngle: () => { { return getAngle; } }, fromValues: () => { { return fromValues3; } }, fromMat3: () => { { return fromMat3; } }, fromEuler: () => { { return fromEuler; } }, exp: () => { { return exp; } }, exactEquals: () => { { return exactEquals3; } }, equals: () => { { return equals3; } }, dot: () => { { return dot3; } }, create: () => { { return create4; } }, copy: () => { { return copy3; } }, conjugate: () => { { return conjugate; } }, clone: () => { { return clone3; } }, calculateW: () => { { return calculateW; } }, add: () => { { return add3; } } }); // node_modules/gl-matrix/esm/common.js var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; var RANDOM = Math.random; var degree = Math.PI / 180; if (!Math.hypot) Math.hypot = function() { var y = 0, i = arguments.length; while (i--) { y += arguments[i] * arguments[i]; } return Math.sqrt(y); }; // node_modules/gl-matrix/esm/mat3.js function create() { var out = new ARRAY_TYPE(9); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[5] = 0; out[6] = 0; out[7] = 0; } out[0] = 1; out[4] = 1; out[8] = 1; return out; } // node_modules/gl-matrix/esm/vec3.js var exports_vec3 = {}; __export(exports_vec3, { zero: () => { { return zero; } }, transformQuat: () => { { return transformQuat; } }, transformMat4: () => { { return transformMat4; } }, transformMat3: () => { { return transformMat3; } }, subtract: () => { { return subtract; } }, sub: () => { { return sub; } }, str: () => { { return str; } }, squaredLength: () => { { return squaredLength; } }, squaredDistance: () => { { return squaredDistance; } }, sqrLen: () => { { return sqrLen; } }, sqrDist: () => { { return sqrDist; } }, set: () => { { return set; } }, scaleAndAdd: () => { { return scaleAndAdd; } }, scale: () => { { return scale; } }, round: () => { { return round; } }, rotateZ: () => { { return rotateZ; } }, rotateY: () => { { return rotateY; } }, rotateX: () => { { return rotateX; } }, random: () => { { return random; } }, normalize: () => { { return normalize; } }, negate: () => { { return negate; } }, multiply: () => { { return multiply; } }, mul: () => { { return mul; } }, min: () => { { return min; } }, max: () => { { return max; } }, lerp: () => { { return lerp; } }, length: () => { { return length; } }, len: () => { { return len; } }, inverse: () => { { return inverse; } }, hermite: () => { { return hermite; } }, fromValues: () => { { return fromValues; } }, forEach: () => { { return forEach; } }, floor: () => { { return floor; } }, exactEquals: () => { { return exactEquals; } }, equals: () => { { return equals; } }, dot: () => { { return dot; } }, divide: () => { { return divide; } }, div: () => { { return div; } }, distance: () => { { return distance; } }, dist: () => { { return dist; } }, cross: () => { { return cross; } }, create: () => { { return create2; } }, copy: () => { { return copy; } }, clone: () => { { return clone; } }, ceil: () => { { return ceil; } }, bezier: () => { { return bezier; } }, angle: () => { { return angle; } }, add: () => { { return add; } } }); function create2() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } function clone(a) { var out = new ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } function length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.hypot(x, y, z); } function fromValues(x, y, z) { var out = new ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out; } function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } function set(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out; } function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out; } function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out; } function multiply(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out; } function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out; } function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out; } function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out; } function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out; } function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out; } function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); return out; } function scale(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out; } function scaleAndAdd(out, a, b, scale2) { out[0] = a[0] + b[0] * scale2; out[1] = a[1] + b[1] * scale2; out[2] = a[2] + b[2] * scale2; return out; } function distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.hypot(x, y, z); } function squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z; } function squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z; } function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out; } function inverse(out, a) { out[0] = 1 / a[0]; out[1] = 1 / a[1]; out[2] = 1 / a[2]; return out; } function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) { len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; return out; } function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } function cross(out, a, b) { var ax = a[0], ay = a[1], az = a[2]; var bx = b[0], by = b[1], bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out; } function lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out; } function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } function bezier(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } function random(out, scale2) { scale2 = scale2 || 1; var r = RANDOM() * 2 * Math.PI; var z = RANDOM() * 2 - 1; var zScale = Math.sqrt(1 - z * z) * scale2; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale2; return out; } function transformMat4(out, a, m) { var x = a[0], y = a[1], z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out; } function transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } function transformQuat(out, a, q) { var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; var x = a[0], y = a[1], z = a[2]; var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; uuvx *= 2; uuvy *= 2; uuvz *= 2; out[0] = x + uvx + uuvx; out[1] = y + uvy + uuvy; out[2] = z + uvz + uuvz; return out; } function rotateX(out, a, b, rad) { var p = [], r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[0]; r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } function rotateY(out, a, b, rad) { var p = [], r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); r[1] = p[1]; r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } function rotateZ(out, a, b, rad) { var p = [], r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); r[2] = p[2]; out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } function angle(a, b) { var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag1 = Math.sqrt(ax * ax + ay * ay + az * az), mag2 = Math.sqrt(bx * bx + by * by + bz * bz), mag = mag1 * mag2, cosine = mag && dot(a, b) / mag; return Math.acos(Math.min(Math.max(cosine, -1), 1)); } function zero(out) { out[0] = 0; out[1] = 0; out[2] = 0; return out; } function str(a) { return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; } function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; } function equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2]; var b0 = b[0], b1 = b[1], b2 = b[2]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)); } var sub = subtract; var mul = multiply; var div = divide; var dist = distance; var sqrDist = squaredDistance; var len = length; var sqrLen = squaredLength; var forEach = function() { var vec = create2(); return function(a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 3; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset;i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; } return a; }; }(); // node_modules/gl-matrix/esm/vec4.js function create3() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; } return out; } function clone2(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } function fromValues2(x, y, z, w) { var out = new ARRAY_TYPE(4); out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } function copy2(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } function set2(out, x, y, z, w) { out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } function add2(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } function scale2(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } function length2(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return Math.hypot(x, y, z, w); } function squaredLength2(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return x * x + y * y + z * z + w * w; } function normalize2(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; var len2 = x * x + y * y + z * z + w * w; if (len2 > 0) { len2 = 1 / Math.sqrt(len2); } out[0] = x * len2; out[1] = y * len2; out[2] = z * len2; out[3] = w * len2; return out; } function dot2(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; } function lerp2(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; var aw = a[3]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); out[3] = aw + t * (b[3] - aw); return out; } function exactEquals2(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } function equals2(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)); } var forEach2 = function() { var vec = create3(); return function(a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 4; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset;i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; vec[3] = a[i + 3]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; a[i + 3] = vec[3]; } return a; }; }(); // node_modules/gl-matrix/esm/quat.js function create4() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } out[3] = 1; return out; } function identity(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } function setAxisAngle(out, axis, rad) { rad = rad * 0.5; var s = Math.sin(rad); out[0] = s * axis[0]; out[1] = s * axis[1]; out[2] = s * axis[2]; out[3] = Math.cos(rad); return out; } function getAxisAngle(out_axis, q) { var rad = Math.acos(q[3]) * 2; var s = Math.sin(rad / 2); if (s > EPSILON) { out_axis[0] = q[0] / s; out_axis[1] = q[1] / s; out_axis[2] = q[2] / s; } else { out_axis[0] = 1; out_axis[1] = 0; out_axis[2] = 0; } return rad; } function getAngle(a, b) { var dotproduct = dot3(a, b); return Math.acos(2 * dotproduct * dotproduct - 1); } function multiply2(out, a, b) { var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; out[0] = ax * bw + aw * bx + ay * bz - az * by; out[1] = ay * bw + aw * by + az * bx - ax * bz; out[2] = az * bw + aw * bz + ax * by - ay * bx; out[3] = aw * bw - ax * bx - ay * by - az * bz; return out; } function rotateX2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + aw * bx; out[1] = ay * bw + az * bx; out[2] = az * bw - ay * bx; out[3] = aw * bw - ax * bx; return out; } function rotateY2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var by = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw - az * by; out[1] = ay * bw + aw * by; out[2] = az * bw + ax * by; out[3] = aw * bw - ay * by; return out; } function rotateZ2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bz = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + ay * bz; out[1] = ay * bw - ax * bz; out[2] = az * bw + aw * bz; out[3] = aw * bw - az * bz; return out; } function calculateW(out, a) { var x = a[0], y = a[1], z = a[2]; out[0] = x; out[1] = y; out[2] = z; out[3] = Math.sqrt(Math.abs(1 - x * x - y * y - z * z)); return out; } function exp(out, a) { var x = a[0], y = a[1], z = a[2], w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var et = Math.exp(w); var s = r > 0 ? et * Math.sin(r) / r : 0; out[0] = x * s; out[1] = y * s; out[2] = z * s; out[3] = et * Math.cos(r); return out; } function ln(out, a) { var x = a[0], y = a[1], z = a[2], w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var t = r > 0 ? Math.atan2(r, w) / r : 0; out[0] = x * t; out[1] = y * t; out[2] = z * t; out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w); return out; } function pow(out, a, b) { ln(out, a); scale3(out, out, b); exp(out, out); return out; } function slerp(out, a, b, t) { var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; var omega, cosom, sinom, scale0, scale1; cosom = ax * bx + ay * by + az * bz + aw * bw; if (cosom < 0) { cosom = -cosom; bx = -bx; by = -by; bz = -bz; bw = -bw; } if (1 - cosom > EPSILON) { omega = Math.acos(cosom); sinom = Math.sin(omega); scale0 = Math.sin((1 - t) * omega) / sinom; scale1 = Math.sin(t * omega) / sinom; } else { scale0 = 1 - t; scale1 = t; } out[0] = scale0 * ax + scale1 * bx; out[1] = scale0 * ay + scale1 * by; out[2] = scale0 * az + scale1 * bz; out[3] = scale0 * aw + scale1 * bw; return out; } function random2(out) { var u1 = RANDOM(); var u2 = RANDOM(); var u3 = RANDOM(); var sqrt1MinusU1 = Math.sqrt(1 - u1); var sqrtU1 = Math.sqrt(u1); out[0] = sqrt1MinusU1 * Math.sin(2 * Math.PI * u2); out[1] = sqrt1MinusU1 * Math.cos(2 * Math.PI * u2); out[2] = sqrtU1 * Math.sin(2 * Math.PI * u3); out[3] = sqrtU1 * Math.cos(2 * Math.PI * u3); return out; } function invert(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var dot3 = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; var invDot = dot3 ? 1 / dot3 : 0; out[0] = -a0 * invDot; out[1] = -a1 * invDot; out[2] = -a2 * invDot; out[3] = a3 * invDot; return out; } function conjugate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; return out; } function fromMat3(out, m) { var fTrace = m[0] + m[4] + m[8]; var fRoot; if (fTrace > 0) { fRoot = Math.sqrt(fTrace + 1); out[3] = 0.5 * fRoot; fRoot = 0.5 / fRoot; out[0] = (m[5] - m[7]) * fRoot; out[1] = (m[6] - m[2]) * fRoot; out[2] = (m[1] - m[3]) * fRoot; } else { var i = 0; if (m[4] > m[0]) i = 1; if (m[8] > m[i * 3 + i]) i = 2; var j = (i + 1) % 3; var k = (i + 2) % 3; fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1); out[i] = 0.5 * fRoot; fRoot = 0.5 / fRoot; out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; } return out; } function fromEuler(out, x, y, z) { var halfToRad = 0.5 * Math.PI / 180; x *= halfToRad; y *= halfToRad; z *= halfToRad; var sx = Math.sin(x); var cx = Math.cos(x); var sy = Math.sin(y); var cy = Math.cos(y); var sz = Math.sin(z); var cz = Math.cos(z); out[0] = sx * cy * cz - cx * sy * sz; out[1] = cx * sy * cz + sx * cy * sz; out[2] = cx * cy * sz - sx * sy * cz; out[3] = cx * cy * cz + sx * sy * sz; return out; } function str2(a) { return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; } var clone3 = clone2; var fromValues3 = fromValues2; var copy3 = copy2; var set3 = set2; var add3 = add2; var mul2 = multiply2; var scale3 = scale2; var dot3 = dot2; var lerp3 = lerp2; var length3 = length2; var len2 = length3; var squaredLength3 = squaredLength2; var sqrLen2 = squaredLength3; var normalize3 = normalize2; var exactEquals3 = exactEquals2; var equals3 = equals2; var rotationTo = function() { var tmpvec3 = create2(); var xUnitVec3 = fromValues(1, 0, 0); var yUnitVec3 = fromValues(0, 1, 0); return function(out, a, b) { var dot4 = dot(a, b); if (dot4 < -0.999999) { cross(tmpvec3, xUnitVec3, a); if (len(tmpvec3) < 0.000001) cross(tmpvec3, yUnitVec3, a); normalize(tmpvec3, tmpvec3); setAxisAngle(out, tmpvec3, Math.PI); return out; } else if (dot4 > 0.999999) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } else { cross(tmpvec3, a, b); out[0] = tmpvec3[0]; out[1] = tmpvec3[1]; out[2] = tmpvec3[2]; out[3] = 1 + dot4; return normalize3(out, out); } }; }(); var sqlerp = function() { var temp1 = create4(); var temp2 = create4(); return function(out, a, b, c, d, t) { slerp(temp1, a, d, t); slerp(temp2, b, c, t); slerp(out, temp1, temp2, 2 * t * (1 - t)); return out; }; }(); var setAxes = function() { var matr = create(); return function(out, view, right, up) { matr[0] = right[0]; matr[3] = right[1]; matr[6] = right[2]; matr[1] = up[0]; matr[4] = up[1]; matr[7] = up[2]; matr[2] = -view[0]; matr[5] = -view[1]; matr[8] = -view[2]; return normalize3(out, fromMat3(out, matr)); }; }(); // node_modules/gl-matrix/esm/mat4.js var exports_mat4 = {}; __export(exports_mat4, { transpose: () => { { return transpose; } }, translate: () => { { return translate; } }, targetTo: () => { { return targetTo; } }, subtract: () => { { return subtract2; } }, sub: () => { { return sub2; } }, str: () => { { return str3; } }, set: () => { { return set4; } }, scale: () => { { return scale4; } }, rotateZ: () => { { return rotateZ3; } }, rotateY: () => { { return rotateY3; } }, rotateX: () => { { return rotateX3; } }, rotate: () => { { return rotate; } }, perspectiveZO: () => { { return perspectiveZO; } }, perspectiveNO: () => { { return perspectiveNO; } }, perspectiveFromFieldOfView: () => { { return perspectiveFromFieldOfView; } }, perspective: () => { { return perspective; } }, orthoZO: () => { { return orthoZO; } }, orthoNO: () => { { return orthoNO; } }, ortho: () => { { return ortho; } }, multiplyScalarAndAdd: () => { { return multiplyScalarAndAdd; } }, multiplyScalar: () => { { return multiplyScalar; } }, multiply: () => { { return multiply3; } }, mul: () => { { return mul3; } }, lookAt: () => { { return lookAt; } }, invert: () => { { return invert2; } }, identity: () => { { return identity2; } }, getTranslation: () => { { return getTranslation; } }, getScaling: () => { { return getScaling; } }, getRotation: () => { { return getRotation; } }, frustum: () => { { return frustum; } }, fromZRotation: () => { { return fromZRotation; } }, fromYRotation: () => { { return fromYRotation; } }, fromXRotation: () => { { return fromXRotation; } }, fromValues: () => { { return fromValues4; } }, fromTranslation: () => { { return fromTranslation; } }, fromScaling: () => { { return fromScaling; } }, fromRotationTranslationScaleOrigin: () => { { return fromRotationTranslationScaleOrigin; } }, fromRotationTranslationScale: () => { { return fromRotationTranslationScale; } }, fromRotationTranslation: () => { { return fromRotationTranslation; } }, fromRotation: () => { { return fromRotation; } }, fromQuat2: () => { { return fromQuat2; } }, fromQuat: () => { { return fromQuat; } }, frob: () => { { return frob; } }, exactEquals: () => { { return exactEquals4; } }, equals: () => { { return equals4; } }, determinant: () => { { return determinant; } }, create: () => { { return create5; } }, copy: () => { { return copy4; } }, clone: () => { { return clone4; } }, adjoint: () => { { return adjoint; } }, add: () => { { return add4; } } }); function create5() { var out = new ARRAY_TYPE(16); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; } out[0] = 1; out[5] = 1; out[10] = 1; out[15] = 1; return out; } function clone4(a) { var out = new ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } function copy4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } function fromValues4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { var out = new ARRAY_TYPE(16); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } function set4(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } function identity2(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function transpose(out, a) { if (out === a) { var a01 = a[1], a02 = a[2], a03 = a[3]; var a12 = a[6], a13 = a[7]; var a23 = a[11]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a01; out[6] = a[9]; out[7] = a[13]; out[8] = a02; out[9] = a12; out[11] = a[14]; out[12] = a03; out[13] = a13; out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a[1]; out[5] = a[5]; out[6] = a[9]; out[7] = a[13]; out[8] = a[2]; out[9] = a[6]; out[10] = a[10]; out[11] = a[14]; out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; out[15] = a[15]; } return out; } function invert2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out; } function adjoint(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); return out; } function determinant(a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; } function multiply3(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out; } function translate(out, a, v) { var x = v[0], y = v[1], z = v[2]; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } function scale4(out, a, v) { var x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } function rotate(out, a, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len3 = Math.hypot(x, y, z); var s, c, t; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; var b00, b01, b02; var b10, b11, b12; var b20, b21, b22; if (len3 < EPSILON) { return null; } len3 = 1 / len3; x *= len3; y *= len3; z *= len3; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; out[0] = a00 * b00 + a10 * b01 + a20 * b02; out[1] = a01 * b00 + a11 * b01 + a21 * b02; out[2] = a02 * b00 + a12 * b01 + a22 * b02; out[3] = a03 * b00 + a13 * b01 + a23 * b02; out[4] = a00 * b10 + a10 * b11 + a20 * b12; out[5] = a01 * b10 + a11 * b11 + a21 * b12; out[6] = a02 * b10 + a12 * b11 + a22 * b12; out[7] = a03 * b10 + a13 * b11 + a23 * b12; out[8] = a00 * b20 + a10 * b21 + a20 * b22; out[9] = a01 * b20 + a11 * b21 + a21 * b22; out[10] = a02 * b20 + a12 * b21 + a22 * b22; out[11] = a03 * b20 + a13 * b21 + a23 * b22; if (a !== out) { out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } return out; } function rotateX3(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out; } function rotateY3(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } out[0] = a00 * c - a20 * s; out[1] = a01 * c - a21 * s; out[2] = a02 * c - a22 * s; out[3] = a03 * c - a23 * s; out[8] = a00 * s + a20 * c; out[9] = a01 * s + a21 * c; out[10] = a02 * s + a22 * c; out[11] = a03 * s + a23 * c; return out; } function rotateZ3(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; if (a !== out) { out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out; } function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = v[1]; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = v[2]; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function fromRotation(out, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len3 = Math.hypot(x, y, z); var s, c, t; if (len3 < EPSILON) { return null; } len3 = 1 / len3; x *= len3; y *= len3; z *= len3; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; out[0] = x * x * t + c; out[1] = y * x * t + z * s; out[2] = z * x * t - y * s; out[3] = 0; out[4] = x * y * t - z * s; out[5] = y * y * t + c; out[6] = z * y * t + x * s; out[7] = 0; out[8] = x * z * t + y * s; out[9] = y * z * t - x * s; out[10] = z * z * t + c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function fromXRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = c; out[6] = s; out[7] = 0; out[8] = 0; out[9] = -s; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function fromYRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = 0; out[2] = -s; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = s; out[9] = 0; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function fromZRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = 0; out[4] = -s; out[5] = c; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function fromRotationTranslation(out, q, v) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - (yy + zz); out[1] = xy + wz; out[2] = xz - wy; out[3] = 0; out[4] = xy - wz; out[5] = 1 - (xx + zz); out[6] = yz + wx; out[7] = 0; out[8] = xz + wy; out[9] = yz - wx; out[10] = 1 - (xx + yy); out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } function fromQuat2(out, a) { var translation = new ARRAY_TYPE(3); var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7]; var magnitude = bx * bx + by * by + bz * bz + bw * bw; if (magnitude > 0) { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; } else { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; } fromRotationTranslation(out, a, translation); return out; } function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; return out; } function getScaling(out, mat) { var m11 = mat[0]; var m12 = mat[1]; var m13 = mat[2]; var m21 = mat[4]; var m22 = mat[5]; var m23 = mat[6]; var m31 = mat[8]; var m32 = mat[9]; var m33 = mat[10]; out[0] = Math.hypot(m11, m12, m13); out[1] = Math.hypot(m21, m22, m23); out[2] = Math.hypot(m31, m32, m33); return out; } function getRotation(out, mat) { var scaling = new ARRAY_TYPE(3); getScaling(scaling, mat); var is1 = 1 / scaling[0]; var is2 = 1 / scaling[1]; var is3 = 1 / scaling[2]; var sm11 = mat[0] * is1; var sm12 = mat[1] * is2; var sm13 = mat[2] * is3; var sm21 = mat[4] * is1; var sm22 = mat[5] * is2; var sm23 = mat[6] * is3; var sm31 = mat[8] * is1; var sm32 = mat[9] * is2; var sm33 = mat[10] * is3; var trace = sm11 + sm22 + sm33; var S = 0; if (trace > 0) { S = Math.sqrt(trace + 1) * 2; out[3] = 0.25 * S; out[0] = (sm23 - sm32) / S; out[1] = (sm31 - sm13) / S; out[2] = (sm12 - sm21) / S; } else if (sm11 > sm22 && sm11 > sm33) { S = Math.sqrt(1 + sm11 - sm22 - sm33) * 2; out[3] = (sm23 - sm32) / S; out[0] = 0.25 * S; out[1] = (sm12 + sm21) / S; out[2] = (sm31 + sm13) / S; } else if (sm22 > sm33) { S = Math.sqrt(1 + sm22 - sm11 - sm33) * 2; out[3] = (sm31 - sm13) / S; out[0] = (sm12 + sm21) / S; out[1] = 0.25 * S; out[2] = (sm23 + sm32) / S; } else { S = Math.sqrt(1 + sm33 - sm11 - sm22) * 2; out[3] = (sm12 - sm21) / S; out[0] = (sm31 + sm13) / S; out[1] = (sm23 + sm32) / S; out[2] = 0.25 * S; } return out; } function fromRotationTranslationScale(out, q, v, s) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } function fromRotationTranslationScaleOrigin(out, q, v, s, o) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; var ox = o[0]; var oy = o[1]; var oz = o[2]; var out0 = (1 - (yy + zz)) * sx; var out1 = (xy + wz) * sx; var out2 = (xz - wy) * sx; var out4 = (xy - wz) * sy; var out5 = (1 - (xx + zz)) * sy; var out6 = (yz + wx) * sy; var out8 = (xz + wy) * sz; var out9 = (yz - wx) * sz; var out10 = (1 - (xx + yy)) * sz; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = 0; out[4] = out4; out[5] = out5; out[6] = out6; out[7] = 0; out[8] = out8; out[9] = out9; out[10] = out10; out[11] = 0; out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); out[15] = 1; return out; } function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[1] = yx + wz; out[2] = zx - wy; out[3] = 0; out[4] = yx - wz; out[5] = 1 - xx - zz; out[6] = zy + wx; out[7] = 0; out[8] = zx + wy; out[9] = zy - wx; out[10] = 1 - xx - yy; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function frustum(out, left, right, bottom, top, near, far) { var rl = 1 / (right - left); var tb = 1 / (top - bottom); var nf = 1 / (near - far); out[0] = near * 2 * rl; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = near * 2 * tb; out[6] = 0; out[7] = 0; out[8] = (right + left) * rl; out[9] = (top + bottom) * tb; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near * 2 * nf; out[15] = 0; return out; } function perspectiveNO(out, fovy, aspect, near, far) { var f = 1 / Math.tan(fovy / 2), nf; out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = -1; out[12] = 0; out[13] = 0; out[15] = 0; if (far != null && far !== Infinity) { nf = 1 / (near - far); out[10] = (far + near) * nf; out[14] = 2 * far * near * nf; } else { out[10] = -1; out[14] = -2 * near; } return out; } function perspectiveZO(out, fovy, aspect, near, far) { var f = 1 / Math.tan(fovy / 2), nf; out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = -1; out[12] = 0; out[13] = 0; out[15] = 0; if (far != null && far !== Infinity) { nf = 1 / (near - far); out[10] = far * nf; out[14] = far * near * nf; } else { out[10] = -1; out[14] = -near; } return out; } function perspectiveFromFieldOfView(out, fov, near, far) { var upTan = Math.tan(fov.upDegrees * Math.PI / 180); var downTan = Math.tan(fov.downDegrees * Math.PI / 180); var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180); var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180); var xScale = 2 / (leftTan + rightTan); var yScale = 2 / (upTan + downTan); out[0] = xScale; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = yScale; out[6] = 0; out[7] = 0; out[8] = -((leftTan - rightTan) * xScale * 0.5); out[9] = (upTan - downTan) * yScale * 0.5; out[10] = far / (near - far); out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near / (near - far); out[15] = 0; return out; } function orthoNO(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out; } function orthoZO(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = near * nf; out[15] = 1; return out; } function lookAt(out, eye, center, up) { var x0, x1, x2, y0, y1, y2, z0, z1, z2, len3; var eyex = eye[0]; var eyey = eye[1]; var eyez = eye[2]; var upx = up[0]; var upy = up[1]; var upz = up[2]; var centerx = center[0]; var centery = center[1]; var centerz = center[2]; if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { return identity2(out); } z0 = eyex - centerx; z1 = eyey - centery; z2 = eyez - centerz; len3 = 1 / Math.hypot(z0, z1, z2); z0 *= len3; z1 *= len3; z2 *= len3; x0 = upy * z2 - upz * z1; x1 = upz * z0 - upx * z2; x2 = upx * z1 - upy * z0; len3 = Math.hypot(x0, x1, x2); if (!len3) { x0 = 0; x1 = 0; x2 = 0; } else { len3 = 1 / len3; x0 *= len3; x1 *= len3; x2 *= len3; } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len3 = Math.hypot(y0, y1, y2); if (!len3) { y0 = 0; y1 = 0; y2 = 0; } else { len3 = 1 / len3; y0 *= len3; y1 *= len3; y2 *= len3; } out[0] = x0; out[1] = y0; out[2] = z0; out[3] = 0; out[4] = x1; out[5] = y1; out[6] = z1; out[7] = 0; out[8] = x2; out[9] = y2; out[10] = z2; out[11] = 0; out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); out[15] = 1; return out; } function targetTo(out, eye, target, up) { var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2]; var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2]; var len3 = z0 * z0 + z1 * z1 + z2 * z2; if (len3 > 0) { len3 = 1 / Math.sqrt(len3); z0 *= len3; z1 *= len3; z2 *= len3; } var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0; len3 = x0 * x0 + x1 * x1 + x2 * x2; if (len3 > 0) { len3 = 1 / Math.sqrt(len3); x0 *= len3; x1 *= len3; x2 *= len3; } out[0] = x0; out[1] = x1; out[2] = x2; out[3] = 0; out[4] = z1 * x2 - z2 * x1; out[5] = z2 * x0 - z0 * x2; out[6] = z0 * x1 - z1 * x0; out[7] = 0; out[8] = z0; out[9] = z1; out[10] = z2; out[11] = 0; out[12] = eyex; out[13] = eyey; out[14] = eyez; out[15] = 1; return out; } function str3(a) { return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; } function frob(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); } function add4(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; out[9] = a[9] + b[9]; out[10] = a[10] + b[10]; out[11] = a[11] + b[11]; out[12] = a[12] + b[12]; out[13] = a[13] + b[13]; out[14] = a[14] + b[14]; out[15] = a[15] + b[15]; return out; } function subtract2(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; out[9] = a[9] - b[9]; out[10] = a[10] - b[10]; out[11] = a[11] - b[11]; out[12] = a[12] - b[12]; out[13] = a[13] - b[13]; out[14] = a[14] - b[14]; out[15] = a[15] - b[15]; return out; } function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; out[9] = a[9] * b; out[10] = a[10] * b; out[11] = a[11] * b; out[12] = a[12] * b; out[13] = a[13] * b; out[14] = a[14] * b; out[15] = a[15] * b; return out; } function multiplyScalarAndAdd(out, a, b, scale5) { out[0] = a[0] + b[0] * scale5; out[1] = a[1] + b[1] * scale5; out[2] = a[2] + b[2] * scale5; out[3] = a[3] + b[3] * scale5; out[4] = a[4] + b[4] * scale5; out[5] = a[5] + b[5] * scale5; out[6] = a[6] + b[6] * scale5; out[7] = a[7] + b[7] * scale5; out[8] = a[8] + b[8] * scale5; out[9] = a[9] + b[9] * scale5; out[10] = a[10] + b[10] * scale5; out[11] = a[11] + b[11] * scale5; out[12] = a[12] + b[12] * scale5; out[13] = a[13] + b[13] * scale5; out[14] = a[14] + b[14] * scale5; out[15] = a[15] + b[15] * scale5; return out; } function exactEquals4(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; } function equals4(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11]; var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11]; var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1, Math.abs(a15), Math.abs(b15)); } var perspective = perspectiveNO; var ortho = orthoNO; var mul3 = multiply3; var sub2 = subtract2; // src/renderer/transform.ts class Transform { position; rotation; scale5; constructor(position = exports_vec3.create(), rotation = exports_quat.create(), scale5 = exports_vec3.fromValues(1, 1, 1)) { this.position = position; this.rotation = rotation; this.scale = scale5; } rotateEuler(x, y, z) { exports_quat.fromEuler(this.rotation, x, y, z); return this; } toMat4() { const mat = exports_mat4.create(); exports_mat4.fromRotationTranslationScale(mat, this.rotation, this.position, this.scale); return mat; } } var etoq = (v3) => exports_quat.fromEuler(exports_quat.create(), v3[0], v3[1], v3[2]); var v3 = (v) => [v, v, v]; // src/renderer/behavior.ts class Behavior { app; constructor(app) { this.app = app; this.onStart && app.onStart(this.onStart.bind(this)); this.onUpdate && app.onUpdate(this.onUpdate.bind(this)); this.onAfterUpdate && app.onAfterUpdate(this.onAfterUpdate.bind(this)); this.onBeforeUpdate && app.onBeforeUpdate(this.onBeforeUpdate.bind(this)); this.onDraw && app.onDraw(this.onDraw.bind(this)); } } // src/renderer/mesh-renderer.ts class MeshRenderer extends Behavior { app; mesh; shader; camera; light; config; projectionMatrix = exports_mat4.create(); buffers = { textures: {} }; faceDataType; colorDataType; constructor(app, mesh, shader, camera = new Transform([0, 0, -6]), light = new Transform([100, 100, 0]), config = {}) { super(app); this.app = app; this.mesh = mesh; this.shader = shader; this.camera = camera; this.light = light; this.config = config; this.faceDataType = this.getDataType(mesh.config.faces); this.colorDataType = mesh.config.colors ? this.getDataType(mesh.config.colors) : null; } getDataType(array) { switch (array.BYTES_PER_ELEMENT) { case 1: return 5121; case 2: return 5123; case 4: return 5125; default: return 5126; } } configure(config) { this.config = config; return this; } makeBuffer(data, target = 34962) { const gl = this.app.gl; const buffer = gl.createBuffer(); if (!buffer) { throw new Error("failed to create a buffer"); } gl.bindBuffer(target, buffer); gl.bufferData(target, data, gl.STATIC_DRAW); gl.bindBuffer(target, null); return buffer; } initializeBuffers() { const vao = this.app.gl.createVertexArray(); if (!vao) { throw new Error("VAO creation failed"); } this.buffers.vao = vao; this.app.gl.bindVertexArray(vao); this.buffers.faces = this.makeBuffer(this.mesh.config.faces, this.app.gl.ELEMENT_ARRAY_BUFFER); const shaderMap = this.shader.mappings; this.buffers.position = this.makeBuffer(this.mesh.config.positions); this.bindAttrib(this.buffers.position, shaderMap.attributes.vertex, 3, this.app.gl.FLOAT); if (this.mesh.config.normals) { this.buffers.normal = this.makeBuffer(this.mesh.config.normals); this.bindAttrib(this.buffers.normal, shaderMap.attributes.normal, 3, this.app.gl.FLOAT, true); } if (this.mesh.config.colors) { this.buffers.color = this.makeBuffer(this.mesh.config.colors); this.bindAttrib(this.buffers.color, shaderMap.attributes.vertexColor, 4, this.colorDataType || this.app.gl.UNSIGNED_BYTE); } if (this.mesh.config.uvs) { this.buffers.uv = this.makeBuffer(this.mesh.config.uvs); this.bindAttrib(this.buffers.uv, shaderMap.attributes.uv0, 2, this.app.gl.FLOAT); } this.app.gl.bindVertexArray(null); } async initializeTextures() { const { gl } = this.app; for (const [name, textureObject] of Object.entries(this.shader.textures)) { await textureObject.loadImage(); const glTex = gl.createTexture(); if (!glTex) { throw new Error("failed to allocate texture"); } const tex = textureObject.texture; gl.bindTexture(gl.TEXTURE_2D, glTex); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureObject.width, textureObject.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, tex); const uvOverflow = textureObject.config.uvClamp ? gl.CLAMP_TO_EDGE : gl.REPEAT; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, uvOverflow); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, uvOverflow); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); this.buffers.textures[name] = glTex; } } bindTextures() { const { gl } = this.app; const intStart = this.app.gl.TEXTURE0; const textures = Object.entries(this.buffers.textures); const destructors = []; textures.forEach(([key, tex], index) => { const uniform = this.shader.mappings.uniforms[key]; if (!uniform) { return; } gl.activeTexture(intStart + index); gl.bindTexture(gl.TEXTURE_2D, tex); gl.uniform1i(uniform, index); destructors.push(() => { gl.activeTexture(intStart + index); gl.bindTexture(gl.TEXTURE_2D, null); }); }); return destructors; } bindAttrib(buffer, attribute, elements, glType, normalized = false) { const gl = this.app.gl; gl.bindBuffer(gl.ARRAY_BUFFER, buffer); const attributePosition = Number.isSafeInteger(attribute) ? attribute : this.shader.attrib(attribute); if (attributePosition !== -1) { gl.vertexAttribPointer(attributePosition, elements, glType, normalized, 0, 0); gl.enableVertexAttribArray(attributePosition); } gl.bindBuffer(gl.ARRAY_BUFFER, null); } initializeShader(time, transform2) { const view = exports_mat4.invert(exports_mat4.create(), this.camera.toMat4()); const gl = this.app.gl; const { uniforms } = this.shader.mappings; this.shader.use(); gl.uniform1f(uniforms.time, time); gl.uniform4fv(uniforms.light0Color, [1, 1, 1, 1]); gl.uniformMatrix4fv(uniforms.view, false, view); gl.uniformMatrix4fv(uniforms.projection, false, this.projectionMatrix); gl.uniform3fv(uniforms.light0, this.light.position); gl.uniformMatrix4fv(uniforms.objectToWorld, false, transform2.toMat4()); gl.uniformMatrix4fv(uniforms.objectToWorldInv, false, exports_mat4.invert(exports_mat4.create(), transform2.toMat4())); this.shader.onPrerender(this.app, time); } async onStart(_, app) { app.loading("baking vectors"); app.telemetry?.addRenderers(1); app.telemetry?.addTriangles(this.mesh.config.faces.length); app.telemetry?.addVertexes(this.mesh.config.vertexCount); exports_mat4.perspective(this.projectionMatrix, this.app.config.fov || 45, this.app.aspect, this.app.config.zNear || 0.1, this.app.config.zFar || 100); this.shader.compile(); this.shader.link(); this.initializeBuffers(); this.shader.link(); await this.initializeTextures(); } onRenderableUpdate(time, transform2) { const gl = this.app.gl; gl.bindVertexArray(this.buffers.vao || null); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffers.faces || null); gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers.position || null); this.initializeShader(time, transform2); const textureDestructors = this.bindTextures(); gl.drawElements(this.config.drawMode ?? gl.TRIANGLES, this.mesh.config.faces.length, this.faceDataType, 0); const err = gl.getError(); if (err !== 0) { console.log({ err }); throw new Error(`(MeshRenderer) webgl failure: ${err}`); } gl.bindVertexArray(null); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); gl.bindBuffer(gl.ARRAY_BUFFER, null); textureDestructors.forEach((i) => i()); } } // src/renderer/shader.ts class Shader { config; static VERTEX = 35633; static FRAGMENT = 35632; constructor(config) { this.config = config; } vertexCode = ""; fragmentCode = ""; _app; program = null; mappings = {}; textures = {}; materialValues = {}; prerenderHooks = []; get gl() { const gl = this._app?.gl; if (!gl) { throw new Error("GL context not defined at shader compile time."); } return gl; } app(app) { this._app = app; this.program = app.gl.createProgram(); return this; } vertex(code) { this.vertexCode = code; return this; } fragment(code) { this.fragmentCode = code; return this; } prerenderHook(fn) { this.prerenderHooks.push(fn); return this; } attrib(name) { return this.gl.getAttribLocation(this.program, name); } uniform(name) { return this.gl.getUniformLocation(this.program, name); } generateMappings(config) { return { attributes: { normal: this.attrib(config.attributes.normal), uv0: this.attrib(config.attributes.uv0), vertex: this.attrib(config.attributes.vertex), vertexColor: this.attrib(config.attributes.vertexColor) }, uniforms: { albedo: this.uniform(config.uniforms.albedo), light0: this.uniform(config.uniforms.light0), light0Color: this.uniform(config.uniforms.light0Color), objectToWorld: this.uniform(config.uniforms.objectToWorld), objectToWorldInv: this.uniform(config.uniforms.objectToWorldInv), projection: this.uniform(config.uniforms.projection), texture0: this.uniform(config.uniforms.texture0), texture1: this.uniform(config.uniforms.texture1), texture2: this.uniform(config.uniforms.texture2), time: this.uniform(config.uniforms.time), view: this.uniform(config.uniforms.view) } }; } attach(which, source) { const gl = this.gl; const shader = gl.createShader(which); if (!shader) { throw new Error(`failed to init ${humanShaderType(which)} shader`); } gl.shaderSource(shader, source); gl.compileShader(shader); gl.attachShader(this.program, shader); } addTexture(slot, texture) { this.textures[slot] = texture; return this; } compile() { const gl = this.gl; this.attach(gl.FRAGMENT_SHADER, this.fragmentCode); this.attach(gl.VERTEX_SHADER, this.vertexCode); } link() { this.gl.linkProgram(this.program); if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) { throw new Error("Unable to initialize the shader program: " + this.gl.getProgramInfoLog(this.program)); } this.mappings = this.generateMappings(this.config); } bindAttrib(attribLocation, name) { this.gl.bindAttribLocation(this.program, attribLocation, name); } use() { this._app?.gl.useProgram(this.program); } onPrerender(app, time) { for (const fn of this.prerenderHooks) { fn(app, this, time); } } } var humanShaderType = (which) => { switch (which) { case Shader.FRAGMENT: return "fragment"; case Shader.VERTEX: return "vertex"; default: return "some unknown type of"; } }; // src/common-shaders/basic.frag var basic_default = `#version 300 es precision highp float; // uniform mat4 u_view; // uniform mat4 u_projection; // uniform mat4 u_object_to_world; // uniform mat4 u_object_to_world_inv; // uniform vec3 u_light_0; // uniform vec4 u_light_0_color; // uniform float u_time; // uniform vec4 u_albedo; uniform sampler2D u_texture_0; uniform sampler2D u_texture_1; in vec2 uv0; in vec3 normal; in vec3 light_pos; out vec4 fragColor; void main() { vec4 normalTex = texture(u_texture_1, uv0); vec3 normal = normalize(normal * normalTex.xyz); float light = dot(normal, light_pos); fragColor = vec4(1.0); fragColor.rgb = texture(u_texture_0, uv0).rgb; fragColor.rgb *= max(light, 0.1); fragColor.a = 1.0; } `; // src/common-shaders/basic.vert var basic_default2 = `#version 300 es uniform mat4 u_view; uniform mat4 u_projection; uniform mat4 u_object_to_world; uniform mat4 u_object_to_world_inv; uniform vec3 u_light_0; // uniform vec4 u_light_0_color; // uniform float u_time; // uniform vec4 u_albedo; in vec4 a_vertex; in vec2 a_uv0; in vec3 a_normal; in vec4 a_vertex_color; out vec2 uv0; out vec3 normal; out vec4 vertex_color; out vec3 light_pos; // injection point 1 void main() { mat4 worldInv = inverse(u_view); mat4 MVW = u_projection * u_view * u_object_to_world; gl_Position = MVW * a_vertex; uv0 = a_uv0; normal = normalize(mat3(worldInv) * a_normal); vertex_color = a_vertex_color; light_pos = normalize(mat3(u_object_to_world_inv) * u_light_0); // injection point 2 }`; // src/common-shaders/basic.ts var basicShaderConfig = { attributes: { vertex: "a_vertex", uv0: "a_uv0", normal: "a_normal", vertexColor: "a_vertex_color" }, uniforms: { view: "u_view", projection: "u_projection", objectToWorld: "u_object_to_world", objectToWorldInv: "u_object_to_world_inv", light0: "u_light_0", light0Color: "u_light_0_color", time: "u_time", albedo: "u_albedo", texture0: "u_texture_0", texture1: "u_texture_1", texture2: "u_texture_2" } }; var basic3 = (app) => new Shader(basicShaderConfig).vertex(basic_default2).fragment(basic_default).app(app); // src/common-shaders/vertex-colors.frag var vertex_colors_default = `#version 300 es precision highp float; in vec4 vertex_color; out vec4 fragColor; void main() { fragColor = vertex_color; } `; // src/renderer/mesh.ts class Mesh { config; constructor(config) { this.config = config; } get name() { return this.config.name; } } // src/meshes/gizmo.ts var gizmo_default = new Mesh({ colors: new Uint8Array([0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 0, 254, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 254, 0, 0, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255, 0, 0, 254, 255]), faces: new Uint8Array([0, 1, 2, 3, 4, 1, 5, 6, 4, 7, 8, 6, 4, 9, 10, 11, 7, 5, 0, 3, 1, 3, 5, 4, 5, 7, 6, 7, 12, 8, 4, 6, 9, 11, 13, 7, 14, 15, 16, 17, 18, 15, 19, 20, 18, 21, 22, 20, 18, 23, 24, 25, 21, 19, 14, 17, 15, 17, 19, 18, 19, 21, 20, 21, 26, 22, 18, 20, 23, 25, 27, 21, 28, 29, 30, 31, 32, 29, 33, 34, 32, 35, 36, 34, 32, 37, 38, 39, 35, 33, 28, 31, 29, 31, 33, 32, 33, 35, 34, 35, 40, 36, 32, 34, 37, 39, 41, 35]), name: "src/meshes/gizmo.ply", normals: new Float32Array([-0.057735033, 0.5773503, -0.5773503, 0.057735033, -0.5773503, -0.5773503, -0.057735033, -0.5773503, -0.5773503, 0.057735033, 0.5773503, -0.5773503, 0.057735033, -0.5773503, 0.5773503, 0.057735033, 0.5773503, 0.5773503, -0.057735033, -0.5773503, 0.5773503, -0.057735033, 0.5773503, 0.5773503, -0.057735033, -0.5773503, -0.5773503, -0.057735033, -0.5773503, -0.5773503, 0.057735033, -0.5773503, -0.5773503, 0.057735033, 0.5773503, -0.5773503, -0.057735033, 0.5773503, -0.5773503, -0.057735033, 0.5773503, -0.5773503, -0.5773503, 0.5773503, -0.057735033, 0.5773503, -0.5773503, -0.057735033, -0.5773503, -0.5773503, -0.057735033, 0.5773503, 0.5773503, -0.057735033, 0.5773503, -0.5773503, 0.057735033, 0.5773503, 0.5773503, 0.057735033, -0.5773503, -0.5773503, 0.057735033, -0.5773503, 0.5773503, 0.057735033, -0.5773503, -0.5773503, -0.057735033, -0.5773503, -0.5773503, -0.057735033, 0.5773503, -0.5773503, -0.057735033, 0.5773503, 0.5773503, -0.057735033, -0.5773503, 0.5773503, -0.057735033, -0.5773503, 0.5773503, -0.057735033, -0.5773503, 0.057735033, -0.5773503, 0.5773503, -0.057735033, -0.5773503, -0.5773503, -0.057735033, -0.5773503, 0.5773503, 0.057735033, -0.5773503, 0.5773503, -0.057735033, 0.5773503, 0.5773503, 0.057735033, 0.5773503, -0.5773503, -0.057735033, 0.5773503, -0.5773503, 0.057735033, 0.5773503, -0.5773503, -0.057735033, -0.5773503, -0.5773503, -0.057735033, -0.5773503, 0.5773503, -0.057735033, -0.5773503, 0.5773503, 0.057735033, -0.5773503, -0.5773503, 0.057735033, -0.5773503, -0.5773503, 0.057735033, -0.5773503]), positions: new Float32Array([0, 0.05, -0.05, 1, -0.05, -0.05, 0, -0.05, -0.05, 1, 0.05, -0.05, 1, -0.05, 0.05, 1, 0.05, 0.05, 0, -0.05, 0.05, 0, 0.05, 0.05, 0, -0.05, -0.05, 0, -0.05, -0.05, 1, -0.05, -0.05, 1, 0.05, -0.05, 0, 0.05, -0.05, 0, 0.05, -0.05, -0.05, 0.05, 0, 0.05, -0.05, 0, -0.05, -0.05, 0, 0.05, 0.05, 0, 0.05, -0.05, 1, 0.05, 0.05, 1, -0.05, -0.05, 1, -0.05, 0.05, 1, -0.05, -0.05, 0, -0.05, -0.05, 0, 0.05, -0.05, 0, 0.05, 0.05, 0, -0.05, 0.05, 0, -0.05, 0.05, 0, -0.05, 1, -0.05, 0.05, 0, -0.05, -0.05, 0, -0.05, 0.05, 1, -0.05, 0.05, 0, 0.05, 0.05, 1, 0.05, -0.05, 0, 0.05, -0.05, 1, 0.05, -0.05, 0, -0.05, -0.05, 0, -0.05, 0.05, 0, -0.05, 0.05, 1, -0.05, -0.05, 1, -0.05, -0.05, 1, -0.05]), uvs: new Float32Array([0.625, 0, 0.375, 0.25, 0.375, 0, 0.625, 0.25, 0.375, 0.5, 0.625, 0.5, 0.375, 0.75, 0.625, 0.75, 0.375, 1, 0.125, 0.75, 0.125, 0.5, 0.875, 0.5, 0.625, 1, 0.875, 0.75, 0.625, 0, 0.375, 0.25, 0.375, 0, 0.625, 0.25, 0.375, 0.5, 0.625, 0.5, 0.375, 0.75, 0.625, 0.75, 0.375, 1, 0.125, 0.75, 0.125, 0.5, 0.875, 0.5, 0.625, 1, 0.875, 0.75, 0.625, 0, 0.375, 0.25, 0.375, 0, 0.625, 0.25, 0.375, 0.5, 0.625, 0.5, 0.375, 0.75, 0.625, 0.75, 0.375, 1, 0.125, 0.75, 0.125, 0.5, 0.875, 0.5, 0.625, 1, 0.875, 0.75]), vertexCount: 42 }); // src/renderer/gizmo.ts var gizmoShader = (app) => new Shader(basicShaderConfig).vertex(basic_default2).fragment(vertex_colors_default).app(app); var createGizmo = (app, camera, transform3) => { const localTransform = new Transform(transform3?.position, transform3?.rotation); const mr = new MeshRenderer(app, gizmo_default, gizmoShader(app), camera).configure({}); new Renderable(app, localTransform, mr); }; // src/renderer/renderable.ts class Renderable extends Behavior { app; transform3; renderer; constructor(app, transform3, renderer, enableGizmo = false) { super(app); this.app = app; this.transform = transform3; this.renderer = renderer; if (enableGizmo) createGizmo(app, renderer.camera, transform3); } onDraw(time) { this.renderer.onRenderableUpdate(time, this.transform); } } // src/renderer/editor.ts class Editor extends Behavior { constructor() { super(...arguments); } panes = []; addTransform(name, onChange) { this.panes.push({ name, type: "transform", onChange }); } } // src/renderer/telemetry.ts class Telemetry extends Behavior { app; el; frameTimes = []; maxFrameTimes = 100; lastFrameTime = 0; activeTriangles = 0; activeVertexes = 0; activeRenderers = 0; activeTextures = 0; constructor(app, selector = "#telemetry") { super(app); this.app = app; this.el = document.querySelector(selector); if (this.el && location.search.includes("telemetry")) { this.el.style.display = "block"; } } insertTime(time) { this.frameTimes.push(time); if (this.frameTimes.length > this.maxFrameTimes) { this.frameTimes.shift(); } } async onStart() { this.lastFrameTime = 0; this.frameTimes = []; setTimeout(() => this.setText(), 0); setInterval(() => { this.setText(); }, 1001); } setText() { const averageFrameTime = this.frameTimes.reduce((a, b) => a + b, 0) / this.frameTimes.length; const framesPerSecond = 1000 / averageFrameTime; this.el.innerHTML = `${framesPerSecond.toFixed(1)} FPS (${averageFrameTime.toFixed(3)} ms)
update :: b: ${this.app.registry.onBeforeUpdate.length} | u: ${this.app.registry.onUpdate.length} | a: ${this.app.registry.onAfterUpdate.length} | d: ${this.app.registry.onDraw.length}
render :: mr: ${this.activeRenderers} | v: ${this.activeVertexes} | t: ${this.activeTriangles}
others :: tex: ${this.activeTextures}`; } onAfterUpdate(time) { const frameTime = time - this.lastFrameTime; this.insertTime(frameTime); this.lastFrameTime = time; } addTriangles(n) { this.activeTriangles += n; } addVertexes(n) { this.activeVertexes += n; } addRenderers(n) { this.activeRenderers += n; } addTextures(n) { this.activeTextures += n; } } // src/renderer/webgl.ts class WebGLApp { config; canvas; telemetry; gl; editor; loadingMessages = new Set(["[noeidelon] [stage 2]"]); registry = { onBeforeUpdate: [], onAfterUpdate: [], onUpdate: [], onStart: [], onDraw: [] }; constructor(config = {}) { this.config = config; try { this.canvas = document.querySelector("canvas"); this.canvas.width = window.innerWidth; this.canvas.height = window.innerHeight; const context = this.canvas.getContext("webgl2"); if (!context) { throw new Error("Canvas was unable to get a webgl2 context"); } const gl = this.gl = context; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); this.gl.getExtension("EXT_texture_filter_anisotropic"); if (location.search.includes("telemetry") || config.telemetry) { this.telemetry = new Telemetry(this); } if (location.search.includes("editor") || config.editor) { this.editor = new Editor(this); } } catch (e) { const main = document.querySelector("main"); if (main) { main.innerHTML = `
your browser didn't let me set up webgl.
`; } throw new Error(`Unable to initialize WebGL. Your browser or machine may not support it.\n -> ${e}`); } } get aspect() { return this.canvas.clientWidth / this.canvas.clientHeight; } clear() { const gl = this.gl; gl.clearColor(0, 0, 0, 1); gl.clearDepth(1); gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); } loading(message) { this.loadingMessages.add(message.toLowerCase()); document.querySelector("#loading-text").innerHTML = [ ...this.loadingMessages ].join("
"); } ready() { document.querySelector("#loading")?.classList.remove("loading-active"); } onBeforeUpdate(handle) { this.registry.onBeforeUpdate.push(handle); } onAfterUpdate(handle) { this.registry.onAfterUpdate.push(handle); } onUpdate(handle) { this.registry.onUpdate.push(handle); } onStart(handle) { this.registry.onStart.push(handle); } onDraw(handle) { this.registry.onDraw.push(handle); } doUpdate(time) { this.registry.onBeforeUpdate.forEach((handle) => handle(time, this)); this.registry.onUpdate.forEach((handle) => handle(time, this)); this.registry.onAfterUpdate.forEach((handle) => handle(time, this)); this.registry.onDraw.forEach((handle) => handle(time, this)); } async doStart(time = 0) { this.loading("setting launch parameters"); this.clear(); try { for (const fn of this.registry.onStart) { await fn(time, this); } } catch (e) { this.loading(`[panic] failed to start noeidelon`); if (this.telemetry) { this.loading(`${e}`); } return; } this.ready(); } async oneShot(time = 0) { await this.doStart(time); this.doUpdate(time); } async start() { await this.doStart(); const run = (time) => { this.doUpdate(time); requestAnimationFrame(run); }; requestAnimationFrame(run); } } export { Mesh, exports_quat, Transform, etoq, v3, MeshRenderer, Shader, basic_default, basic_default2 as basic_default1, basic3 as basic, Renderable, WebGLApp };