ldr 0.13.0 → 0.15.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.
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-MHOtAg/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))
@@ -690,7 +690,7 @@ function fileStepViews(f) {
690
690
  viewMemo.set(f, out);
691
691
  return out;
692
692
  }
693
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/model.ts
693
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/model.ts
694
694
  var CALLOUT_END = 999999;
695
695
  var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
696
696
  function flatten(doc, opts = {}) {
@@ -1039,7 +1039,7 @@ function parseLDConfig(text) {
1039
1039
  }
1040
1040
  return out;
1041
1041
  }
1042
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/instructions.ts
1042
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/instructions.ts
1043
1043
  var MIN_VIS = 0.5;
1044
1044
  var REORIENT = 0.35;
1045
1045
  var deg = Math.PI / 180;
@@ -1407,10 +1407,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1407
1407
  }
1408
1408
  };
1409
1409
  }
1410
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/render.ts
1410
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
1411
1411
  import * as THREE from "three";
1412
1412
 
1413
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/pack-io.ts
1413
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/pack-io.ts
1414
1414
  import { decompress } from "fzstd";
1415
1415
  async function decompressPack(data) {
1416
1416
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1429,7 +1429,7 @@ function decodePack(buf) {
1429
1429
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1430
1430
  }
1431
1431
 
1432
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/cull.ts
1432
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/cull.ts
1433
1433
  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;
1434
1434
  var prepCache = new WeakMap;
1435
1435
  function prepPart(H, part) {
@@ -1746,7 +1746,7 @@ function precomputeCull(instances, H, useTex = true) {
1746
1746
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
1747
1747
  }
1748
1748
 
1749
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/render.ts
1749
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
1750
1750
  async function loadPack(url) {
1751
1751
  const res = await fetch(url);
1752
1752
  if (!res.ok)
@@ -2106,41 +2106,24 @@ function newIM(g, mat, n) {
2106
2106
  im.count = n;
2107
2107
  return im;
2108
2108
  }
2109
- function applyIMBuffers(im, linked, M, C, n) {
2109
+ function trimCulledIM(im, vis, linked) {
2110
+ if (vis >= im.instanceMatrix.count || !im.instanceColor)
2111
+ return false;
2112
+ const M = im.instanceMatrix.array.slice(0, vis * 16), C = im.instanceColor.array.slice(0, vis * 3);
2110
2113
  im.instanceMatrix = new THREE.InstancedBufferAttribute(M, 16);
2111
2114
  im.instanceColor = new THREE.InstancedBufferAttribute(C, 3);
2112
- im.count = n;
2115
+ im.count = vis;
2113
2116
  for (const o of linked) {
2114
2117
  if (o.isInstancedMesh) {
2115
2118
  o.instanceMatrix = im.instanceMatrix;
2116
2119
  o.instanceColor = im.instanceColor;
2117
- o.count = n;
2120
+ o.count = vis;
2118
2121
  } else if (o.geometry) {
2119
2122
  o.geometry.setAttribute("instanceMatrix", im.instanceMatrix);
2120
- o.geometry.instanceCount = n;
2123
+ o.geometry.instanceCount = vis;
2121
2124
  }
2122
2125
  }
2123
- }
2124
- function trimCulledIM(im, vis, linked) {
2125
- const all = im.instanceMatrix.count;
2126
- if (vis >= all || !im.instanceColor)
2127
- return null;
2128
- const fullM = im.instanceMatrix.array, fullC = im.instanceColor.array;
2129
- const slimM = fullM.slice(0, vis * 16), slimC = fullC.slice(0, vis * 3);
2130
- const tailM = fullM.slice(vis * 16), tailC = fullC.slice(vis * 3);
2131
- applyIMBuffers(im, linked, slimM, slimC, vis);
2132
- return { im, linked, slimM, slimC, tailM, tailC, vis, all };
2133
- }
2134
- function setTrimmedCull(t, showAll) {
2135
- if (showAll) {
2136
- const M = new Float32Array(t.all * 16), C = new Float32Array(t.all * 3);
2137
- M.set(t.slimM);
2138
- M.set(t.tailM, t.vis * 16);
2139
- C.set(t.slimC);
2140
- C.set(t.tailC, t.vis * 3);
2141
- applyIMBuffers(t.im, t.linked, M, C, t.all);
2142
- } else
2143
- applyIMBuffers(t.im, t.linked, t.slimM, t.slimC, t.vis);
2126
+ return true;
2144
2127
  }
2145
2128
  function instancedBoundingSphere(im) {
2146
2129
  const g = im.geometry;
@@ -2346,7 +2329,7 @@ class LdrLodRoot extends THREE.LOD {
2346
2329
  }
2347
2330
  }
2348
2331
  }
2349
- function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
2332
+ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
2350
2333
  const bKind = [], bMat = [];
2351
2334
  const bAll = [];
2352
2335
  const studBucket = new Uint16Array(cull.nStuds);
@@ -2401,6 +2384,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
2401
2384
  const instNeg = det12(a) < 0 ? 1 : 0;
2402
2385
  const B = pp.studM;
2403
2386
  for (let si = 0;si < pp.nStuds; si++, j++) {
2387
+ if ((j & 32767) === 0 && j)
2388
+ yield;
2404
2389
  const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
2405
2390
  const neg = (instNeg ^ ps.neg[si]) === 1;
2406
2391
  const km = ps.kid[si] * 2 + (neg ? 1 : 0);
@@ -2463,23 +2448,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
2463
2448
  colCache.set(c, x = color(c));
2464
2449
  return x;
2465
2450
  };
2466
- forEachStud(insts, H, (j, owner, w, _kind, col, si) => {
2467
- const sm = sMesh[studCl[j]];
2468
- if (!sm)
2469
- return;
2470
- const im = sm.im;
2471
- const slot = studSlot[j];
2472
- if (sm.slots) {
2473
- const t = sm.slots;
2474
- t.own[slot] = steps[owner];
2475
- t.hide[slot] = cull.studHideStep[j];
2476
- t.inst[slot] = owner;
2477
- t.stud[slot] = si;
2478
- t.col[slot] = colorIndex(col);
2479
- }
2480
- writeM4(im.instanceMatrix.array, slot * 16, w);
2481
- colorOf(col).toArray(im.instanceColor.array, slot * 3);
2482
- });
2451
+ yield;
2452
+ {
2453
+ const w = new Float64Array(12);
2454
+ let j = 0;
2455
+ for (let idx = 0;idx < insts.length; idx++) {
2456
+ const it = insts[idx];
2457
+ const pp = prepPart(H, it.part);
2458
+ if (!pp || !pp.nStuds)
2459
+ continue;
2460
+ for (let si = 0;si < pp.nStuds; si++, j++) {
2461
+ if ((j & 32767) === 0 && j)
2462
+ yield;
2463
+ mul12To(it.m, pp.studM, si * 12, w);
2464
+ const sm = sMesh[studCl[j]];
2465
+ if (!sm)
2466
+ continue;
2467
+ const im = sm.im;
2468
+ const slot = studSlot[j];
2469
+ const sc = pp.color[si];
2470
+ const col = sc === "16" ? it.color : sc;
2471
+ if (sm.slots) {
2472
+ const t = sm.slots;
2473
+ t.own[slot] = steps[idx];
2474
+ t.hide[slot] = cull.studHideStep[j];
2475
+ t.inst[slot] = idx;
2476
+ t.stud[slot] = si;
2477
+ t.col[slot] = colorIndex(col);
2478
+ }
2479
+ writeM4(im.instanceMatrix.array, slot * 16, w);
2480
+ colorOf(col).toArray(im.instanceColor.array, slot * 3);
2481
+ }
2482
+ }
2483
+ }
2483
2484
  return sMesh;
2484
2485
  }
2485
2486
  function undersideGroups(ids, insts) {
@@ -2509,7 +2510,7 @@ function undersideGroups(ids, insts) {
2509
2510
  out.push({ ids: rest, ax: null });
2510
2511
  return out;
2511
2512
  }
2512
- function buildLdrScene(insts, pack, P, color, mark) {
2513
+ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2513
2514
  const { header: H, arr } = pack;
2514
2515
  const LOD = P.lod !== false;
2515
2516
  const EDGES = !!P.edges;
@@ -2518,6 +2519,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2518
2519
  root.px = P.lodPx ?? 0.5;
2519
2520
  root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
2520
2521
  root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
2522
+ yield root;
2521
2523
  const trackVp = (r) => {
2522
2524
  const rt = r.getRenderTarget();
2523
2525
  const h = rt ? rt.height : r.getContext().drawingBufferHeight;
@@ -2586,9 +2588,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
2586
2588
  }
2587
2589
  b.ids.push(i);
2588
2590
  });
2591
+ yield root;
2589
2592
  const steps = P.steps;
2590
2593
  let cull = P.cull ?? cullCore(insts, H, steps);
2591
2594
  mark("culling");
2595
+ yield root;
2592
2596
  const stepBatches = [];
2593
2597
  const stepBatched = [];
2594
2598
  const instM = steps ? new Float64Array(insts.length * 12) : null;
@@ -2664,7 +2668,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2664
2668
  };
2665
2669
  const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
2666
2670
  const toggles = [];
2667
- const trimmed = [];
2671
+ const trimmed = { studs: false, under: false };
2668
2672
  const countTo = (objs) => ({ set count(n) {
2669
2673
  for (const o of objs()) {
2670
2674
  if (o.isInstancedMesh)
@@ -2731,6 +2735,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2731
2735
  };
2732
2736
  const coldByMat = new Map;
2733
2737
  for (const [, bucket] of byPart) {
2738
+ yield root;
2734
2739
  const part = bucket.part;
2735
2740
  const p = H.parts[part];
2736
2741
  const idsAll = bucket.ids;
@@ -2819,12 +2824,10 @@ function buildLdrScene(insts, pack, P, color, mark) {
2819
2824
  if (!o.isInstancedMesh)
2820
2825
  o.geometry.instanceCount = im.count;
2821
2826
  });
2822
- toggles.push({ mesh: countTo(() => objs), all: uids.length, visible: vis, flag: "under" });
2823
- if (!steps && P.cullUnder && vis < uids.length) {
2824
- const t = trimCulledIM(im, vis, objs);
2825
- if (t)
2826
- trimmed.push(t);
2827
- }
2827
+ const trim = !steps && P.cullUnder && trimCulledIM(im, vis, objs);
2828
+ if (trim)
2829
+ trimmed.under = true;
2830
+ toggles.push({ mesh: countTo(() => objs), all: trim ? vis : uids.length, visible: vis, flag: "under" });
2828
2831
  if (steps)
2829
2832
  stepBatches.push({ im, objs, 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]) });
2830
2833
  }
@@ -2834,9 +2837,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
2834
2837
  list.push({ part, p, mat, ids: idsAll });
2835
2838
  }
