3d/html/chunk-652b721da622b7d9.js
2024-05-05 04:23:00 -04:00

3366 lines
81 KiB
JavaScript

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<Mesh#${this.mesh.name}>) 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)<br />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}<br />render :: mr: ${this.activeRenderers} | v: ${this.activeVertexes} | t: ${this.activeTriangles}<br />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 = `<div><i>your browser didn't let me set up webgl.</i></div>`;
}
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("<br />");
}
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] <span style="color: red">failed to start noeidelon</span>`);
if (this.telemetry) {
this.loading(`<span style="color: purple">${e}</span>`);
}
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 };