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.
package/dist/index.js CHANGED
@@ -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))
@@ -689,7 +689,7 @@ function fileStepViews(f) {
689
689
  viewMemo.set(f, out);
690
690
  return out;
691
691
  }
692
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/model.ts
692
+ // ../../../../../../../tmp/ldr-build-MHOtAg/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 = {}) {
@@ -1038,7 +1038,7 @@ function parseLDConfig(text) {
1038
1038
  }
1039
1039
  return out;
1040
1040
  }
1041
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/instructions.ts
1041
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/instructions.ts
1042
1042
  var MIN_VIS = 0.5;
1043
1043
  var REORIENT = 0.35;
1044
1044
  var deg = Math.PI / 180;
@@ -1406,10 +1406,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1406
1406
  }
1407
1407
  };
1408
1408
  }
1409
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/render.ts
1409
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
1410
1410
  import * as THREE from "three";
1411
1411
 
1412
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/pack-io.ts
1412
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/pack-io.ts
1413
1413
  import { decompress } from "fzstd";
1414
1414
  async function decompressPack(data) {
1415
1415
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1428,7 +1428,7 @@ function decodePack(buf) {
1428
1428
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1429
1429
  }
1430
1430
 
1431
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/cull.ts
1431
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/cull.ts
1432
1432
  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;
1433
1433
  var prepCache = new WeakMap;
1434
1434
  function prepPart(H, part) {
@@ -1745,7 +1745,7 @@ function precomputeCull(instances, H, useTex = true) {
1745
1745
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
1746
1746
  }
1747
1747
 
1748
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/render.ts
1748
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
1749
1749
  async function loadPack(url) {
1750
1750
  const res = await fetch(url);
1751
1751
  if (!res.ok)
@@ -2105,41 +2105,24 @@ function newIM(g, mat, n) {
2105
2105
  im.count = n;
2106
2106
  return im;
2107
2107
  }
2108
- function applyIMBuffers(im, linked, M, C, n) {
2108
+ function trimCulledIM(im, vis, linked) {
2109
+ if (vis >= im.instanceMatrix.count || !im.instanceColor)
2110
+ return false;
2111
+ const M = im.instanceMatrix.array.slice(0, vis * 16), C = im.instanceColor.array.slice(0, vis * 3);
2109
2112
  im.instanceMatrix = new THREE.InstancedBufferAttribute(M, 16);
2110
2113
  im.instanceColor = new THREE.InstancedBufferAttribute(C, 3);
2111
- im.count = n;
2114
+ im.count = vis;
2112
2115
  for (const o of linked) {
2113
2116
  if (o.isInstancedMesh) {
2114
2117
  o.instanceMatrix = im.instanceMatrix;
2115
2118
  o.instanceColor = im.instanceColor;
2116
- o.count = n;
2119
+ o.count = vis;
2117
2120
  } else if (o.geometry) {
2118
2121
  o.geometry.setAttribute("instanceMatrix", im.instanceMatrix);
2119
- o.geometry.instanceCount = n;
2122
+ o.geometry.instanceCount = vis;
2120
2123
  }
2121
2124
  }
2122
- }
2123
- function trimCulledIM(im, vis, linked) {
2124
- const all = im.instanceMatrix.count;
2125
- if (vis >= all || !im.instanceColor)
2126
- return null;
2127
- const fullM = im.instanceMatrix.array, fullC = im.instanceColor.array;
2128
- const slimM = fullM.slice(0, vis * 16), slimC = fullC.slice(0, vis * 3);
2129
- const tailM = fullM.slice(vis * 16), tailC = fullC.slice(vis * 3);
2130
- applyIMBuffers(im, linked, slimM, slimC, vis);
2131
- return { im, linked, slimM, slimC, tailM, tailC, vis, all };
2132
- }
2133
- function setTrimmedCull(t, showAll) {
2134
- if (showAll) {
2135
- const M = new Float32Array(t.all * 16), C = new Float32Array(t.all * 3);
2136
- M.set(t.slimM);
2137
- M.set(t.tailM, t.vis * 16);
2138
- C.set(t.slimC);
2139
- C.set(t.tailC, t.vis * 3);
2140
- applyIMBuffers(t.im, t.linked, M, C, t.all);
2141
- } else
2142
- applyIMBuffers(t.im, t.linked, t.slimM, t.slimC, t.vis);
2125
+ return true;
2143
2126
  }
2144
2127
  function instancedBoundingSphere(im) {
2145
2128
  const g = im.geometry;
@@ -2345,7 +2328,7 @@ class LdrLodRoot extends THREE.LOD {
2345
2328
  }
2346
2329
  }
2347
2330
  }
2348
- function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
2331
+ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
2349
2332
  const bKind = [], bMat = [];
2350
2333
  const bAll = [];
2351
2334
  const studBucket = new Uint16Array(cull.nStuds);
@@ -2400,6 +2383,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
2400
2383
  const instNeg = det12(a) < 0 ? 1 : 0;
2401
2384
  const B = pp.studM;
2402
2385
  for (let si = 0;si < pp.nStuds; si++, j++) {
2386
+ if ((j & 32767) === 0 && j)
2387
+ yield;
2403
2388
  const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
2404
2389
  const neg = (instNeg ^ ps.neg[si]) === 1;
2405
2390
  const km = ps.kid[si] * 2 + (neg ? 1 : 0);
@@ -2462,23 +2447,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
2462
2447
  colCache.set(c, x = color(c));
2463
2448
  return x;
2464
2449
  };
2465
- forEachStud(insts, H, (j, owner, w, _kind, col, si) => {
2466
- const sm = sMesh[studCl[j]];
2467
- if (!sm)
2468
- return;
2469
- const im = sm.im;
2470
- const slot = studSlot[j];
2471
- if (sm.slots) {
2472
- const t = sm.slots;
2473
- t.own[slot] = steps[owner];
2474
- t.hide[slot] = cull.studHideStep[j];
2475
- t.inst[slot] = owner;
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
- });
2450
+ yield;
2451
+ {
2452
+ const w = new Float64Array(12);
2453
+ let j = 0;
2454
+ for (let idx = 0;idx < insts.length; idx++) {
2455
+ const it = insts[idx];
2456
+ const pp = prepPart(H, it.part);
2457
+ if (!pp || !pp.nStuds)
2458
+ continue;
2459
+ for (let si = 0;si < pp.nStuds; si++, j++) {
2460
+ if ((j & 32767) === 0 && j)
2461
+ yield;
2462
+ mul12To(it.m, pp.studM, si * 12, w);
2463
+ const sm = sMesh[studCl[j]];
2464
+ if (!sm)
2465
+ continue;
2466
+ const im = sm.im;
2467
+ const slot = studSlot[j];
2468
+ const sc = pp.color[si];
2469
+ const col = sc === "16" ? it.color : sc;
2470
+ if (sm.slots) {
2471
+ const t = sm.slots;
2472
+ t.own[slot] = steps[idx];
2473
+ t.hide[slot] = cull.studHideStep[j];
2474
+ t.inst[slot] = idx;
2475
+ t.stud[slot] = si;
2476
+ t.col[slot] = colorIndex(col);
2477
+ }
2478
+ writeM4(im.instanceMatrix.array, slot * 16, w);
2479
+ colorOf(col).toArray(im.instanceColor.array, slot * 3);
2480
+ }
2481
+ }
2482
+ }
2482
2483
  return sMesh;
2483
2484
  }
2484
2485
  function undersideGroups(ids, insts) {
@@ -2508,7 +2509,7 @@ function undersideGroups(ids, insts) {
2508
2509
  out.push({ ids: rest, ax: null });
2509
2510
  return out;
2510
2511
  }
2511
- function buildLdrScene(insts, pack, P, color, mark) {
2512
+ function* buildLdrSceneGen(insts, pack, P, color, mark) {
2512
2513
  const { header: H, arr } = pack;
2513
2514
  const LOD = P.lod !== false;
2514
2515
  const EDGES = !!P.edges;
@@ -2517,6 +2518,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2517
2518
  root.px = P.lodPx ?? 0.5;
2518
2519
  root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
2519
2520
  root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
2521
+ yield root;
2520
2522
  const trackVp = (r) => {
2521
2523
  const rt = r.getRenderTarget();
2522
2524
  const h = rt ? rt.height : r.getContext().drawingBufferHeight;
@@ -2585,9 +2587,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
2585
2587
  }
2586
2588
  b.ids.push(i);
2587
2589
  });
2590
+ yield root;
2588
2591
  const steps = P.steps;
2589
2592
  let cull = P.cull ?? cullCore(insts, H, steps);
2590
2593
  mark("culling");
2594
+ yield root;
2591
2595
  const stepBatches = [];
2592
2596
  const stepBatched = [];
2593
2597
  const instM = steps ? new Float64Array(insts.length * 12) : null;
@@ -2663,7 +2667,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2663
2667
  };
2664
2668
  const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
2665
2669
  const toggles = [];
2666
- const trimmed = [];
2670
+ const trimmed = { studs: false, under: false };
2667
2671
  const countTo = (objs) => ({ set count(n) {
2668
2672
  for (const o of objs()) {
2669
2673
  if (o.isInstancedMesh)
@@ -2730,6 +2734,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
2730
2734
  };
2731
2735
  const coldByMat = new Map;
2732
2736
  for (const [, bucket] of byPart) {
2737
+ yield root;
2733
2738
  const part = bucket.part;
2734
2739
  const p = H.parts[part];
2735
2740
  const idsAll = bucket.ids;
@@ -2818,12 +2823,10 @@ function buildLdrScene(insts, pack, P, color, mark) {
2818
2823
  if (!o.isInstancedMesh)
2819
2824
  o.geometry.instanceCount = im.count;
2820
2825
  });
2821
- toggles.push({ mesh: countTo(() => objs), all: uids.length, visible: vis, flag: "under" });
2822
- if (!steps && P.cullUnder && vis < uids.length) {
2823
- const t = trimCulledIM(im, vis, objs);
2824
- if (t)
2825
- trimmed.push(t);
2826
- }
2826
+ const trim = !steps && P.cullUnder && trimCulledIM(im, vis, objs);
2827
+ if (trim)
2828
+ trimmed.under = true;
2829
+ toggles.push({ mesh: countTo(() => objs), all: trim ? vis : uids.length, visible: vis, flag: "under" });
2827
2830
  if (steps)
2828
2831
  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]) });
2829
2832
  }
@@ -2833,9 +2836,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
2833
2836
  list.push({ part, p, mat, ids: idsAll });
2834
2837
  }