2836
2839
  }
2840
+ yield root;
2837
2841
  const tmpM = new THREE.Matrix4;
2838
2842
  const tmpC = new THREE.Color;
2839
2843
  for (const [mat, items] of coldByMat) {
2844
+ yield root;
2840
2845
  const entries = [];
2841
2846
  for (const it of items)
2842
2847
  for (const id of it.ids)
@@ -3079,13 +3084,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
3079
3084
  }
3080
3085
  }
3081
3086
  }
3082
- const sMesh = buildStudMeshes(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
3087
+ yield root;
3088
+ const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
3089
+ let _studR = _studGen.next();
3090
+ while (!_studR.done) {
3091
+ yield root;
3092
+ _studR = _studGen.next();
3093
+ }
3094
+ const sMesh = _studR.value;
3083
3095
  const sKind = sMesh.map((x) => x?.kind ?? "");
3084
3096
  const sVis = sMesh.map((x) => x?.vis ?? 0);
3085
3097
  const STUD_ERR = 12;
3086
- sMesh.forEach((sm, ci) => {
3098
+ let _coopS = 0;
3099
+ for (let ci = 0;ci < sMesh.length; ci++) {
3100
+ const sm = sMesh[ci];
3087
3101
  if (!sm)
3088
- return;
3102
+ continue;
3103
+ if ((++_coopS & 3) === 0)
3104
+ yield root;
3089
3105
  const im = sm.im;
3090
3106
  const kind = sKind[ci];
3091
3107
  const k = H.studKinds[kind];
@@ -3108,15 +3124,14 @@ function buildLdrScene(insts, pack, P, color, mark) {
3108
3124
  if (!o.isInstancedMesh)
3109
3125
  o.geometry.instanceCount = im.count;
3110
3126
  });
3111
- toggles.push({ mesh: countTo(() => objs), all, visible: vis, flag: "studs" });
3112
- if (!steps && P.cullStuds && vis < all) {
3113
- const t = trimCulledIM(im, vis, objs);
3114
- if (t)
3115
- trimmed.push(t);
3116
- }
3127
+ const trim = !steps && P.cullStuds && trimCulledIM(im, vis, objs);
3128
+ if (trim)
3129
+ trimmed.studs = true;
3130
+ toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
3117
3131
  if (sm.slots)
3118
3132
  stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
3119
- });
3133
+ }
3134
+ yield root;
3120
3135
  stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
