ldr 0.24.1 → 0.25.0

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/spec.ts
2
2
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
3
3
  function parseColor(tok) {
4
4
  if (/^0x/i.test(tok))
@@ -689,7 +689,7 @@ function fileStepViews(f) {
689
689
  viewMemo.set(f, out);
690
690
  return out;
691
691
  }
692
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/model.ts
692
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/model.ts
693
693
  var CALLOUT_END = 999999;
694
694
  var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
695
695
  function flatten(doc, opts = {}) {
@@ -708,17 +708,18 @@ function flatten(doc, opts = {}) {
708
708
  }
709
709
  return fn;
710
710
  };
711
- const walk = (d, fname, m, color, path, stepPath, depth, texIn, fixed = null, subPath = [], subMats = []) => {
711
+ const walk = (d, fname, m, color, path, stepPath, depth, texIn, fixed = null, subPath = [], subMats = [], colour = undefined, scope0 = null) => {
712
712
  const f = d.files.get(fname);
713
713
  if (!f || depth > maxDepth)
714
714
  return;
715
+ let scope = scope0;
715
716
  let s = 0;
716
717
  const subId = depth > 0 ? ++subs : 0;
717
718
  const sp0 = co && subId ? [...subPath, subId] : subPath;
718
719
  const sm0 = co && subId ? [...subMats, m] : subMats;
719
720
  const groups = co && !fixed ? new Map : null;
720
721
  let ordStep = -1, ord = 0;
721
- const sub = (sd, file, mm, col, sp, lt) => {
722
+ const sub = (sd, file, mm, col, sp, lt, cd) => {
722
723
  if (ordStep !== s) {
723
724
  ordStep = s;
724
725
  ord = 0;
@@ -726,19 +727,21 @@ function flatten(doc, opts = {}) {
726
727
  const g = groups?.get(s + "|" + file);
727
728
  if (g) {
728
729
  g.n++;
729
- return walk(sd, sd === d ? file : sd.main, mm, col, path + "/" + file, [...sp, CALLOUT_END], depth + 1, lt, [...sp, CALLOUT_END], sp0, sm0);
730
+ return walk(sd, sd === d ? file : sd.main, mm, col, path + "/" + file, [...sp, CALLOUT_END], depth + 1, lt, [...sp, CALLOUT_END], sp0, sm0, cd, scope);
730
731
  }
731
732
  const spo = [...sp, ord++], from = out.length;
732
- walk(sd, sd === d ? file : sd.main, mm, col, path + "/" + file, spo, depth + 1, lt, fixed, sp0, sm0);
733
+ walk(sd, sd === d ? file : sd.main, mm, col, path + "/" + file, spo, depth + 1, lt, fixed, sp0, sm0, cd, scope);
733
734
  groups?.set(s + "|" + file, { n: 1, from, to: out.length });
734
735
  };
735
736
  const views = fileStepViews(f);
736
737
  const ls = loose ? looseSteps(f) : [];
737
738
  let li = 0;
738
- const emit = (part, col, mm, sp, k, embedded, tex) => {
739
+ const emit = (part, col, mm, sp, k, embedded, tex, cd) => {
739
740
  if (fixed)
740
741
  sp = fixed;
741
742
  const i = { part, color: col, m: mm, step: sp[0], steps: sp, localStep: k, path };
743
+ if (cd)
744
+ i.colour = cd;
742
745
  if (subId) {
743
746
  i.sub = subId;
744
747
  if (co) {
@@ -762,7 +765,7 @@ function flatten(doc, opts = {}) {
762
765
  const flushLoose = (upTo) => {
763
766
  while (li < ls.length && ls[li] <= upTo) {
764
767
  const k = ls[li++];
765
- emit(loosePartName(f.name, k), color, m, [...stepPath, k], k, false, null).source = lazy(f, k);
768
+ emit(loosePartName(f.name, k), color, m, [...stepPath, k], k, false, null, colour).source = lazy(f, k);
766
769
  }
767
770
  };
768
771
  for (const c0 of f.cmds) {
@@ -776,6 +779,12 @@ function flatten(doc, opts = {}) {
776
779
  continue;
777
780
  }
778
781
  if (c.t === 0) {
782
+ if (c.meta === "!COLOUR") {
783
+ const def = parseColourLine(c.text);
784
+ if (def && def.code !== 16 && def.code !== 24)
785
+ (scope = new Map(scope ?? [])).set(def.code, def);
786
+ continue;
787
+ }
779
788
  if (tx && c.geom?.t === 1)
780
789
  c = c.geom;
781
790
  else
@@ -785,24 +794,24 @@ function flatten(doc, opts = {}) {
785
794
  continue;
786
795
  if (tx && c.fallback)
787
796
  continue;
788
- const col = c.color === 16 ? color : c.color, mm = mul(m, c.m), sp = [...stepPath, s];
797
+ const col = c.color === 16 ? color : c.color, cd = c.color === 16 ? colour : scope?.get(c.color), mm = mul(m, c.m), sp = [...stepPath, s];
789
798
  const tex = tx ? c.tex ?? texIn : null;
790
799
  const local = tex ? invert(c.m) : null;
791
800
  const lt = tex && local ? transformTexMap(tex, local) : null;
792
801
  if (d.files.has(c.file)) {
793
802
  if (fileKind(d, c.file) === "model") {
794
- sub(d, c.file, mm, col, sp, lt);
803
+ sub(d, c.file, mm, col, sp, lt, cd);
795
804
  continue;
796
805
  }
797
- emit(c.file, col, mm, sp, s, true, lt);
806
+ emit(c.file, col, mm, sp, s, true, lt, cd);
798
807
  continue;
799
808
  }
800
809
  const ext = opts.resolveModel?.(c.file);
801
810
  if (ext) {
802
- sub(ext, c.file, mm, col, sp, lt);
811
+ sub(ext, c.file, mm, col, sp, lt, cd);
803
812
  continue;
804
813
  }
805
- emit(c.file, col, mm, sp, s, false, lt);
814
+ emit(c.file, col, mm, sp, s, false, lt, cd);
806
815
  }
807
816
  flushLoose(Infinity);
808
817
  if (groups) {
@@ -1038,7 +1047,31 @@ function parseLDConfig(text) {
1038
1047
  }
1039
1048
  return out;
1040
1049
  }
1041
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/instructions.ts
1050
+ var LDRAW_EXE_16 = [
1051
+ [51, 51, 51],
1052
+ [0, 51, 178],
1053
+ [0, 127, 51],
1054
+ [0, 181, 166],
1055
+ [204, 0, 0],
1056
+ [255, 51, 153],
1057
+ [102, 51, 0],
1058
+ [153, 153, 153],
1059
+ [102, 102, 88],
1060
+ [0, 128, 255],
1061
+ [51, 255, 102],
1062
+ [171, 253, 249],
1063
+ [255, 0, 0],
1064
+ [255, 176, 204],
1065
+ [255, 229, 0],
1066
+ [255, 255, 255]
1067
+ ];
1068
+ function blendedColourHex(code) {
1069
+ if (!Number.isInteger(code) || code < 256 || code > 511)
1070
+ return null;
1071
+ const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
1072
+ return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
1073
+ }
1074
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/instructions.ts
1042
1075
  var MIN_VIS = 0.5;
1043
1076
  var REORIENT = 0.35;
1044
1077
  var deg = Math.PI / 180;
@@ -1406,10 +1439,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1406
1439
  }
1407
1440
  };
1408
1441
  }
1409
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/render.ts
1442
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/render.ts
1410
1443
  import * as THREE from "three";
1411
1444
 
1412
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/pack-io.ts
1445
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/pack-io.ts
1413
1446
  import { decompress } from "fzstd";
1414
1447
  async function decompressPack(data) {
1415
1448
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1432,7 +1465,7 @@ function decodePack(buf) {
1432
1465
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1433
1466
  }
1434
1467
 
1435
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/cull.ts
1468
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/cull.ts
1436
1469
  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;
1437
1470
  var prepCache = new WeakMap;
1438
1471
  function prepPart(H, part) {
@@ -1738,18 +1771,36 @@ function cullCore(insts, H, steps) {
1738
1771
  }
1739
1772
  function sceneInstances(instances, H, useTex) {
1740
1773
  const pick = (i) => useTex && i.texPart && H.parts[i.texPart] ? i.texPart : i.part;
1741
- const all = instances.map((i) => ({ part: pick(i), color: String(i.color), m: i.m, steps: i.steps }));
1774
+ const localColours = new Map;
1775
+ const same = new Map;
1776
+ const keyOf = (i) => {
1777
+ const c = i.colour;
1778
+ if (!c)
1779
+ return String(i.color);
1780
+ let k = same.get(c);
1781
+ if (k !== undefined)
1782
+ return k;
1783
+ const g = H.colorTable?.[i.color], gHex = g?.hex ?? H.colors?.[i.color];
1784
+ const gKey = g ? colourMaterialKey({ alpha: g.alpha ?? 255, luminance: g.luminance ?? 0, finish: g.finish ?? { type: "default" } }) : "default:op";
1785
+ const lKey = colourMaterialKey(c);
1786
+ k = gHex && gHex.toUpperCase() === c.hex.toUpperCase() && gKey === lKey ? String(i.color) : c.hex.toUpperCase() + "/" + lKey;
1787
+ if (k !== String(i.color))
1788
+ localColours.set(k, c);
1789
+ same.set(c, k);
1790
+ return k;
1791
+ };
1792
+ const all = instances.map((i) => ({ part: pick(i), color: keyOf(i), m: i.m, steps: i.steps }));
1742
1793
  const keys = all.map((i) => stepKey(i.steps));
1743
1794
  const uniq = [...new Set(keys)].sort();
1744
1795
  const rank = new Map(uniq.map((k, j) => [k, j]));
1745
- return { all, stepOf: keys.map((k) => rank.get(k)), nSteps: uniq.length };
1796
+ return { all, stepOf: keys.map((k) => rank.get(k)), nSteps: uniq.length, localColours };
1746
1797
  }
1747
1798
  function precomputeCull(instances, H, useTex = true) {
1748
1799
  const s = sceneInstances(instances, H, useTex);
1749
1800
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
1750
1801
  }
1751
1802
 
1752
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/render.ts
1803
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/render.ts
1753
1804
  async function loadPack(url) {
1754
1805
  const res = await fetch(url);
1755
1806
  if (!res.ok)
@@ -2276,6 +2327,68 @@ function gridClusters(n, x, z, k) {
2276
2327
  }
2277
2328
  return out;
2278
2329
  }
2330
+ function* gridClustersGen(n, x, z, k) {
2331
+ const CH = 65536;
2332
+ if (n <= CH || n <= k || !isFinite(k))
2333
+ return gridClusters(n, x, z, k);
2334
+ const bb = [Infinity, -Infinity, Infinity, -Infinity];
2335
+ for (let i0 = 0;i0 < n; i0 += CH) {
2336
+ gcBounds(bb, x, z, i0, Math.min(n, i0 + CH));
2337
+ yield;
2338
+ }
2339
+ const [x0, x1, z0, z1] = bb;
2340
+ const G = Math.max(1, Math.ceil(Math.sqrt(n / k)));
2341
+ const sx = (x1 - x0) / G || 1, sz = (z1 - z0) / G || 1;
2342
+ const cell = new Int32Array(n), cnt = new Int32Array(G * G);
2343
+ for (let i0 = 0;i0 < n; i0 += CH) {
2344
+ gcCells(cell, cnt, x, z, i0, Math.min(n, i0 + CH), x0, z0, sx, sz, G);
2345
+ yield;
2346
+ }
2347
+ const out = [];
2348
+ const at = new Int32Array(G * G).fill(-1);
2349
+ const fill = new Int32Array(G * G);
2350
+ for (let c = 0;c < G * G; c++)
2351
+ if (cnt[c]) {
2352
+ at[c] = out.length;
2353
+ out.push(new Int32Array(cnt[c]));
2354
+ }
2355
+ for (let i0 = 0;i0 < n; i0 += CH) {
2356
+ gcFill(out, at, fill, cell, i0, Math.min(n, i0 + CH));
2357
+ yield;
2358
+ }
2359
+ return out;
2360
+ }
2361
+ function gcBounds(bb, x, z, i0, i1) {
2362
+ let x0 = bb[0], x1 = bb[1], z0 = bb[2], z1 = bb[3];
2363
+ for (let i = i0;i < i1; i++) {
2364
+ const a = x(i), b = z(i);
2365
+ if (a < x0)
2366
+ x0 = a;
2367
+ if (a > x1)
2368
+ x1 = a;
2369
+ if (b < z0)
2370
+ z0 = b;
2371
+ if (b > z1)
2372
+ z1 = b;
2373
+ }
2374
+ bb[0] = x0;
2375
+ bb[1] = x1;
2376
+ bb[2] = z0;
2377
+ bb[3] = z1;
2378
+ }
2379
+ function gcCells(cell, cnt, x, z, i0, i1, x0, z0, sx, sz, G) {
2380
+ for (let i = i0;i < i1; i++) {
2381
+ const c = Math.min(G - 1, Math.floor((x(i) - x0) / sx)) * G + Math.min(G - 1, Math.floor((z(i) - z0) / sz));
2382
+ cell[i] = c;
2383
+ cnt[c]++;
2384
+ }
2385
+ }
2386
+ function gcFill(out, at, fill, cell, i0, i1) {
2387
+ for (let i = i0;i < i1; i++) {
2388
+ const c = cell[i];
2389
+ out[at[c]][fill[c]++] = i;
2390
+ }
2391
+ }
2279
2392
  var _studDisc = null;
2280
2393
  function studDiscGeom() {
2281
2394
  if (_studDisc)
@@ -2474,12 +2587,9 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
2474
2587
  }
2475
2588
  const studCl = new Int32Array(cull.nStuds), studSlot = new Int32Array(cull.nStuds);
2476
2589
  const sMesh = [];
2477
- bKind.forEach((kind, b) => {
2478
- const g = geom(H.studKinds[kind].body, arr);
2479
- const ids = bIds[b];
2480
- const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
2481
- const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
2482
- for (const c of gridClusters(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud)) {
2590
+ const allocClusters = (b, kind, g, ids, cs, c0, c1) => {
2591
+ for (let q = c0;q < c1; q++) {
2592
+ const c = cs[q];
2483
2593
  const ci = sMesh.length;
2484
2594
  let v = 0;
2485
2595
  for (const i of c)
@@ -2500,7 +2610,22 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
2500
2610
  const n = c.length;
2501
2611
  sMesh.push({ im, kind, vis: v, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
2502
2612
  }
2503
- });
2613
+ };
2614
+ for (let b = 0;b < bKind.length; b++) {
2615
+ if (b)
2616
+ yield;
2617
+ const kind = bKind[b];
2618
+ const g = geom(H.studKinds[kind].body, arr);
2619
+ const ids = bIds[b];
2620
+ const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
2621
+ const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
2622
+ const clusters = yield* gridClustersGen(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud);
2623
+ for (let c0 = 0;c0 < clusters.length; c0 += 4) {
2624
+ if (c0)
2625
+ yield;
2626
+ allocClusters(b, kind, g, ids, clusters, c0, Math.min(clusters.length, c0 + 4));
2627
+ }
2628
+ }
2504
2629
  const colCache = new Map;
2505
2630
  const colorOf = (c) => {
2506
2631
  let x = colCache.get(c);
@@ -2602,6 +2727,9 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2602
2727
  const colorTable = H.colorTable ?? {};
2603
2728
  const defaultLC = { code: -1, name: "", hex: "#A0A5A9", edge: "#333333", alpha: 255, luminance: 0, finish: { type: "default" } };
2604
2729
  const lookupLC = (code) => {
2730
+ const loc = P.localColours?.get(code);
2731
+ if (loc)
2732
+ return loc;
2605
2733
  const e = colorTable[code] ?? colorTable[String(+code)];
2606
2734
  if (e && typeof e === "object" && e.hex) {
2607
2735
  return { code: +code || -1, name: e.name ?? "", hex: e.hex, edge: e.edge ?? "#333333", alpha: e.alpha ?? 255, luminance: e.luminance ?? 0, finish: e.finish ?? { type: "default" } };
@@ -2611,6 +2739,9 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2611
2739
  const hex = "#" + (n & 16777215).toString(16).padStart(6, "0").toUpperCase();
2612
2740
  return { code: n, name: "Direct", hex, edge: hex, alpha: 255, luminance: 0, finish: { type: "default" } };
2613
2741
  }
2742
+ const bl = blendedColourHex(n);
2743
+ if (bl)
2744
+ return { code: n, name: "Blended", hex: bl, edge: "#333333", alpha: 255, luminance: 0, finish: { type: "default" } };
2614
2745
  return defaultLC;
2615
2746
  };
2616
2747
  const matCache = new Map;
@@ -2633,21 +2764,29 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2633
2764
  return m;
2634
2765
  };
2635
2766
  const byPart = new Map;
2636
- insts.forEach((it, i) => {
2637
- const p = H.parts[it.part];
2638
- if (!p)
2639
- return;
2640
- const mirror = det12(it.m) < 0;
2641
- const mat = materialFor(String(it.color), mirror, !!p.uncert);
2642
- const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
2643
- let b = byPart.get(k);
2644
- if (!b) {
2645
- if (p.uncert)
2646
- nUncert++;
2647
- byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
2767
+ const bucketRange = (i0, i1) => {
2768
+ for (let i = i0;i < i1; i++) {
2769
+ const it = insts[i];
2770
+ const p = H.parts[it.part];
2771
+ if (!p)
2772
+ continue;
2773
+ const mirror = det12(it.m) < 0;
2774
+ const mat = materialFor(String(it.color), mirror, !!p.uncert);
2775
+ const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
2776
+ let b = byPart.get(k);
2777
+ if (!b) {
2778
+ if (p.uncert)
2779
+ nUncert++;
2780
+ byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
2781
+ }
2782
+ b.ids.push(i);
2648
2783
  }
2649
- b.ids.push(i);
2650
- });
2784
+ };
2785
+ for (let i0 = 0;i0 < insts.length; i0 += 8192) {
2786
+ if (i0)
2787
+ yield root;
2788
+ bucketRange(i0, Math.min(insts.length, i0 + 8192));
2789
+ }
2651
2790
  yield root;
2652
2791
  const steps = P.steps;
2653
2792
  let cull = P.cull ?? cullCore(insts, H, steps);
@@ -2928,7 +3067,10 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2928
3067
  if (!entries.length)
2929
3068
  continue;
2930
3069
  const groups = gridClusters(entries.length, (i) => insts[entries[i].id].m[0], (i) => insts[entries[i].id].m[2], LOD ? 256 : Infinity);
3070
+ let _coopG = 0;
2931
3071
  for (const g of groups) {
3072
+ if (_coopG++)
3073
+ yield root;
2932
3074
  const members = Array.from(g, (i) => entries[i]);
2933
3075
  const partSet = new Map;
2934
3076
  for (const m of members)
@@ -3012,6 +3154,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3012
3154
  if (pp.edges)
3013
3155
  addLines(pp.edges, ghost, cl);
3014
3156
  addCond(pp, ghost, cl);
3157
+ yield root;
3015
3158
  if (steps)
3016
3159
  stepBatches.push({ im: ghost, objs: [ghost, ...cl.lines.slice(nL), ...cl.cond.slice(nC)], own: Int32Array.from(ids, (id) => steps[id]), hide: null, flag: "body", inst: Int32Array.from(ids), stud: null, col: Uint16Array.from(ids, (id) => instCol[id]) });
3017
3160
  }
@@ -3023,6 +3166,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3023
3166
  const uEntries = withUnder.map((m) => m.id);
3024
3167
  const uGroups = LOD && P.lodUnder !== false ? undersideGroups(uEntries, insts) : [{ ids: uEntries, ax: null }];
3025
3168
  for (const { ids: uids, ax } of uGroups) {
3169
+ yield root;
3026
3170
  const byId = new Map(members.map((m) => [m.id, m]));
3027
3171
  const umembers = uids.map((id) => {
3028
3172
  const m = byId.get(id);
@@ -3125,6 +3269,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3125
3269
  };
3126
3270
  setN(P.cullUnder ? vis : ord.length);
3127
3271
  underGhostCounts.push({ set: setN, all: ord.length, vis });
3272
+ yield root;
3128
3273
  if (steps)
3129
3274
  stepBatches.push({ im: ghost, objs: [ghost, ...lineObjs], own: Int32Array.from(ord, (id) => steps[id]), hide: Int32Array.from(ord, (id) => cull.underHideStep[id]), flag: "under", inst: Int32Array.from(ord), stud: null, col: Uint16Array.from(ord, (id) => instCol[id]) });
3130
3275
  }
@@ -3463,7 +3608,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3463
3608
  await new Promise((r) => setTimeout(r, 0));
3464
3609
  }
3465
3610
  }
3466
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/scene.ts
3611
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/scene.ts
3467
3612
  import * as THREE2 from "three";
3468
3613
  function colorFn(src, pack, fallback) {
3469
3614
  const table = new Map;
@@ -3490,8 +3635,17 @@ function colorFn(src, pack, fallback) {
3490
3635
  }
3491
3636
  var direct = (c) => {
3492
3637
  const n = +c;
3493
- return n > 16777215 && n >>> 24 === 2 ? new THREE2.Color(n & 16777215) : null;
3638
+ if (n > 16777215 && n >>> 24 === 2)
3639
+ return new THREE2.Color(n & 16777215);
3640
+ const b = blendedColourHex(n);
3641
+ return b ? new THREE2.Color(b) : null;
3494
3642
  };
3643
+ function withLocalColours(base, local) {
3644
+ if (!local.size)
3645
+ return base;
3646
+ const own = new Map([...local].map(([k, v]) => [k, new THREE2.Color(v.hex)]));
3647
+ return (c) => own.get(c) ?? base(c);
3648
+ }
3495
3649
  var plasticCache = new WeakMap;
3496
3650
  function toPlastic(old) {
3497
3651
  const fin = old.userData?.ldrFinish;
@@ -3530,10 +3684,10 @@ async function createLdrObjectAsync(instances, pack, options = {}) {
3530
3684
  }
3531
3685
  function createLdrObjectInner(instances, pack, options, progressive) {
3532
3686
  const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
3533
- const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
3534
3687
  const useTex = o.textures !== false;
3535
- const { all, stepOf, nSteps } = sceneInstances(instances, pack.header, useTex);
3688
+ const { all, stepOf, nSteps, localColours } = sceneInstances(instances, pack.header, useTex);
3536
3689
  const uniq = { length: nSteps };
3690
+ const color = withLocalColours(colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169)), localColours);
3537
3691
  const stepViews = new Array(uniq.length).fill(null);
3538
3692
  instances.forEach((i, k) => {
3539
3693
  if (i.view)
@@ -3571,7 +3725,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
3571
3725
  };
3572
3726
  const multiStep = uniq.length > 1;
3573
3727
  const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
3574
- const sceneOpts = () => ({ cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
3728
+ const sceneOpts = () => ({ localColours: localColours.size ? localColours : undefined, cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
3575
3729
  const applyBuilt = (built, t0) => {
3576
3730
  cur = built;
3577
3731
  pairs.clear();
@@ -3681,10 +3835,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
3681
3835
  return finish();
3682
3836
  })();
3683
3837
  }
3684
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/parts-cdn.ts
3838
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/parts-cdn.ts
3685
3839
  import { decompress as decompress2 } from "fzstd";
3686
3840
 
3687
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/embedded.ts
3841
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/embedded.ts
3688
3842
  function splitFiles(text, fallback) {
3689
3843
  const files = new Map;
3690
3844
  let cur = null, saw = false;
@@ -3756,7 +3910,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
3756
3910
  return out;
3757
3911
  }
3758
3912
 
3759
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/parts-cdn.ts
3913
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/parts-cdn.ts
3760
3914
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
3761
3915
  var indexCache = new Map;
3762
3916
  var shardCache = new Map;
@@ -3988,10 +4142,10 @@ async function prepareModel(source, o = {}) {
3988
4142
  return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
3989
4143
  }
3990
4144
 
3991
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/load-worker.gen.ts
3992
- var load_worker_gen_default = 'var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=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},ce=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},xt=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 wt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=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,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,f=je(e,a,c);a+=c;var m=l?1<<l:s,g=je(e,a,m)+(l==1&&256),y=g;if(!s){var v=1<<10+(e[5]>>3);y=v+(v>>3)*(e[5]&7)}if(y>2145386496)K(1);var x=new W((t==1?g||y:t?0:y)+12);return x[0]=1,x[4]=4,x[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:x.subarray(12),e:y,o:new be(x.buffer,0,3),u:g,c:o,m:Math.min(131072,y)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,f=o,m=new bt(512+(o<<2)),g=new yt(m,0,256),y=new de(m,0,256),v=new de(m,512,o),x=512+(o<<1),S=new W(m,x,o),h=new W(m,x+o);while(l<255&&i>0){var u=re(i+1),d=r>>3,p=(1<<u+1)-1,L=(e[d]|e[d+1]<<8|e[d+2]<<16)>>(r&7)&p,b=(1<<u)-1,T=p-i-1,E=L&b;if(E<T)r+=u,L=E;else if(r+=u+1,L>b)L-=T;if(g[++l]=--L,L==-1)i+=L,S[--f]=l;else i-=L;if(!L)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=g[H];if(M<1){y[H]=-M;continue}for(c=0;c<M;++c){S[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=y[S[c]]++,k=h[c]=s-re(A);v[c]=(A<<k)-o}return[r+7>>3,{b:s,s:S,n:h,t:v}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var g=f<<3,y=e[t];if(!y)K(0);var v=0,x=0,S=m.b,h=S,u=(++t<<3)-8+re(y);for(;;){if(u-=S,u<g)break;var d=u>>3;if(v+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<S)-1,i[++r]=m.s[v],u-=h,u<g)break;d=u>>3,x+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<h)-1,i[++r]=m.s[x],S=m.n[v],v=m.t[v],h=m.n[x],x=m.t[x]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var L=0;for(n=0;n<r;++n){var b=i[n];if(b>11)K(0);L+=b&&1<<b-1}var T=re(L)+1,E=1<<T,D=E-L;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var b=i[n];++l[i[n]=b&&T+1-b]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[T]=0;for(n=T;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<T-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<T-M))}}return[t,{n:X,b:T,s:U}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(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],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var g=f>>3,y=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(f&7);a=(a<<c|y)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),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+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,g=c>>4,y=0,v=0;if(f<2)if(m&1)g|=e[++s]<<4|(m&2&&e[++s]<<12);else g=c>>3;else if(v=m,m<2)g|=(e[++s]&63)<<4,y=e[s]>>6|e[++s]<<2;else if(m==2)g|=e[++s]<<4|(e[++s]&3)<<12,y=e[s]>>2|e[++s]<<6;else g|=e[++s]<<4|(e[++s]&63)<<12,y=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var x=n?n.subarray(t.y,t.y+t.m):new W(t.m),S=x.length-g;if(f==0)x.set(e.subarray(s,s+=g),S);else if(f==1)ce(x,e[s++],S);else{var h=t.h;if(f==2){var u=vt(e,s);y+=s-(s=u[0]),t.h=h=u[1]}else if(!h)K(0);(v?Lt:le)(e.subarray(s,s+=y),x.subarray(S),h)}var d=e[s++];if(d){if(d==255)d=(e[s++]|e[s++]<<8)+32512;else if(d>127)d=d-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var L=[Ct,Et,Tt];for(var b=2;b>-1;--b){var T=p>>(b<<1)+2&3;if(T==1){var E=new W([0,0,e[s++]]);L[b]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(T==2)r=ue(e,s,9-(b&1)),s=r[0],L[b]=r[1];else if(T==3){if(!t.t)K(0);L[b]=t.t[b]}}var D=t.t=L,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,k=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var B=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++d;--d;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[B],z=U.n[B];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,B=U.t[B]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var b=0;b<_;++b)x[k+b]=x[S+b];k+=_,S+=_;var q=k-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var b=0;b<J;++b)x[k+b]=t.w[ee+b];k+=J,G-=J,q=0}for(var b=0;b<G;++b)x[k+b]=x[q+b];k+=G}if(k!=S)while(S<x.length)x[k++]=x[S++];else k=x.length;if(n)t.y+=k;else x=Ee(x,0,k)}else if(n){if(t.y+=g,S)for(var b=0;b<g;++b)x[b]=x[S+b]}else if(S)x=Ee(x,S);return t.b=a,x}K(2)},Bt=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 ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(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 l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Bt(n,o)}async function It(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(ye(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 He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(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 Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(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 zt(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(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=a.findIndex((m,g)=>g>0&&m.toUpperCase()==="GLOSSMAP");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),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 Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Le(o),m:i,file:Z(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Z(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],f=null,m=()=>{if(!a)return;let u=Ot(a.chunks.join("")),d=u[0]===137&&u[1]===80&&u[2]===78&&u[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:u,...d?{mime:"image/png"}:{}}),a=null},g=!0,y=(u)=>{if(m(),o={name:Z(u),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,g=!0},v=!1,x=!1,S=()=>{if(x)return;x=!0,s.clear(),o=null,i=""},h=(u,d)=>{if(f){u.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!d)u.fallback=!0}else u.tex=p.map};for(let u of e.split(`\n`)){let d=u.trim();if(!d)continue;if(r&&d.charCodeAt(0)>=50&&d.charCodeAt(0)<=53&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){if(a||v)continue;if(!o)y(t);let T=d.slice(2).trimStart(),E=T.search(/\\s/),D={t:d.charCodeAt(0)-48,color:Le(E<0?T:T.slice(0,E)),p:[],src:d};h(D,!1),o.cmds.push(D),g=!1;continue}if(d.charCodeAt(0)===48&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){let T=2;while(d.charCodeAt(T)===32||d.charCodeAt(T)===9)T++;let E=T;while(E<d.length&&d.charCodeAt(E)!==32&&d.charCodeAt(E)!==9)E++;let D=d.slice(T,E);if(!Ft.has(D)){if(v||a)continue;if(!o)y(t);let C=d.slice(T),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,g&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(d.charCodeAt(0)===49&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)&&!a&&!v){let T=Nt(d);if(T){if(!o)y(t);h(T,!1),o.cmds.push(T),g=!1;continue}}let p=d.split(/\\s+/);if(+p[0]===0){let T=d.slice(1).trim();if(p[1]==="FILE"){S(),v=!1,y(T.slice(5));continue}if(p[1]==="NOFILE"){m(),o=null,v=!0;continue}if(p[1]==="!DATA"){S(),m(),o=null,v=!1,a={name:T.slice(5).trim(),chunks:[]};continue}if(v)continue;if(a){if(p[1]==="!:")a.chunks.push(p.slice(2).join(""));continue}if(!o)y(t);let E={t:0,text:T};if(p[1]==="STEP")E.step=!0,c=[],f=null;else if(p[1]==="BFC")E.bfc=p.slice(2).join(" ");else if(p[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],f=null,(p[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(p[5]??"REL").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(p[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(p[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:p[3]??"A"}}else if(p[1]?.startsWith("!"))E.meta=p[1];if(g&&!o.org){let C=We(T);if(C)o.org=C}if(p[1]==="!TEXMAP"){let C=(p[2]??"").toUpperCase();if(f=null,C==="START"||C==="NEXT"){let U=zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else f=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(p[1]==="!:"){f=null;let C=Ke(p.slice(2));if(C)h(C,!0),E.geom=C}else f=null;let D=T.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||v)continue;if(!o)y(t);let b=Ke(p);if(!b)continue;h(b,!1),o.cmds.push(b),g=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(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 nt(e,t){let[n,r,s,o,i,l,a,c,f,m,g,y]=e,[v,x,S,h,u,d,p,L,b,T,E,D]=t;return[o*v+i*x+l*S+n,a*v+c*x+f*S+r,m*v+g*x+y*S+s,o*h+i*p+l*T,o*u+i*L+l*E,o*d+i*b+l*D,a*h+c*p+f*T,a*u+c*L+f*E,a*d+c*b+f*D,m*h+g*p+y*T,m*u+g*L+y*E,m*d+g*b+y*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.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&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.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 Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(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){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:Ie(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(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 ot(e){let[t,n,r,s,o,i,l,a,c,f,m,g]=e,y=a*g-c*m,v=-(l*g-c*f),x=l*m-a*f,S=s*y+o*v+i*x;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,u=[y*h,-(o*g-i*m)*h,(o*c-i*a)*h,v*h,(s*g-i*f)*h,-(s*c-i*l)*h,x*h,-(s*m-o*f)*h,(s*a-o*l)*h];return[-(u[0]*t+u[1]*n+u[2]*r),-(u[3]*t+u[4]*n+u[5]*r),-(u[6]*t+u[7]*n+u[8]*r),...u]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(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 Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.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=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,g)=>{let y=m.name+"#"+g,v=l.get(y);if(!v){let x;v=Object.assign(()=>x??=st(m,g),{file:m,step:g}),l.set(y,v)}return v},f=(m,g,y,v,x,S,h,u,d=null,p=[],L=[])=>{let b=m.files.get(g);if(!b||h>r)return;let T=0,E=h>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...L,y]:L,U=i&&!d?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==T)X=T,H=0;let j=U?.get(T+"|"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,x+"/"+w,[...R,lt],h+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,x+"/"+w,I,h+1,z,d,D,C),U?.set(T+"|"+w,{n:1,from:G,to:n.length})},A=at(b),k=s?rt(b):[],V=0,B=(P,w,O,F,R,z,j)=>{if(d)F=d;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:x};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<k.length&&k[V]<=P){let w=k[V++];B(Ie(b.name,w),v,y,[...S,w],w,!1,null).source=c(b,w)}};for(let P of b.cmds){if(P.t===0&&P.step){T++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(T);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?v:w.color,F=nt(y,w.m),R=[...S,T],z=o?w.tex??u:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)==="model"){M(m,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Z(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Z(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Z(t.slice(14).join(" ")):null};function Yt(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 ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(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,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((g,y)=>{l.push(g[0]),a.push(g[1]);for(let v=0;v<12;v++)i[y*12+v]=g[2+v]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let g=s.mask[2];c=new Uint8Array(g.length);for(let y=0;y<g.length;y++)c[y]=g.charCodeAt(y)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],g=new Re(e.length*2),y=[],v=[];for(let M=0;M<e.length;M++){let A=e[M],k=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(k))continue;let B=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?B[3]:B[0],G=j?B[5]:B[2],_=k[0]+k[3]*I+k[5]*G,Y=k[2]+k[9]*I+k[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(B[0]),m.push(B[2]);let R=Math.round((k[1]+B[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=v.length;v.push(F),y.push(g.put(R,z,j,I))}}let x=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,u=NaN,d=NaN,p=-1,L=(M,A,k,V)=>{let B=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(k/40);if(!we(B,N,P))return fe;let w=fe;if(B!==h||N!==u||P!==d)h=B,u=N,d=P,p=g.get(B,N,P);for(let O=p;O>=0;O=y[O]){let F=v[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&k-6>=i[F]-0.5&&k+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=k-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+x[Q]-j)/20),ne=Math.floor((J+S[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<w)w=Q}}return w},b=0;for(let M of e){let A=Fe(t,M.part);if(A)b+=A.nStuds}let T=new Uint8Array(b),E=new Uint8Array(b),D=new Re(b),C=0,U=n?new Int32Array(b).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let k=e[M],V=Fe(t,k.part);if(!V)continue;let B=k.m,N=V.studM,P=B[0],w=B[1],O=B[2],F=B[3],R=B[4],z=B[5],j=B[6],I=B[7],G=B[8],_=B[9],Y=B[10],q=B[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=L(De,Ue,ze,M);if(Oe!==fe){if(T[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],k=t.parts[A.part];if(!k||!k.under||!pt(A.m))continue;let V=k.bbox,B=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!B||!N||B*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<B&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:b,studHidden:T,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.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(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(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"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let g of e){let y=g.buffer;if(!y)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let v=new DataView(y).getUint32(0,!0),x=new Uint8Array(y,4+v),S=r;n.push(x),r+=x.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[u,d]of Object.entries(g.header.parts??{}))if(!(u in s))s[u]=Te(d,S);for(let[u,d]of Object.entries(g.header.studKinds??{}))if(!(u in o))o[u]=Te(d,S)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let g of n)f.set(g,m),m+=g.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let h of i){if(Me.has(n+h))continue;let u=o.parts[h];if(u)a.push({name:h,off:u[0],len:u[1],file:u[2]??0});else l.push(h)}a.sort((h,u)=>h.file-u.file||h.off-u.off);let c=[];for(let h of a){let u=c[c.length-1];if(u&&u.file===h.file&&h.off-u.end<=s)u.end=Math.max(u.end,h.off+h.len),u.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,m=0,g=0,y=new Map,v=async()=>{while(g<c.length){let h=c[g++],u=y.get(h.file);if(u)u=u.subarray(h.start,h.end);else{let d=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!d.ok)throw Error(`ldr: parts CDN ${d.status}`);if(m++,u=new Uint8Array(await d.arrayBuffer()),f+=u.byteLength,d.status===200)y.set(h.file,u),u=u.subarray(h.start,h.end)}for(let d of h.items){let p=ye(u.subarray(d.off-h.start,d.off-h.start+d.len)),L=p.buffer.slice(p.byteOffset,p.byteOffset+p.byteLength);Me.set(n+d.name,xe(L))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},v));let x=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:m,bytes:f}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors: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 rn(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 sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe 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 dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,L)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&L>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:g,missing:y,requests:v,bytes:x}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),S=new Map([...f].map(([p,L])=>[L,p])),h=y.map((p)=>S.get(p)??p);for(let[p,L]of f){let b=g.header.parts[L];if(b)g.header.parts[p]=b}let u=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=g.buffer?.byteLength??g.bytes??0,L=rn(a,g);if(m(L,p))throw new pe({bodyTris:L,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let d=t.cull?Ae(a,g.header,t.textures!==!1):void 0;return{insts:a,pack:g,missing:h,requests:v,bytes:x,cull:d,timings:{fetchModel:i-n,parse:c-i,parts:u-c,...d?{cull:performance.now()-u}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||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';
4145
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/load-worker.gen.ts
4146
+ var load_worker_gen_default = 'var wt=ArrayBuffer,Z=Uint8Array,de=Uint16Array,At=Int16Array;var be=Int32Array,Le=function(e,t,n){if(Z.prototype.slice)return Z.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 Z(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(Z.prototype.fill)return Z.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},Mt=function(e,t,n,r){if(Z.prototype.copyWithin)return Z.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 vt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],J=function(e,t,n){var r=Error(t||vt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,J);if(!n)throw r;return r},He=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Ct=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Tt=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,a=r>>6;if(r&8)J(0);var u=6-s,c=i==3?4:i,f=He(e,u,c);u+=c;var l=a?1<<a:s,p=He(e,u,l)+(a==1&&256),d=p;if(!s){var w=1<<10+(e[5]>>3);d=w+(w>>3)*(e[5]&7)}if(d>2145386496)J(1);var y=new Z((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+l,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new be(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Ct(e,4)+8;J(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)J(3);var o=1<<s,i=o,a=-1,u=-1,c=-1,f=o,l=new wt(512+(o<<2)),p=new At(l,0,256),d=new de(l,0,256),w=new de(l,512,o),y=512+(o<<1),L=new Z(l,y,o),g=new Z(l,y+o);while(a<255&&i>0){var m=re(i+1),b=r>>3,h=(1<<m+1)-1,P=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&h,A=(1<<m)-1,S=h-i-1,T=P&A;if(T<S)r+=m,P=T;else if(r+=m+1,P>A)P-=S;if(p[++a]=--P,P==-1)i+=P,L[--f]=a;else i-=P;if(!P)do{var B=r>>3;u=(e[B]|e[B+1]<<8)>>(r&7)&3,r+=2,a+=u}while(u==3)}if(a>255||i)J(0);var v=0,F=(o>>1)+(o>>3)+3,Y=o-1;for(var H=0;H<=a;++H){var C=p[H];if(C<1){d[H]=-C;continue}for(c=0;c<C;++c){L[v]=H;do v=v+F&Y;while(v>=f)}}if(v)J(0);for(c=0;c<o;++c){var M=d[L[c]]++,k=g[c]=s-re(M);w[c]=(M<<k)-o}return[r+7>>3,{b:s,s:L,n:g,t:w}]},Lt=function(e,t){var n=0,r=-1,s=new Z(292),o=e[t],i=s.subarray(0,256),a=s.subarray(256,268),u=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],l=c[1];t+=o;var p=f<<3,d=e[t];if(!d)J(0);var w=0,y=0,L=l.b,g=L,m=(++t<<3)-8+re(d);for(;;){if(m-=L,m<p)break;var b=m>>3;if(w+=(e[b]|e[b+1]<<8)>>(m&7)&(1<<L)-1,i[++r]=l.s[w],m-=g,m<p)break;b=m>>3,y+=(e[b]|e[b+1]<<8)>>(m&7)&(1<<g)-1,i[++r]=l.s[y],L=l.n[w],w=l.t[w],g=l.n[y],y=l.t[y]}if(++r>255)J(0)}else{r=o-127;for(;n<r;n+=2){var h=e[++t];i[n]=h>>4,i[n+1]=h&15}++t}var P=0;for(n=0;n<r;++n){var A=i[n];if(A>11)J(0);P+=A&&1<<A-1}var S=re(P)+1,T=1<<S,B=T-P;if(B&B-1)J(0);i[r++]=re(B)+1;for(n=0;n<r;++n){var A=i[n];++a[i[n]=A&&S+1-A]}var v=new Z(T<<1),F=v.subarray(0,T),Y=v.subarray(T);u[S]=0;for(n=S;n>0;--n){var H=u[n];ce(Y,n,H,u[n-1]=H+a[n]*(1<<S-n))}if(u[0]!=T)J(0);for(n=0;n<r;++n){var C=i[n];if(C){var M=u[C];ce(F,n,M,u[C]=M+(1<<S-C))}}return[t,{n:Y,b:S,s:F}]},St=ue(new Z([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Et=ue(new Z([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],Pt=ue(new Z([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ge=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new Z(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),kt=Ge(Se,0),Ee=new Z(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),It=Ge(Ee,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,a=-n.b;if(!o)J(0);var u=0,c=n.b,f=(r<<3)-8+re(o)-c,l=-1;for(;f>a&&l<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++l]=n.s[u],f-=c=n.n[u]}if(f!=a||l+1!=s)J(0)},Bt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,a=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,a),n),le(e.subarray(r),t.subarray(a),n)},Ft=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var a=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+a;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=a),n;return ce(new Z(a),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=a,n;return Le(e,s,u)}if(i==2){var c=e[s],f=c&3,l=c>>2&3,p=c>>4,d=0,w=0;if(f<2)if(l&1)p|=e[++s]<<4|(l&2&&e[++s]<<12);else p=c>>3;else if(w=l,l<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(l==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 y=n?n.subarray(t.y,t.y+t.m):new Z(t.m),L=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),L);else if(f==1)ce(y,e[s++],L);else{var g=t.h;if(f==2){var m=Lt(e,s);d+=s-(s=m[0]),t.h=g=m[1]}else if(!g)J(0);(w?Bt:le)(e.subarray(s,s+=d),y.subarray(L),g)}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 h=e[s++];if(h&3)J(0);var P=[Et,Pt,St];for(var A=2;A>-1;--A){var S=h>>(A<<1)+2&3;if(S==1){var T=new Z([0,0,e[s++]]);P[A]={s:T.subarray(2,3),n:T.subarray(0,1),t:new de(T.buffer,0,1),b:0}}else if(S==2)r=ue(e,s,9-(A&1)),s=r[0],P[A]=r[1];else if(S==3){if(!t.t)J(0);P[A]=t.t[A]}}var B=t.t=P,v=B[0],F=B[1],Y=B[2],H=e[u-1];if(!H)J(0);var C=(u<<3)-8+re(H)-Y.b,M=C>>3,k=0,_=(e[M]|e[M+1]<<8)>>(C&7)&(1<<Y.b)-1;M=(C-=F.b)>>3;var I=(e[M]|e[M+1]<<8)>>(C&7)&(1<<F.b)-1;M=(C-=v.b)>>3;var O=(e[M]|e[M+1]<<8)>>(C&7)&(1<<v.b)-1;for(++b;--b;){var j=Y.s[_],X=Y.n[_],W=v.s[O],E=v.n[O],x=F.s[I],R=F.n[I];M=(C-=x)>>3;var D=1<<x,U=D+((e[M]|e[M+1]<<8|e[M+2]<<16|e[M+3]<<24)>>>(C&7)&D-1);M=(C-=Ee[W])>>3;var G=It[W]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(C&7)&(1<<Ee[W])-1);M=(C-=Se[j])>>3;var N=kt[j]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(C&7)&(1<<Se[j])-1);if(M=(C-=X)>>3,_=Y.t[_]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<X)-1),M=(C-=E)>>3,O=v.t[O]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<E)-1),M=(C-=R)>>3,I=F.t[I]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<R)-1),U>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=U-=3;else{var V=U-(N!=0);if(V){if(U=V==3?t.o[0]-1:t.o[V],V>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=U}else U=t.o[0]}for(var A=0;A<N;++A)y[k+A]=y[L+A];k+=N,L+=N;var z=k-U;if(z<0){var K=-z,q=t.e+z;if(K>G)K=G;for(var A=0;A<K;++A)y[k+A]=t.w[q+A];k+=K,G-=K,z=0}for(var A=0;A<G;++A)y[k+A]=y[z+A];k+=G}if(k!=L)while(L<y.length)y[k++]=y[L++];else k=y.length;if(n)t.y+=k;else y=Le(y,0,k)}else if(n){if(t.y+=p,L)for(var A=0;A<p;++A)y[A]=y[L+A]}else if(L)y=Le(y,L);return t.b=u,y}J(2)},Rt=function(e,t){if(e.length==1)return e[0];var n=new Z(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 ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Tt(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 a=Ft(e,i,t);if(!a)J(5);if(t)i.e=i.y;else n.push(a),o+=a.length,Mt(i.w,0,a.length),i.w.set(a,i.w.length-a.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Rt(n,o)}async function Dt(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(ye(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 _e(e){return new TextDecoder().decode(await Dt(e))}var Ke=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(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 Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Pe(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var We=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ut=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),tt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),zt=new Set(["model","submodel","configuration"]),Ot=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Xe(e){let t=Ot.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return tt.has(n)||zt.has(n)?n:void 0}function Nt(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 $t(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(Number.isFinite))return null;let a=n[2].trim();for(let l=0;l<s;l++)a=a.replace(/^\\S+\\s*/,"");let u=Nt(a);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((l,p)=>p>0&&l.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var jt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),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 Vt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let a=e.slice(n),u=/[ \\t]{2,}|\\t/.test(a)?a.split(/\\s+/).join(" "):a;return{t:1,color:Pe(o),m:i,file:Q(u)}}function Ze(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Pe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function nt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",a,u=null,c=[],f=null,l=()=>{if(!u)return;let m=jt(u.chunks.join("")),b=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(a??=new Map).set(Q(u.name),{name:u.name,bytes:m,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(m)=>{if(l(),o={name:Q(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},w=!1,y=!1,L=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},g=(m,b)=>{if(f){m.tex=f,f=null;return}let h=c[c.length-1];if(!h)return;if(h.fallback){if(!b)m.fallback=!0}else m.tex=h.map};for(let m of e.split(`\n`)){let b=m.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||w)continue;if(!o)d(t);let S=b.slice(2).trimStart(),T=S.search(/\\s/),B={t:b.charCodeAt(0)-48,color:Pe(T<0?S:S.slice(0,T)),p:[],src:b};g(B,!1),o.cmds.push(B),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let S=2;while(b.charCodeAt(S)===32||b.charCodeAt(S)===9)S++;let T=S;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let B=b.slice(S,T);if(!Ut.has(B)){if(w||u)continue;if(!o)d(t);let v=b.slice(S),F={t:0,text:v};if(B.charCodeAt(0)===33)F.meta=B;if(f=null,p&&!o.org){let H=Xe(v);if(H)o.org=H}let Y=v.match(We);if(Y&&!o.movedTo){let H=Y[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Q(H)}o.cmds.push(F);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!w){let S=Vt(b);if(S){if(!o)d(t);g(S,!1),o.cmds.push(S),p=!1;continue}}let h=b.split(/\\s+/);if(+h[0]===0){let S=b.slice(1).trim();if(h[1]==="FILE"){L(),w=!1,d(S.slice(5));continue}if(h[1]==="NOFILE"){l(),o=null,w=!0;continue}if(h[1]==="!DATA"){L(),l(),o=null,w=!1,u={name:S.slice(5).trim(),chunks:[]};continue}if(w)continue;if(u){if(h[1]==="!:")u.chunks.push(h.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:S};if(h[1]==="STEP")T.step=!0,c=[],f=null;else if(h[1]==="BFC")T.bfc=h.slice(2).join(" ");else if(h[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(h[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let v=(h[5]??"REL").toUpperCase();T.rotstep={x:+h[2]||0,y:+h[3]||0,z:+h[4]||0,mode:["REL","ABS","ADD"].includes(v)?v:"REL"}}else if(h[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let v=(h[2]??"").toUpperCase();T.bufexchg={op:v==="RETRIEVE"?"RETRIEVE":"STORE",buf:h[3]??"A"}}else if(h[1]?.startsWith("!"))T.meta=h[1];if(p&&!o.org){let v=Xe(S);if(v)o.org=v}if(h[1]==="!TEXMAP"){let v=(h[2]??"").toUpperCase();if(f=null,v==="START"||v==="NEXT"){let F=$t(S.replace(/^!TEXMAP\\s+\\S+/i,""),v==="NEXT");if(T.texmap={op:v,...F?{map:F}:{}},F)if((o.texmaps??=[]).push(F),v==="START")c.push({map:F,fallback:!1});else f=F}else if(v==="FALLBACK"){T.texmap={op:v};let F=c[c.length-1];if(F)F.fallback=!0}else if(v==="END")T.texmap={op:v},c.pop()}else if(h[1]==="!:"){f=null;let v=Ze(h.slice(2));if(v)g(v,!0),T.geom=v}else f=null;let B=S.match(We);if(B&&!o.movedTo){let v=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(v))v+=".dat";o.movedTo=Q(v)}o.cmds.push(T);continue}if(u||w)continue;if(!o)d(t);let A=Ze(h);if(!A)continue;g(A,!1),o.cmds.push(A),p=!1}return l(),a?{main:i,files:s,data:a}:{main:i,files:s}}var gn=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 st(e,t){let[n,r,s,o,i,a,u,c,f,l,p,d]=e,[w,y,L,g,m,b,h,P,A,S,T,B]=t;return[o*w+i*y+a*L+n,u*w+c*y+f*L+r,l*w+p*y+d*L+s,o*g+i*h+a*S,o*m+i*P+a*T,o*b+i*A+a*B,u*g+c*h+f*S,u*m+c*P+f*T,u*b+c*A+f*B,l*g+p*h+d*S,l*m+p*P+d*T,l*b+p*A+d*B]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Ye=new WeakMap,Ht=/^(s|8|48)\\//;function Ie(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=Ye.get(n);if(r)return r;if(n.org)r=tt.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&&Ht.test(s.file))?"part":"model";return Ye.set(n,r),r}var Je=new WeakMap;function ot(e){let t=Je.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 Je.set(e,t),t}var qe=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),Gt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${qe(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${qe(e.color)} ${e.p.join(" ")}`,Be=(e,t)=>`${Q(e)}#${t}`;function _t(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){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:Be(e.name,t),cmds:n}}function it(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,..._t(e,t).cmds.map(Gt)].join(`\n`)+`\n`}function Kt(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 at(e){let[t,n,r,s,o,i,a,u,c,f,l,p]=e,d=u*p-c*l,w=-(a*p-c*f),y=a*l-u*f,L=s*d+o*w+i*y;if(!Number.isFinite(L)||Math.abs(L)<0.000000000001)return null;let g=1/L,m=[d*g,-(o*p-i*l)*g,(o*c-i*u)*g,w*g,(s*p-i*f)*g,-(s*c-i*a)*g,y*g,-(s*l-o*f)*g,(s*u-o*a)*g];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var Wt=(e)=>String(+e.toFixed(6)||0),Qe=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function lt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Wt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Qe(t.texture)}${t.glossmap?" GLOSSMAP "+Qe(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${Kt(r)}`,source:r}}var Xt=(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 Zt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),a=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[a*c,-a*u,i,o*u+s*i*c,o*c-s*i*u,-s*a,s*u-o*i*c,s*c+o*i*u,o*a]}var et=new WeakMap;function ct(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=Zt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Xt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),et.set(e,n),n}var ut=999999,pt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Yt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,a=new Map,u=0,c=(l,p)=>{let d=l.name+"#"+p,w=a.get(d);if(!w){let y;w=Object.assign(()=>y??=it(l,p),{file:l,step:p}),a.set(d,w)}return w},f=(l,p,d,w,y,L,g,m,b=null,h=[],P=[],A=void 0,S=null)=>{let T=l.files.get(p);if(!T||g>r)return;let B=S,v=0,F=g>0?++u:0,Y=i&&F?[...h,F]:h,H=i&&F?[...P,d]:P,C=i&&!b?new Map:null,M=-1,k=0,_=(E,x,R,D,U,G,N)=>{if(M!==v)M=v,k=0;let V=C?.get(v+"|"+x);if(V)return V.n++,f(E,E===l?x:E.main,R,D,y+"/"+x,[...U,ut],g+1,G,[...U,ut],Y,H,N,B);let z=[...U,k++],K=n.length;f(E,E===l?x:E.main,R,D,y+"/"+x,z,g+1,G,b,Y,H,N,B),C?.set(v+"|"+x,{n:1,from:K,to:n.length})},I=ct(T),O=s?ot(T):[],j=0,X=(E,x,R,D,U,G,N,V)=>{if(b)D=b;let z={part:E,color:x,m:R,step:D[0],steps:D,localStep:U,path:y};if(V)z.colour=V;if(F){if(z.sub=F,i)z.subPath=Y,z.subMats=H}if(G)z.embedded=!0;if(N){let q=lt(E,N);z.texPart=q.name,z.texSource=q.source}let K=I[U];if(K)z.view=K;return n.push(z),z},W=(E)=>{while(j<O.length&&O[j]<=E){let x=O[j++];X(Be(T.name,x),w,d,[...L,x],x,!1,null,A).source=c(T,x)}};for(let E of T.cmds){if(E.t===0&&E.step){v++;continue}let x=E;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){W(v);continue}if(x.t===0){if(x.meta==="!COLOUR"){let q=qt(x.text);if(q&&q.code!==16&&q.code!==24)(B=new Map(B??[])).set(q.code,q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let R=x.color===16?w:x.color,D=x.color===16?A:B?.get(x.color),U=st(d,x.m),G=[...L,v],N=o?x.tex??m:null,V=N?at(x.m):null,z=N&&V?rt(N,V):null;if(l.files.has(x.file)){if(Ie(l,x.file)==="model"){_(l,x.file,U,R,G,z,D);continue}X(x.file,R,U,G,v,!0,z,D);continue}let K=t.resolveModel?.(x.file);if(K){_(K,x.file,U,R,G,z,D);continue}X(x.file,R,U,G,v,!1,z,D)}if(W(1/0),C){for(let E of C.values())if(E.n>1)for(let x=E.from;x<E.to;x++)n[x].mult??=E.n}};if(Ie(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function mt(e,t="main.ldr",n){return Yt(nt(e,t,{geometryText:!0}),n)}var Jt=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Fe(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 ft(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=Fe(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 qt(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=-1,o="#FF00FF",i="#333333",a=255,u=0,c={type:"default"},f=1;while(f<n.length){let l=n[f].toUpperCase(),p=n[f+1];if(l==="CODE")s=+p,f+=2;else if(l==="VALUE"){let d=Fe(p);if(d)o=d;f+=2}else if(l==="EDGE")i=Fe(p)??p,f+=2;else if(l==="ALPHA")a=+p,f+=2;else if(l==="LUMINANCE")u=+p,f+=2;else if(l==="CHROME")c={type:"chrome"},f+=1;else if(l==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(l==="RUBBER")c={type:"rubber"},f+=1;else if(l==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(l==="METAL")c={type:"metal"},f+=1;else if(l==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:w,next:y}=ft(n,f+2);c={type:"glitter",material:w},f=y}else if(d==="SPECKLE"){let{grain:w,next:y}=ft(n,f+2);c={type:"speckle",material:w},f=y}else if(d==="FABRIC"){let w=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(w)?w.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(Jt.has(l))f+=1;else f+=1}if(s<0||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(a)?a:255,luminance:Number.isFinite(u)?u:0,finish:c}}function Qt(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,a=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:a,finish:"glitter"}}case"speckle":{let i=e.finish.material,a=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:a,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 Re(e){let t=Qt(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 en(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Q(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Q(t),r)}let a=o.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var tn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function nn(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 ht(e,t,n="main.ldr"){let r=en(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let a=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let l=tn(f);if(l&&r.has(l)&&!a.has(l))a.add(l),u.push(l)}let c=[i,...[...a].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${nn(c)}.dat`)}return s}var gt=(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,dt=new WeakMap;function De(e,t){let n=dt.get(e);if(!n)dt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),a=[],u=[];s.studs.forEach((p,d)=>{a.push(p[0]),u.push(p[1]);for(let w=0;w<12;w++)i[d*12+w]=p[2+w]});let c=null,f=0,l=0;if(s.mask){f=s.mask[0],l=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:a,color:u,mask:c,nx:f,nz:l}),r}var ie=1073741824;class Ue{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,a=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&a[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,a=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,a[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&a[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function rn(e,t,n){let s=[],o=[],i=[],a=[],u=[],c=[],f=[],l=[],p=new Ue(e.length*2),d=[],w=[];for(let C=0;C<e.length;C++){let M=e[C],k=M.m,_=t.parts[M.part];if(!_||!_.mask||!gt(k))continue;let I=_.bbox,O=1/0,j=-1/0,X=1/0,W=-1/0;for(let R=0;R<2;R++)for(let D=0;D<2;D++){let U=R?I[3]:I[0],G=D?I[5]:I[2],N=k[0]+k[3]*U+k[5]*G,V=k[2]+k[9]*U+k[11]*G;if(N<O)O=N;if(N>j)j=N;if(V<X)X=V;if(V>W)W=V}let E=u.length;s.push(O),o.push(j),i.push(X),a.push(W),u.push(C),c.push(De(t,M.part)),f.push(I[0]),l.push(I[2]);let x=Math.round((k[1]+I[4])*2);for(let R=Math.floor(O/40);R<=Math.floor(j/40);R++)for(let D=Math.floor(X/40);D<=Math.floor(W/40);D++){if(!we(x,R,D))continue;let U=w.length;w.push(E),d.push(p.put(x,R,D,U))}}let y=[0,5,-5,5,-5],L=[0,5,5,-5,-5],g=NaN,m=NaN,b=NaN,h=-1,P=(C,M,k,_)=>{let I=Math.round(M*2),O=Math.floor(C/40),j=Math.floor(k/40);if(!we(I,O,j))return fe;let X=fe;if(I!==g||O!==m||j!==b)g=I,m=O,b=j,h=p.get(I,O,j);for(let W=h;W>=0;W=d[W]){let E=w[W];if(u[E]===_||!(C-6>=s[E]-0.5&&C+6<=o[E]+0.5&&k-6>=i[E]-0.5&&k+6<=a[E]+0.5))continue;let x=e[u[E]].m,R=c[E],D=f[E],U=l[E],G=C-x[0],N=M-x[1],V=k-x[2],z=x[3]*G+x[6]*N+x[9]*V,K=x[5]*G+x[8]*N+x[11]*V,{nx:q,nz:se,mask:ae}=R,oe=!0;for(let ee=0;ee<5;ee++){let te=Math.floor((z+y[ee]-D)/20),ne=Math.floor((K+L[ee]-U)/20);if(te<0||ne<0||te>=q||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let ee=n[u[E]];if(ee<X)X=ee}}return X},A=0;for(let C of e){let M=De(t,C.part);if(M)A+=M.nStuds}let S=new Uint8Array(A),T=new Uint8Array(A),B=new Ue(A),v=0,F=n?new Int32Array(A).fill(fe):void 0;for(let C=0,M=0;C<e.length;C++){let k=e[C],_=De(t,k.part);if(!_)continue;let I=k.m,O=_.studM,j=I[0],X=I[1],W=I[2],E=I[3],x=I[4],R=I[5],D=I[6],U=I[7],G=I[8],N=I[9],V=I[10],z=I[11];for(let K=0;K<_.nStuds;K++,M++){let q=K*12,se=O[q+4],ae=O[q+7],oe=O[q+10];if(!(Math.abs(D*se+U*ae+G*oe-1)<0.001&&Math.abs(E*se+x*ae+R*oe)<0.001&&Math.abs(N*se+V*ae+z*oe)<0.001))continue;T[M]=1;let ee=O[q],te=O[q+1],ne=O[q+2],ze=j+E*ee+x*te+R*ne,Oe=X+D*ee+U*te+G*ne,Ne=W+N*ee+V*te+z*ne,$e=P(ze,Oe,Ne,C);if($e!==fe){if(S[M]=1,v++,F)F[M]=$e}let me=Math.round(ze),he=Math.round(Oe),ge=Math.round(Ne);if(!we(me,he,ge))continue;if(!n){B.put(me,he,ge,1);continue}let je=n[C],Ve=B.get(me,he,ge);if(Ve<0||je<Ve)B.put(me,he,ge,je)}}let Y=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let C=0;C<e.length;C++){let M=e[C],k=t.parts[M.part];if(!k||!k.under||!gt(M.m))continue;let _=k.bbox,I=Math.round((_[3]-_[0])/20),O=Math.round((_[5]-_[2])/20);if(!I||!O||I*O>4096)continue;let j=M.m,X=!0,W=0;for(let E=0;E<I&&X;E++)for(let x=0;x<O;x++){let R=_[0]+10+20*E,D=_[2]+10+20*x,U=j[0]+j[3]*R+j[5]*D,G=j[2]+j[9]*R+j[11]*D,N=Math.round(U),V=Math.round(j[1]+_[4]),z=Math.round(G),K=we(N,V,z)?B.get(N,V,z):-1;if(K<0){X=!1;break}if(K>W)W=K}if(X){if(Y[C]=1,H)H[C]=W}}return{nStuds:A,studHidden:S,studUp:T,underHidden:Y,studsHidden:v,studHideStep:F,underHideStep:H}}function sn(e,t,n){let r=(l)=>n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let p=l.colour;if(!p)return String(l.color);let d=o.get(p);if(d!==void 0)return d;let w=t.colorTable?.[l.color],y=w?.hex??t.colors?.[l.color],L=w?Re({alpha:w.alpha??255,luminance:w.luminance??0,finish:w.finish??{type:"default"}}):"default:op",g=Re(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&L===g?String(l.color):p.hex.toUpperCase()+"/"+g,d!==String(l.color))s.set(d,p);return o.set(p,d),d},a=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=a.map((l)=>pt(l.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((l,p)=>[l,p]));return{all:a,stepOf:u.map((l)=>f.get(l)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=sn(e,t,n);return rn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function yt(e=Te,t=fetch){let n=ve.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(()=>ve.delete(e)),ve.set(e,n);return n}var on=(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"),Ce=(e,t)=>on(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function an(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 w=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+w),L=r;n.push(y),r+=y.byteLength;let g=(4-r%4)%4;if(g)n.push(new Uint8Array(g)),r+=g;for(let[m,b]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Ce(b,L);for(let[m,b]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Ce(b,L)}let i=e[0]?.header??{version:1,weld:!0},a=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+a.length)%4)%4,c=4+a.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,a.length+u,!0),f.set(a,4),f.fill(32,4+a.length,c);let l=c;for(let p of n)f.set(p,l),l+=p.byteLength;return xe(f.buffer)}async function ln(e,t={}){e=[...e];try{return await bt(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;ve.delete(r);let o=(i,a)=>s(i,{...a,cache:"reload"});try{return await bt(e,{...t,fetch:o})}catch{throw n}}}async function bt(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await yt(n,r),i=[...new Set([...e].map(Q))],a=[],u=[];for(let g of i){if(Me.has(n+g))continue;let m=o.parts[g];if(m)u.push({name:g,off:m[0],len:m[1],file:m[2]??0});else a.push(g)}u.sort((g,m)=>g.file-m.file||g.off-m.off);let c=[];for(let g of u){let m=c[c.length-1];if(m&&m.file===g.file&&g.off-m.end<=s)m.end=Math.max(m.end,g.off+g.len),m.items.push(g);else c.push({file:g.file,start:g.off,end:g.off+g.len,items:[g]})}let f=0,l=0,p=0,d=new Map,w=async()=>{while(p<c.length){let g=c[p++],m=d.get(g.file);if(m)m=m.subarray(g.start,g.end);else{let b=await r(new URL(o.archives[g.file],n).href,{headers:{Range:`bytes=${g.start}-${g.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(l++,m=new Uint8Array(await b.arrayBuffer()),f+=m.byteLength,b.status===200)d.set(g.file,m),m=m.subarray(g.start,g.end)}for(let b of g.items){let h=ye(m.subarray(b.off-g.start,b.off-g.start+b.len)),P=h.buffer.slice(h.byteOffset,h.byteOffset+h.byteLength);Me.set(n+b.name,xe(P))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},w));let y=i.filter((g)=>Me.has(n+g)).map((g)=>Me.get(n+g));return{pack:y.length?an(y,{colors:o.colors}):xe(cn(o.colors)),missing:a,requests:l,bytes:f}}function cn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors: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 un(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 fn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let a of e){let u=a.embedded?t.get(a.part):Q(a.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe 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 xt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=yt(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return _e(await h.arrayBuffer())}),i=performance.now(),a=t.name??(t.text?"main.ldr":Ke(e)),u=mt(o,a,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=ht(o,new Set(u.filter((h)=>h.embedded).map((h)=>h.part)),a),l=(h,P)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let h=fn(u,f,await s);if(l(h.known?h.bodyTris:0,h.packBytes))throw new pe({bodyTris:h.bodyTris,packBytes:h.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:p,missing:d,requests:w,bytes:y}=await ln([...u.filter((h)=>!h.embedded).map((h)=>h.part),...f.values()],t),L=new Map([...f].map(([h,P])=>[P,h])),g=d.map((h)=>L.get(h)??h);for(let[h,P]of f){let A=p.header.parts[P];if(A)p.header.parts[h]=A}let m=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let h=p.buffer?.byteLength??p.bytes??0,P=un(u,p);if(l(P,h))throw new pe({bodyTris:P,packBytes:h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let b=t.cull?Ae(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,missing:g,requests:w,bytes:y,cull:b,timings:{fetchModel:i-n,parse:c-i,parts:m-c,...b?{cull:performance.now()-m}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await xt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),a=Ae(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[a.studHidden,a.studUp,a.underHidden,a.studHideStep,a.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:a,ms:u},c)}catch(s){if(s instanceof pe||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';
3993
4147
 
3994
- // ../../../../../../../tmp/ldr-build-eJ6hMz/src/cdn.ts
4148
+ // ../../../../../../../tmp/ldr-build-sxbVKM/src/cdn.ts
3995
4149
  var worker;
3996
4150
  var seq = 0;
3997
4151
  var pending = new Map;
@@ -4111,6 +4265,7 @@ export {
4111
4265
  I as IDENTITY,
4112
4266
  MIN_VIS,
4113
4267
  REORIENT,
4268
+ blendedColourHex,
4114
4269
  bodyTriangles,
4115
4270
  buildLdrScene,
4116
4271
  buildLdrSceneAsync,