2835
2838
  }
2839
+ yield root;
2836
2840
  const tmpM = new THREE.Matrix4;
2837
2841
  const tmpC = new THREE.Color;
2838
2842
  for (const [mat, items] of coldByMat) {
2843
+ yield root;
2839
2844
  const entries = [];
2840
2845
  for (const it of items)
2841
2846
  for (const id of it.ids)
@@ -3078,13 +3083,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
3078
3083
  }
3079
3084
  }
3080
3085
  }
3081
- const sMesh = buildStudMeshes(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
3086
+ yield root;
3087
+ const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
3088
+ let _studR = _studGen.next();
3089
+ while (!_studR.done) {
3090
+ yield root;
3091
+ _studR = _studGen.next();
3092
+ }
3093
+ const sMesh = _studR.value;
3082
3094
  const sKind = sMesh.map((x) => x?.kind ?? "");
3083
3095
  const sVis = sMesh.map((x) => x?.vis ?? 0);
3084
3096
  const STUD_ERR = 12;
3085
- sMesh.forEach((sm, ci) => {
3097
+ let _coopS = 0;
3098
+ for (let ci = 0;ci < sMesh.length; ci++) {
3099
+ const sm = sMesh[ci];
3086
3100
  if (!sm)
3087
- return;
3101
+ continue;
3102
+ if ((++_coopS & 3) === 0)
3103
+ yield root;
3088
3104
  const im = sm.im;
3089
3105
  const kind = sKind[ci];
3090
3106
  const k = H.studKinds[kind];
@@ -3107,15 +3123,14 @@ function buildLdrScene(insts, pack, P, color, mark) {
3107
3123
  if (!o.isInstancedMesh)
3108
3124
  o.geometry.instanceCount = im.count;
3109
3125
  });
3110
- toggles.push({ mesh: countTo(() => objs), all, visible: vis, flag: "studs" });
3111
- if (!steps && P.cullStuds && vis < all) {
3112
- const t = trimCulledIM(im, vis, objs);
3113
- if (t)
3114
- trimmed.push(t);
3115
- }
3126
+ const trim = !steps && P.cullStuds && trimCulledIM(im, vis, objs);
3127
+ if (trim)
3128
+ trimmed.studs = true;
3129
+ toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
3116
3130
  if (sm.slots)
3117
3131
  stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
3118
- });
3132
+ }
3133
+ yield root;
3119
3134
  stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