3121
3136
  stats.uncertBatches = nUncert;
3122
3137
  let condOn = true, edgesOn = true;
@@ -3218,11 +3233,6 @@ function buildLdrScene(insts, pack, P, color, mark) {
3218
3233
  applySteps();
3219
3234
  return;
3220
3235
  }
3221
- if (trimmed.length) {
3222
- for (const t of trimmed)
3223
- setTrimmedCull(t, t.im.userData.ldrStud ? !studs : !under);
3224
- return;
3225
- }
3226
3236
  for (const t of toggles)
3227
3237
  t.mesh.count = (t.flag === "studs" ? studs : under) ? t.visible : t.all;
3228
3238
  };
@@ -3285,7 +3295,38 @@ function buildLdrScene(insts, pack, P, color, mark) {
3285
3295
  insts = null;
3286
3296
  cull = null;
3287
3297
  byPart.clear();
3288
- return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady };
3298
+ return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
3299
+ }
3300
+ function buildLdrScene(insts, pack, P, color, mark) {
3301
+ const g = buildLdrSceneGen(insts, pack, P, color, mark);
3302
+ let r = g.next();
3303
+ while (!r.done)
3304
+ r = g.next();
3305
+ return r.value;
3306
+ }
3307
+ async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
3308
+ const sliceMs = opts.sliceMs ?? 8;
3309
+ const g = buildLdrSceneGen(insts, pack, P, color, mark);
3310
+ let r = g.next();
3311
+ let sliceStart = performance.now();
3312
+ let longestSliceMs = 0;
3313
+ let yields = 0;
3314
+ while (!r.done) {
3315
+ const now = performance.now();
3316
+ if (now - sliceStart >= sliceMs) {
3317
+ longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
3318
+ yields++;
3319
+ if (opts.onSlice)
3320
+ await opts.onSlice(r.value);
3321
+ await new Promise((res) => setTimeout(res, 0));
3322
+ sliceStart = performance.now();
3323
+ }
3324
+ r = g.next();
3325
+ }
3326
+ longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
3327
+ const value = r.value;
3328
+ value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
3329
+ return value;
3289
3330
  }
3290
3331
  async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3291
3332
  const { header: H, arr } = pack;
@@ -3309,7 +3350,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3309
3350
  await new Promise((r) => setTimeout(r, 0));
3310
3351
  }
3311
3352
  }
3312
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/scene.ts
3353
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/scene.ts
3313
3354
  import * as THREE2 from "three";
