ldr 0.34.12 → 0.34.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +23 -14
- package/dist/cull.d.ts +4 -2
- package/dist/index.js +114 -66
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/index.js +122 -74
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
4
4
|
var namedCodes = new Map;
|
|
@@ -833,7 +833,7 @@ function fileStepViews(f) {
|
|
|
833
833
|
viewMemo.set(f, out);
|
|
834
834
|
return out;
|
|
835
835
|
}
|
|
836
|
-
// ../../../../../../../tmp/ldr-build-
|
|
836
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/model.ts
|
|
837
837
|
class ModelLimitError extends Error {
|
|
838
838
|
limit;
|
|
839
839
|
code = "ldr-model-limit";
|
|
@@ -883,6 +883,15 @@ function flatten(doc, opts = {}) {
|
|
|
883
883
|
const loose = opts.looseGeometry !== false, tx = !!opts.textures, co = !!opts.callouts;
|
|
884
884
|
const src = new Map;
|
|
885
885
|
let subs = 0;
|
|
886
|
+
const stepSingles = [];
|
|
887
|
+
const stepPathOf = (path, s) => {
|
|
888
|
+
if (path.length)
|
|
889
|
+
return [...path, s];
|
|
890
|
+
let a = stepSingles[s];
|
|
891
|
+
if (!a)
|
|
892
|
+
stepSingles[s] = a = [s];
|
|
893
|
+
return a;
|
|
894
|
+
};
|
|
886
895
|
const open = new Set;
|
|
887
896
|
const maxN = opts.maxInstances ?? 2000000;
|
|
888
897
|
let work = 0;
|
|
@@ -962,7 +971,7 @@ function flatten(doc, opts = {}) {
|
|
|
962
971
|
const flushLoose = (upTo) => {
|
|
963
972
|
while (li < ls.length && ls[li] <= upTo) {
|
|
964
973
|
const k = ls[li++];
|
|
965
|
-
emit(loosePartName(f.name, k), color, m,
|
|
974
|
+
emit(loosePartName(f.name, k), color, m, stepPathOf(stepPath, k), k, false, null, colour, scope0).source = lazy(f, k);
|
|
966
975
|
}
|
|
967
976
|
};
|
|
968
977
|
for (const c0 of f.cmds) {
|
|
@@ -993,10 +1002,10 @@ function flatten(doc, opts = {}) {
|
|
|
993
1002
|
continue;
|
|
994
1003
|
if (tx && c.fallback)
|
|
995
1004
|
continue;
|
|
996
|
-
const mm = mul(m, c.m);
|
|
1005
|
+
const mm = m === I ? c.m : mul(m, c.m);
|
|
997
1006
|
if (!inRange12(mm))
|
|
998
1007
|
continue;
|
|
999
|
-
const col = c.color === 16 ? color : c.color, cd = c.color === 16 ? colour : scope?.get(c.color), sp =
|
|
1008
|
+
const col = c.color === 16 ? color : c.color, cd = c.color === 16 ? colour : scope?.get(c.color), sp = stepPathOf(stepPath, s);
|
|
1000
1009
|
const tex = tx ? c.tex ?? texIn : null;
|
|
1001
1010
|
const local = tex ? invert(c.m) : null;
|
|
1002
1011
|
const lt = tex && local ? transformTexMap(tex, local) : null;
|
|
@@ -1274,7 +1283,7 @@ function blendedColourHex(code) {
|
|
|
1274
1283
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1275
1284
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1276
1285
|
}
|
|
1277
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1286
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/instructions.ts
|
|
1278
1287
|
var MIN_VIS = 0.5;
|
|
1279
1288
|
var REORIENT = 0.35;
|
|
1280
1289
|
var deg = Math.PI / 180;
|
|
@@ -1642,10 +1651,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1642
1651
|
}
|
|
1643
1652
|
};
|
|
1644
1653
|
}
|
|
1645
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1654
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/render.ts
|
|
1646
1655
|
import * as THREE2 from "three";
|
|
1647
1656
|
|
|
1648
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1657
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/pack-io.ts
|
|
1649
1658
|
import { decompress } from "fzstd";
|
|
1650
1659
|
async function decompressPack(data) {
|
|
1651
1660
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1668,7 +1677,7 @@ function decodePack(buf) {
|
|
|
1668
1677
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1669
1678
|
}
|
|
1670
1679
|
|
|
1671
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1680
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/stud-decal.ts
|
|
1672
1681
|
import * as THREE from "three";
|
|
1673
1682
|
function studDecalUniforms(near = 0) {
|
|
1674
1683
|
return { center: { value: new THREE.Vector3 }, near: { value: near } };
|
|
@@ -1767,7 +1776,7 @@ roughnessFactor = clamp(roughnessFactor * mix(1.0, sdTop > 0.5 ? 0.85 : 1.1, sdK
|
|
|
1767
1776
|
return d;
|
|
1768
1777
|
}
|
|
1769
1778
|
|
|
1770
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1779
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/cull.ts
|
|
1771
1780
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1772
1781
|
var prepCache = new WeakMap;
|
|
1773
1782
|
var lastH = null;
|
|
@@ -1817,7 +1826,7 @@ function prepPart(H, part) {
|
|
|
1817
1826
|
break;
|
|
1818
1827
|
}
|
|
1819
1828
|
}
|
|
1820
|
-
c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz, full });
|
|
1829
|
+
c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz, full, src: p });
|
|
1821
1830
|
lastH = H;
|
|
1822
1831
|
lastPart = part;
|
|
1823
1832
|
lastPrep = r;
|
|
@@ -2039,24 +2048,33 @@ function seeThrough(H, c) {
|
|
|
2039
2048
|
return (g.alpha ?? 255) < 255;
|
|
2040
2049
|
return c.charCodeAt(0) === 35 && /\/[^:/]*:a\d/.test(c);
|
|
2041
2050
|
}
|
|
2042
|
-
function cullCore(insts, H, steps) {
|
|
2043
|
-
|
|
2051
|
+
function cullCore(insts, H, steps, pps) {
|
|
2052
|
+
if (!pps) {
|
|
2053
|
+
pps = new Array(insts.length);
|
|
2054
|
+
for (let i = 0;i < insts.length; i++)
|
|
2055
|
+
pps[i] = prepPart(H, insts[i].part);
|
|
2056
|
+
}
|
|
2057
|
+
return cullPass(insts, H, steps, -1, pps) ?? cullPass(insts, H, steps, needE, pps);
|
|
2044
2058
|
}
|
|
2045
2059
|
var needE = 0;
|
|
2046
|
-
function cullPass(insts, H, steps, eCap) {
|
|
2060
|
+
function cullPass(insts, H, steps, eCap, pps) {
|
|
2047
2061
|
const CELL = 40;
|
|
2048
2062
|
const clear = new Map;
|
|
2063
|
+
let lastC = null, lastV = false;
|
|
2049
2064
|
const isClear = (c) => {
|
|
2065
|
+
if (c === lastC)
|
|
2066
|
+
return lastV;
|
|
2050
2067
|
let v = clear.get(c);
|
|
2051
2068
|
if (v === undefined)
|
|
2052
2069
|
clear.set(c, v = seeThrough(H, c));
|
|
2070
|
+
lastC = c;
|
|
2071
|
+
lastV = v;
|
|
2053
2072
|
return v;
|
|
2054
2073
|
};
|
|
2055
2074
|
const nI = insts.length;
|
|
2056
2075
|
let cap = 0, nR = 0, nStuds = 0;
|
|
2057
|
-
const pps = new Array(nI);
|
|
2058
2076
|
for (let idx = 0;idx < nI; idx++) {
|
|
2059
|
-
const pp = pps[idx]
|
|
2077
|
+
const pp = pps[idx];
|
|
2060
2078
|
if (pp) {
|
|
2061
2079
|
nStuds += pp.nStuds;
|
|
2062
2080
|
if (pp.mask)
|
|
@@ -2076,9 +2094,10 @@ function cullPass(insts, H, steps, eCap) {
|
|
|
2076
2094
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
2077
2095
|
const it = insts[idx];
|
|
2078
2096
|
const m = it.m;
|
|
2079
|
-
const
|
|
2080
|
-
if (!
|
|
2097
|
+
const pp = pps[idx];
|
|
2098
|
+
if (!pp || !pp.mask || !upright(m) || isClear(it.color))
|
|
2081
2099
|
continue;
|
|
2100
|
+
const p = pp.src;
|
|
2082
2101
|
const b = p.bbox;
|
|
2083
2102
|
let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity;
|
|
2084
2103
|
for (let cxi = 0;cxi < 2; cxi++)
|
|
@@ -2095,7 +2114,6 @@ function cullPass(insts, H, steps, eCap) {
|
|
|
2095
2114
|
z1 = wz;
|
|
2096
2115
|
}
|
|
2097
2116
|
const lv2 = Math.round((m[1] + b[4]) * 2);
|
|
2098
|
-
const pp = pps[idx];
|
|
2099
2117
|
const cx0 = Math.floor(x0 / CELL), cx1 = Math.floor(x1 / CELL), cz0 = Math.floor(z0 / CELL), cz1 = Math.floor(z1 / CELL);
|
|
2100
2118
|
if (!((cx1 - cx0 + 1) * (cz1 - cz0 + 1) <= 65536) || !inRange(lv2, cx0, cz0) || !inRange(lv2, cx1, cz1))
|
|
2101
2119
|
continue;
|
|
@@ -2263,7 +2281,8 @@ function cullPass(insts, H, steps, eCap) {
|
|
|
2263
2281
|
const underHideStep = steps ? new Int32Array(insts.length).fill(STEP_NEVER) : undefined;
|
|
2264
2282
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
2265
2283
|
const it = insts[idx];
|
|
2266
|
-
const
|
|
2284
|
+
const pp = pps[idx];
|
|
2285
|
+
const p = pp ? pp.src : null;
|
|
2267
2286
|
if (!p || !p.under || !upright(it.m) || isClear(it.color))
|
|
2268
2287
|
continue;
|
|
2269
2288
|
const b = p.bbox;
|
|
@@ -2349,7 +2368,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
2349
2368
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
2350
2369
|
}
|
|
2351
2370
|
|
|
2352
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2371
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/render.ts
|
|
2353
2372
|
async function loadPack(url) {
|
|
2354
2373
|
const res = await fetch(url);
|
|
2355
2374
|
if (!res.ok)
|
|
@@ -2873,13 +2892,13 @@ function batchedBoundingBox(bm) {
|
|
|
2873
2892
|
const bb = bm.boundingBox;
|
|
2874
2893
|
return bb && !bb.isEmpty() ? Float32Array.of(bb.min.x, bb.min.y, bb.min.z, bb.max.x, bb.max.y, bb.max.z) : undefined;
|
|
2875
2894
|
}
|
|
2876
|
-
function fillInstances(im, ids, insts, color) {
|
|
2895
|
+
function fillInstances(im, ids, insts, color, cols) {
|
|
2877
2896
|
const M = im.instanceMatrix.array;
|
|
2878
2897
|
const C = new Float32Array(ids.length * 3);
|
|
2879
2898
|
for (let k = 0;k < ids.length; k++) {
|
|
2880
|
-
const
|
|
2899
|
+
const id = ids[k], it = insts[id];
|
|
2881
2900
|
writeM4(M, k * 16, it.m);
|
|
2882
|
-
color(it.color).toArray(C, k * 3);
|
|
2901
|
+
(cols?.[id] ?? color(it.color)).toArray(C, k * 3);
|
|
2883
2902
|
}
|
|
2884
2903
|
im.instanceColor = new THREE2.InstancedBufferAttribute(C, 3);
|
|
2885
2904
|
}
|
|
@@ -3470,7 +3489,7 @@ function studGridGeom(g, n) {
|
|
|
3470
3489
|
m.set(n, out);
|
|
3471
3490
|
return out;
|
|
3472
3491
|
}
|
|
3473
|
-
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex, trim = false, grid = 1) {
|
|
3492
|
+
function* buildStudMeshesGen(insts, pps, H, cull, arr, LOD, color, matOf, steps, colorIndex, trim = false, grid = 1) {
|
|
3474
3493
|
const bKind = [], bMat = [];
|
|
3475
3494
|
const bAll = [];
|
|
3476
3495
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -3503,13 +3522,18 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3503
3522
|
const pass1 = (idx) => {
|
|
3504
3523
|
let j = jAt;
|
|
3505
3524
|
const jEnd = j + 32768;
|
|
3525
|
+
let pc = null, pe = null, qc = null, qe = null;
|
|
3506
3526
|
for (;idx < insts.length && j < jEnd; idx++) {
|
|
3507
|
-
const
|
|
3508
|
-
const pp = prepPart(H, it.part);
|
|
3527
|
+
const pp = pps[idx];
|
|
3509
3528
|
if (!pp || !pp.nStuds)
|
|
3510
3529
|
continue;
|
|
3530
|
+
const it = insts[idx];
|
|
3511
3531
|
const a = it.m;
|
|
3512
|
-
|
|
3532
|
+
if (it.color !== pc) {
|
|
3533
|
+
pc = it.color;
|
|
3534
|
+
pe = colEntry(pc);
|
|
3535
|
+
}
|
|
3536
|
+
const instE = pe;
|
|
3513
3537
|
let ps = partStud.get(pp);
|
|
3514
3538
|
if (!ps) {
|
|
3515
3539
|
const kid = new Int32Array(pp.nStuds), neg = new Uint8Array(pp.nStuds);
|
|
@@ -3533,7 +3557,7 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3533
3557
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
3534
3558
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
3535
3559
|
const sc = pp.color[si];
|
|
3536
|
-
const mid = sc === "16" ? matIdFor(it.color, instE, neg ? 1 : 0) : matIdFor(sc, colEntry(sc), neg ? 1 : 0);
|
|
3560
|
+
const mid = sc === "16" ? matIdFor(it.color, instE, neg ? 1 : 0) : matIdFor(sc, sc === qc ? qe : qe = colEntry(qc = sc), neg ? 1 : 0);
|
|
3537
3561
|
const row = bucketOfKM[mid];
|
|
3538
3562
|
let b = row[km];
|
|
3539
3563
|
if (b === undefined) {
|
|
@@ -3627,11 +3651,12 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3627
3651
|
const pass3 = (idx) => {
|
|
3628
3652
|
let j = jAt;
|
|
3629
3653
|
const jEnd = j + 32768;
|
|
3654
|
+
let pc = null, pv = null;
|
|
3630
3655
|
for (;idx < insts.length && j < jEnd; idx++) {
|
|
3631
|
-
const
|
|
3632
|
-
const pp = prepPart(H, it.part);
|
|
3656
|
+
const pp = pps[idx];
|
|
3633
3657
|
if (!pp || !pp.nStuds)
|
|
3634
3658
|
continue;
|
|
3659
|
+
const it = insts[idx];
|
|
3635
3660
|
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
3636
3661
|
if (trim && cull.studHidden[j]) {
|
|
3637
3662
|
if (sMesh[studCl[j]]) {
|
|
@@ -3658,7 +3683,11 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3658
3683
|
t.col[slot] = colorIndex(col);
|
|
3659
3684
|
}
|
|
3660
3685
|
writeM4(im.instanceMatrix.array, slot * 16, w);
|
|
3661
|
-
|
|
3686
|
+
if (col !== pc) {
|
|
3687
|
+
pc = col;
|
|
3688
|
+
pv = colorOf(col);
|
|
3689
|
+
}
|
|
3690
|
+
pv.toArray(im.instanceColor.array, slot * 3);
|
|
3662
3691
|
}
|
|
3663
3692
|
}
|
|
3664
3693
|
jAt = j;
|
|
@@ -3687,24 +3716,39 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3687
3716
|
}
|
|
3688
3717
|
for (let k0 = 0;k0 < nHid; k0 += 65536) {
|
|
3689
3718
|
yield;
|
|
3690
|
-
hiddenStudSpheres(insts,
|
|
3719
|
+
hiddenStudSpheres(insts, pps, hidI, hidS, hidC, sMesh, k0, Math.min(nHid, k0 + 65536));
|
|
3691
3720
|
}
|
|
3692
3721
|
}
|
|
3693
3722
|
return sMesh;
|
|
3694
3723
|
}
|
|
3695
|
-
function hiddenStudSpheres(insts,
|
|
3696
|
-
const w = new Float64Array(12), A = new Float32Array(16);
|
|
3724
|
+
function hiddenStudSpheres(insts, pps, hidI, hidS, hidC, sMesh, k0, k1) {
|
|
3725
|
+
const w = new Float64Array(12), A = new Float32Array(16 * HID_RUN);
|
|
3726
|
+
let n = 0, cur = -1;
|
|
3697
3727
|
for (let k = k0;k < k1; k++) {
|
|
3698
|
-
const
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3728
|
+
const c = hidC[k];
|
|
3729
|
+
if (c !== cur || n === HID_RUN) {
|
|
3730
|
+
if (n) {
|
|
3731
|
+
const sm = sMesh[cur];
|
|
3732
|
+
sphereUnion(sm.S, A, n);
|
|
3733
|
+
if (sm.B)
|
|
3734
|
+
boxUnion(sm.B, A, n);
|
|
3735
|
+
n = 0;
|
|
3736
|
+
}
|
|
3737
|
+
cur = c;
|
|
3738
|
+
}
|
|
3739
|
+
const i = hidI[k];
|
|
3740
|
+
mul12To(insts[i].m, pps[i].studM, hidS[k] * 12, w);
|
|
3741
|
+
writeM4(A, n * 16, w);
|
|
3742
|
+
n++;
|
|
3743
|
+
}
|
|
3744
|
+
if (n) {
|
|
3745
|
+
const sm = sMesh[cur];
|
|
3746
|
+
sphereUnion(sm.S, A, n);
|
|
3704
3747
|
if (sm.B)
|
|
3705
|
-
boxUnion(sm.B, A,
|
|
3748
|
+
boxUnion(sm.B, A, n);
|
|
3706
3749
|
}
|
|
3707
3750
|
}
|
|
3751
|
+
var HID_RUN = 64;
|
|
3708
3752
|
function undersideGroups(ids, insts) {
|
|
3709
3753
|
const by = new Map;
|
|
3710
3754
|
const rest = [];
|
|
@@ -3814,19 +3858,23 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3814
3858
|
return m;
|
|
3815
3859
|
};
|
|
3816
3860
|
const byPart = new Map;
|
|
3861
|
+
const pps = new Array(insts.length);
|
|
3862
|
+
const iCol = new Array(insts.length);
|
|
3817
3863
|
const matMemo = new Map;
|
|
3818
3864
|
const bucketMemo = new Map;
|
|
3819
3865
|
const bucketRange = (i0, i1) => {
|
|
3820
3866
|
for (let i = i0;i < i1; i++) {
|
|
3821
3867
|
const it = insts[i];
|
|
3822
|
-
const
|
|
3823
|
-
if (!
|
|
3868
|
+
const pp = pps[i] = prepPart(H, it.part);
|
|
3869
|
+
if (!pp)
|
|
3824
3870
|
continue;
|
|
3871
|
+
const p = pp.src;
|
|
3825
3872
|
const d = det12(it.m), mirror = d < 0;
|
|
3826
3873
|
const code = String(it.color), uncert = !!p.uncert || singular12(it.m, d), role = uncert ? 2 : mirror ? 1 : 0;
|
|
3827
3874
|
let me = matMemo.get(code);
|
|
3828
3875
|
if (!me)
|
|
3829
|
-
matMemo.set(code, me = [undefined, undefined, undefined]);
|
|
3876
|
+
matMemo.set(code, me = [undefined, undefined, undefined, color(code)]);
|
|
3877
|
+
iCol[i] = me[3];
|
|
3830
3878
|
const mat = me[role] ?? (me[role] = materialFor(code, mirror, uncert));
|
|
3831
3879
|
let pm = bucketMemo.get(it.part);
|
|
3832
3880
|
if (!pm)
|
|
@@ -3855,7 +3903,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3855
3903
|
}
|
|
3856
3904
|
yield root;
|
|
3857
3905
|
const steps = P.steps;
|
|
3858
|
-
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
3906
|
+
let cull = P.cull ?? cullCore(insts, H, steps, pps);
|
|
3859
3907
|
mark("culling");
|
|
3860
3908
|
yield root;
|
|
3861
3909
|
const stepBatches = [];
|
|
@@ -3878,7 +3926,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3878
3926
|
insts.forEach((it, i) => {
|
|
3879
3927
|
for (let k = 0;k < 12; k++)
|
|
3880
3928
|
instM[i * 12 + k] = it.m[k];
|
|
3881
|
-
instPP.push(
|
|
3929
|
+
instPP.push(pps[i]);
|
|
3882
3930
|
instCol[i] = colorIndex(it.color);
|
|
3883
3931
|
});
|
|
3884
3932
|
const edgeObjs = [];
|
|
@@ -4071,7 +4119,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4071
4119
|
let bodyIm = null;
|
|
4072
4120
|
const lv0 = [];
|
|
4073
4121
|
const place = (im) => {
|
|
4074
|
-
fillInstances(im, ids, insts, color);
|
|
4122
|
+
fillInstances(im, ids, insts, color, iCol);
|
|
4075
4123
|
instancedBoundingSphere(im);
|
|
4076
4124
|
im.userData.ldrPart = part;
|
|
4077
4125
|
root.add(im);
|
|
@@ -4152,7 +4200,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4152
4200
|
stats.undersHidden += uids.length - vis;
|
|
4153
4201
|
const trimU = !steps && !!P.cullUnder;
|
|
4154
4202
|
const im = newIM(under, mat, trimU ? vis : uids.length);
|
|
4155
|
-
fillInstances(im, trimU ? ord.slice(0, vis) : ord, insts, color);
|
|
4203
|
+
fillInstances(im, trimU ? ord.slice(0, vis) : ord, insts, color, iCol);
|
|
4156
4204
|
im.onBeforeRender = trackVp;
|
|
4157
4205
|
im.userData.ldrUnder = true;
|
|
4158
4206
|
im.userData.ldrPart = part;
|
|
@@ -4289,7 +4337,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4289
4337
|
writeM4(m16, 0, insts[id].m);
|
|
4290
4338
|
tmpM.fromArray(m16);
|
|
4291
4339
|
bm.setMatrixAt(iid, tmpM);
|
|
4292
|
-
tmpC.copy(color(insts[id].color));
|
|
4340
|
+
tmpC.copy(iCol[id] ?? color(insts[id].color));
|
|
4293
4341
|
bm.setColorAt(iid, tmpC);
|
|
4294
4342
|
instGids[iid] = gids;
|
|
4295
4343
|
if (ownArr) {
|
|
@@ -4322,7 +4370,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4322
4370
|
if (!pp.edges && !(wantCond && (pp.condl || pp.condlu)))
|
|
4323
4371
|
continue;
|
|
4324
4372
|
const ghost = newIM(geom(pp.body, arr) || new THREE2.BufferGeometry, mat, ids.length);
|
|
4325
|
-
fillInstances(ghost, ids, insts, color);
|
|
4373
|
+
fillInstances(ghost, ids, insts, color, iCol);
|
|
4326
4374
|
const nL = cl.lines.length, nC = cl.cond.length;
|
|
4327
4375
|
if (pp.edges)
|
|
4328
4376
|
addLines(pp.edges, ghost, cl);
|
|
@@ -4406,7 +4454,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4406
4454
|
writeM4(m16, 0, insts[id].m);
|
|
4407
4455
|
tmpM.fromArray(m16);
|
|
4408
4456
|
ubm.setMatrixAt(iid, tmpM);
|
|
4409
|
-
tmpC.copy(color(insts[id].color));
|
|
4457
|
+
tmpC.copy(iCol[id] ?? color(insts[id].color));
|
|
4410
4458
|
ubm.setColorAt(iid, tmpC);
|
|
4411
4459
|
uInstGids[iid] = gids;
|
|
4412
4460
|
uHid[iid] = hid ? 1 : 0;
|
|
@@ -4444,7 +4492,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4444
4492
|
const ord = [...ids.filter((id) => !cull.underHidden[id]), ...ids.filter((id) => cull.underHidden[id])];
|
|
4445
4493
|
const vis = ids.length - ids.reduce((a, id) => a + cull.underHidden[id], 0);
|
|
4446
4494
|
const ghost = newIM(geom(pp.under, arr) || new THREE2.BufferGeometry, mat, ord.length);
|
|
4447
|
-
fillInstances(ghost, ord, insts, color);
|
|
4495
|
+
fillInstances(ghost, ord, insts, color, iCol);
|
|
4448
4496
|
const nC = ucl.cond.length;
|
|
4449
4497
|
addCond(pp, ghost, ucl, "under");
|
|
4450
4498
|
const lineObjs = ucl.cond.slice(nC);
|
|
@@ -4495,7 +4543,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4495
4543
|
}
|
|
4496
4544
|
}
|
|
4497
4545
|
yield root;
|
|
4498
|
-
const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex, !steps && !!P.cullStuds, G);
|
|
4546
|
+
const _studGen = buildStudMeshesGen(insts, pps, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex, !steps && !!P.cullStuds, G);
|
|
4499
4547
|
let _studR = _studGen.next();
|
|
4500
4548
|
while (!_studR.done) {
|
|
4501
4549
|
yield root;
|
|
@@ -4752,10 +4800,10 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4752
4800
|
return true;
|
|
4753
4801
|
};
|
|
4754
4802
|
const box = new THREE2.Box3;
|
|
4755
|
-
for (
|
|
4756
|
-
if (!
|
|
4803
|
+
for (let i = 0;i < insts.length; i++) {
|
|
4804
|
+
if (!pps[i])
|
|
4757
4805
|
continue;
|
|
4758
|
-
const m =
|
|
4806
|
+
const m = insts[i].m;
|
|
4759
4807
|
if (m[0] < box.min.x)
|
|
4760
4808
|
box.min.x = m[0];
|
|
4761
4809
|
if (m[1] < box.min.y)
|
|
@@ -4887,7 +4935,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
4887
4935
|
await new Promise((r) => setTimeout(r, 0));
|
|
4888
4936
|
}
|
|
4889
4937
|
}
|
|
4890
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4938
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/scene.ts
|
|
4891
4939
|
import * as THREE3 from "three";
|
|
4892
4940
|
var _box = new THREE3.Box3;
|
|
4893
4941
|
var _m4 = new THREE3.Matrix4;
|
|
@@ -5291,10 +5339,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
5291
5339
|
return finish();
|
|
5292
5340
|
})();
|
|
5293
5341
|
}
|
|
5294
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5342
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/parts-cdn.ts
|
|
5295
5343
|
import { decompress as decompress2 } from "fzstd";
|
|
5296
5344
|
|
|
5297
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5345
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/embedded.ts
|
|
5298
5346
|
function splitFiles(text, fallback) {
|
|
5299
5347
|
const files = new Map;
|
|
5300
5348
|
let cur = null, saw = false, skip = false;
|
|
@@ -5372,7 +5420,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
5372
5420
|
return out;
|
|
5373
5421
|
}
|
|
5374
5422
|
|
|
5375
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5423
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/parts-cdn.ts
|
|
5376
5424
|
var DEFAULT_PARTS_CDN = "https://ldr-parts-cdn.baconbrix.workers.dev/v1/";
|
|
5377
5425
|
var indexCache = new Map;
|
|
5378
5426
|
var shardCache = new Map;
|
|
@@ -5633,10 +5681,10 @@ async function prepareModel(source, o = {}) {
|
|
|
5633
5681
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
5634
5682
|
}
|
|
5635
5683
|
|
|
5636
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5637
|
-
var load_worker_gen_default = 'var sn=ArrayBuffer,H=Uint8Array,$e=Uint16Array,on=Int16Array;var je=Int32Array,Ye=function(e,t,n){if(H.prototype.slice)return H.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new H(n-t);return r.set(e.subarray(t,n)),r},Be=function(e,t,n,r){if(H.prototype.fill)return H.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},an=function(e,t,n,r){if(H.prototype.copyWithin)return H.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var ln=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||ln[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},yt=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},cn=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},un=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)Z(0);var a=6-s,u=i==3?4:i,l=yt(e,a,u);a+=u;var f=c?1<<c:s,h=yt(e,a,f)+(c==1&&256),g=h;if(!s){var p=1<<10+(e[5]>>3);g=p+(p>>3)*(e[5]&7)}if(g>2145386496)Z(1);var m=new H((t==1?h||g:t?0:g)+12);return m[0]=1,m[4]=4,m[8]=8,{b:a+f,y:0,l:0,d:l,w:t&&t!=1?t:m.subarray(12),e:g,o:new je(m.buffer,0,3),u:h,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return cn(e,4)+8;Z(0)},Se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},De=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,a=-1,u=-1,l=o,f=new sn(512+(o<<2)),h=new on(f,0,256),g=new $e(f,0,256),p=new $e(f,512,o),m=512+(o<<1),A=new H(f,m,o),b=new H(f,m+o);while(c<255&&i>0){var d=Se(i+1),x=r>>3,w=(1<<d+1)-1,v=(e[x]|e[x+1]<<8|e[x+2]<<16)>>(r&7)&w,M=(1<<d)-1,U=w-i-1,S=v&M;if(S<U)r+=d,v=S;else if(r+=d+1,v>M)v-=U;if(h[++c]=--v,v==-1)i+=v,A[--l]=c;else i-=v;if(!v)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,c+=a}while(a==3)}if(c>255||i)Z(0);var y=0,R=(o>>1)+(o>>3)+3,C=o-1;for(var F=0;F<=c;++F){var B=h[F];if(B<1){g[F]=-B;continue}for(u=0;u<B;++u){A[y]=F;do y=y+R&C;while(y>=l)}}if(y)Z(0);for(u=0;u<o;++u){var L=g[A[u]]++,V=b[u]=s-Se(L);p[u]=(L<<V)-o}return[r+7>>3,{b:s,s:A,n:b,t:p}]},fn=function(e,t){var n=0,r=-1,s=new H(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),a=new $e(s.buffer,268);if(o<128){var u=De(e,t+1,6),l=u[0],f=u[1];t+=o;var h=l<<3,g=e[t];if(!g)Z(0);var p=0,m=0,A=f.b,b=A,d=(++t<<3)-8+Se(g);for(;;){if(d-=A,d<h)break;var x=d>>3;if(p+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<A)-1,i[++r]=f.s[p],d-=b,d<h)break;x=d>>3,m+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=f.s[m],A=f.n[p],p=f.t[p],b=f.n[m],m=f.t[m]}if(++r>255)Z(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var v=0;for(n=0;n<r;++n){var M=i[n];if(M>11)Z(0);v+=M&&1<<M-1}var U=Se(v)+1,S=1<<U,D=S-v;if(D&D-1)Z(0);i[r++]=Se(D)+1;for(n=0;n<r;++n){var M=i[n];++c[i[n]=M&&U+1-M]}var y=new H(S<<1),R=y.subarray(0,S),C=y.subarray(S);a[U]=0;for(n=U;n>0;--n){var F=a[n];Be(C,n,F,a[n-1]=F+c[n]*(1<<U-n))}if(a[0]!=S)Z(0);for(n=0;n<r;++n){var B=i[n];if(B){var L=a[B];Be(R,n,L,a[B]=L+(1<<U-B))}}return[t,{n:C,b:U,s:R}]},pn=De(new H([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],mn=De(new H([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],hn=De(new H([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],xt=function(e,t){var n=e.length,r=new je(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Je=new H(new je([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),gn=xt(Je,0),Qe=new H(new je([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),dn=xt(Qe,3),Re=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var a=0,u=n.b,l=(r<<3)-8+Se(o)-u,f=-1;for(;l>c&&f<s;){var h=l>>3,g=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(l&7);a=(a<<u|g)&i,t[++f]=n.s[a],l-=u=n.n[a]}if(l!=c||f+1!=s)Z(0)},bn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;Re(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),Re(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),Re(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),Re(e.subarray(r),t.subarray(c),n)},yn=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Be(n,e[s],t.y,t.y+=c),n;return Be(new H(c),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=c,n;return Ye(e,s,a)}if(i==2){var u=e[s],l=u&3,f=u>>2&3,h=u>>4,g=0,p=0;if(l<2)if(f&1)h|=e[++s]<<4|(f&2&&e[++s]<<12);else h=u>>3;else if(p=f,f<2)h|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(f==2)h|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var m=n?n.subarray(t.y,t.y+t.m):new H(t.m),A=m.length-h;if(l==0)m.set(e.subarray(s,s+=h),A);else if(l==1)Be(m,e[s++],A);else{var b=t.h;if(l==2){var d=fn(e,s);g+=s-(s=d[0]),t.h=b=d[1]}else if(!b)Z(0);(p?bn:Re)(e.subarray(s,s+=g),m.subarray(A),b)}var x=e[s++];if(x){if(x==255)x=(e[s++]|e[s++]<<8)+32512;else if(x>127)x=x-128<<8|e[s++];var w=e[s++];if(w&3)Z(0);var v=[mn,hn,pn];for(var M=2;M>-1;--M){var U=w>>(M<<1)+2&3;if(U==1){var S=new H([0,0,e[s++]]);v[M]={s:S.subarray(2,3),n:S.subarray(0,1),t:new $e(S.buffer,0,1),b:0}}else if(U==2)r=De(e,s,9-(M&1)),s=r[0],v[M]=r[1];else if(U==3){if(!t.t)Z(0);v[M]=t.t[M]}}var D=t.t=v,y=D[0],R=D[1],C=D[2],F=e[a-1];if(!F)Z(0);var B=(a<<3)-8+Se(F)-C.b,L=B>>3,V=0,me=(e[L]|e[L+1]<<8)>>(B&7)&(1<<C.b)-1;L=(B-=R.b)>>3;var be=(e[L]|e[L+1]<<8)>>(B&7)&(1<<R.b)-1;L=(B-=y.b)>>3;var ye=(e[L]|e[L+1]<<8)>>(B&7)&(1<<y.b)-1;for(++x;--x;){var ue=C.s[me],Pe=C.n[me],xe=y.s[ye],Ce=y.n[ye],ke=R.s[be],he=R.n[be];L=(B-=ke)>>3;var O=1<<ke,k=O+((e[L]|e[L+1]<<8|e[L+2]<<16|e[L+3]<<24)>>>(B&7)&O-1);L=(B-=Qe[xe])>>3;var J=dn[xe]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Qe[xe])-1);L=(B-=Je[ue])>>3;var _=gn[ue]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Je[ue])-1);if(L=(B-=Pe)>>3,me=C.t[me]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Pe)-1),L=(B-=Ce)>>3,ye=y.t[ye]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Ce)-1),L=(B-=he)>>3,be=R.t[be]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<he)-1),k>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=k-=3;else{var W=k-(_!=0);if(W){if(k=W==3?t.o[0]-1:t.o[W],W>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=k}else k=t.o[0]}for(var M=0;M<_;++M)m[V+M]=m[A+M];V+=_,A+=_;var ne=V-k;if(ne<0){var q=-ne,le=t.e+ne;if(q>J)q=J;for(var M=0;M<q;++M)m[V+M]=t.w[le+M];V+=q,J-=q,ne=0}for(var M=0;M<J;++M)m[V+M]=m[ne+M];V+=J}if(V!=A)while(A<m.length)m[V++]=m[A++];else V=m.length;if(n)t.y+=V;else m=Ye(m,0,V)}else if(n){if(t.y+=h,A)for(var M=0;M<h;++M)m[M]=m[A+M]}else if(A)m=Ye(m,A);return t.b=a,m}Z(2)},xn=function(e,t){if(e.length==1)return e[0];var n=new H(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function Ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=un(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var c=yn(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,an(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return xn(n,o)}async function wn(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(Ve(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function wt(e){return new TextDecoder().decode(await wn(e))}var At=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function _e(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),et=/^[A-Za-z][A-Za-z0-9_]*$/,qe=new Map;function tt(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!qe.has(r))qe.set(r,t);return r}function nt(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&et.test(e))return tt(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Mt=/^~?\\s*moved\\s+to\\s+(.+)$/i,An=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Mn=new Set(["FILE","NOFILE","!DATA"]),Pt=1000000000000000,It=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),vn=new Set(["model","submodel","configuration"]),Cn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function vt(e){let t=Cn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return It.has(n)||vn.has(n)?n:void 0}function kn(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Tn(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every((f)=>Number.isFinite(f)&&Math.abs(f)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let f=0;f<s;f++)c=c.replace(/^\\S+\\s*/,"");let a=kn(c);if(!a.length)return null;let u={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)u.a=i[9];if(s===11)u.b=i[10];let l=a.findIndex((f,h)=>h>0&&f.toUpperCase()==="GLOSSMAP");if(l>0&&a[l+1])u.glossmap=a[l+1];if(t)u.next=!0;return u}var Ln=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Sn(e,t){let n=e.length,r=1,s=(p)=>p===32||p===9,o=()=>{while(r<n&&s(e.charCodeAt(r)))r++;let p=r,m=e.charCodeAt(r),A=m===45;if(A)m=e.charCodeAt(++r);let b=0,d=0;while(m>=48&&m<=57)b=b*10+(m-48),d++,m=e.charCodeAt(++r);if(d>0&&d<=15&&(r>=n||s(m)))return A?-b:b;while(r<n&&!s(e.charCodeAt(r)))r++;return p<r?+e.slice(p,r):NaN};while(r<n&&s(e.charCodeAt(r)))r++;let i=r;if(r>=n)return null;let c=e.charCodeAt(r),a=c===45,u=0,l=0;if(a)c=e.charCodeAt(++r);while(c>=48&&c<=57)u=u*10+(c-48),l++,c=e.charCodeAt(++r);if(l>0&&l<=15&&(r>=n||s(c))){if(a)u=-u}else{while(r<n&&!s(e.charCodeAt(r)))r++;u=nt(e.slice(i,r))}let f=Array(12);for(let p=0;p<12;p++){let m=o();if(!Number.isFinite(m))return null;f[p]=m}while(r<n&&s(e.charCodeAt(r)))r++;if(r>=n)return null;let h=e.slice(r),g=t.get(h);if(g===void 0)g=Y(/[ \\t]{2,}|\\t/.test(h)?h.split(/\\s+/).join(" "):h),t.set(h,g);if(!Number.isFinite(u))return null;return{t:1,color:u,m:f,file:g}}var En=[0,12,6,9,12,12];function Ct(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=nt(e[1]),r=En[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Ft(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,a=null,u=[],l=null,f=()=>{if(!a)return;let x=Ln(a.chunks.join("")),w=x[0]===137&&x[1]===80&&x[2]===78&&x[3]===71;(c??=new Map).set(Y(a.name),{name:a.name,bytes:x,...w?{mime:"image/png"}:{}}),a=null},h=new Map,g=!0,p=(x)=>{if(f(),o={name:Y(x),cmds:[]},s.set(o.name,o),!i)i=o.name;u=[],l=null,g=!0},m=!1,A=!1,b=()=>{if(A)return;A=!0,s.clear(),o=null,i=""},d=(x,w)=>{if(l){x.tex=l,l=null;return}let v=u[u.length-1];if(!v)return;if(v.fallback){if(!w)x.fallback=!0}else x.tex=v.map};for(let x of e.split(`\n`)){let w=x.trim();if(!w)continue;if(r&&w.charCodeAt(0)>=50&&w.charCodeAt(0)<=53&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){if(a||m)continue;if(!o)p(t);let S=w.slice(2).trimStart(),D=S.search(/\\s/),y={t:w.charCodeAt(0)-48,color:nt(D<0?S:S.slice(0,D)),p:[],src:w};d(y,!1),o.cmds.push(y),g=!1;continue}if(w.charCodeAt(0)===48&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){let S=2;while(w.charCodeAt(S)===32||w.charCodeAt(S)===9)S++;let D=S;while(D<w.length&&w.charCodeAt(D)!==32&&w.charCodeAt(D)!==9)D++;let y=w.slice(S,D),R=/[^\\x21-\\x7e]/.test(y)?w.slice(S).trim().split(/\\s+/)[0]:y;if(!An.has(R)&&!(R.length>=4&&R.length<=6&&Mn.has(R.toUpperCase()))){if(m||a)continue;if(!o)p(t);let C=w.slice(S),F={t:0,text:C};if(y.charCodeAt(0)===33)F.meta=y;if(l=null,g&&!o.org){let L=vt(C);if(L)o.org=L}let B=C.match(Mt);if(B&&!o.movedTo){let L=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(L))L+=".dat";o.movedTo=Y(L)}o.cmds.push(F);continue}}if(w.charCodeAt(0)===49&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)&&!a&&!m){let S=Sn(w,h);if(S){if(!o)p(t);d(S,!1),o.cmds.push(S),g=!1;continue}}let v=w.split(/\\s+/);if(+v[0]===0){let S=w.slice(1).trim(),D=v.length>1&&v[1].length>=4&&v[1].length<=6?v[1].toUpperCase():v[1];if(D==="FILE"){let C=S.slice(5).trimStart().split("\\r")[0].trim();if(C){b(),m=!1,p(C);continue}}if(D==="NOFILE"){f(),o=null,m=!0;continue}if(D==="!DATA"){b(),f(),o=null,m=!1,a={name:S.slice(5).trim(),chunks:[]};continue}if(m)continue;if(a){if(v[1]==="!:")a.chunks.push(v.slice(2).join(""));continue}if(!o)p(t);let y={t:0,text:S};if(v[1]==="STEP")y.step=!0,u=[],l=null;else if(v[1]==="BFC")y.bfc=v.slice(2).join(" ");else if(v[1]==="ROTSTEP")if(y.meta="ROTSTEP",y.step=!0,u=[],l=null,(v[2]??"").toUpperCase()==="END")y.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(v[5]??"REL").toUpperCase(),F=(B)=>{let L=Number(B);return Number.isFinite(L)?L:0};y.rotstep={x:F(v[2]),y:F(v[3]),z:F(v[4]),mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(v[1]==="BUFEXCHG"){y.meta="BUFEXCHG";let C=(v[2]??"").toUpperCase();y.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:v[3]??"A"}}else if(v[1]?.startsWith("!"))y.meta=v[1];if(g&&!o.org){let C=vt(S);if(C)o.org=C}if(v[1]==="!TEXMAP"){let C=(v[2]??"").toUpperCase();if(l=null,C==="START"||C==="NEXT"){let F=Tn(S.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(y.texmap={op:C,...F?{map:F}:{}},F)if((o.texmaps??=[]).push(F),C==="START")u.push({map:F,fallback:!1});else l=F}else if(C==="FALLBACK"){y.texmap={op:C};let F=u[u.length-1];if(F)F.fallback=!0}else if(C==="END")y.texmap={op:C},u.pop()}else if(v[1]==="!:"){l=null;let C=Ct(v.slice(2));if(C)d(C,!0),y.geom=C}else l=null;let R=S.match(Mt);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(y);continue}if(a||m)continue;if(!o)p(t);let U=Ct(v);if(!U){if(/^[2-5][ \\t]/.test(w))g=!1;continue}d(U,!1),o.cmds.push(U),g=!1}return f(),c?{main:i,files:s,data:c}:{main:i,files:s}}var sr=Math.PI/180;function Rt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function Bt(e,t){let[n,r,s,o,i,c,a,u,l,f,h,g]=e,[p,m,A,b,d,x,w,v,M,U,S,D]=t;return[o*p+i*m+c*A+n,a*p+u*m+l*A+r,f*p+h*m+g*A+s,o*b+i*w+c*U,o*d+i*v+c*S,o*x+i*M+c*D,a*b+u*w+l*U,a*d+u*v+l*S,a*x+u*M+l*D,f*b+h*w+g*U,f*d+h*v+g*S,f*x+h*M+g*D]}var rt=[0,0,0,1,0,0,0,1,0,0,0,1];var kt=new WeakMap,Pn=/^(s|8|48)\\//;function st(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=kt.get(n);if(r)return r;if(n.org)r=It.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Pn.test(s.file))?"part":"model";return kt.set(n,r),r}var Tt=new WeakMap;function Dt(e){let t=Tt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Tt.set(e,t),t}var Lt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?qe.get(e)??String(e):String(e),In=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Lt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Lt(e.color)} ${e.p.join(" ")}`,ot=(e,t)=>`${Y(e)}#${t}`;function Fn(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:ot(e.name,t),cmds:n}}function Ut(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Fn(e,t).cmds.map(In)].join(`\n`)+`\n`}function it(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Nt(e){let[t,n,r,s,o,i,c,a,u,l,f,h]=e,g=a*h-u*f,p=-(c*h-u*l),m=c*f-a*l,A=s*g+o*p+i*m;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let b=1/A,d=[g*b,-(o*h-i*f)*b,(o*u-i*a)*b,p*b,(s*h-i*l)*b,-(s*u-i*c)*b,m*b,-(s*f-o*l)*b,(s*a-o*c)*b];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Rn=(e)=>String(+e.toFixed(6)||0),St=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Ot(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Rn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${St(t.texture)}${t.glossmap?" GLOSSMAP "+St(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${it(r)}`,source:r}}var Bn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Dn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),a=Math.sin(n*r),u=Math.cos(n*r);return[c*u,-c*a,i,o*a+s*i*u,o*u-s*i*a,-s*c,s*a-o*i*u,s*u+o*i*a,o*c]}var Et=new WeakMap;function zt(e){let t=Et.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Dn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Bn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Et.set(e,n),n}class at extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var Un=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=Pt))return!1;return!0},$t=999999,_t=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Gt=new WeakMap,jt=new WeakMap;function Nn(e,t){let n=jt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Gt.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},jt.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${it(o)}`,source:o},n.parts.set(e,r)}return r}function On(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,a=0,u=new Set,l=t.maxInstances??2000000,f=0,h=(p,m)=>{let A=p.name+"#"+m,b=c.get(A);if(!b){let d;b=Object.assign(()=>d??=Ut(p,m),{file:p,step:m}),c.set(A,b)}return b},g=(p,m,A,b,d,x,w,v,M=null,U=[],S=[],D=void 0,y=null)=>{let R=p.files.get(m);if(!R||w>r||u.has(R))return;if(++f>l)throw new at("model",l);u.add(R);let C=y,F=0,B=w>0?++a:0,L=i&&B?[...U,B]:U,V=i&&B?[...S,A]:S,me=i&&!M?new Map:null,be=-1,ye=0,ue=(O,k,J,_,W,ne,q)=>{if(be!==F)be=F,ye=0;let le=me?.get(F+"|"+k);if(le)return le.n++,g(O,O===p?k:O.main,J,_,d+"/"+k,[...W,$t],w+1,ne,[...W,$t],L,V,q,C);let T=[...W,ye++],P=n.length;g(O,O===p?k:O.main,J,_,d+"/"+k,T,w+1,ne,M,L,V,q,C),me?.set(F+"|"+k,{n:1,from:P,to:n.length})},Pe=zt(R),xe=s?Dt(R):[],Ce=0,ke=(O,k,J,_,W,ne,q,le,T)=>{if(M)_=M;if(++f>l)throw new at("model",l);let P={part:O,color:k,m:J,step:_[0],steps:_,localStep:W,path:d};if(le)P.colour=le;if(B){if(P.sub=B,i)P.subPath=L,P.subMats=V}if(ne)P.embedded=!0;if(q){let N=Ot(O,q);P.texPart=N.name,P.texSource=N.source}else if(T){let N=Nn(O,T);P.colPart=N.name,P.colSource=N.source}let E=Pe[W];if(E)P.view=E;return n.push(P),P},he=(O)=>{while(Ce<xe.length&&xe[Ce]<=O){let k=xe[Ce++];ke(ot(R.name,k),b,A,[...x,k],k,!1,null,D,y).source=h(R,k)}};for(let O of R.cmds){if(O.t===0&&O.step){F++;continue}let k=O;if(k.t>=2||k.t===0&&k.geom&&k.geom.t>=2){he(F);continue}if(k.t===0){if(k.meta==="!COLOUR"){let E=$n(k.text);if(E&&E.code!==16&&E.code!==24)Gt.set(E,k.text),(C=new Map(C??[])).set(E.code,E);continue}if(o&&k.geom?.t===1)k=k.geom;else continue}if(k.t!==1)continue;if(o&&k.fallback)continue;let J=Bt(A,k.m);if(!Un(J))continue;let _=k.color===16?b:k.color,W=k.color===16?D:C?.get(k.color),ne=[...x,F],q=o?k.tex??v:null,le=q?Nt(k.m):null,T=q&&le?Rt(q,le):null;if(p.files.has(k.file)){if(st(p,k.file)==="model"){ue(p,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!0,T,W,C);continue}let P=t.resolveModel?.(k.file);if(P){ue(P,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!1,T,W,C)}if(he(1/0),u.delete(R),me){for(let O of me.values())if(O.n>1)for(let k=O.from;k<O.to;k++)n[k].mult??=O.n}};if(st(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...rt],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,rt,16,e.main,[],0,null),n}function Ht(e,t="main.ldr",n){return On(Ft(e,t,{geometryText:!0}),n)}var zn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function lt(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function Vt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=lt(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function $n(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,a=0,u={type:"default"},l=1;while(l<n.length){let f=n[l].toUpperCase(),h=n[l+1];if(f==="CODE")s=h!==void 0&&et.test(h)?tt(h):h!==void 0&&/^\\d+$/.test(h)?+h:NaN,l+=2;else if(f==="VALUE"){let g=lt(h);if(g)o=g;l+=2}else if(f==="EDGE")i=lt(h)??h,l+=2;else if(f==="ALPHA")c=+h,l+=2;else if(f==="LUMINANCE")a=+h,l+=2;else if(f==="CHROME")u={type:"chrome"},l+=1;else if(f==="PEARLESCENT")u={type:"pearlescent"},l+=1;else if(f==="RUBBER")u={type:"rubber"},l+=1;else if(f==="MATTE_METALLIC")u={type:"matte_metallic"},l+=1;else if(f==="METAL")u={type:"metal"},l+=1;else if(f==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:p,next:m}=Vt(n,l+2);u={type:"glitter",material:p},l=m}else if(g==="SPECKLE"){let{grain:p,next:m}=Vt(n,l+2);u={type:"speckle",material:p},l=m}else if(g==="FABRIC"){let p=(n[l+2]||"").toUpperCase(),m=["VELVET","CANVAS","STRING","FUR"].includes(p)?p.toLowerCase():void 0;u={type:"fabric",kind:m},l+=m?3:2}else l=n.length}else if(zn.has(f))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(a)?a:0,finish:u}}function jn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function ct(e){let t=jn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function Vn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let a=i.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var _n=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Gn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Wt(e,t,n="main.ldr"){let r=[...t],s=new Map;if(!r.length)return s;let o=Vn(e,n);for(let i of r){let c=Y(i);if(!o.has(c)||s.has(c))continue;let a=new Set([c]),u=[c];while(u.length)for(let f of o.get(u.pop())){let h=_n(f);if(h&&o.has(h)&&!a.has(h))a.add(h),u.push(h)}let l=[c,...[...a].filter((f)=>f!==c).sort()].map((f)=>"0 FILE "+(f===c?"":f)+`\n`+o.get(f).join(`\n`)).join(`\n`);s.set(c,`emb/${Gn(l)}.dat`)}return s}var Xt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Kt=new WeakMap,ut=null,ft="",pt=null;function Hn(e,t){if(e===ut&&t===ft)return pt;let n=Kt.get(e);if(!n)Kt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return ut=e,ft=t,pt=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],a=[];s.studs.forEach((g,p)=>{c.push(g[0]),a.push(g[1]);for(let m=0;m<12;m++)i[p*12+m]=g[2+m]});let u=null,l=0,f=0;if(s.mask){l=s.mask[0],f=s.mask[1];let g=s.mask[2];u=new Uint8Array(g.length);for(let p=0;p<g.length;p++)u[p]=g.charCodeAt(p)===49?1:0}let h=!!u;if(u){for(let g=0;g<u.length;g++)if(u[g]!==1){h=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:a,mask:u,nx:l,nz:f,full:h}),ut=e,ft=t,pt=r,r}var Ie=1073741824;class Ee{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=Ee.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let a=s[c];if(a===0)return-1;if(a===r){let u=c<<2;if(o[u]===e&&o[u+1]===t&&o[u+2]===n)return o[u+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=Ee.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,a=this.slot(e,t,n);for(;;){let u=o[a],l=a<<2;if(u===0)return o[a]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(u===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let f=i[l+3];return i[l+3]=r,f}a=a+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Yt{grp=new Ee(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],a=[];for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=(h%20+20)%20,A=(p%20+20)%20,b=this.group(g,m,A);if(b<0)b=s.length,this.grp.put(g,m,A,b),this.lg=b,s.push(0),o.push(h),i.push(h),c.push(p),a.push(p);if(s[b]++,h<o[b])o[b]=h;else if(h>i[b])i[b]=h;if(p<c[b])c[b]=p;else if(p>a[b])a[b]=p}let u=0,l=0;for(let f=0;f<s.length;f++){let h=(i[f]-o[f])/20+1,g=(a[f]-c[f])/20+1,p=h*g;if(this.gX0.push(o[f]),this.gZ0.push(c[f]),this.gNx.push(h),this.gNz.push(g),p<=64*s[f]+1024&&u+p<2147483648)this.gBits.push(u),u+=p;else this.gBits.push(-1),l+=s[f]}this.bits=new Uint8Array(Math.ceil(u/8)),this.rest=new Ee(l);for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=this.group(g,(h%20+20)%20,(p%20+20)%20),A=this.gBits[m];if(A<0){this.rest.put(h,g,p,1);continue}let b=A+(h-this.gX0[m])/20*this.gNz[m]+(p-this.gZ0[m])/20;this.bits[b>>>3]|=1<<(b&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Wn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),Fe=(e,t,n)=>e>-Ie&&e<Ie&&t>-Ie&&t<Ie&&n>-Ie&&n<Ie,Ue=2147483647;function Xn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function mt(e,t,n){return Zt(e,t,n,-1)??Zt(e,t,n,Jt)}var Jt=0;function Zt(e,t,n,r){let o=new Map,i=(T)=>{let P=o.get(T);if(P===void 0)o.set(T,P=Xn(t,T));return P},c=e.length,a=0,u=0,l=0,f=Array(c);for(let T=0;T<c;T++){let P=f[T]=Hn(t,e[T].part);if(P){if(l+=P.nStuds,P.mask)a++}}let h=new Float64Array(a),g=new Float64Array(a),p=new Float64Array(a),m=new Float64Array(a),A=new Int32Array(a),b=new Int32Array(a),d=new Float64Array(a),x=new Float64Array(a),w=[],v=new Int32Array(a),M=new Float64Array(a*9),U=new Uint8Array(a);if(r<0)r=a*4+64;let S=new Ee(e.length*2),D=new Int32Array(r),y=new Int32Array(r),R=0,C=0;for(let T=0;T<e.length;T++){let P=e[T],E=P.m,N=t.parts[P.part];if(!N||!N.mask||!Xt(E)||i(P.color))continue;let I=N.bbox,z=1/0,j=-1/0,ee=1/0,X=-1/0;for(let K=0;K<2;K++)for(let ae=0;ae<2;ae++){let te=K?I[3]:I[0],Le=ae?I[5]:I[2],ve=E[0]+E[3]*te+E[5]*Le,de=E[2]+E[9]*te+E[11]*Le;if(ve<z)z=ve;if(ve>j)j=ve;if(de<ee)ee=de;if(de>X)X=de}let G=Math.round((E[1]+I[4])*2),Q=f[T],ce=Math.floor(z/40),we=Math.floor(j/40),Ae=Math.floor(ee/40),Me=Math.floor(X/40);if(!((we-ce+1)*(Me-Ae+1)<=65536)||!Fe(G,ce,Ae)||!Fe(G,we,Me))continue;let ge=Math.floor((z+5)/40),re=Math.floor((j-5)/40),se=Math.floor((ee+5)/40),oe=Math.floor((X-5)/40),Te=ge<=re&&se<=oe?(re-ge+1)*(oe-se+1):0;C+=Te;let fe=-1;for(let K=ge<=re&&se<=oe?S.get(G,ge,se):-1,ae=0;K>=0&&ae<8;K=D[K],ae++){let te=y[K];if(h[te]!==z||g[te]!==j||p[te]!==ee||m[te]!==X||w[te]!==Q)continue;let Le=e[A[te]].m,ve=!0;for(let de=0;de<12;de++)if(Le[de]!==E[de]){ve=!1;break}if(ve){fe=te;break}}if(fe>=0){let K=n?n[T]:0;if(n&&K<n[A[fe]])b[fe]=A[fe],A[fe]=T;else if(b[fe]<0||n&&K<n[b[fe]])b[fe]=T;continue}let ie=u++;h[ie]=z,g[ie]=j,p[ie]=ee,m[ie]=X,A[ie]=T,b[ie]=-1,w.push(Q),d[ie]=I[0],x[ie]=I[2],v[ie]=G;let pe=ie*9;if(M[pe]=E[0],M[pe+1]=E[1],M[pe+2]=E[2],M[pe+3]=E[3],M[pe+4]=E[6],M[pe+5]=E[9],M[pe+6]=E[5],M[pe+7]=E[8],M[pe+8]=E[11],U[ie]=Q.full&&I[3]-I[0]<=20*Q.nx&&I[5]-I[2]<=20*Q.nz&&E[4]===0&&E[6]===0&&E[8]===0&&E[10]===0&&Wn(E[3],E[5],E[9],E[11])?1:0,R+Te>r){R=r+1;continue}for(let K=ge;K<=re;K++)for(let ae=se;ae<=oe;ae++){if(!Fe(G,K,ae))continue;let te=R++;y[te]=ie,D[te]=S.put(G,K,ae,te)}}if(R>r)return Jt=C,null;let F=[0,5,-5,5,-5],B=[0,5,5,-5,-5],L=(T,P,E,N)=>{if(!(P-6>=h[T]-0.5&&P+6<=g[T]+0.5&&N-6>=p[T]-0.5&&N+6<=m[T]+0.5))return!1;if(U[T]===1)return!0;let I=T*9,z=w[T],j=d[T],ee=x[T],X=P-M[I],G=E-M[I+1],Q=N-M[I+2],ce=M[I+3]*X+M[I+4]*G+M[I+5]*Q,we=M[I+6]*X+M[I+7]*G+M[I+8]*Q,{nx:Ae,nz:Me,mask:ge}=z;for(let re=0;re<5;re++){let se=Math.floor((ce+F[re]-j)/20),oe=Math.floor((we+B[re]-ee)/20);if(se<0||oe<0||se>=Ae||oe>=Me||ge[se*Me+oe]!==1)return!1}return!0},V=NaN,me=NaN,be=NaN,ye=-1,ue=-1,Pe=(T,P,E,N)=>{let I=Math.round(P*2),z=Math.floor(T/40),j=Math.floor(E/40);if(!Fe(I,z,j))return Ue;let ee=Ue;if(!n&&ue>=0&&v[ue]===I&&(A[ue]!==N||b[ue]>=0)&&L(ue,T,P,E))return 0;if(I!==V||z!==me||j!==be)V=I,me=z,be=j,ye=S.get(I,z,j);for(let X=ye;X>=0;X=D[X]){let G=y[X],Q=A[G];if(Q===N&&(Q=b[G])<0)continue;if(!L(G,T,P,E))continue;if(!n)return ue=G,0;let ce=n[Q];if(ce<ee)ee=ce}return ee},xe=new Uint8Array(l),Ce=new Uint8Array(l),ke=0,he=n?new Ee(l,4):null,O=n?null:new Int32Array(l),k=n?null:new Int32Array(l),J=n?null:new Int32Array(l),_=0,W=n?new Int32Array(l).fill(Ue):void 0;for(let T=0,P=0;T<e.length;T++){let E=e[T],N=f[T];if(!N)continue;let I=E.m,z=N.studM,j=I[0],ee=I[1],X=I[2],G=I[3],Q=I[4],ce=I[5],we=I[6],Ae=I[7],Me=I[8],ge=I[9],re=I[10],se=I[11];for(let oe=0;oe<N.nStuds;oe++,P++){let Te=oe*12,fe=z[Te+4],ie=z[Te+7],pe=z[Te+10];if(!(Math.abs(we*fe+Ae*ie+Me*pe-1)<0.001&&Math.abs(G*fe+Q*ie+ce*pe)<0.001&&Math.abs(ge*fe+re*ie+se*pe)<0.001))continue;Ce[P]=1;let K=z[Te],ae=z[Te+1],te=z[Te+2],Le=j+G*K+Q*ae+ce*te,ve=ee+we*K+Ae*ae+Me*te,de=X+ge*K+re*ae+se*te,gt=Pe(Le,ve,de,T);if(gt!==Ue){if(xe[P]=1,ke++,W)W[P]=gt}let Ne=Math.round(Le),Oe=Math.round(ve),ze=Math.round(de);if(!Fe(Ne,Oe,ze))continue;if(!he){O[_]=Ne,k[_]=Oe,J[_++]=ze;continue}let dt=n[T],bt=he.get(Ne,Oe,ze);if(bt<0||dt<bt)he.put(Ne,Oe,ze,dt)}}let ne=he?null:new Yt(O,k,J,_),q=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(Ue):void 0;for(let T=0;T<e.length;T++){let P=e[T],E=t.parts[P.part];if(!E||!E.under||!Xt(P.m)||i(P.color))continue;let N=E.bbox,I=Math.round((N[3]-N[0])/20),z=Math.round((N[5]-N[2])/20);if(!I||!z||I*z>4096)continue;let j=P.m,ee=Math.round(j[1]+N[4]),X=!0,G=0;for(let Q=0;Q<I&&X;Q++)for(let ce=0;ce<z;ce++){let we=N[0]+10+20*Q,Ae=N[2]+10+20*ce,Me=j[0]+j[3]*we+j[5]*Ae,ge=j[2]+j[9]*we+j[11]*Ae,re=Math.round(Me),se=Math.round(ge),oe=!Fe(re,ee,se)?-1:he?he.get(re,ee,se):ne.has(re,ee,se)?1:-1;if(oe<0){X=!1;break}if(oe>G)G=oe}if(X){if(q[T]=1,le)le[T]=G}}return{nStuds:l,studHidden:xe,studUp:Ce,underHidden:q,studsHidden:ke,studHideStep:W,underHideStep:le}}function ht(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let f=l.colour;if(!f)return String(l.color);let h=o.get(f);if(h!==void 0)return h;let g=t.colorTable?.[l.color],p=g?.hex??t.colors?.[l.color],m=g?ct({alpha:g.alpha??255,luminance:g.luminance??0,finish:g.finish??{type:"default"}}):"default:op",A=ct(f);if(h=p&&p.toUpperCase()===f.hex.toUpperCase()&&m===A?String(l.color):f.hex.toUpperCase()+"/"+A,h!==String(l.color))s.set(h,f);return o.set(f,h),h},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),{stepOf:a,nSteps:u}=Kn(c);return{all:c,stepOf:a,nSteps:u,localColours:s}}function Kn(e){let t=!0;for(let o=0;o<e.length;o++){let i=e[o].steps;if(i.length!==1){t=!1;break}let c=i[0];if(!(Number.isInteger(c)&&c>=0&&c<1e6)){t=!1;break}}if(t){let o=new Set;for(let a=0;a<e.length;a++)o.add(e[a].steps[0]);let i=[...o].sort((a,u)=>a-u),c=new Map(i.map((a,u)=>[a,u]));return{stepOf:e.map((a)=>c.get(a.steps[0])),nSteps:i.length}}let n=e.map((o)=>_t(o.steps)),r=[...new Set(n)].sort(),s=new Map(r.map((o,i)=>[o,i]));return{stepOf:n.map((o)=>s.get(o)),nSteps:r.length}}function Qt(e,t,n=!0){let r=ht(e,t,n);return mt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ke="https://ldr-parts-cdn.baconbrix.workers.dev/v1/",He=new Map,Ge=new Map;function We(e=Ke,t=fetch){let n=He.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>He.delete(e)),He.set(e,n);return n}var Zn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Xe=(e,t)=>Zn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Xe(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Xe(r,t)])):e;function Yn(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let g=h.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let p=new DataView(g).getUint32(0,!0),m=new Uint8Array(g,4+p),A=r;n.push(m),r+=m.byteLength;let b=(4-r%4)%4;if(b)n.push(new Uint8Array(b)),r+=b;for(let[d,x]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Xe(x,A);for(let[d,x]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Xe(x,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+c.length)%4)%4,u=4+c.length+a,l=new Uint8Array(u+r);new DataView(l.buffer).setUint32(0,c.length+a,!0),l.set(c,4),l.fill(32,4+c.length,u);let f=u;for(let h of n)l.set(h,f),f+=h.byteLength;return _e(l.buffer)}async function Jn(e,t={}){e=[...e];try{return await qt(e,t)}catch(n){let r=t.cdn??Ke,s=t.fetch??fetch;He.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await qt(e,{...t,fetch:o})}catch{throw n}}}async function qt(e,t){let n=t.cdn??Ke,r=t.fetch??fetch,s=t.gap??16384,o=await We(n,r),i=[...new Set([...new Set(e)].map(Y))],c=[],a=[];for(let d of i){if(Ge.has(n+d))continue;let x=o.parts[d];if(x)a.push({name:d,off:x[0],len:x[1],file:x[2]??0});else c.push(d)}a.sort((d,x)=>d.file-x.file||d.off-x.off);let u=[];for(let d of a){let x=u[u.length-1];if(x&&x.file===d.file&&d.off-x.end<=s)x.end=Math.max(x.end,d.off+d.len),x.items.push(d);else u.push({file:d.file,start:d.off,end:d.off+d.len,items:[d]})}let l=0,f=0,h=0,g=new Map,p=async()=>{while(h<u.length){let d=u[h++],x=g.get(d.file);if(x)x=x.subarray(d.start,d.end);else{let w=await r(new URL(o.archives[d.file],n).href,{headers:{Range:`bytes=${d.start}-${d.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(f++,x=new Uint8Array(await w.arrayBuffer()),l+=x.byteLength,w.status===200)g.set(d.file,x),x=x.subarray(d.start,d.end)}for(let w of d.items){let v=Ve(x.subarray(w.off-d.start,w.off-d.start+w.len)),M=v.buffer.slice(v.byteOffset,v.byteOffset+v.byteLength);Ge.set(n+w.name,_e(M))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,u.length)},p));let m=i.filter((d)=>Ge.has(n+d)).map((d)=>Ge.get(n+d)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:m.length?Yn(m,A):_e(Qn(A)),missing:c,requests:f,bytes:l}}function Qn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function qn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function en(e,t,n){let r=0,s=0,o=!1,i=new Set,c=new Map;for(let a of e){let u;if(a.embedded)u=t.get(a.part);else if(u=c.get(a.part),u===void 0)c.set(a.part,u=Y(a.part));let l=u?n.parts[u]:void 0;if(!l)continue;if(l[3]!=null)o=!0,r+=l[3];if(!i.has(u))i.add(u),s+=l[1]}return{bodyTris:r,packBytes:s,known:o}}class Ze extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function tn(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=We(t.cdn??Ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(y)=>{if(!y.ok)throw Error(`ldr: ${y.status} fetching ${e}`);return wt(await y.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":At(e)),a=Ht(o,c,{looseGeometry:!1,callouts:t.callouts}),u=performance.now();t.onParsed?.(a),await s;let l=Wt(o,new Set(a.filter((y)=>y.embedded).map((y)=>y.part)),c),f=(y,R)=>t.maxBodyTris!=null&&y>t.maxBodyTris||t.maxPackBytes!=null&&R>t.maxPackBytes,h=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(y)=>new Ze({...y,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),p="full";if(h){let y=en(a,l,await s);if(f(y.known?y.bodyTris:0,y.packBytes)){if(!t.lowCdn)throw g(y);let R=await We(t.lowCdn,r).catch(()=>null);if(!R)throw g(y);let C=en(a,l,R);if(f(C.known?C.bodyTris:0,C.packBytes))throw g(C);p="low"}}let m=[...a.filter((y)=>!y.embedded).map((y)=>y.part),...l.values()],A=async()=>{let y=await Jn(m,p==="low"?{...t,cdn:t.lowCdn}:t);for(let[R,C]of l){let F=y.pack.header.parts[C];if(F)y.pack.header.parts[R]=F}return{...y,packBytes:y.pack.buffer?.byteLength??y.pack.bytes??0,bodyTris:qn(a,y.pack)}},b=await A();if(h&&f(b.bodyTris,b.packBytes)&&p==="full"&&t.lowCdn&&await We(t.lowCdn,r).then(()=>!0,()=>!1)){p="low";let y=b;b=await A(),b.requests+=y.requests,b.bytes+=y.bytes}if(h&&f(b.bodyTris,b.packBytes))throw g(b);let{pack:d,missing:x,requests:w,bytes:v}=b,M=new Map([...l].map(([y,R])=>[R,y])),U=x.map((y)=>M.get(y)??y),S=performance.now(),D=t.cull?Qt(a,d.header,t.textures!==!1):void 0;return{insts:a,pack:d,tier:p,missing:U,requests:w,bytes:v,cull:D,timings:{fetchModel:i-n,parse:u-i,parts:S-u,...D?{cull:performance.now()-S}:{}}}}var er=new Set(["part","color","m","step","steps","localStep","path"]);function nn(e){let t=e.length,n=0;for(let p of e){if(typeof p.part!=="string"||typeof p.path!=="string"||typeof p.color!=="number"||typeof p.step!=="number"||typeof p.localStep!=="number"||!Array.isArray(p.m)||p.m.length!==12||!Array.isArray(p.steps))return null;n+=p.steps.length}let r=[],s=new Map,o=(p)=>{let m=s.get(p);if(m===void 0)s.set(p,m=r.length),r.push(p);return m},i=new Uint32Array(t),c=new Uint32Array(t),a=new Float64Array(t*3),u=new Float64Array(t*12),l=new Uint32Array(t+1),f=new Float64Array(n),h=[],g=0;for(let p=0;p<t;p++){let m=e[p];i[p]=o(m.part),c[p]=o(m.path),a[p*3]=m.color,a[p*3+1]=m.step,a[p*3+2]=m.localStep;let A=m.m,b=p*12;for(let w=0;w<12;w++)u[b+w]=A[w];let d=m.steps;for(let w=0;w<d.length;w++)f[g++]=d[w];l[p+1]=g;let x=null;for(let w in m)if(!er.has(w))(x??={})[w]=m[w];if(x)h.push([p,x])}return{n:t,strs:r,part:i,path:c,num:a,m:u,so:l,steps:f,extra:h}}var rn=(e)=>[e.part.buffer,e.path.buffer,e.num.buffer,e.m.buffer,e.so.buffer,e.steps.buffer];self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await tn(n,{...r,cull:!1,onParsed:(f)=>{let h=nn(f);if(h)self.postMessage({id:t,packed:h},rn(h));else self.postMessage({id:t,insts:f})}}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=ht(s.insts,s.pack.header,r.textures!==!1),a=mt(c.all,s.pack.header,r.stepCull&&c.nSteps>1?c.stepOf:void 0),u=performance.now()-i,l=[];for(let f of[a.studHidden,a.studUp,a.underHidden,a.studHideStep,a.underHideStep])if(f)l.push(f.buffer);self.postMessage({id:t,cull:a,ms:u},l)}catch(s){if(s instanceof Ze||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
5684
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/load-worker.gen.ts
|
|
5685
|
+
var load_worker_gen_default = 'var an=ArrayBuffer,W=Uint8Array,Ve=Uint16Array,ln=Int16Array;var _e=Int32Array,qe=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},Ue=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},cn=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var un=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Y=function(e,t,n){var r=Error(t||un[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Y);if(!n)throw r;return r},wt=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},fn=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},pn=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)Y(0);var l=6-s,f=i==3?4:i,u=wt(e,l,f);l+=f;var a=c?1<<c:s,p=wt(e,l,a)+(c==1&&256),d=p;if(!s){var h=1<<10+(e[5]>>3);d=h+(h>>3)*(e[5]&7)}if(d>2145386496)Y(1);var m=new W((t==1?p||d:t?0:d)+12);return m[0]=1,m[4]=4,m[8]=8,{b:l+a,y:0,l:0,d:u,w:t&&t!=1?t:m.subarray(12),e:d,o:new _e(m.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return fn(e,4)+8;Y(0)},Ee=function(e){var t=0;for(;1<<t<=e;++t);return t-1},Ne=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Y(3);var o=1<<s,i=o,c=-1,l=-1,f=-1,u=o,a=new an(512+(o<<2)),p=new ln(a,0,256),d=new Ve(a,0,256),h=new Ve(a,512,o),m=512+(o<<1),A=new W(a,m,o),y=new W(a,m+o);while(c<255&&i>0){var g=Ee(i+1),b=r>>3,w=(1<<g+1)-1,M=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&w,T=(1<<g)-1,O=w-i-1,v=M&T;if(v<O)r+=g,M=v;else if(r+=g+1,M>T)M-=O;if(p[++c]=--M,M==-1)i+=M,A[--u]=c;else i-=M;if(!M)do{var B=r>>3;l=(e[B]|e[B+1]<<8)>>(r&7)&3,r+=2,c+=l}while(l==3)}if(c>255||i)Y(0);var x=0,D=(o>>1)+(o>>3)+3,k=o-1;for(var E=0;E<=c;++E){var F=p[E];if(F<1){d[E]=-F;continue}for(f=0;f<F;++f){A[x]=E;do x=x+D&k;while(x>=u)}}if(x)Y(0);for(f=0;f<o;++f){var C=d[A[f]]++,j=y[f]=s-Ee(C);h[f]=(C<<j)-o}return[r+7>>3,{b:s,s:A,n:y,t:h}]},mn=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),l=new Ve(s.buffer,268);if(o<128){var f=Ne(e,t+1,6),u=f[0],a=f[1];t+=o;var p=u<<3,d=e[t];if(!d)Y(0);var h=0,m=0,A=a.b,y=A,g=(++t<<3)-8+Ee(d);for(;;){if(g-=A,g<p)break;var b=g>>3;if(h+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<A)-1,i[++r]=a.s[h],g-=y,g<p)break;b=g>>3,m+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<y)-1,i[++r]=a.s[m],A=a.n[h],h=a.t[h],y=a.n[m],m=a.t[m]}if(++r>255)Y(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var M=0;for(n=0;n<r;++n){var T=i[n];if(T>11)Y(0);M+=T&&1<<T-1}var O=Ee(M)+1,v=1<<O,B=v-M;if(B&B-1)Y(0);i[r++]=Ee(B)+1;for(n=0;n<r;++n){var T=i[n];++c[i[n]=T&&O+1-T]}var x=new W(v<<1),D=x.subarray(0,v),k=x.subarray(v);l[O]=0;for(n=O;n>0;--n){var E=l[n];Ue(k,n,E,l[n-1]=E+c[n]*(1<<O-n))}if(l[0]!=v)Y(0);for(n=0;n<r;++n){var F=i[n];if(F){var C=l[F];Ue(D,n,C,l[F]=C+(1<<O-F))}}return[t,{n:k,b:O,s:D}]},hn=Ne(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],gn=Ne(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],dn=Ne(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],At=function(e,t){var n=e.length,r=new _e(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},et=new W(new _e([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),bn=At(et,0),tt=new W(new _e([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),yn=At(tt,3),De=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Y(0);var l=0,f=n.b,u=(r<<3)-8+Ee(o)-f,a=-1;for(;u>c&&a<s;){var p=u>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(u&7);l=(l<<f|d)&i,t[++a]=n.s[l],u-=f=n.n[l]}if(u!=c||a+1!=s)Y(0)},xn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;De(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),De(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),De(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),De(e.subarray(r),t.subarray(c),n)},wn=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,l=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Ue(n,e[s],t.y,t.y+=c),n;return Ue(new W(c),e[s])}if(l>e.length)return;if(i==0){if(t.b=l,n)return n.set(e.subarray(s,l),t.y),t.y+=c,n;return qe(e,s,l)}if(i==2){var f=e[s],u=f&3,a=f>>2&3,p=f>>4,d=0,h=0;if(u<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=f>>3;else if(h=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var m=n?n.subarray(t.y,t.y+t.m):new W(t.m),A=m.length-p;if(u==0)m.set(e.subarray(s,s+=p),A);else if(u==1)Ue(m,e[s++],A);else{var y=t.h;if(u==2){var g=mn(e,s);d+=s-(s=g[0]),t.h=y=g[1]}else if(!y)Y(0);(h?xn:De)(e.subarray(s,s+=d),m.subarray(A),y)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var w=e[s++];if(w&3)Y(0);var M=[gn,dn,hn];for(var T=2;T>-1;--T){var O=w>>(T<<1)+2&3;if(O==1){var v=new W([0,0,e[s++]]);M[T]={s:v.subarray(2,3),n:v.subarray(0,1),t:new Ve(v.buffer,0,1),b:0}}else if(O==2)r=Ne(e,s,9-(T&1)),s=r[0],M[T]=r[1];else if(O==3){if(!t.t)Y(0);M[T]=t.t[T]}}var B=t.t=M,x=B[0],D=B[1],k=B[2],E=e[l-1];if(!E)Y(0);var F=(l<<3)-8+Ee(E)-k.b,C=F>>3,j=0,ye=(e[C]|e[C+1]<<8)>>(F&7)&(1<<k.b)-1;C=(F-=D.b)>>3;var xe=(e[C]|e[C+1]<<8)>>(F&7)&(1<<D.b)-1;C=(F-=x.b)>>3;var me=(e[C]|e[C+1]<<8)>>(F&7)&(1<<x.b)-1;for(++b;--b;){var Ce=k.s[ye],Se=k.n[ye],le=x.s[me],Fe=x.n[me],ke=D.s[xe],Te=D.n[xe];C=(F-=ke)>>3;var Le=1<<ke,te=Le+((e[C]|e[C+1]<<8|e[C+2]<<16|e[C+3]<<24)>>>(F&7)&Le-1);C=(F-=tt[le])>>3;var N=yn[le]+((e[C]|e[C+1]<<8|e[C+2]<<16)>>(F&7)&(1<<tt[le])-1);C=(F-=et[Ce])>>3;var S=bn[Ce]+((e[C]|e[C+1]<<8|e[C+2]<<16)>>(F&7)&(1<<et[Ce])-1);if(C=(F-=Se)>>3,ye=k.t[ye]+((e[C]|e[C+1]<<8)>>(F&7)&(1<<Se)-1),C=(F-=Fe)>>3,me=x.t[me]+((e[C]|e[C+1]<<8)>>(F&7)&(1<<Fe)-1),C=(F-=Te)>>3,xe=D.t[xe]+((e[C]|e[C+1]<<8)>>(F&7)&(1<<Te)-1),te>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=te-=3;else{var q=te-(S!=0);if(q){if(te=q==3?t.o[0]-1:t.o[q],q>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=te}else te=t.o[0]}for(var T=0;T<S;++T)m[j+T]=m[A+T];j+=S,A+=S;var V=j-te;if(V<0){var G=-V,ce=t.e+V;if(G>N)G=N;for(var T=0;T<G;++T)m[j+T]=t.w[ce+T];j+=G,N-=G,V=0}for(var T=0;T<N;++T)m[j+T]=m[V+T];j+=N}if(j!=A)while(A<m.length)m[j++]=m[A++];else j=m.length;if(n)t.y+=j;else m=qe(m,0,j)}else if(n){if(t.y+=p,A)for(var T=0;T<p;++T)m[T]=m[A+T]}else if(A)m=qe(m,A);return t.b=l,m}Y(2)},An=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function Ge(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=pn(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var c=wn(e,i,t);if(!c)Y(5);if(t)i.e=i.y;else n.push(c),o+=c.length,cn(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return An(n,o)}async function Mn(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(Ge(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Mt(e){return new TextDecoder().decode(await Mn(e))}var vt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function He(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),rt=/^[A-Za-z][A-Za-z0-9_]*$/,nt=new Map;function st(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!nt.has(r))nt.set(r,t);return r}function ot(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&rt.test(e))return st(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ct=/^~?\\s*moved\\s+to\\s+(.+)$/i,vn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Cn=new Set(["FILE","NOFILE","!DATA"]),Ft=1000000000000000,Rt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),kn=new Set(["model","submodel","configuration"]),Tn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function kt(e){let t=Tn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Rt.has(n)||kn.has(n)?n:void 0}function Ln(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Sn(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every((a)=>Number.isFinite(a)&&Math.abs(a)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let a=0;a<s;a++)c=c.replace(/^\\S+\\s*/,"");let l=Ln(c);if(!l.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:l[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let u=l.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(u>0&&l[u+1])f.glossmap=l[u+1];if(t)f.next=!0;return f}var Pn=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function En(e,t){let n=e.length,r=1,s=(h)=>h===32||h===9,o=()=>{while(r<n&&s(e.charCodeAt(r)))r++;let h=r,m=e.charCodeAt(r),A=m===45;if(A)m=e.charCodeAt(++r);let y=0,g=0;while(m>=48&&m<=57)y=y*10+(m-48),g++,m=e.charCodeAt(++r);if(g>0&&g<=15&&(r>=n||s(m)))return A?-y:y;while(r<n&&!s(e.charCodeAt(r)))r++;return h<r?+e.slice(h,r):NaN};while(r<n&&s(e.charCodeAt(r)))r++;let i=r;if(r>=n)return null;let c=e.charCodeAt(r),l=c===45,f=0,u=0;if(l)c=e.charCodeAt(++r);while(c>=48&&c<=57)f=f*10+(c-48),u++,c=e.charCodeAt(++r);if(u>0&&u<=15&&(r>=n||s(c))){if(l)f=-f}else{while(r<n&&!s(e.charCodeAt(r)))r++;f=ot(e.slice(i,r))}let a=Array(12);for(let h=0;h<12;h++){let m=o();if(!Number.isFinite(m))return null;a[h]=m}while(r<n&&s(e.charCodeAt(r)))r++;if(r>=n)return null;let p=e.slice(r),d=t.get(p);if(d===void 0)d=J(/[ \\t]{2,}|\\t/.test(p)?p.split(/\\s+/).join(" "):p),t.set(p,d);if(!Number.isFinite(f))return null;return{t:1,color:f,m:a,file:d}}var In=[0,12,6,9,12,12];function Tt(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=ot(e[1]),r=In[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=J(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Bt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,l=null,f=[],u=null,a=()=>{if(!l)return;let b=Pn(l.chunks.join("")),w=b[0]===137&&b[1]===80&&b[2]===78&&b[3]===71;(c??=new Map).set(J(l.name),{name:l.name,bytes:b,...w?{mime:"image/png"}:{}}),l=null},p=new Map,d=!0,h=(b)=>{if(a(),o={name:J(b),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],u=null,d=!0},m=!1,A=!1,y=()=>{if(A)return;A=!0,s.clear(),o=null,i=""},g=(b,w)=>{if(u){b.tex=u,u=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!w)b.fallback=!0}else b.tex=M.map};for(let b of e.split(`\n`)){let w=b.trim();if(!w)continue;if(r&&w.charCodeAt(0)>=50&&w.charCodeAt(0)<=53&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){if(l||m)continue;if(!o)h(t);let v=w.slice(2).trimStart(),B=v.search(/\\s/),x={t:w.charCodeAt(0)-48,color:ot(B<0?v:v.slice(0,B)),p:[],src:w};g(x,!1),o.cmds.push(x),d=!1;continue}if(w.charCodeAt(0)===48&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){let v=2;while(w.charCodeAt(v)===32||w.charCodeAt(v)===9)v++;let B=v;while(B<w.length&&w.charCodeAt(B)!==32&&w.charCodeAt(B)!==9)B++;let x=w.slice(v,B),D=/[^\\x21-\\x7e]/.test(x)?w.slice(v).trim().split(/\\s+/)[0]:x;if(!vn.has(D)&&!(D.length>=4&&D.length<=6&&Cn.has(D.toUpperCase()))){if(m||l)continue;if(!o)h(t);let k=w.slice(v),E={t:0,text:k};if(x.charCodeAt(0)===33)E.meta=x;if(u=null,d&&!o.org){let C=kt(k);if(C)o.org=C}let F=k.match(Ct);if(F&&!o.movedTo){let C=F[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=J(C)}o.cmds.push(E);continue}}if(w.charCodeAt(0)===49&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)&&!l&&!m){let v=En(w,p);if(v){if(!o)h(t);g(v,!1),o.cmds.push(v),d=!1;continue}}let M=w.split(/\\s+/);if(+M[0]===0){let v=w.slice(1).trim(),B=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(B==="FILE"){let k=v.slice(5).trimStart().split("\\r")[0].trim();if(k){y(),m=!1,h(k);continue}}if(B==="NOFILE"){a(),o=null,m=!0;continue}if(B==="!DATA"){y(),a(),o=null,m=!1,l={name:v.slice(5).trim(),chunks:[]};continue}if(m)continue;if(l){if(M[1]==="!:")l.chunks.push(M.slice(2).join(""));continue}if(!o)h(t);let x={t:0,text:v};if(M[1]==="STEP")x.step=!0,f=[],u=null;else if(M[1]==="BFC")x.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(x.meta="ROTSTEP",x.step=!0,f=[],u=null,(M[2]??"").toUpperCase()==="END")x.rotstep={x:0,y:0,z:0,mode:"END"};else{let k=(M[5]??"REL").toUpperCase(),E=(F)=>{let C=Number(F);return Number.isFinite(C)?C:0};x.rotstep={x:E(M[2]),y:E(M[3]),z:E(M[4]),mode:["REL","ABS","ADD"].includes(k)?k:"REL"}}else if(M[1]==="BUFEXCHG"){x.meta="BUFEXCHG";let k=(M[2]??"").toUpperCase();x.bufexchg={op:k==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))x.meta=M[1];if(d&&!o.org){let k=kt(v);if(k)o.org=k}if(M[1]==="!TEXMAP"){let k=(M[2]??"").toUpperCase();if(u=null,k==="START"||k==="NEXT"){let E=Sn(v.replace(/^!TEXMAP\\s+\\S+/i,""),k==="NEXT");if(x.texmap={op:k,...E?{map:E}:{}},E)if((o.texmaps??=[]).push(E),k==="START")f.push({map:E,fallback:!1});else u=E}else if(k==="FALLBACK"){x.texmap={op:k};let E=f[f.length-1];if(E)E.fallback=!0}else if(k==="END")x.texmap={op:k},f.pop()}else if(M[1]==="!:"){u=null;let k=Tt(M.slice(2));if(k)g(k,!0),x.geom=k}else u=null;let D=v.match(Ct);if(D&&!o.movedTo){let k=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(k))k+=".dat";o.movedTo=J(k)}o.cmds.push(x);continue}if(l||m)continue;if(!o)h(t);let O=Tt(M);if(!O){if(/^[2-5][ \\t]/.test(w))d=!1;continue}g(O,!1),o.cmds.push(O),d=!1}return a(),c?{main:i,files:s,data:c}:{main:i,files:s}}var ir=Math.PI/180;function Dt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function Ut(e,t){let[n,r,s,o,i,c,l,f,u,a,p,d]=e,[h,m,A,y,g,b,w,M,T,O,v,B]=t;return[o*h+i*m+c*A+n,l*h+f*m+u*A+r,a*h+p*m+d*A+s,o*y+i*w+c*O,o*g+i*M+c*v,o*b+i*T+c*B,l*y+f*w+u*O,l*g+f*M+u*v,l*b+f*T+u*B,a*y+p*w+d*O,a*g+p*M+d*v,a*b+p*T+d*B]}var We=[0,0,0,1,0,0,0,1,0,0,0,1];var Lt=new WeakMap,Fn=/^(s|8|48)\\//;function it(e,t){let n=e.files.get(J(t));if(!n)return"part";let r=Lt.get(n);if(r)return r;if(n.org)r=Rt.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Fn.test(s.file))?"part":"model";return Lt.set(n,r),r}var St=new WeakMap;function Nt(e){let t=St.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return St.set(e,t),t}var Pt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?nt.get(e)??String(e):String(e),Rn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Pt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Pt(e.color)} ${e.p.join(" ")}`,at=(e,t)=>`${J(e)}#${t}`;function Bn(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:at(e.name,t),cmds:n}}function Ot(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Bn(e,t).cmds.map(Rn)].join(`\n`)+`\n`}function lt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function zt(e){let[t,n,r,s,o,i,c,l,f,u,a,p]=e,d=l*p-f*a,h=-(c*p-f*u),m=c*a-l*u,A=s*d+o*h+i*m;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let y=1/A,g=[d*y,-(o*p-i*a)*y,(o*f-i*l)*y,h*y,(s*p-i*u)*y,-(s*f-i*c)*y,m*y,-(s*a-o*u)*y,(s*l-o*c)*y];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Dn=(e)=>String(+e.toFixed(6)||0),Et=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function $t(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Dn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Et(t.texture)}${t.glossmap?" GLOSSMAP "+Et(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${lt(r)}`,source:r}}var Un=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Nn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),l=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*l,i,o*l+s*i*f,o*f-s*i*l,-s*c,s*l-o*i*f,s*f+o*i*l,o*c]}var It=new WeakMap;function jt(e){let t=It.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Nn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Un(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),It.set(e,n),n}class ct extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var On=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=Ft))return!1;return!0},Vt=999999,Ht=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Wt=new WeakMap,_t=new WeakMap;function zn(e,t){let n=_t.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Wt.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},_t.set(t,n);let r=n.parts.get(e);if(!r){let s=J(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${lt(o)}`,source:o},n.parts.set(e,r)}return r}function $n(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,l=0,f=[],u=(A,y)=>{if(A.length)return[...A,y];let g=f[y];if(!g)f[y]=g=[y];return g},a=new Set,p=t.maxInstances??2000000,d=0,h=(A,y)=>{let g=A.name+"#"+y,b=c.get(g);if(!b){let w;b=Object.assign(()=>w??=Ot(A,y),{file:A,step:y}),c.set(g,b)}return b},m=(A,y,g,b,w,M,T,O,v=null,B=[],x=[],D=void 0,k=null)=>{let E=A.files.get(y);if(!E||T>r||a.has(E))return;if(++d>p)throw new ct("model",p);a.add(E);let F=k,C=0,j=T>0?++l:0,ye=i&&j?[...B,j]:B,xe=i&&j?[...x,g]:x,me=i&&!v?new Map:null,Ce=-1,Se=0,le=(N,S,q,V,G,ce,he)=>{if(Ce!==C)Ce=C,Se=0;let ge=me?.get(C+"|"+S);if(ge)return ge.n++,m(N,N===A?S:N.main,q,V,w+"/"+S,[...G,Vt],T+1,ce,[...G,Vt],ye,xe,he,F);let L=[...G,Se++],I=n.length;m(N,N===A?S:N.main,q,V,w+"/"+S,L,T+1,ce,v,ye,xe,he,F),me?.set(C+"|"+S,{n:1,from:I,to:n.length})},Fe=jt(E),ke=s?Nt(E):[],Te=0,Le=(N,S,q,V,G,ce,he,ge,L)=>{if(v)V=v;if(++d>p)throw new ct("model",p);let I={part:N,color:S,m:q,step:V[0],steps:V,localStep:G,path:w};if(ge)I.colour=ge;if(j){if(I.sub=j,i)I.subPath=ye,I.subMats=xe}if(ce)I.embedded=!0;if(he){let z=$t(N,he);I.texPart=z.name,I.texSource=z.source}else if(L){let z=zn(N,L);I.colPart=z.name,I.colSource=z.source}let P=Fe[G];if(P)I.view=P;return n.push(I),I},te=(N)=>{while(Te<ke.length&&ke[Te]<=N){let S=ke[Te++];Le(at(E.name,S),b,g,u(M,S),S,!1,null,D,k).source=h(E,S)}};for(let N of E.cmds){if(N.t===0&&N.step){C++;continue}let S=N;if(S.t>=2||S.t===0&&S.geom&&S.geom.t>=2){te(C);continue}if(S.t===0){if(S.meta==="!COLOUR"){let P=Vn(S.text);if(P&&P.code!==16&&P.code!==24)Wt.set(P,S.text),(F=new Map(F??[])).set(P.code,P);continue}if(o&&S.geom?.t===1)S=S.geom;else continue}if(S.t!==1)continue;if(o&&S.fallback)continue;let q=g===We?S.m:Ut(g,S.m);if(!On(q))continue;let V=S.color===16?b:S.color,G=S.color===16?D:F?.get(S.color),ce=u(M,C),he=o?S.tex??O:null,ge=he?zt(S.m):null,L=he&&ge?Dt(he,ge):null;if(A.files.has(S.file)){if(it(A,S.file)==="model"){le(A,S.file,q,V,ce,L,G);continue}Le(S.file,V,q,ce,C,!0,L,G,F);continue}let I=t.resolveModel?.(S.file);if(I){le(I,S.file,q,V,ce,L,G);continue}Le(S.file,V,q,ce,C,!1,L,G,F)}if(te(1/0),a.delete(E),me){for(let N of me.values())if(N.n>1)for(let S=N.from;S<N.to;S++)n[S].mult??=N.n}};if(it(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...We],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return m(e,e.main,We,16,e.main,[],0,null),n}function Xt(e,t="main.ldr",n){return $n(Bt(e,t,{geometryText:!0}),n)}var jn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function ut(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function Gt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=ut(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function Vn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,l=0,f={type:"default"},u=1;while(u<n.length){let a=n[u].toUpperCase(),p=n[u+1];if(a==="CODE")s=p!==void 0&&rt.test(p)?st(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,u+=2;else if(a==="VALUE"){let d=ut(p);if(d)o=d;u+=2}else if(a==="EDGE")i=ut(p)??p,u+=2;else if(a==="ALPHA")c=+p,u+=2;else if(a==="LUMINANCE")l=+p,u+=2;else if(a==="CHROME")f={type:"chrome"},u+=1;else if(a==="PEARLESCENT")f={type:"pearlescent"},u+=1;else if(a==="RUBBER")f={type:"rubber"},u+=1;else if(a==="MATTE_METALLIC")f={type:"matte_metallic"},u+=1;else if(a==="METAL")f={type:"metal"},u+=1;else if(a==="MATERIAL"){let d=(n[u+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:h,next:m}=Gt(n,u+2);f={type:"glitter",material:h},u=m}else if(d==="SPECKLE"){let{grain:h,next:m}=Gt(n,u+2);f={type:"speckle",material:h},u=m}else if(d==="FABRIC"){let h=(n[u+2]||"").toUpperCase(),m=["VELVET","CANVAS","STRING","FUR"].includes(h)?h.toLowerCase():void 0;f={type:"fabric",kind:m},u+=m?3:2}else u=n.length}else if(jn.has(a))u+=1;else u+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(l)?l:0,finish:f}}function _n(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function ft(e){let t=_n(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function Gn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(J(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(J(t),r)}let l=i.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Hn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?J(t.slice(14).join(" ")):null};function Wn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Kt(e,t,n="main.ldr"){let r=[...t],s=new Map;if(!r.length)return s;let o=Gn(e,n);for(let i of r){let c=J(i);if(!o.has(c)||s.has(c))continue;let l=new Set([c]),f=[c];while(f.length)for(let a of o.get(f.pop())){let p=Hn(a);if(p&&o.has(p)&&!l.has(p))l.add(p),f.push(p)}let u=[c,...[...l].filter((a)=>a!==c).sort()].map((a)=>"0 FILE "+(a===c?"":a)+`\n`+o.get(a).join(`\n`)).join(`\n`);s.set(c,`emb/${Wn(u)}.dat`)}return s}var Zt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Yt=new WeakMap,pt=null,mt="",ht=null;function Xn(e,t){if(e===pt&&t===mt)return ht;let n=Yt.get(e);if(!n)Yt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return pt=e,mt=t,ht=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],l=[];s.studs.forEach((d,h)=>{c.push(d[0]),l.push(d[1]);for(let m=0;m<12;m++)i[h*12+m]=d[2+m]});let f=null,u=0,a=0;if(s.mask){u=s.mask[0],a=s.mask[1];let d=s.mask[2];f=new Uint8Array(d.length);for(let h=0;h<d.length;h++)f[h]=d.charCodeAt(h)===49?1:0}let p=!!f;if(f){for(let d=0;d<f.length;d++)if(f[d]!==1){p=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:l,mask:f,nx:u,nz:a,full:p,src:s}),pt=e,mt=t,ht=r,r}var Re=1073741824;class Ie{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=Ie.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let l=s[c];if(l===0)return-1;if(l===r){let f=c<<2;if(o[f]===e&&o[f+1]===t&&o[f+2]===n)return o[f+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=Ie.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,l=this.slot(e,t,n);for(;;){let f=o[l],u=l<<2;if(f===0)return o[l]=s,i[u]=e,i[u+1]=t,i[u+2]=n,i[u+3]=r,this.size++,-1;if(f===s&&i[u]===e&&i[u+1]===t&&i[u+2]===n){let a=i[u+3];return i[u+3]=r,a}l=l+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Qt{grp=new Ie(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],l=[];for(let a=0;a<r;a++){let p=e[a],d=t[a],h=n[a],m=(p%20+20)%20,A=(h%20+20)%20,y=this.group(d,m,A);if(y<0)y=s.length,this.grp.put(d,m,A,y),this.lg=y,s.push(0),o.push(p),i.push(p),c.push(h),l.push(h);if(s[y]++,p<o[y])o[y]=p;else if(p>i[y])i[y]=p;if(h<c[y])c[y]=h;else if(h>l[y])l[y]=h}let f=0,u=0;for(let a=0;a<s.length;a++){let p=(i[a]-o[a])/20+1,d=(l[a]-c[a])/20+1,h=p*d;if(this.gX0.push(o[a]),this.gZ0.push(c[a]),this.gNx.push(p),this.gNz.push(d),h<=64*s[a]+1024&&f+h<2147483648)this.gBits.push(f),f+=h;else this.gBits.push(-1),u+=s[a]}this.bits=new Uint8Array(Math.ceil(f/8)),this.rest=new Ie(u);for(let a=0;a<r;a++){let p=e[a],d=t[a],h=n[a],m=this.group(d,(p%20+20)%20,(h%20+20)%20),A=this.gBits[m];if(A<0){this.rest.put(p,d,h,1);continue}let y=A+(p-this.gX0[m])/20*this.gNz[m]+(h-this.gZ0[m])/20;this.bits[y>>>3]|=1<<(y&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Kn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),Be=(e,t,n)=>e>-Re&&e<Re&&t>-Re&&t<Re&&n>-Re&&n<Re,Oe=2147483647;function Zn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function gt(e,t,n,r){if(!r){r=Array(e.length);for(let s=0;s<e.length;s++)r[s]=Xn(t,e[s].part)}return Jt(e,t,n,-1,r)??Jt(e,t,n,qt,r)}var qt=0;function Jt(e,t,n,r,s){let i=new Map,c=null,l=!1,f=(L)=>{if(L===c)return l;let I=i.get(L);if(I===void 0)i.set(L,I=Zn(t,L));return c=L,l=I,I},u=e.length,a=0,p=0,d=0;for(let L=0;L<u;L++){let I=s[L];if(I){if(d+=I.nStuds,I.mask)a++}}let h=new Float64Array(a),m=new Float64Array(a),A=new Float64Array(a),y=new Float64Array(a),g=new Int32Array(a),b=new Int32Array(a),w=new Float64Array(a),M=new Float64Array(a),T=[],O=new Int32Array(a),v=new Float64Array(a*9),B=new Uint8Array(a);if(r<0)r=a*4+64;let x=new Ie(e.length*2),D=new Int32Array(r),k=new Int32Array(r),E=0,F=0;for(let L=0;L<e.length;L++){let I=e[L],P=I.m,z=s[L];if(!z||!z.mask||!Zt(P)||f(I.color))continue;let U=z.src.bbox,Q=1/0,_=-1/0,X=1/0,H=-1/0;for(let Z=0;Z<2;Z++)for(let oe=0;oe<2;oe++){let ee=Z?U[3]:U[0],Pe=oe?U[5]:U[2],ve=P[0]+P[3]*ee+P[5]*Pe,be=P[2]+P[9]*ee+P[11]*Pe;if(ve<Q)Q=ve;if(ve>_)_=ve;if(be<X)X=be;if(be>H)H=be}let K=Math.round((P[1]+U[4])*2),ie=Math.floor(Q/40),we=Math.floor(_/40),Me=Math.floor(X/40),Ae=Math.floor(H/40);if(!((we-ie+1)*(Ae-Me+1)<=65536)||!Be(K,ie,Me)||!Be(K,we,Ae))continue;let de=Math.floor((Q+5)/40),ae=Math.floor((_-5)/40),ne=Math.floor((X+5)/40),re=Math.floor((H-5)/40),ue=de<=ae&&ne<=re?(ae-de+1)*(re-ne+1):0;F+=ue;let fe=-1;for(let Z=de<=ae&&ne<=re?x.get(K,de,ne):-1,oe=0;Z>=0&&oe<8;Z=D[Z],oe++){let ee=k[Z];if(h[ee]!==Q||m[ee]!==_||A[ee]!==X||y[ee]!==H||T[ee]!==z)continue;let Pe=e[g[ee]].m,ve=!0;for(let be=0;be<12;be++)if(Pe[be]!==P[be]){ve=!1;break}if(ve){fe=ee;break}}if(fe>=0){let Z=n?n[L]:0;if(n&&Z<n[g[fe]])b[fe]=g[fe],g[fe]=L;else if(b[fe]<0||n&&Z<n[b[fe]])b[fe]=L;continue}let se=p++;h[se]=Q,m[se]=_,A[se]=X,y[se]=H,g[se]=L,b[se]=-1,T.push(z),w[se]=U[0],M[se]=U[2],O[se]=K;let pe=se*9;if(v[pe]=P[0],v[pe+1]=P[1],v[pe+2]=P[2],v[pe+3]=P[3],v[pe+4]=P[6],v[pe+5]=P[9],v[pe+6]=P[5],v[pe+7]=P[8],v[pe+8]=P[11],B[se]=z.full&&U[3]-U[0]<=20*z.nx&&U[5]-U[2]<=20*z.nz&&P[4]===0&&P[6]===0&&P[8]===0&&P[10]===0&&Kn(P[3],P[5],P[9],P[11])?1:0,E+ue>r){E=r+1;continue}for(let Z=de;Z<=ae;Z++)for(let oe=ne;oe<=re;oe++){if(!Be(K,Z,oe))continue;let ee=E++;k[ee]=se,D[ee]=x.put(K,Z,oe,ee)}}if(E>r)return qt=F,null;let C=[0,5,-5,5,-5],j=[0,5,5,-5,-5],ye=(L,I,P,z)=>{if(!(I-6>=h[L]-0.5&&I+6<=m[L]+0.5&&z-6>=A[L]-0.5&&z+6<=y[L]+0.5))return!1;if(B[L]===1)return!0;let R=L*9,U=T[L],Q=w[L],_=M[L],X=I-v[R],H=P-v[R+1],K=z-v[R+2],ie=v[R+3]*X+v[R+4]*H+v[R+5]*K,we=v[R+6]*X+v[R+7]*H+v[R+8]*K,{nx:Me,nz:Ae,mask:de}=U;for(let ae=0;ae<5;ae++){let ne=Math.floor((ie+C[ae]-Q)/20),re=Math.floor((we+j[ae]-_)/20);if(ne<0||re<0||ne>=Me||re>=Ae||de[ne*Ae+re]!==1)return!1}return!0},xe=NaN,me=NaN,Ce=NaN,Se=-1,le=-1,Fe=(L,I,P,z)=>{let R=Math.round(I*2),U=Math.floor(L/40),Q=Math.floor(P/40);if(!Be(R,U,Q))return Oe;let _=Oe;if(!n&&le>=0&&O[le]===R&&(g[le]!==z||b[le]>=0)&&ye(le,L,I,P))return 0;if(R!==xe||U!==me||Q!==Ce)xe=R,me=U,Ce=Q,Se=x.get(R,U,Q);for(let X=Se;X>=0;X=D[X]){let H=k[X],K=g[H];if(K===z&&(K=b[H])<0)continue;if(!ye(H,L,I,P))continue;if(!n)return le=H,0;let ie=n[K];if(ie<_)_=ie}return _},ke=new Uint8Array(d),Te=new Uint8Array(d),Le=0,te=n?new Ie(d,4):null,N=n?null:new Int32Array(d),S=n?null:new Int32Array(d),q=n?null:new Int32Array(d),V=0,G=n?new Int32Array(d).fill(Oe):void 0;for(let L=0,I=0;L<e.length;L++){let P=e[L],z=s[L];if(!z)continue;let R=P.m,U=z.studM,Q=R[0],_=R[1],X=R[2],H=R[3],K=R[4],ie=R[5],we=R[6],Me=R[7],Ae=R[8],de=R[9],ae=R[10],ne=R[11];for(let re=0;re<z.nStuds;re++,I++){let ue=re*12,fe=U[ue+4],se=U[ue+7],pe=U[ue+10];if(!(Math.abs(we*fe+Me*se+Ae*pe-1)<0.001&&Math.abs(H*fe+K*se+ie*pe)<0.001&&Math.abs(de*fe+ae*se+ne*pe)<0.001))continue;Te[I]=1;let Z=U[ue],oe=U[ue+1],ee=U[ue+2],Pe=Q+H*Z+K*oe+ie*ee,ve=_+we*Z+Me*oe+Ae*ee,be=X+de*Z+ae*oe+ne*ee,bt=Fe(Pe,ve,be,L);if(bt!==Oe){if(ke[I]=1,Le++,G)G[I]=bt}let ze=Math.round(Pe),$e=Math.round(ve),je=Math.round(be);if(!Be(ze,$e,je))continue;if(!te){N[V]=ze,S[V]=$e,q[V++]=je;continue}let yt=n[L],xt=te.get(ze,$e,je);if(xt<0||yt<xt)te.put(ze,$e,je,yt)}}let ce=te?null:new Qt(N,S,q,V),he=new Uint8Array(e.length),ge=n?new Int32Array(e.length).fill(Oe):void 0;for(let L=0;L<e.length;L++){let I=e[L],P=s[L],z=P?P.src:null;if(!z||!z.under||!Zt(I.m)||f(I.color))continue;let R=z.bbox,U=Math.round((R[3]-R[0])/20),Q=Math.round((R[5]-R[2])/20);if(!U||!Q||U*Q>4096)continue;let _=I.m,X=Math.round(_[1]+R[4]),H=!0,K=0;for(let ie=0;ie<U&&H;ie++)for(let we=0;we<Q;we++){let Me=R[0]+10+20*ie,Ae=R[2]+10+20*we,de=_[0]+_[3]*Me+_[5]*Ae,ae=_[2]+_[9]*Me+_[11]*Ae,ne=Math.round(de),re=Math.round(ae),ue=!Be(ne,X,re)?-1:te?te.get(ne,X,re):ce.has(ne,X,re)?1:-1;if(ue<0){H=!1;break}if(ue>K)K=ue}if(H){if(he[L]=1,ge)ge[L]=K}}return{nStuds:d,studHidden:ke,studUp:Te,underHidden:he,studsHidden:Le,studHideStep:G,underHideStep:ge}}function dt(e,t,n){let r=(u)=>u.colPart&&t.parts[u.colPart]?u.colPart:n&&u.texPart&&t.parts[u.texPart]?u.texPart:u.part,s=new Map,o=new Map,i=(u)=>{let a=u.colour;if(!a)return String(u.color);let p=o.get(a);if(p!==void 0)return p;let d=t.colorTable?.[u.color],h=d?.hex??t.colors?.[u.color],m=d?ft({alpha:d.alpha??255,luminance:d.luminance??0,finish:d.finish??{type:"default"}}):"default:op",A=ft(a);if(p=h&&h.toUpperCase()===a.hex.toUpperCase()&&m===A?String(u.color):a.hex.toUpperCase()+"/"+A,p!==String(u.color))s.set(p,a);return o.set(a,p),p},c=e.map((u)=>({part:r(u),color:i(u),m:u.m,steps:u.steps})),{stepOf:l,nSteps:f}=Yn(c);return{all:c,stepOf:l,nSteps:f,localColours:s}}function Yn(e){let t=!0;for(let o=0;o<e.length;o++){let i=e[o].steps;if(i.length!==1){t=!1;break}let c=i[0];if(!(Number.isInteger(c)&&c>=0&&c<1e6)){t=!1;break}}if(t){let o=new Set;for(let l=0;l<e.length;l++)o.add(e[l].steps[0]);let i=[...o].sort((l,f)=>l-f),c=new Map(i.map((l,f)=>[l,f]));return{stepOf:e.map((l)=>c.get(l.steps[0])),nSteps:i.length}}let n=e.map((o)=>Ht(o.steps)),r=[...new Set(n)].sort(),s=new Map(r.map((o,i)=>[o,i]));return{stepOf:n.map((o)=>s.get(o)),nSteps:r.length}}function en(e,t,n=!0){let r=dt(e,t,n);return gt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Je="https://ldr-parts-cdn.baconbrix.workers.dev/v1/",Ke=new Map,Xe=new Map;function Ze(e=Je,t=fetch){let n=Ke.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ke.delete(e)),Ke.set(e,n);return n}var Jn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Ye=(e,t)=>Jn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ye(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ye(r,t)])):e;function Qn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let h=new DataView(d).getUint32(0,!0),m=new Uint8Array(d,4+h),A=r;n.push(m),r+=m.byteLength;let y=(4-r%4)%4;if(y)n.push(new Uint8Array(y)),r+=y;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ye(b,A);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ye(b,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),l=(4-(4+c.length)%4)%4,f=4+c.length+l,u=new Uint8Array(f+r);new DataView(u.buffer).setUint32(0,c.length+l,!0),u.set(c,4),u.fill(32,4+c.length,f);let a=f;for(let p of n)u.set(p,a),a+=p.byteLength;return He(u.buffer)}async function qn(e,t={}){e=[...e];try{return await tn(e,t)}catch(n){let r=t.cdn??Je,s=t.fetch??fetch;Ke.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await tn(e,{...t,fetch:o})}catch{throw n}}}async function tn(e,t){let n=t.cdn??Je,r=t.fetch??fetch,s=t.gap??16384,o=await Ze(n,r),i=[...new Set([...new Set(e)].map(J))],c=[],l=[];for(let g of i){if(Xe.has(n+g))continue;let b=o.parts[g];if(b)l.push({name:g,off:b[0],len:b[1],file:b[2]??0});else c.push(g)}l.sort((g,b)=>g.file-b.file||g.off-b.off);let f=[];for(let g of l){let b=f[f.length-1];if(b&&b.file===g.file&&g.off-b.end<=s)b.end=Math.max(b.end,g.off+g.len),b.items.push(g);else f.push({file:g.file,start:g.off,end:g.off+g.len,items:[g]})}let u=0,a=0,p=0,d=new Map,h=async()=>{while(p<f.length){let g=f[p++],b=d.get(g.file);if(b)b=b.subarray(g.start,g.end);else{let w=await r(new URL(o.archives[g.file],n).href,{headers:{Range:`bytes=${g.start}-${g.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(a++,b=new Uint8Array(await w.arrayBuffer()),u+=b.byteLength,w.status===200)d.set(g.file,b),b=b.subarray(g.start,g.end)}for(let w of g.items){let M=Ge(b.subarray(w.off-g.start,w.off-g.start+w.len)),T=M.buffer.slice(M.byteOffset,M.byteOffset+M.byteLength);Xe.set(n+w.name,He(T))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},h));let m=i.filter((g)=>Xe.has(n+g)).map((g)=>Xe.get(n+g)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:m.length?Qn(m,A):He(er(A)),missing:c,requests:a,bytes:u}}function er(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function tr(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function nn(e,t,n){let r=0,s=0,o=!1,i=new Set,c=new Map;for(let l of e){let f;if(l.embedded)f=t.get(l.part);else if(f=c.get(l.part),f===void 0)c.set(l.part,f=J(l.part));let u=f?n.parts[f]:void 0;if(!u)continue;if(u[3]!=null)o=!0,r+=u[3];if(!i.has(f))i.add(f),s+=u[1]}return{bodyTris:r,packBytes:s,known:o}}class Qe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function rn(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Ze(t.cdn??Je,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(x)=>{if(!x.ok)throw Error(`ldr: ${x.status} fetching ${e}`);return Mt(await x.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":vt(e)),l=Xt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(l),await s;let u=Kt(o,new Set(l.filter((x)=>x.embedded).map((x)=>x.part)),c),a=(x,D)=>t.maxBodyTris!=null&&x>t.maxBodyTris||t.maxPackBytes!=null&&D>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(x)=>new Qe({...x,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),h="full";if(p){let x=nn(l,u,await s);if(a(x.known?x.bodyTris:0,x.packBytes)){if(!t.lowCdn)throw d(x);let D=await Ze(t.lowCdn,r).catch(()=>null);if(!D)throw d(x);let k=nn(l,u,D);if(a(k.known?k.bodyTris:0,k.packBytes))throw d(k);h="low"}}let m=[...l.filter((x)=>!x.embedded).map((x)=>x.part),...u.values()],A=async()=>{let x=await qn(m,h==="low"?{...t,cdn:t.lowCdn}:t);for(let[D,k]of u){let E=x.pack.header.parts[k];if(E)x.pack.header.parts[D]=E}return{...x,packBytes:x.pack.buffer?.byteLength??x.pack.bytes??0,bodyTris:tr(l,x.pack)}},y=await A();if(p&&a(y.bodyTris,y.packBytes)&&h==="full"&&t.lowCdn&&await Ze(t.lowCdn,r).then(()=>!0,()=>!1)){h="low";let x=y;y=await A(),y.requests+=x.requests,y.bytes+=x.bytes}if(p&&a(y.bodyTris,y.packBytes))throw d(y);let{pack:g,missing:b,requests:w,bytes:M}=y,T=new Map([...u].map(([x,D])=>[D,x])),O=b.map((x)=>T.get(x)??x),v=performance.now(),B=t.cull?en(l,g.header,t.textures!==!1):void 0;return{insts:l,pack:g,tier:h,missing:O,requests:w,bytes:M,cull:B,timings:{fetchModel:i-n,parse:f-i,parts:v-f,...B?{cull:performance.now()-v}:{}}}}var nr=new Set(["part","color","m","step","steps","localStep","path"]);function sn(e){let t=e.length,n=0;for(let h of e){if(typeof h.part!=="string"||typeof h.path!=="string"||typeof h.color!=="number"||typeof h.step!=="number"||typeof h.localStep!=="number"||!Array.isArray(h.m)||h.m.length!==12||!Array.isArray(h.steps))return null;n+=h.steps.length}let r=[],s=new Map,o=(h)=>{let m=s.get(h);if(m===void 0)s.set(h,m=r.length),r.push(h);return m},i=new Uint32Array(t),c=new Uint32Array(t),l=new Float64Array(t*3),f=new Float64Array(t*12),u=new Uint32Array(t+1),a=new Float64Array(n),p=[],d=0;for(let h=0;h<t;h++){let m=e[h];i[h]=o(m.part),c[h]=o(m.path),l[h*3]=m.color,l[h*3+1]=m.step,l[h*3+2]=m.localStep;let A=m.m,y=h*12;for(let w=0;w<12;w++)f[y+w]=A[w];let g=m.steps;for(let w=0;w<g.length;w++)a[d++]=g[w];u[h+1]=d;let b=null;for(let w in m)if(!nr.has(w))(b??={})[w]=m[w];if(b)p.push([h,b])}return{n:t,strs:r,part:i,path:c,num:l,m:f,so:u,steps:a,extra:p}}var on=(e)=>[e.part.buffer,e.path.buffer,e.num.buffer,e.m.buffer,e.so.buffer,e.steps.buffer];self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await rn(n,{...r,cull:!1,onParsed:(a)=>{let p=sn(a);if(p)self.postMessage({id:t,packed:p},on(p));else self.postMessage({id:t,insts:a})}}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=dt(s.insts,s.pack.header,r.textures!==!1),l=gt(c.all,s.pack.header,r.stepCull&&c.nSteps>1?c.stepOf:void 0),f=performance.now()-i,u=[];for(let a of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(a)u.push(a.buffer);self.postMessage({id:t,cull:l,ms:f},u)}catch(s){if(s instanceof Qe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
5638
5686
|
|
|
5639
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5687
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/inst-io.ts
|
|
5640
5688
|
var CORE = new Set(["part", "color", "m", "step", "steps", "localStep", "path"]);
|
|
5641
5689
|
function unpackInstances(p) {
|
|
5642
5690
|
const { n, strs, part, path, num, m, so, steps, extra } = p;
|
|
@@ -5661,7 +5709,7 @@ function unpackInstances(p) {
|
|
|
5661
5709
|
return out;
|
|
5662
5710
|
}
|
|
5663
5711
|
|
|
5664
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5712
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/cdn.ts
|
|
5665
5713
|
var worker;
|
|
5666
5714
|
var seq = 0;
|
|
5667
5715
|
var pending = new Map;
|
|
@@ -5777,7 +5825,7 @@ async function loadModel(source, o = {}) {
|
|
|
5777
5825
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
5778
5826
|
});
|
|
5779
5827
|
}
|
|
5780
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5828
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/usdz.ts
|
|
5781
5829
|
var IDENT = [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
5782
5830
|
var MAX_ERR = 8;
|
|
5783
5831
|
var REL_ERR = 0.1;
|
|
@@ -6409,7 +6457,7 @@ function hiddenInstances(n, items, geo, clear, RES = 512) {
|
|
|
6409
6457
|
hidden[k] = seen[k] ? 0 : 1;
|
|
6410
6458
|
return hidden;
|
|
6411
6459
|
}
|
|
6412
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6460
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/library.ts
|
|
6413
6461
|
import { existsSync, readFileSync, statSync } from "fs";
|
|
6414
6462
|
import { join } from "path";
|
|
6415
6463
|
var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
|
|
@@ -6759,11 +6807,11 @@ class Library {
|
|
|
6759
6807
|
return insts;
|
|
6760
6808
|
}
|
|
6761
6809
|
}
|
|
6762
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6810
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/build-pack.ts
|
|
6763
6811
|
import fs3 from "node:fs";
|
|
6764
6812
|
import path3 from "node:path";
|
|
6765
6813
|
|
|
6766
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6814
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/resolver.ts
|
|
6767
6815
|
import fs from "node:fs";
|
|
6768
6816
|
import path from "node:path";
|
|
6769
6817
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -7092,11 +7140,11 @@ function collectDeps(lib, refs) {
|
|
|
7092
7140
|
return out;
|
|
7093
7141
|
}
|
|
7094
7142
|
|
|
7095
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7143
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/compile.ts
|
|
7096
7144
|
import fs2 from "node:fs";
|
|
7097
7145
|
import path2 from "node:path";
|
|
7098
7146
|
|
|
7099
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7147
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/lod.ts
|
|
7100
7148
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
7101
7149
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
7102
7150
|
function reorderMesh(P, N, C, I) {
|
|
@@ -7402,7 +7450,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
|
|
|
7402
7450
|
return out;
|
|
7403
7451
|
}
|
|
7404
7452
|
|
|
7405
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7453
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/compile.ts
|
|
7406
7454
|
class BfcState {
|
|
7407
7455
|
accum;
|
|
7408
7456
|
ccw = true;
|
|
@@ -8363,7 +8411,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
8363
8411
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
8364
8412
|
}
|
|
8365
8413
|
|
|
8366
|
-
// ../../../../../../../tmp/ldr-build-
|
|
8414
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/build-pack.ts
|
|
8367
8415
|
function packCompilerOpts(o) {
|
|
8368
8416
|
return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures, ...o.partWorkLimit ? { workLimit: o.partWorkLimit } : {} };
|
|
8369
8417
|
}
|
|
@@ -8435,7 +8483,7 @@ function buildPack(o) {
|
|
|
8435
8483
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
8436
8484
|
return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
|
|
8437
8485
|
}
|
|
8438
|
-
// ../../../../../../../tmp/ldr-build-
|
|
8486
|
+
// ../../../../../../../tmp/ldr-build-zkQ2hC/src/node/promote.ts
|
|
8439
8487
|
var GEOM = /^\s*[2-5]\s/;
|
|
8440
8488
|
var REF = /^\s*1\s/;
|
|
8441
8489
|
var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;
|