3120
3135
  stats.uncertBatches = nUncert;
3121
3136
  let condOn = true, edgesOn = true;
@@ -3217,11 +3232,6 @@ function buildLdrScene(insts, pack, P, color, mark) {
3217
3232
  applySteps();
3218
3233
  return;
3219
3234
  }
3220
- if (trimmed.length) {
3221
- for (const t of trimmed)
3222
- setTrimmedCull(t, t.im.userData.ldrStud ? !studs : !under);
3223
- return;
3224
- }
3225
3235
  for (const t of toggles)
3226
3236
  t.mesh.count = (t.flag === "studs" ? studs : under) ? t.visible : t.all;
3227
3237
  };
@@ -3284,7 +3294,38 @@ function buildLdrScene(insts, pack, P, color, mark) {
3284
3294
  insts = null;
3285
3295
  cull = null;
3286
3296
  byPart.clear();
3287
- return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady };
3297
+ return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
3298
+ }
3299
+ function buildLdrScene(insts, pack, P, color, mark) {
3300
+ const g = buildLdrSceneGen(insts, pack, P, color, mark);
3301
+ let r = g.next();
3302
+ while (!r.done)
3303
+ r = g.next();
3304
+ return r.value;
3305
+ }
3306
+ async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
3307
+ const sliceMs = opts.sliceMs ?? 8;
3308
+ const g = buildLdrSceneGen(insts, pack, P, color, mark);
3309
+ let r = g.next();
3310
+ let sliceStart = performance.now();
3311
+ let longestSliceMs = 0;
3312
+ let yields = 0;
3313
+ while (!r.done) {
3314
+ const now = performance.now();
3315
+ if (now - sliceStart >= sliceMs) {
3316
+ longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
3317
+ yields++;
3318
+ if (opts.onSlice)
3319
+ await opts.onSlice(r.value);
3320
+ await new Promise((res) => setTimeout(res, 0));
3321
+ sliceStart = performance.now();
3322
+ }
3323
+ r = g.next();
3324
+ }
3325
+ longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
3326
+ const value = r.value;
3327
+ value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
3328
+ return value;
3288
3329
  }