3314
3355
  function colorFn(src, pack, fallback) {
3315
3356
  const table = new Map;
@@ -3369,6 +3410,12 @@ function toPlastic(old) {
3369
3410
  return m;
3370
3411
  }
3371
3412
  function createLdrObject(instances, pack, options = {}) {
3413
+ return createLdrObjectInner(instances, pack, options, false);
3414
+ }
3415
+ async function createLdrObjectAsync(instances, pack, options = {}) {
3416
+ return createLdrObjectInner(instances, pack, options, true);
3417
+ }
3418
+ function createLdrObjectInner(instances, pack, options, progressive) {
3372
3419
  const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
3373
3420
  const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
3374
3421
  const useTex = o.textures !== false;
@@ -3388,7 +3435,7 @@ function createLdrObject(instances, pack, options = {}) {
3388
3435
  object.scale.setScalar(o.scale);
3389
3436
  const pairs = new Map;
3390
3437
  let cur = null;
3391
- let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o;
3438
+ let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o, lodOn = true;
3392
3439
  const stats = { instances: all.length, drawn: 0, missing, studsTotal: 0, studsHidden: 0, undersTotal: 0, undersHidden: 0, buildMs: 0 };
3393
3440
  const disposeCur = () => {
3394
3441
  if (!cur)
@@ -3410,9 +3457,9 @@ function createLdrObject(instances, pack, options = {}) {
3410
3457
  };
3411
3458
  const multiStep = uniq.length > 1;
3412
3459
  const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
3413
- const build = () => {
3414
- const t0 = performance.now();
3415
- cur = buildLdrScene(all, pack, { cullStuds: cs, cullUnder: cu, edges, side, cond, 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 }, color, () => {});
3460
+ 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 });
3461
+ const applyBuilt = (built, t0) => {
3462
+ cur = built;
3416
3463
  pairs.clear();
3417
3464
  if (o.material === "plastic")
3418
3465
  cur.root.traverse((x) => {
@@ -3429,8 +3476,11 @@ function createLdrObject(instances, pack, options = {}) {
3429
3476
  cur.setEdges(false);
3430
3477
  if (!cond)
3431
3478
  cur.setCond(false);
3432
- object.add(cur.root);
3433
- Object.assign(stats, { drawn: drawnAt(null), studsTotal: cur.stats.studsTotal, studsHidden: cur.stats.studsHidden, undersTotal: cur.stats.undersTotal, undersHidden: cur.stats.undersHidden, condBatches: cur.stats.condBatches ?? 0, texBatches: cur.stats.texBatches ?? 0, textures: cur.stats.textures ?? 0, clusters: cur.stats.clusters ?? 0, buildMs: performance.now() - t0 });
3479
+ if (!lodOn)
3480
+ cur.setLod(false);
3481
+ if (cur.root.parent !== object)
3482
+ object.add(cur.root);
3483
+ Object.assign(stats, { drawn: drawnAt(null), studsTotal: cur.stats.studsTotal, studsHidden: cur.stats.studsHidden, undersTotal: cur.stats.undersTotal, undersHidden: cur.stats.undersHidden, condBatches: cur.stats.condBatches ?? 0, texBatches: cur.stats.texBatches ?? 0, textures: cur.stats.textures ?? 0, clusters: cur.stats.clusters ?? 0, longestSliceMs: cur.stats.longestSliceMs, buildYields: cur.stats.buildYields, buildMs: performance.now() - t0 });
3434
3484
  api.texturesReady = cur.texturesReady;
3435
3485
  };
3436
3486
  const setStep = (step, mask = null) => {
@@ -3440,56 +3490,86 @@ function createLdrObject(instances, pack, options = {}) {
3440
3490
  Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
3441
3491
  };
3442
3492
  const api = { texturesReady: Promise.resolve() };
3443
- build();
3444
- if (o.step != null)
3445
- setStep(o.step);
3446
- return Object.assign(api, {
3447
- object,
3448
- stats,
3449
- stepCount: uniq.length,
3450
- stepViews,
3451
- setStep,
3452
- setEdges: (v) => {
3453
- edges = v;
3454
- cur.setEdges(v);
3455
- },
3456
- setConditionalLines: (v) => {
3457
- cond = v;
3458
- cur.setCond(v);
3459
- },
3460
- setCulling: (a, b) => {
3461
- cs = a;
3462
- cu = b;
3463
- cur.setCull(a, b);
3464
- },
3465
- setLod: (v) => cur.setLod(v),
3466
- setSide: (s) => {
3467
- side = s;
3468
- cur.setSide(s === "front");
3469
- for (const [p, old] of pairs) {
3470
- p.side = old.side;
3471
- p.needsUpdate = true;
3472
- }
3473
- },
3474
- getBox: (target = new THREE2.Box3) => {
3475
- object.updateMatrixWorld(true);
3476
- target.makeEmpty();
3477
- object.traverse((x) => {
3478
- if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
3479
- x.computeBoundingBox();
3480
- const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
3481
- target.union(b);
3493
+ const finish = () => {
3494
+ if (o.step != null)
3495
+ setStep(o.step);
3496
+ return Object.assign(api, {
3497
+ object,
3498
+ stats,
3499
+ stepCount: uniq.length,
3500
+ stepViews,
3501
+ setStep,
3502
+ setEdges: (v) => {
3503
+ edges = v;
3504
+ cur.setEdges(v);
3505
+ },
3506
+ setConditionalLines: (v) => {
3507
+ cond = v;
3508
+ cur.setCond(v);
3509
+ },
3510
+ setCulling: (a, b) => {
3511
+ cs = a;
3512
+ cu = b;
3513
+ if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
3514
+ disposeCur();
3515
+ const t0 = performance.now();
3516
+ applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
3517
+ } else
3518
+ cur.setCull(a, b);
3519
+ },
3520
+ setLod: (v) => {
3521
+ lodOn = v;
3522
+ cur.setLod(v);
3523
+ },
3524
+ setSide: (s) => {
3525
+ side = s;
3526
+ cur.setSide(s === "front");
3527
+ for (const [p, old] of pairs) {
3528
+ p.side = old.side;
3529
+ p.needsUpdate = true;
3482
3530
  }
3483
- });
3484
- return target;
3485
- },
3486
- dispose: disposeCur
3487
- });
3531
+ },
3532
+ getBox: (target = new THREE2.Box3) => {
3533
+ object.updateMatrixWorld(true);
3534
+ target.makeEmpty();
3535
+ object.traverse((x) => {
3536
+ if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
3537
+ x.computeBoundingBox();
3538
+ const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
3539
+ target.union(b);
3540
+ }
3541
+ });
3542
+ return target;
3543
+ },
3544
+ dispose: disposeCur
3545
+ });
3546
+ };
3547
+ if (!progressive) {
3548
+ const t0 = performance.now();
3549
+ applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
3550
+ return finish();
3551
+ }
3552
+ return (async () => {
3553
+ const t0 = performance.now();
3554
+ const so = sceneOpts();
3555
+ if (!so.cull)
3556
+ so.cull = cullCore(all, pack.header, so.steps);
3557
+ const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
3558
+ sliceMs: o.sliceMs,
3559
+ onSlice: async (root) => {
3560
+ if (root.parent !== object)
3561
+ object.add(root);
3562
+ await o.onSlice?.();
3563
+ }
3564
+ });
3565
+ applyBuilt(built, t0);
3566
+ return finish();
3567
+ })();
3488
3568
  }
3489
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
3569
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
3490
3570
  import { decompress as decompress2 } from "fzstd";
3491
3571
 
3492
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/embedded.ts
3572
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/embedded.ts
3493
3573
  function splitFiles(text, fallback) {
3494
3574
  const files = new Map;
3495
3575
  let cur = null, saw = false;
@@ -3561,7 +3641,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
3561
3641
  return out;
3562
3642
  }
3563
3643
 
3564
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
3644
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
3565
3645
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
3566
3646
  var indexCache = new Map;
3567
3647
  var shardCache = new Map;
@@ -3721,10 +3801,10 @@ async function prepareModel(source, o = {}) {
3721
3801
  return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
3722
3802
  }
3723
3803
 
3724
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/load-worker.gen.ts
3804
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/load-worker.gen.ts
3725
3805
  var load_worker_gen_default = 'var ht=ArrayBuffer,W=Uint8Array,ge=Uint16Array,gt=Int16Array;var be=Int32Array,Ce=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},bt=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 dt=["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||dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},Be=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},xt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},yt=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,p=Be(e,a,c);a+=c;var m=l?1<<l:s,h=Be(e,a,m)+(l==1&&256),d=h;if(!s){var C=1<<10+(e[5]>>3);d=C+(C>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:p,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return xt(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,p=o,m=new ht(512+(o<<2)),h=new gt(m,0,256),d=new ge(m,0,256),C=new ge(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,A=(1<<g+1)-1,z=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&A,x=(1<<g)-1,M=A-i-1,L=z&x;if(L<M)r+=g,z=L;else if(r+=g+1,z>x)z-=M;if(h[++l]=--z,z==-1)i+=z,b[--p]=l;else i-=z;if(!z)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 E=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var v=h[H];if(v<1){d[H]=-v;continue}for(c=0;c<v;++c){b[E]=H;do E=E+U&X;while(E>=p)}}if(E)K(0);for(c=0;c<o;++c){var w=d[b[c]]++,P=S[c]=s-re(w);C[c]=(w<<P)-o}return[r+7>>3,{b:s,s:b,n:S,t:C}]},wt=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 ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),p=c[0],m=c[1];t+=o;var h=p<<3,d=e[t];if(!d)K(0);var C=0,u=0,b=m.b,S=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(C+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=m.s[C],g-=S,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[C],C=m.t[C],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var A=e[++t];i[n]=A>>4,i[n+1]=A&15}++t}var z=0;for(n=0;n<r;++n){var x=i[n];if(x>11)K(0);z+=x&&1<<x-1}var M=re(z)+1,L=1<<M,D=L-z;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var x=i[n];++l[i[n]=x&&M+1-x]}var E=new W(L<<1),U=E.subarray(0,L),X=E.subarray(L);a[M]=0;for(n=M;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<M-n))}if(a[0]!=L)K(0);for(n=0;n<r;++n){var v=i[n];if(v){var w=a[v];ce(U,n,w,a[v]=w+(1<<M-v))}}return[t,{n:X,b:M,s:U}]},At=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],vt=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],Mt=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],$e=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},Ee=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ct=$e(Ee,0),Se=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Et=$e(Se,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,p=(r<<3)-8+re(o)-c,m=-1;for(;p>l&&m<s;){var h=p>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(p&7);a=(a<<c|d)&i,t[++m]=n.s[a],p-=c=n.n[a]}if(p!=l||m+1!=s)K(0)},St=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)},Lt=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 Ce(e,s,a)}if(i==2){var c=e[s],p=c&3,m=c>>2&3,h=c>>4,d=0,C=0;if(p<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(C=m,m<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(p==0)u.set(e.subarray(s,s+=h),b);else if(p==1)ce(u,e[s++],b);else{var S=t.h;if(p==2){var g=wt(e,s);d+=s-(s=g[0]),t.h=S=g[1]}else if(!S)K(0);(C?St:le)(e.subarray(s,s+=d),u.subarray(b),S)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var A=e[s++];if(A&3)K(0);var z=[vt,Mt,At];for(var x=2;x>-1;--x){var M=A>>(x<<1)+2&3;if(M==1){var L=new W([0,0,e[s++]]);z[x]={s:L.subarray(2,3),n:L.subarray(0,1),t:new ge(L.buffer,0,1),b:0}}else if(M==2)r=ue(e,s,9-(x&1)),s=r[0],z[x]=r[1];else if(M==3){if(!t.t)K(0);z[x]=t.t[x]}}var D=t.t=z,E=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var v=(a<<3)-8+re(H)-X.b,w=v>>3,P=0,V=(e[w]|e[w+1]<<8)>>(v&7)&(1<<X.b)-1;w=(v-=U.b)>>3;var I=(e[w]|e[w+1]<<8)>>(v&7)&(1<<U.b)-1;w=(v-=E.b)>>3;var B=(e[w]|e[w+1]<<8)>>(v&7)&(1<<E.b)-1;for(++f;--f;){var T=X.s[V],y=X.n[V],N=E.s[B],R=E.n[B],k=U.s[I],O=U.n[I];w=(v-=k)>>3;var j=1<<k,F=j+((e[w]|e[w+1]<<8|e[w+2]<<16|e[w+3]<<24)>>>(v&7)&j-1);w=(v-=Se[N])>>3;var G=Et[N]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Se[N])-1);w=(v-=Ee[T])>>3;var _=Ct[T]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Ee[T])-1);if(w=(v-=y)>>3,V=X.t[V]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<y)-1),w=(v-=R)>>3,B=E.t[B]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<R)-1),w=(v-=O)>>3,I=U.t[I]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<O)-1),F>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=F-=3;else{var Z=F-(_!=0);if(Z){if(F=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=F}else F=t.o[0]}for(var x=0;x<_;++x)u[P+x]=u[b+x];P+=_,b+=_;var q=P-F;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var x=0;x<J;++x)u[P+x]=t.w[ee+x];P+=J,G-=J,q=0}for(var x=0;x<G;++x)u[P+x]=u[q+x];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ce(u,0,P)}else if(n){if(t.y+=h,b)for(var x=0;x<h;++x)u[x]=u[b+x]}else if(b)u=Ce(u,b);return t.b=a,u}K(2)},Tt=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 je(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=yt(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=Lt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,bt(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 Tt(n,o)}function de(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,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ve=/^~?\\s*moved\\s+to\\s+(.+)$/i,Pt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Ye=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),It=new Set(["model","submodel","configuration"]),Ft=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function He(e){let t=Ft.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ye.has(n)||It.has(n)?n:void 0}function Rt(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 kt(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=Rt(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 p=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(p>0&&a[p+1])c.glossmap=a[p+1];if(t)c.next=!0;return c}var Dt=(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 Ut(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 p=s();if(p===null)return null;i[c]=+p}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:Y(a)}}function Ge(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:Y(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 Je(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],p=null,m=()=>{if(!a)return;let g=Dt(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(m(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],p=null,h=!0},C=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(g,f)=>{if(p){g.tex=p,p=null;return}let A=c[c.length-1];if(!A)return;if(A.fallback){if(!f)g.fallback=!0}else g.tex=A.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||C)continue;if(!o)d(t);let M=f.slice(2).trimStart(),L=M.search(/\\s/),D={t:f.charCodeAt(0)-48,color:Le(L<0?M:M.slice(0,L)),p:[],src:f};S(D,!1),o.cmds.push(D),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let M=2;while(f.charCodeAt(M)===32||f.charCodeAt(M)===9)M++;let L=M;while(L<f.length&&f.charCodeAt(L)!==32&&f.charCodeAt(L)!==9)L++;let D=f.slice(M,L);if(!Pt.has(D)){if(C||a)continue;if(!o)d(t);let E=f.slice(M),U={t:0,text:E};if(D.charCodeAt(0)===33)U.meta=D;if(p=null,h&&!o.org){let H=He(E);if(H)o.org=H}let X=E.match(Ve);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(U);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!C){let M=Ut(f);if(M){if(!o)d(t);S(M,!1),o.cmds.push(M),h=!1;continue}}let A=f.split(/\\s+/);if(+A[0]===0){let M=f.slice(1).trim();if(A[1]==="FILE"){b(),C=!1,d(M.slice(5));continue}if(A[1]==="NOFILE"){m(),o=null,C=!0;continue}if(A[1]==="!DATA"){b(),m(),o=null,C=!1,a={name:M.slice(5).trim(),chunks:[]};continue}if(C)continue;if(a){if(A[1]==="!:")a.chunks.push(A.slice(2).join(""));continue}if(!o)d(t);let L={t:0,text:M};if(A[1]==="STEP")L.step=!0,c=[],p=null;else if(A[1]==="BFC")L.bfc=A.slice(2).join(" ");else if(A[1]==="ROTSTEP")if(L.meta="ROTSTEP",L.step=!0,c=[],p=null,(A[2]??"").toUpperCase()==="END")L.rotstep={x:0,y:0,z:0,mode:"END"};else{let E=(A[5]??"REL").toUpperCase();L.rotstep={x:+A[2]||0,y:+A[3]||0,z:+A[4]||0,mode:["REL","ABS","ADD"].includes(E)?E:"REL"}}else if(A[1]==="BUFEXCHG"){L.meta="BUFEXCHG";let E=(A[2]??"").toUpperCase();L.bufexchg={op:E==="RETRIEVE"?"RETRIEVE":"STORE",buf:A[3]??"A"}}else if(A[1]?.startsWith("!"))L.meta=A[1];if(h&&!o.org){let E=He(M);if(E)o.org=E}if(A[1]==="!TEXMAP"){let E=(A[2]??"").toUpperCase();if(p=null,E==="START"||E==="NEXT"){let U=kt(M.replace(/^!TEXMAP\\s+\\S+/i,""),E==="NEXT");if(L.texmap={op:E,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),E==="START")c.push({map:U,fallback:!1});else p=U}else if(E==="FALLBACK"){L.texmap={op:E};let U=c[c.length-1];if(U)U.fallback=!0}else if(E==="END")L.texmap={op:E},c.pop()}else if(A[1]==="!:"){p=null;let E=Ge(A.slice(2));if(E)S(E,!0),L.geom=E}else p=null;let D=M.match(Ve);if(D&&!o.movedTo){let E=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=Y(E)}o.cmds.push(L);continue}if(a||C)continue;if(!o)d(t);let x=Ge(A);if(!x)continue;S(x,!1),o.cmds.push(x),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var tn=Math.PI/180;function qe(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 Qe(e,t){let[n,r,s,o,i,l,a,c,p,m,h,d]=e,[C,u,b,S,g,f,A,z,x,M,L,D]=t;return[o*C+i*u+l*b+n,a*C+c*u+p*b+r,m*C+h*u+d*b+s,o*S+i*A+l*M,o*g+i*z+l*L,o*f+i*x+l*D,a*S+c*A+p*M,a*g+c*z+p*L,a*f+c*x+p*D,m*S+h*A+d*M,m*g+h*z+d*L,m*f+h*x+d*D]}var Te=[0,0,0,1,0,0,0,1,0,0,0,1];var _e=new WeakMap,zt=/^(s|8|48)\\//;function Pe(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=_e.get(n);if(r)return r;if(n.org)r=Ye.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&&zt.test(s.file))?"part":"model";return _e.set(n,r),r}var We=new WeakMap;function et(e){let t=We.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 We.set(e,t),t}var Ke=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),Ot=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ke(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ke(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Y(e)}#${t}`;function Nt(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 tt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Nt(e,t).cmds.map(Ot)].join(`\n`)+`\n`}function Bt(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,l,a,c,p,m,h]=e,d=a*h-c*m,C=-(l*h-c*p),u=l*m-a*p,b=s*d+o*C+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,g=[d*S,-(o*h-i*m)*S,(o*c-i*a)*S,C*S,(s*h-i*p)*S,-(s*c-i*l)*S,u*S,-(s*m-o*p)*S,(s*a-o*l)*S];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 $t=(e)=>String(+e.toFixed(6)||0),Xe=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function rt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map($t).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Xe(t.texture)}${t.glossmap?" GLOSSMAP "+Xe(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-${Bt(r)}`,source:r}}var jt=(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 Vt(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 Ze=new WeakMap;function st(e){let t=Ze.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=Vt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Ze.set(e,n),n}var ot=999999,it=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Ht(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,h)=>{let d=m.name+"#"+h,C=l.get(d);if(!C){let u;C=Object.assign(()=>u??=tt(m,h),{file:m,step:h}),l.set(d,C)}return C},p=(m,h,d,C,u,b,S,g,f=null,A=[],z=[])=>{let x=m.files.get(h);if(!x||S>r)return;let M=0,L=S>0?++a:0,D=i&&L?[...A,L]:A,E=i&&L?[...z,d]:z,U=i&&!f?new Map:null,X=-1,H=0,v=(T,y,N,R,k,O)=>{if(X!==M)X=M,H=0;let j=U?.get(M+"|"+y);if(j)return j.n++,p(T,T===m?y:T.main,N,R,u+"/"+y,[...k,ot],S+1,O,[...k,ot],D,E);let F=[...k,H++],G=n.length;p(T,T===m?y:T.main,N,R,u+"/"+y,F,S+1,O,f,D,E),U?.set(M+"|"+y,{n:1,from:G,to:n.length})},w=st(x),P=s?et(x):[],V=0,I=(T,y,N,R,k,O,j)=>{if(f)R=f;let F={part:T,color:y,m:N,step:R[0],steps:R,localStep:k,path:u};if(L){if(F.sub=L,i)F.subPath=D,F.subMats=E}if(O)F.embedded=!0;if(j){let _=rt(T,j);F.texPart=_.name,F.texSource=_.source}let G=w[k];if(G)F.view=G;return n.push(F),F},B=(T)=>{while(V<P.length&&P[V]<=T){let y=P[V++];I(Ie(x.name,y),C,d,[...b,y],y,!1,null).source=c(x,y)}};for(let T of x.cmds){if(T.t===0&&T.step){M++;continue}let y=T;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){B(M);continue}if(y.t===0)if(o&&y.geom?.t===1)y=y.geom;else continue;if(y.t!==1)continue;if(o&&y.fallback)continue;let N=y.color===16?C:y.color,R=Qe(d,y.m),k=[...b,M],O=o?y.tex??g:null,j=O?nt(y.m):null,F=O&&j?qe(O,j):null;if(m.files.has(y.file)){if(Pe(m,y.file)==="model"){v(m,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!0,F);continue}let G=t.resolveModel?.(y.file);if(G){v(G,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!1,F)}if(B(1/0),U){for(let T of U.values())if(T.n>1)for(let y=T.from;y<T.to;y++)n[y].mult??=T.n}};if(Pe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Te],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return p(e,e.main,Te,16,e.main,[],0,null),n}function at(e,t="main.ldr",n){return Ht(Je(e,t,{geometryText:!0}),n)}function Gt(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(Y(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(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var _t=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Wt(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 lt(e,t,n="main.ldr"){let r=Gt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let p of r.get(a.pop())){let m=_t(p);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((p)=>p!==i).sort()].map((p)=>"0 FILE "+(p===i?"":p)+`\n`+r.get(p).join(`\n`)).join(`\n`);s.set(i,`emb/${Wt(c)}.dat`)}return s}var ct=(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,ut=new WeakMap;function Fe(e,t){let n=ut.get(e);if(!n)ut.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((h,d)=>{l.push(h[0]),a.push(h[1]);for(let C=0;C<12;C++)i[d*12+C]=h[2+C]});let c=null,p=0,m=0;if(s.mask){p=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:p,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 xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Kt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],p=[],m=[],h=new Re(e.length*2),d=[],C=[];for(let v=0;v<e.length;v++){let w=e[v],P=w.m,V=t.parts[w.part];if(!V||!V.mask||!ct(P))continue;let I=V.bbox,B=1/0,T=-1/0,y=1/0,N=-1/0;for(let O=0;O<2;O++)for(let j=0;j<2;j++){let F=O?I[3]:I[0],G=j?I[5]:I[2],_=P[0]+P[3]*F+P[5]*G,Z=P[2]+P[9]*F+P[11]*G;if(_<B)B=_;if(_>T)T=_;if(Z<y)y=Z;if(Z>N)N=Z}let R=a.length;s.push(B),o.push(T),i.push(y),l.push(N),a.push(v),c.push(Fe(t,w.part)),p.push(I[0]),m.push(I[2]);let k=Math.round((P[1]+I[4])*2);for(let O=Math.floor(B/40);O<=Math.floor(T/40);O++)for(let j=Math.floor(y/40);j<=Math.floor(N/40);j++){if(!xe(k,O,j))continue;let F=C.length;C.push(R),d.push(h.put(k,O,j,F))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,g=NaN,f=NaN,A=-1,z=(v,w,P,V)=>{let I=Math.round(w*2),B=Math.floor(v/40),T=Math.floor(P/40);if(!xe(I,B,T))return fe;let y=fe;if(I!==S||B!==g||T!==f)S=I,g=B,f=T,A=h.get(I,B,T);for(let N=A;N>=0;N=d[N]){let R=C[N];if(a[R]===V||!(v-6>=s[R]-0.5&&v+6<=o[R]+0.5&&P-6>=i[R]-0.5&&P+6<=l[R]+0.5))continue;let k=e[a[R]].m,O=c[R],j=p[R],F=m[R],G=v-k[0],_=w-k[1],Z=P-k[2],q=k[3]*G+k[6]*_+k[9]*Z,J=k[5]*G+k[8]*_+k[11]*Z,{nx:ee,nz:se,mask:ae}=O,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-F)/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[R]];if(Q<y)y=Q}}return y},x=0;for(let v of e){let w=Fe(t,v.part);if(w)x+=w.nStuds}let M=new Uint8Array(x),L=new Uint8Array(x),D=new Re(x),E=0,U=n?new Int32Array(x).fill(fe):void 0;for(let v=0,w=0;v<e.length;v++){let P=e[v],V=Fe(t,P.part);if(!V)continue;let I=P.m,B=V.studM,T=I[0],y=I[1],N=I[2],R=I[3],k=I[4],O=I[5],j=I[6],F=I[7],G=I[8],_=I[9],Z=I[10],q=I[11];for(let J=0;J<V.nStuds;J++,w++){let ee=J*12,se=B[ee+4],ae=B[ee+7],oe=B[ee+10];if(!(Math.abs(j*se+F*ae+G*oe-1)<0.001&&Math.abs(R*se+k*ae+O*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;L[w]=1;let Q=B[ee],te=B[ee+1],ne=B[ee+2],ke=T+R*Q+k*te+O*ne,De=y+j*Q+F*te+G*ne,Ue=N+_*Q+Z*te+q*ne,ze=z(ke,De,Ue,v);if(ze!==fe){if(M[w]=1,E++,U)U[w]=ze}let pe=Math.round(ke),me=Math.round(De),he=Math.round(Ue);if(!xe(pe,me,he))continue;if(!n){D.put(pe,me,he,1);continue}let Oe=n[v],Ne=D.get(pe,me,he);if(Ne<0||Oe<Ne)D.put(pe,me,he,Oe)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let w=e[v],P=t.parts[w.part];if(!P||!P.under||!ct(w.m))continue;let V=P.bbox,I=Math.round((V[3]-V[0])/20),B=Math.round((V[5]-V[2])/20);if(!I||!B||I*B>4096)continue;let T=w.m,y=!0,N=0;for(let R=0;R<I&&y;R++)for(let k=0;k<B;k++){let O=V[0]+10+20*R,j=V[2]+10+20*k,F=T[0]+T[3]*O+T[5]*j,G=T[2]+T[9]*O+T[11]*j,_=Math.round(F),Z=Math.round(T[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?D.get(_,Z,q):-1;if(J<0){y=!1;break}if(J>N)N=J}if(y){if(X[v]=1,H)H[v]=N}}return{nStuds:x,studHidden:M,studUp:L,underHidden:X,studsHidden:E,studHideStep:U,underHideStep:H}}function Xt(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)=>it(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 ye(e,t,n=!0){let r=Xt(e,t,n);return Kt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Me="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,we=new Map;function pt(e=Me,t=fetch){let n=Ae.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(()=>Ae.delete(e)),Ae.set(e,n);return n}var Zt=(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"),ve=(e,t)=>Zt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function Yt(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let C=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+C),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}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,p=new Uint8Array(c+r);new DataView(p.buffer).setUint32(0,l.length+a,!0),p.set(l,4),p.fill(32,4+l.length,c);let m=c;for(let h of n)p.set(h,m),m+=h.byteLength;return de(p.buffer)}async function Jt(e,t={}){e=[...e];try{return await ft(e,t)}catch(n){let r=t.cdn??Me,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ft(e,{...t,fetch:o})}catch{throw n}}}async function ft(e,t){let n=t.cdn??Me,r=t.fetch??fetch,s=t.gap??16384,o=await pt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(we.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let p=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);p+=S.byteLength;for(let g of u.items){let f=je(S.subarray(g.off-u.start,g.off-u.start+g.len)),A=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);we.set(n+g.name,de(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>we.has(n+u)).map((u)=>we.get(n+u));return{pack:d.length?Yt(d,{colors:o.colors}):de(qt(o.colors)),missing:l,requests:c.length,bytes:p}}function qt(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}async function mt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=pt(t.cdn??Me,r);s.catch(()=>{});let o=t.text?e:await r(e).then((f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return f.text()}),i=performance.now(),l=t.name??(t.text?"main.ldr":decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr")),a=at(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let p=lt(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:m,missing:h,requests:d,bytes:C}=await Jt([...a.filter((f)=>!f.embedded).map((f)=>f.part),...p.values()],t),u=new Map([...p].map(([f,A])=>[A,f])),b=h.map((f)=>u.get(f)??f);for(let[f,A]of p){let z=m.header.parts[A];if(z)m.header.parts[f]=z}let S=performance.now(),g=t.cull?ye(a,m.header,t.textures!==!1):void 0;return{insts:a,pack:m,missing:b,requests:d,bytes:C,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:S-c,...g?{cull:performance.now()-S}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await mt(n,{...r,cull:!1,onParsed:(p)=>self.postMessage({id:t,insts:p})}),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=ye(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let p of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(p)c.push(p.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
3726
3806
 
3727
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/cdn.ts
3807
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/cdn.ts
3728
3808
  var worker;
3729
3809
  var seq = 0;
3730
3810
  var pending = new Map;
@@ -3819,7 +3899,7 @@ async function loadModel(source, o = {}) {
3819
3899
  } else
3820
3900
  prep = await prepareModel(source, o);
3821
3901
  const t3 = performance.now();
3822
- const obj = createLdrObject(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
3902
+ const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
3823
3903
  for (const m of prep.missing)
3824
3904
  if (!obj.stats.missing.includes(m))
3825
3905
  obj.stats.missing.push(m);
@@ -3833,7 +3913,7 @@ async function loadModel(source, o = {}) {
3833
3913
  timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
3834
3914
  });
3835
3915
  }
3836
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/library.ts
3916
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/library.ts
3837
3917
  import { existsSync, readFileSync } from "fs";
3838
3918
  import { join } from "path";
3839
3919
  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]];
