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/node/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))
|
|
@@ -690,7 +690,7 @@ function fileStepViews(f) {
|
|
|
690
690
|
viewMemo.set(f, out);
|
|
691
691
|
return out;
|
|
692
692
|
}
|
|
693
|
-
// ../../../../../../../tmp/ldr-build-
|
|
693
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/model.ts
|
|
694
694
|
var CALLOUT_END = 999999;
|
|
695
695
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
696
696
|
function flatten(doc, opts = {}) {
|
|
@@ -1039,7 +1039,7 @@ function parseLDConfig(text) {
|
|
|
1039
1039
|
}
|
|
1040
1040
|
return out;
|
|
1041
1041
|
}
|
|
1042
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1042
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/instructions.ts
|
|
1043
1043
|
var MIN_VIS = 0.5;
|
|
1044
1044
|
var REORIENT = 0.35;
|
|
1045
1045
|
var deg = Math.PI / 180;
|
|
@@ -1407,10 +1407,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1407
1407
|
}
|
|
1408
1408
|
};
|
|
1409
1409
|
}
|
|
1410
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1410
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/render.ts
|
|
1411
1411
|
import * as THREE from "three";
|
|
1412
1412
|
|
|
1413
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1413
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/pack-io.ts
|
|
1414
1414
|
import { decompress } from "fzstd";
|
|
1415
1415
|
async function decompressPack(data) {
|
|
1416
1416
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1429,7 +1429,7 @@ function decodePack(buf) {
|
|
|
1429
1429
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1430
1430
|
}
|
|
1431
1431
|
|
|
1432
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1432
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/cull.ts
|
|
1433
1433
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1434
1434
|
var prepCache = new WeakMap;
|
|
1435
1435
|
function prepPart(H, part) {
|
|
@@ -1746,7 +1746,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1746
1746
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1747
1747
|
}
|
|
1748
1748
|
|
|
1749
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1749
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/render.ts
|
|
1750
1750
|
async function loadPack(url) {
|
|
1751
1751
|
const res = await fetch(url);
|
|
1752
1752
|
if (!res.ok)
|
|
@@ -2329,7 +2329,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2329
2329
|
}
|
|
2330
2330
|
}
|
|
2331
2331
|
}
|
|
2332
|
-
function
|
|
2332
|
+
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
|
|
2333
2333
|
const bKind = [], bMat = [];
|
|
2334
2334
|
const bAll = [];
|
|
2335
2335
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -2384,6 +2384,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2384
2384
|
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
2385
2385
|
const B = pp.studM;
|
|
2386
2386
|
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2387
|
+
if ((j & 32767) === 0 && j)
|
|
2388
|
+
yield;
|
|
2387
2389
|
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
2388
2390
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
2389
2391
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
@@ -2446,23 +2448,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2446
2448
|
colCache.set(c, x = color(c));
|
|
2447
2449
|
return x;
|
|
2448
2450
|
};
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2451
|
+
yield;
|
|
2452
|
+
{
|
|
2453
|
+
const w = new Float64Array(12);
|
|
2454
|
+
let j = 0;
|
|
2455
|
+
for (let idx = 0;idx < insts.length; idx++) {
|
|
2456
|
+
const it = insts[idx];
|
|
2457
|
+
const pp = prepPart(H, it.part);
|
|
2458
|
+
if (!pp || !pp.nStuds)
|
|
2459
|
+
continue;
|
|
2460
|
+
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2461
|
+
if ((j & 32767) === 0 && j)
|
|
2462
|
+
yield;
|
|
2463
|
+
mul12To(it.m, pp.studM, si * 12, w);
|
|
2464
|
+
const sm = sMesh[studCl[j]];
|
|
2465
|
+
if (!sm)
|
|
2466
|
+
continue;
|
|
2467
|
+
const im = sm.im;
|
|
2468
|
+
const slot = studSlot[j];
|
|
2469
|
+
const sc = pp.color[si];
|
|
2470
|
+
const col = sc === "16" ? it.color : sc;
|
|
2471
|
+
if (sm.slots) {
|
|
2472
|
+
const t = sm.slots;
|
|
2473
|
+
t.own[slot] = steps[idx];
|
|
2474
|
+
t.hide[slot] = cull.studHideStep[j];
|
|
2475
|
+
t.inst[slot] = idx;
|
|
2476
|
+
t.stud[slot] = si;
|
|
2477
|
+
t.col[slot] = colorIndex(col);
|
|
2478
|
+
}
|
|
2479
|
+
writeM4(im.instanceMatrix.array, slot * 16, w);
|
|
2480
|
+
colorOf(col).toArray(im.instanceColor.array, slot * 3);
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
}
|
|
2466
2484
|
return sMesh;
|
|
2467
2485
|
}
|
|
2468
2486
|
function undersideGroups(ids, insts) {
|
|
@@ -2492,7 +2510,7 @@ function undersideGroups(ids, insts) {
|
|
|
2492
2510
|
out.push({ ids: rest, ax: null });
|
|
2493
2511
|
return out;
|
|
2494
2512
|
}
|
|
2495
|
-
function
|
|
2513
|
+
function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
2496
2514
|
const { header: H, arr } = pack;
|
|
2497
2515
|
const LOD = P.lod !== false;
|
|
2498
2516
|
const EDGES = !!P.edges;
|
|
@@ -2501,6 +2519,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2501
2519
|
root.px = P.lodPx ?? 0.5;
|
|
2502
2520
|
root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
|
|
2503
2521
|
root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
|
|
2522
|
+
yield root;
|
|
2504
2523
|
const trackVp = (r) => {
|
|
2505
2524
|
const rt = r.getRenderTarget();
|
|
2506
2525
|
const h = rt ? rt.height : r.getContext().drawingBufferHeight;
|
|
@@ -2569,9 +2588,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2569
2588
|
}
|
|
2570
2589
|
b.ids.push(i);
|
|
2571
2590
|
});
|
|
2591
|
+
yield root;
|
|
2572
2592
|
const steps = P.steps;
|
|
2573
2593
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
2574
2594
|
mark("culling");
|
|
2595
|
+
yield root;
|
|
2575
2596
|
const stepBatches = [];
|
|
2576
2597
|
const stepBatched = [];
|
|
2577
2598
|
const instM = steps ? new Float64Array(insts.length * 12) : null;
|
|
@@ -2714,6 +2735,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2714
2735
|
};
|
|
2715
2736
|
const coldByMat = new Map;
|
|
2716
2737
|
for (const [, bucket] of byPart) {
|
|
2738
|
+
yield root;
|
|
2717
2739
|
const part = bucket.part;
|
|
2718
2740
|
const p = H.parts[part];
|
|
2719
2741
|
const idsAll = bucket.ids;
|
|
@@ -2815,9 +2837,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2815
2837
|
list.push({ part, p, mat, ids: idsAll });
|
|
2816
2838
|
}
|
|
2817
2839
|
}
|
|
2840
|
+
yield root;
|
|
2818
2841
|
const tmpM = new THREE.Matrix4;
|
|
2819
2842
|
const tmpC = new THREE.Color;
|
|
2820
2843
|
for (const [mat, items] of coldByMat) {
|
|
2844
|
+
yield root;
|
|
2821
2845
|
const entries = [];
|
|
2822
2846
|
for (const it of items)
|
|
2823
2847
|
for (const id of it.ids)
|
|
@@ -3060,13 +3084,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3060
3084
|
}
|
|
3061
3085
|
}
|
|
3062
3086
|
}
|
|
3063
|
-
|
|
3087
|
+
yield root;
|
|
3088
|
+
const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
|
|
3089
|
+
let _studR = _studGen.next();
|
|
3090
|
+
while (!_studR.done) {
|
|
3091
|
+
yield root;
|
|
3092
|
+
_studR = _studGen.next();
|
|
3093
|
+
}
|
|
3094
|
+
const sMesh = _studR.value;
|
|
3064
3095
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
3065
3096
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
3066
3097
|
const STUD_ERR = 12;
|
|
3067
|
-
|
|
3098
|
+
let _coopS = 0;
|
|
3099
|
+
for (let ci = 0;ci < sMesh.length; ci++) {
|
|
3100
|
+
const sm = sMesh[ci];
|
|
3068
3101
|
if (!sm)
|
|
3069
|
-
|
|
3102
|
+
continue;
|
|
3103
|
+
if ((++_coopS & 3) === 0)
|
|
3104
|
+
yield root;
|
|
3070
3105
|
const im = sm.im;
|
|
3071
3106
|
const kind = sKind[ci];
|
|
3072
3107
|
const k = H.studKinds[kind];
|
|
@@ -3095,7 +3130,8 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3095
3130
|
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
|
|
3096
3131
|
if (sm.slots)
|
|
3097
3132
|
stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
|
|
3098
|
-
}
|
|
3133
|
+
}
|
|
3134
|
+
yield root;
|
|
3099
3135
|
stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
|
|
3100
3136
|
stats.uncertBatches = nUncert;
|
|
3101
3137
|
let condOn = true, edgesOn = true;
|
|
@@ -3261,6 +3297,55 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3261
3297
|
byPart.clear();
|
|
3262
3298
|
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
|
|
3263
3299
|
}
|
|
3300
|
+
function buildLdrScene(insts, pack, P, color, mark) {
|
|
3301
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3302
|
+
let r = g.next();
|
|
3303
|
+
while (!r.done)
|
|
3304
|
+
r = g.next();
|
|
3305
|
+
return r.value;
|
|
3306
|
+
}
|
|
3307
|
+
function yieldToMain() {
|
|
3308
|
+
const s = globalThis.scheduler;
|
|
3309
|
+
if (s && typeof s.yield === "function")
|
|
3310
|
+
return s.yield();
|
|
3311
|
+
return new Promise((res) => {
|
|
3312
|
+
const c = new MessageChannel;
|
|
3313
|
+
c.port1.onmessage = () => res();
|
|
3314
|
+
c.port2.postMessage(null);
|
|
3315
|
+
});
|
|
3316
|
+
}
|
|
3317
|
+
async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
|
|
3318
|
+
const sliceMs = opts.sliceMs ?? 8;
|
|
3319
|
+
const postPaint = opts.postPaintSliceMs ?? Math.max(sliceMs, 24);
|
|
3320
|
+
let painting = typeof opts.onSlice === "function";
|
|
3321
|
+
let effective = painting ? sliceMs : postPaint;
|
|
3322
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3323
|
+
let r = g.next();
|
|
3324
|
+
let sliceStart = performance.now();
|
|
3325
|
+
let longestSliceMs = 0;
|
|
3326
|
+
let yields = 0;
|
|
3327
|
+
while (!r.done) {
|
|
3328
|
+
const now = performance.now();
|
|
3329
|
+
if (now - sliceStart >= effective) {
|
|
3330
|
+
longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
|
|
3331
|
+
yields++;
|
|
3332
|
+
if (painting && opts.onSlice) {
|
|
3333
|
+
const cont = await opts.onSlice(r.value);
|
|
3334
|
+
if (cont === false) {
|
|
3335
|
+
painting = false;
|
|
3336
|
+
effective = postPaint;
|
|
3337
|
+
}
|
|
3338
|
+
}
|
|
3339
|
+
await yieldToMain();
|
|
3340
|
+
sliceStart = performance.now();
|
|
3341
|
+
}
|
|
3342
|
+
r = g.next();
|
|
3343
|
+
}
|
|
3344
|
+
longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
|
|
3345
|
+
const value = r.value;
|
|
3346
|
+
value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
|
|
3347
|
+
return value;
|
|
3348
|
+
}
|
|
3264
3349
|
async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
3265
3350
|
const { header: H, arr } = pack;
|
|
3266
3351
|
const list = [];
|
|
@@ -3283,7 +3368,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3283
3368
|
await new Promise((r) => setTimeout(r, 0));
|
|
3284
3369
|
}
|
|
3285
3370
|
}
|
|
3286
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3371
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/scene.ts
|
|
3287
3372
|
import * as THREE2 from "three";
|
|
3288
3373
|
function colorFn(src, pack, fallback) {
|
|
3289
3374
|
const table = new Map;
|
|
@@ -3343,6 +3428,12 @@ function toPlastic(old) {
|
|
|
3343
3428
|
return m;
|
|
3344
3429
|
}
|
|
3345
3430
|
function createLdrObject(instances, pack, options = {}) {
|
|
3431
|
+
return createLdrObjectInner(instances, pack, options, false);
|
|
3432
|
+
}
|
|
3433
|
+
async function createLdrObjectAsync(instances, pack, options = {}) {
|
|
3434
|
+
return createLdrObjectInner(instances, pack, options, true);
|
|
3435
|
+
}
|
|
3436
|
+
function createLdrObjectInner(instances, pack, options, progressive) {
|
|
3346
3437
|
const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
|
|
3347
3438
|
const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
|
|
3348
3439
|
const useTex = o.textures !== false;
|
|
@@ -3384,9 +3475,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3384
3475
|
};
|
|
3385
3476
|
const multiStep = uniq.length > 1;
|
|
3386
3477
|
const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
|
|
3387
|
-
const
|
|
3388
|
-
|
|
3389
|
-
cur =
|
|
3478
|
+
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 });
|
|
3479
|
+
const applyBuilt = (built, t0) => {
|
|
3480
|
+
cur = built;
|
|
3390
3481
|
pairs.clear();
|
|
3391
3482
|
if (o.material === "plastic")
|
|
3392
3483
|
cur.root.traverse((x) => {
|
|
@@ -3405,8 +3496,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3405
3496
|
cur.setCond(false);
|
|
3406
3497
|
if (!lodOn)
|
|
3407
3498
|
cur.setLod(false);
|
|
3408
|
-
|
|
3409
|
-
|
|
3499
|
+
if (cur.root.parent !== object)
|
|
3500
|
+
object.add(cur.root);
|
|
3501
|
+
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 });
|
|
3410
3502
|
api.texturesReady = cur.texturesReady;
|
|
3411
3503
|
};
|
|
3412
3504
|
const setStep = (step, mask = null) => {
|
|
@@ -3416,63 +3508,87 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3416
3508
|
Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
|
|
3417
3509
|
};
|
|
3418
3510
|
const api = { texturesReady: Promise.resolve() };
|
|
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
|
-
|
|
3453
|
-
p
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
},
|
|
3457
|
-
getBox: (target = new THREE2.Box3) => {
|
|
3458
|
-
object.updateMatrixWorld(true);
|
|
3459
|
-
target.makeEmpty();
|
|
3460
|
-
object.traverse((x) => {
|
|
3461
|
-
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3462
|
-
x.computeBoundingBox();
|
|
3463
|
-
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3464
|
-
target.union(b);
|
|
3511
|
+
const finish = () => {
|
|
3512
|
+
if (o.step != null)
|
|
3513
|
+
setStep(o.step);
|
|
3514
|
+
return Object.assign(api, {
|
|
3515
|
+
object,
|
|
3516
|
+
stats,
|
|
3517
|
+
stepCount: uniq.length,
|
|
3518
|
+
stepViews,
|
|
3519
|
+
setStep,
|
|
3520
|
+
setEdges: (v) => {
|
|
3521
|
+
edges = v;
|
|
3522
|
+
cur.setEdges(v);
|
|
3523
|
+
},
|
|
3524
|
+
setConditionalLines: (v) => {
|
|
3525
|
+
cond = v;
|
|
3526
|
+
cur.setCond(v);
|
|
3527
|
+
},
|
|
3528
|
+
setCulling: (a, b) => {
|
|
3529
|
+
cs = a;
|
|
3530
|
+
cu = b;
|
|
3531
|
+
if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
|
|
3532
|
+
disposeCur();
|
|
3533
|
+
const t0 = performance.now();
|
|
3534
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3535
|
+
} else
|
|
3536
|
+
cur.setCull(a, b);
|
|
3537
|
+
},
|
|
3538
|
+
setLod: (v) => {
|
|
3539
|
+
lodOn = v;
|
|
3540
|
+
cur.setLod(v);
|
|
3541
|
+
},
|
|
3542
|
+
setSide: (s) => {
|
|
3543
|
+
side = s;
|
|
3544
|
+
cur.setSide(s === "front");
|
|
3545
|
+
for (const [p, old] of pairs) {
|
|
3546
|
+
p.side = old.side;
|
|
3547
|
+
p.needsUpdate = true;
|
|
3465
3548
|
}
|
|
3466
|
-
}
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3549
|
+
},
|
|
3550
|
+
getBox: (target = new THREE2.Box3) => {
|
|
3551
|
+
object.updateMatrixWorld(true);
|
|
3552
|
+
target.makeEmpty();
|
|
3553
|
+
object.traverse((x) => {
|
|
3554
|
+
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3555
|
+
x.computeBoundingBox();
|
|
3556
|
+
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3557
|
+
target.union(b);
|
|
3558
|
+
}
|
|
3559
|
+
});
|
|
3560
|
+
return target;
|
|
3561
|
+
},
|
|
3562
|
+
dispose: disposeCur
|
|
3563
|
+
});
|
|
3564
|
+
};
|
|
3565
|
+
if (!progressive) {
|
|
3566
|
+
const t0 = performance.now();
|
|
3567
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3568
|
+
return finish();
|
|
3569
|
+
}
|
|
3570
|
+
return (async () => {
|
|
3571
|
+
const t0 = performance.now();
|
|
3572
|
+
const so = sceneOpts();
|
|
3573
|
+
if (!so.cull)
|
|
3574
|
+
so.cull = cullCore(all, pack.header, so.steps);
|
|
3575
|
+
const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
|
|
3576
|
+
sliceMs: o.sliceMs,
|
|
3577
|
+
postPaintSliceMs: o.postPaintSliceMs,
|
|
3578
|
+
onSlice: o.onSlice ? async (root) => {
|
|
3579
|
+
if (root.parent !== object)
|
|
3580
|
+
object.add(root);
|
|
3581
|
+
return await o.onSlice();
|
|
3582
|
+
} : undefined
|
|
3583
|
+
});
|
|
3584
|
+
applyBuilt(built, t0);
|
|
3585
|
+
return finish();
|
|
3586
|
+
})();
|
|
3471
3587
|
}
|
|
3472
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3588
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/parts-cdn.ts
|
|
3473
3589
|
import { decompress as decompress2 } from "fzstd";
|
|
3474
3590
|
|
|
3475
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3591
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/embedded.ts
|
|
3476
3592
|
function splitFiles(text, fallback) {
|
|
3477
3593
|
const files = new Map;
|
|
3478
3594
|
let cur = null, saw = false;
|
|
@@ -3544,7 +3660,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3544
3660
|
return out;
|
|
3545
3661
|
}
|
|
3546
3662
|
|
|
3547
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3663
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/parts-cdn.ts
|
|
3548
3664
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3549
3665
|
var indexCache = new Map;
|
|
3550
3666
|
var shardCache = new Map;
|
|
@@ -3704,10 +3820,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3704
3820
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3705
3821
|
}
|
|
3706
3822
|
|
|
3707
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3823
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/load-worker.gen.ts
|
|
3708
3824
|
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';
|
|
3709
3825
|
|
|
3710
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3826
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/cdn.ts
|
|
3711
3827
|
var worker;
|
|
3712
3828
|
var seq = 0;
|
|
3713
3829
|
var pending = new Map;
|
|
@@ -3802,7 +3918,7 @@ async function loadModel(source, o = {}) {
|
|
|
3802
3918
|
} else
|
|
3803
3919
|
prep = await prepareModel(source, o);
|
|
3804
3920
|
const t3 = performance.now();
|
|
3805
|
-
const obj =
|
|
3921
|
+
const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
|
|
3806
3922
|
for (const m of prep.missing)
|
|
3807
3923
|
if (!obj.stats.missing.includes(m))
|
|
3808
3924
|
obj.stats.missing.push(m);
|
|
@@ -3816,7 +3932,7 @@ async function loadModel(source, o = {}) {
|
|
|
3816
3932
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
3817
3933
|
});
|
|
3818
3934
|
}
|
|
3819
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3935
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/library.ts
|
|
3820
3936
|
import { existsSync, readFileSync } from "fs";
|
|
3821
3937
|
import { join } from "path";
|
|
3822
3938
|
var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
|
|
@@ -4067,11 +4183,11 @@ class Library {
|
|
|
4067
4183
|
return insts;
|
|
4068
4184
|
}
|
|
4069
4185
|
}
|
|
4070
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4186
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/build-pack.ts
|
|
4071
4187
|
import fs3 from "node:fs";
|
|
4072
4188
|
import path3 from "node:path";
|
|
4073
4189
|
|
|
4074
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4190
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/resolver.ts
|
|
4075
4191
|
import fs from "node:fs";
|
|
4076
4192
|
import path from "node:path";
|
|
4077
4193
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4343,11 +4459,11 @@ function collectDeps(lib, refs) {
|
|
|
4343
4459
|
return out;
|
|
4344
4460
|
}
|
|
4345
4461
|
|
|
4346
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4462
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/compile.ts
|
|
4347
4463
|
import fs2 from "node:fs";
|
|
4348
4464
|
import path2 from "node:path";
|
|
4349
4465
|
|
|
4350
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4466
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/lod.ts
|
|
4351
4467
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4352
4468
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4353
4469
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4539,7 +4655,7 @@ function lodChain(P, C, I) {
|
|
|
4539
4655
|
return out;
|
|
4540
4656
|
}
|
|
4541
4657
|
|
|
4542
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4658
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/compile.ts
|
|
4543
4659
|
function loadColors(root) {
|
|
4544
4660
|
const map = new Map;
|
|
4545
4661
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -5122,7 +5238,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
5122
5238
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
5123
5239
|
}
|
|
5124
5240
|
|
|
5125
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5241
|
+
// ../../../../../../../tmp/ldr-build-8f2mWh/src/node/build-pack.ts
|
|
5126
5242
|
function buildPack(o) {
|
|
5127
5243
|
const lib = new Library2(o.ldrawRoot);
|
|
5128
5244
|
const refs = new Map;
|
|
@@ -5199,6 +5315,7 @@ export {
|
|
|
5199
5315
|
REORIENT,
|
|
5200
5316
|
Library2 as ResolverLibrary,
|
|
5201
5317
|
buildLdrScene,
|
|
5318
|
+
buildLdrSceneAsync,
|
|
5202
5319
|
buildPack,
|
|
5203
5320
|
collectDeps,
|
|
5204
5321
|
colorToken,
|
|
@@ -5210,6 +5327,7 @@ export {
|
|
|
5210
5327
|
createInstancedConditionalEdges,
|
|
5211
5328
|
createInstancedEdges,
|
|
5212
5329
|
createLdrObject,
|
|
5330
|
+
createLdrObjectAsync,
|
|
5213
5331
|
cullCore,
|
|
5214
5332
|
decodePack,
|
|
5215
5333
|
decompressPack,
|