3289
3330
  async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3290
3331
  const { header: H, arr } = pack;
@@ -3308,7 +3349,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3308
3349
  await new Promise((r) => setTimeout(r, 0));
3309
3350
  }
3310
3351
  }
3311
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/scene.ts
3352
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/scene.ts
3312
3353
  import * as THREE2 from "three";
3313
3354
  function colorFn(src, pack, fallback) {
3314
3355
  const table = new Map;
@@ -3368,6 +3409,12 @@ function toPlastic(old) {
3368
3409
  return m;
3369
3410
  }
3370
3411
  function createLdrObject(instances, pack, options = {}) {
3412
+ return createLdrObjectInner(instances, pack, options, false);
3413
+ }
3414
+ async function createLdrObjectAsync(instances, pack, options = {}) {
3415
+ return createLdrObjectInner(instances, pack, options, true);
3416
+ }
3417
+ function createLdrObjectInner(instances, pack, options, progressive) {
3371
3418
  const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
3372
3419
  const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
3373
3420
  const useTex = o.textures !== false;
@@ -3387,7 +3434,7 @@ function createLdrObject(instances, pack, options = {}) {
3387
3434
  object.scale.setScalar(o.scale);
3388
3435
  const pairs = new Map;
3389
3436
  let cur = null;
3390
- let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o;
3437
+ let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o, lodOn = true;
3391
3438
  const stats = { instances: all.length, drawn: 0, missing, studsTotal: 0, studsHidden: 0, undersTotal: 0, undersHidden: 0, buildMs: 0 };
3392
3439
  const disposeCur = () => {
3393
3440
  if (!cur)
@@ -3409,9 +3456,9 @@ function createLdrObject(instances, pack, options = {}) {
3409
3456
  };
3410
3457
  const multiStep = uniq.length > 1;
3411
3458
  const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
3412
- const build = () => {
3413
- const t0 = performance.now();
3414
- 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, () => {});
3459
+ 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 });
3460
+ const applyBuilt = (built, t0) => {
3461
+ cur = built;
3415
3462
  pairs.clear();
3416
3463
  if (o.material === "plastic")
3417
3464
  cur.root.traverse((x) => {
@@ -3428,8 +3475,11 @@ function createLdrObject(instances, pack, options = {}) {
3428
3475
  cur.setEdges(false);
3429
3476
  if (!cond)
3430
3477
  cur.setCond(false);
3431
- object.add(cur.root);
3432
- 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 });
3478
+ if (!lodOn)
3479
+ cur.setLod(false);
3480
+ if (cur.root.parent !== object)
3481
+ object.add(cur.root);
3482
+ 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 });
3433
3483
  api.texturesReady = cur.texturesReady;
3434
3484
  };
3435
3485
  const setStep = (step, mask = null) => {
@@ -3439,56 +3489,86 @@ function createLdrObject(instances, pack, options = {}) {
3439
3489
  Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
3440
3490
  };
3441
3491
  const api = { texturesReady: Promise.resolve() };
3442
- build();
3443
- if (o.step != null)
3444
- setStep(o.step);
3445
- return Object.assign(api, {
3446
- object,
3447
- stats,
3448
- stepCount: uniq.length,
3449
- stepViews,
3450
- setStep,
3451
- setEdges: (v) => {
3452
- edges = v;
3453
- cur.setEdges(v);
3454
- },
3455
- setConditionalLines: (v) => {
3456
- cond = v;
3457
- cur.setCond(v);
3458
- },
3459
- setCulling: (a, b) => {
3460
- cs = a;
3461
- cu = b;
3462
- cur.setCull(a, b);
3463
- },
3464
- setLod: (v) => cur.setLod(v),
3465
- setSide: (s) => {
3466
- side = s;
3467
- cur.setSide(s === "front");
3468
- for (const [p, old] of pairs) {
3469
- p.side = old.side;
3470
- p.needsUpdate = true;
3471
- }
3472
- },
3473
- getBox: (target = new THREE2.Box3) => {
3474
- object.updateMatrixWorld(true);
3475
- target.makeEmpty();
3476
- object.traverse((x) => {
3477
- if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
3478
- x.computeBoundingBox();
3479
- const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
3480
- target.union(b);
3492
+ const finish = () => {
3493
+ if (o.step != null)
3494
+ setStep(o.step);
3495
+ return Object.assign(api, {
3496
+ object,
3497
+ stats,
3498
+ stepCount: uniq.length,
3499
+ stepViews,
3500
+ setStep,
3501
+ setEdges: (v) => {
3502
+ edges = v;
3503
+ cur.setEdges(v);
3504
+ },
3505
+ setConditionalLines: (v) => {
3506
+ cond = v;
3507
+ cur.setCond(v);
3508
+ },
3509
+ setCulling: (a, b) => {
3510
+ cs = a;
3511
+ cu = b;
3512
+ if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
3513
+ disposeCur();
3514
+ const t0 = performance.now();
3515
+ applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
3516
+ } else
3517
+ cur.setCull(a, b);
3518
+ },
3519
+ setLod: (v) => {
3520
+ lodOn = v;
3521
+ cur.setLod(v);
3522
+ },
3523
+ setSide: (s) => {
3524
+ side = s;
3525
+ cur.setSide(s === "front");
3526
+ for (const [p, old] of pairs) {
3527
+ p.side = old.side;
3528
+ p.needsUpdate = true;
3481
3529
  }
3482
- });
3483
- return target;
3484
- },
3485
- dispose: disposeCur
3486
- });
3530
+ },
3531
+ getBox: (target = new THREE2.Box3) => {
3532
+ object.updateMatrixWorld(true);
3533
+ target.makeEmpty();
3534
+ object.traverse((x) => {
3535
+ if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
3536
+ x.computeBoundingBox();
3537
+ const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
3538
+ target.union(b);
3539
+ }
3540
+ });
3541
+ return target;
3542
+ },
3543
+ dispose: disposeCur
3544
+ });
3545
+ };
3546
+ if (!progressive) {
3547
+ const t0 = performance.now();
3548
+ applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
3549
+ return finish();
3550
+ }
3551
+ return (async () => {
3552
+ const t0 = performance.now();
3553
+ const so = sceneOpts();
3554
+ if (!so.cull)
3555
+ so.cull = cullCore(all, pack.header, so.steps);
3556
+ const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
3557
+ sliceMs: o.sliceMs,
3558
+ onSlice: async (root) => {
3559
+ if (root.parent !== object)
3560
+ object.add(root);
3561
+ await o.onSlice?.();
3562
+ }
3563
+ });
3564
+ applyBuilt(built, t0);
3565
+ return finish();
3566
+ })();
3487
3567
  }
