ldr 0.14.0 → 0.16.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/cli.js +11 -11
- package/dist/index.d.ts +3 -3
- package/dist/index.js +211 -93
- package/dist/node/index.js +218 -100
- package/dist/render.d.ts +22 -21
- package/dist/scene.d.ts +23 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/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-
|
|
692
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/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-
|
|
1041
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/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-
|
|
1409
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/render.ts
|
|
1410
1410
|
import * as THREE from "three";
|
|
1411
1411
|
|
|
1412
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1412
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/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-
|
|
1431
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/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-
|
|
1748
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/render.ts
|
|
1749
1749
|
async function loadPack(url) {
|
|
1750
1750
|
const res = await fetch(url);
|
|
1751
1751
|
if (!res.ok)
|
|
@@ -2328,7 +2328,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2328
2328
|
}
|
|
2329
2329
|
}
|
|
2330
2330
|
}
|
|
2331
|
-
function
|
|
2331
|
+
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
|
|
2332
2332
|
const bKind = [], bMat = [];
|
|
2333
2333
|
const bAll = [];
|
|
2334
2334
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -2383,6 +2383,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2383
2383
|
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
2384
2384
|
const B = pp.studM;
|
|
2385
2385
|
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2386
|
+
if ((j & 32767) === 0 && j)
|
|
2387
|
+
yield;
|
|
2386
2388
|
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
2387
2389
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
2388
2390
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
@@ -2445,23 +2447,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2445
2447
|
colCache.set(c, x = color(c));
|
|
2446
2448
|
return x;
|
|
2447
2449
|
};
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
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
|
+
}
|
|
2465
2483
|
return sMesh;
|
|
2466
2484
|
}
|
|
2467
2485
|
function undersideGroups(ids, insts) {
|
|
@@ -2491,7 +2509,7 @@ function undersideGroups(ids, insts) {
|
|
|
2491
2509
|
out.push({ ids: rest, ax: null });
|
|
2492
2510
|
return out;
|
|
2493
2511
|
}
|
|
2494
|
-
function
|
|
2512
|
+
function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
2495
2513
|
const { header: H, arr } = pack;
|
|
2496
2514
|
const LOD = P.lod !== false;
|
|
2497
2515
|
const EDGES = !!P.edges;
|
|
@@ -2500,6 +2518,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2500
2518
|
root.px = P.lodPx ?? 0.5;
|
|
2501
2519
|
root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
|
|
2502
2520
|
root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
|
|
2521
|
+
yield root;
|
|
2503
2522
|
const trackVp = (r) => {
|
|
2504
2523
|
const rt = r.getRenderTarget();
|
|
2505
2524
|
const h = rt ? rt.height : r.getContext().drawingBufferHeight;
|
|
@@ -2568,9 +2587,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2568
2587
|
}
|
|
2569
2588
|
b.ids.push(i);
|
|
2570
2589
|
});
|
|
2590
|
+
yield root;
|
|
2571
2591
|
const steps = P.steps;
|
|
2572
2592
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
2573
2593
|
mark("culling");
|
|
2594
|
+
yield root;
|
|
2574
2595
|
const stepBatches = [];
|
|
2575
2596
|
const stepBatched = [];
|
|
2576
2597
|
const instM = steps ? new Float64Array(insts.length * 12) : null;
|
|
@@ -2713,6 +2734,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2713
2734
|
};
|
|
2714
2735
|
const coldByMat = new Map;
|
|
2715
2736
|
for (const [, bucket] of byPart) {
|
|
2737
|
+
yield root;
|
|
2716
2738
|
const part = bucket.part;
|
|
2717
2739
|
const p = H.parts[part];
|
|
2718
2740
|
const idsAll = bucket.ids;
|
|
@@ -2814,9 +2836,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2814
2836
|
list.push({ part, p, mat, ids: idsAll });
|
|
2815
2837
|
}
|
|
2816
2838
|
}
|
|
2839
|
+
yield root;
|
|
2817
2840
|
const tmpM = new THREE.Matrix4;
|
|
2818
2841
|
const tmpC = new THREE.Color;
|
|
2819
2842
|
for (const [mat, items] of coldByMat) {
|
|
2843
|
+
yield root;
|
|
2820
2844
|
const entries = [];
|
|
2821
2845
|
for (const it of items)
|
|
2822
2846
|
for (const id of it.ids)
|
|
@@ -3059,13 +3083,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3059
3083
|
}
|
|
3060
3084
|
}
|
|
3061
3085
|
}
|
|
3062
|
-
|
|
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;
|
|
3063
3094
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
3064
3095
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
3065
3096
|
const STUD_ERR = 12;
|
|
3066
|
-
|
|
3097
|
+
let _coopS = 0;
|
|
3098
|
+
for (let ci = 0;ci < sMesh.length; ci++) {
|
|
3099
|
+
const sm = sMesh[ci];
|
|
3067
3100
|
if (!sm)
|
|
3068
|
-
|
|
3101
|
+
continue;
|
|
3102
|
+
if ((++_coopS & 3) === 0)
|
|
3103
|
+
yield root;
|
|
3069
3104
|
const im = sm.im;
|
|
3070
3105
|
const kind = sKind[ci];
|
|
3071
3106
|
const k = H.studKinds[kind];
|
|
@@ -3094,7 +3129,8 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3094
3129
|
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
|
|
3095
3130
|
if (sm.slots)
|
|
3096
3131
|
stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
|
|
3097
|
-
}
|
|
3132
|
+
}
|
|
3133
|
+
yield root;
|
|
3098
3134
|
stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
|
|
3099
3135
|
stats.uncertBatches = nUncert;
|
|
3100
3136
|
let condOn = true, edgesOn = true;
|
|
@@ -3260,6 +3296,55 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3260
3296
|
byPart.clear();
|
|
3261
3297
|
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
|
|
3262
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
|
+
function yieldToMain() {
|
|
3307
|
+
const s = globalThis.scheduler;
|
|
3308
|
+
if (s && typeof s.yield === "function")
|
|
3309
|
+
return s.yield();
|
|
3310
|
+
return new Promise((res) => {
|
|
3311
|
+
const c = new MessageChannel;
|
|
3312
|
+
c.port1.onmessage = () => res();
|
|
3313
|
+
c.port2.postMessage(null);
|
|
3314
|
+
});
|
|
3315
|
+
}
|
|
3316
|
+
async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
|
|
3317
|
+
const sliceMs = opts.sliceMs ?? 8;
|
|
3318
|
+
const postPaint = opts.postPaintSliceMs ?? Math.max(sliceMs, 24);
|
|
3319
|
+
let painting = typeof opts.onSlice === "function";
|
|
3320
|
+
let effective = painting ? sliceMs : postPaint;
|
|
3321
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3322
|
+
let r = g.next();
|
|
3323
|
+
let sliceStart = performance.now();
|
|
3324
|
+
let longestSliceMs = 0;
|
|
3325
|
+
let yields = 0;
|
|
3326
|
+
while (!r.done) {
|
|
3327
|
+
const now = performance.now();
|
|
3328
|
+
if (now - sliceStart >= effective) {
|
|
3329
|
+
longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
|
|
3330
|
+
yields++;
|
|
3331
|
+
if (painting && opts.onSlice) {
|
|
3332
|
+
const cont = await opts.onSlice(r.value);
|
|
3333
|
+
if (cont === false) {
|
|
3334
|
+
painting = false;
|
|
3335
|
+
effective = postPaint;
|
|
3336
|
+
}
|
|
3337
|
+
}
|
|
3338
|
+
await yieldToMain();
|
|
3339
|
+
sliceStart = performance.now();
|
|
3340
|
+
}
|
|
3341
|
+
r = g.next();
|
|
3342
|
+
}
|
|
3343
|
+
longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
|
|
3344
|
+
const value = r.value;
|
|
3345
|
+
value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
|
|
3346
|
+
return value;
|
|
3347
|
+
}
|
|
3263
3348
|
async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
3264
3349
|
const { header: H, arr } = pack;
|
|
3265
3350
|
const list = [];
|
|
@@ -3282,7 +3367,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3282
3367
|
await new Promise((r) => setTimeout(r, 0));
|
|
3283
3368
|
}
|
|
3284
3369
|
}
|
|
3285
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3370
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/scene.ts
|
|
3286
3371
|
import * as THREE2 from "three";
|
|
3287
3372
|
function colorFn(src, pack, fallback) {
|
|
3288
3373
|
const table = new Map;
|
|
@@ -3342,6 +3427,12 @@ function toPlastic(old) {
|
|
|
3342
3427
|
return m;
|
|
3343
3428
|
}
|
|
3344
3429
|
function createLdrObject(instances, pack, options = {}) {
|
|
3430
|
+
return createLdrObjectInner(instances, pack, options, false);
|
|
3431
|
+
}
|
|
3432
|
+
async function createLdrObjectAsync(instances, pack, options = {}) {
|
|
3433
|
+
return createLdrObjectInner(instances, pack, options, true);
|
|
3434
|
+
}
|
|
3435
|
+
function createLdrObjectInner(instances, pack, options, progressive) {
|
|
3345
3436
|
const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
|
|
3346
3437
|
const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
|
|
3347
3438
|
const useTex = o.textures !== false;
|
|
@@ -3383,9 +3474,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3383
3474
|
};
|
|
3384
3475
|
const multiStep = uniq.length > 1;
|
|
3385
3476
|
const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
|
|
3386
|
-
const
|
|
3387
|
-
|
|
3388
|
-
cur =
|
|
3477
|
+
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 });
|
|
3478
|
+
const applyBuilt = (built, t0) => {
|
|
3479
|
+
cur = built;
|
|
3389
3480
|
pairs.clear();
|
|
3390
3481
|
if (o.material === "plastic")
|
|
3391
3482
|
cur.root.traverse((x) => {
|
|
@@ -3404,8 +3495,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3404
3495
|
cur.setCond(false);
|
|
3405
3496
|
if (!lodOn)
|
|
3406
3497
|
cur.setLod(false);
|
|
3407
|
-
|
|
3408
|
-
|
|
3498
|
+
if (cur.root.parent !== object)
|
|
3499
|
+
object.add(cur.root);
|
|
3500
|
+
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 });
|
|
3409
3501
|
api.texturesReady = cur.texturesReady;
|
|
3410
3502
|
};
|
|
3411
3503
|
const setStep = (step, mask = null) => {
|
|
@@ -3415,63 +3507,87 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3415
3507
|
Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
|
|
3416
3508
|
};
|
|
3417
3509
|
const api = { texturesReady: Promise.resolve() };
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
|
|
3435
|
-
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
p
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
},
|
|
3456
|
-
getBox: (target = new THREE2.Box3) => {
|
|
3457
|
-
object.updateMatrixWorld(true);
|
|
3458
|
-
target.makeEmpty();
|
|
3459
|
-
object.traverse((x) => {
|
|
3460
|
-
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3461
|
-
x.computeBoundingBox();
|
|
3462
|
-
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3463
|
-
target.union(b);
|
|
3510
|
+
const finish = () => {
|
|
3511
|
+
if (o.step != null)
|
|
3512
|
+
setStep(o.step);
|
|
3513
|
+
return Object.assign(api, {
|
|
3514
|
+
object,
|
|
3515
|
+
stats,
|
|
3516
|
+
stepCount: uniq.length,
|
|
3517
|
+
stepViews,
|
|
3518
|
+
setStep,
|
|
3519
|
+
setEdges: (v) => {
|
|
3520
|
+
edges = v;
|
|
3521
|
+
cur.setEdges(v);
|
|
3522
|
+
},
|
|
3523
|
+
setConditionalLines: (v) => {
|
|
3524
|
+
cond = v;
|
|
3525
|
+
cur.setCond(v);
|
|
3526
|
+
},
|
|
3527
|
+
setCulling: (a, b) => {
|
|
3528
|
+
cs = a;
|
|
3529
|
+
cu = b;
|
|
3530
|
+
if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
|
|
3531
|
+
disposeCur();
|
|
3532
|
+
const t0 = performance.now();
|
|
3533
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3534
|
+
} else
|
|
3535
|
+
cur.setCull(a, b);
|
|
3536
|
+
},
|
|
3537
|
+
setLod: (v) => {
|
|
3538
|
+
lodOn = v;
|
|
3539
|
+
cur.setLod(v);
|
|
3540
|
+
},
|
|
3541
|
+
setSide: (s) => {
|
|
3542
|
+
side = s;
|
|
3543
|
+
cur.setSide(s === "front");
|
|
3544
|
+
for (const [p, old] of pairs) {
|
|
3545
|
+
p.side = old.side;
|
|
3546
|
+
p.needsUpdate = true;
|
|
3464
3547
|
}
|
|
3465
|
-
}
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3548
|
+
},
|
|
3549
|
+
getBox: (target = new THREE2.Box3) => {
|
|
3550
|
+
object.updateMatrixWorld(true);
|
|
3551
|
+
target.makeEmpty();
|
|
3552
|
+
object.traverse((x) => {
|
|
3553
|
+
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3554
|
+
x.computeBoundingBox();
|
|
3555
|
+
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3556
|
+
target.union(b);
|
|
3557
|
+
}
|
|
3558
|
+
});
|
|
3559
|
+
return target;
|
|
3560
|
+
},
|
|
3561
|
+
dispose: disposeCur
|
|
3562
|
+
});
|
|
3563
|
+
};
|
|
3564
|
+
if (!progressive) {
|
|
3565
|
+
const t0 = performance.now();
|
|
3566
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3567
|
+
return finish();
|
|
3568
|
+
}
|
|
3569
|
+
return (async () => {
|
|
3570
|
+
const t0 = performance.now();
|
|
3571
|
+
const so = sceneOpts();
|
|
3572
|
+
if (!so.cull)
|
|
3573
|
+
so.cull = cullCore(all, pack.header, so.steps);
|
|
3574
|
+
const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
|
|
3575
|
+
sliceMs: o.sliceMs,
|
|
3576
|
+
postPaintSliceMs: o.postPaintSliceMs,
|
|
3577
|
+
onSlice: o.onSlice ? async (root) => {
|
|
3578
|
+
if (root.parent !== object)
|
|
3579
|
+
object.add(root);
|
|
3580
|
+
return await o.onSlice();
|
|
3581
|
+
} : undefined
|
|
3582
|
+
});
|
|
3583
|
+
applyBuilt(built, t0);
|
|
3584
|
+
return finish();
|
|
3585
|
+
})();
|
|
3470
3586
|
}
|
|
3471
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3587
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/parts-cdn.ts
|
|
3472
3588
|
import { decompress as decompress2 } from "fzstd";
|
|
3473
3589
|
|
|
3474
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3590
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/embedded.ts
|
|
3475
3591
|
function splitFiles(text, fallback) {
|
|
3476
3592
|
const files = new Map;
|
|
3477
3593
|
let cur = null, saw = false;
|
|
@@ -3543,7 +3659,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3543
3659
|
return out;
|
|
3544
3660
|
}
|
|
3545
3661
|
|
|
3546
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3662
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/parts-cdn.ts
|
|
3547
3663
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3548
3664
|
var indexCache = new Map;
|
|
3549
3665
|
var shardCache = new Map;
|
|
@@ -3703,10 +3819,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3703
3819
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3704
3820
|
}
|
|
3705
3821
|
|
|
3706
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3822
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/load-worker.gen.ts
|
|
3707
3823
|
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';
|
|
3708
3824
|
|
|
3709
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3825
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/cdn.ts
|
|
3710
3826
|
var worker;
|
|
3711
3827
|
var seq = 0;
|
|
3712
3828
|
var pending = new Map;
|
|
@@ -3801,7 +3917,7 @@ async function loadModel(source, o = {}) {
|
|
|
3801
3917
|
} else
|
|
3802
3918
|
prep = await prepareModel(source, o);
|
|
3803
3919
|
const t3 = performance.now();
|
|
3804
|
-
const obj =
|
|
3920
|
+
const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
|
|
3805
3921
|
for (const m of prep.missing)
|
|
3806
3922
|
if (!obj.stats.missing.includes(m))
|
|
3807
3923
|
obj.stats.missing.push(m);
|
|
@@ -3822,6 +3938,7 @@ export {
|
|
|
3822
3938
|
MIN_VIS,
|
|
3823
3939
|
REORIENT,
|
|
3824
3940
|
buildLdrScene,
|
|
3941
|
+
buildLdrSceneAsync,
|
|
3825
3942
|
colorToken,
|
|
3826
3943
|
colourMaterialKey,
|
|
3827
3944
|
colourSurface,
|
|
@@ -3831,6 +3948,7 @@ export {
|
|
|
3831
3948
|
createInstancedConditionalEdges,
|
|
3832
3949
|
createInstancedEdges,
|
|
3833
3950
|
createLdrObject,
|
|
3951
|
+
createLdrObjectAsync,
|
|
3834
3952
|
cullCore,
|
|
3835
3953
|
decodePack,
|
|
3836
3954
|
decompressPack,
|