@@ -4084,11 +4164,11 @@ class Library {
4084
4164
  return insts;
4085
4165
  }
4086
4166
  }
4087
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/build-pack.ts
4167
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
4088
4168
  import fs3 from "node:fs";
4089
4169
  import path3 from "node:path";
4090
4170
 
4091
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/resolver.ts
4171
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/resolver.ts
4092
4172
  import fs from "node:fs";
4093
4173
  import path from "node:path";
4094
4174
  var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
@@ -4360,11 +4440,11 @@ function collectDeps(lib, refs) {
4360
4440
  return out;
4361
4441
  }
4362
4442
 
4363
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/compile.ts
4443
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
4364
4444
  import fs2 from "node:fs";
4365
4445
  import path2 from "node:path";
4366
4446
 
4367
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/lod.ts
4447
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/lod.ts
4368
4448
  import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
4369
4449
  await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
4370
4450
  function reorderMesh(P, N, C, I) {
@@ -4556,7 +4636,7 @@ function lodChain(P, C, I) {
4556
4636
  return out;
4557
4637
  }
4558
4638
 
4559
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/compile.ts
4639
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
4560
4640
  function loadColors(root) {
4561
4641
  const map = new Map;
4562
4642
  for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
@@ -5139,7 +5219,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
5139
5219
  return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
5140
5220
  }
5141
5221
 
5142
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/node/build-pack.ts
5222
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
5143
5223
  function buildPack(o) {
5144
5224
  const lib = new Library2(o.ldrawRoot);
5145
5225
  const refs = new Map;
@@ -5216,6 +5296,7 @@ export {
5216
5296
  REORIENT,
5217
5297
  Library2 as ResolverLibrary,
5218
5298
  buildLdrScene,
5299
+ buildLdrSceneAsync,
5219
5300
  buildPack,
5220
5301
  collectDeps,
5221
5302
  colorToken,
@@ -5227,6 +5308,7 @@ export {
5227
5308
  createInstancedConditionalEdges,
5228
5309
  createInstancedEdges,
5229
5310
  createLdrObject,
5311
+ createLdrObjectAsync,
5230
5312
  cullCore,
5231
5313
  decodePack,
5232
5314
  decompressPack,