3488
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
3568
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
3489
3569
  import { decompress as decompress2 } from "fzstd";
3490
3570
 
3491
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/embedded.ts
3571
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/embedded.ts
3492
3572
  function splitFiles(text, fallback) {
3493
3573
  const files = new Map;
3494
3574
  let cur = null, saw = false;
@@ -3560,7 +3640,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
3560
3640
  return out;
3561
3641
  }
3562
3642
 
3563
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
3643
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
3564
3644
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
3565
3645
  var indexCache = new Map;
3566
3646
  var shardCache = new Map;
@@ -3720,10 +3800,10 @@ async function prepareModel(source, o = {}) {
3720
3800
  return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
3721
3801
  }
3722
3802
 
3723
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/load-worker.gen.ts
3803
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/load-worker.gen.ts
3724
3804
  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';
3725
3805
 
3726
- // ../../../../../../../tmp/ldr-build-TjmzYL/src/cdn.ts
3806
+ // ../../../../../../../tmp/ldr-build-MHOtAg/src/cdn.ts
3727
3807
  var worker;
3728
3808
  var seq = 0;
3729
3809
  var pending = new Map;
@@ -3818,7 +3898,7 @@ async function loadModel(source, o = {}) {
3818
3898
  } else
3819
3899
  prep = await prepareModel(source, o);
3820
3900
  const t3 = performance.now();
3821
- const obj = createLdrObject(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
3901
+ const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
3822
3902
  for (const m of prep.missing)
3823
3903
  if (!obj.stats.missing.includes(m))
3824
3904
  obj.stats.missing.push(m);
@@ -3839,6 +3919,7 @@ export {
3839
3919
  MIN_VIS,
3840
3920
  REORIENT,
3841
3921
  buildLdrScene,
3922
+ buildLdrSceneAsync,
3842
3923
  colorToken,
3843
3924
  colourMaterialKey,
3844
3925
  colourSurface,
@@ -3848,6 +3929,7 @@ export {
3848
3929
  createInstancedConditionalEdges,
3849
3930
  createInstancedEdges,
3850
3931
  createLdrObject,
3932
+ createLdrObjectAsync,
3851
3933
  cullCore,
3852
3934
  decodePack,
3853
3935
  decompressPack,