ldr 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +11 -11
- package/dist/index.d.ts +3 -3
- package/dist/index.js +192 -93
- package/dist/node/index.js +199 -100
- package/dist/render.d.ts +13 -21
- package/dist/scene.d.ts +18 -0
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
function parseColor(tok) {
|
|
4
4
|
if (/^0x/i.test(tok))
|
|
@@ -690,7 +690,7 @@ function fileStepViews(f) {
|
|
|
690
690
|
viewMemo.set(f, out);
|
|
691
691
|
return out;
|
|
692
692
|
}
|
|
693
|
-
// ../../../../../../../tmp/ldr-build-
|
|
693
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/model.ts
|
|
694
694
|
var CALLOUT_END = 999999;
|
|
695
695
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
696
696
|
function flatten(doc, opts = {}) {
|
|
@@ -1039,7 +1039,7 @@ function parseLDConfig(text) {
|
|
|
1039
1039
|
}
|
|
1040
1040
|
return out;
|
|
1041
1041
|
}
|
|
1042
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1042
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/instructions.ts
|
|
1043
1043
|
var MIN_VIS = 0.5;
|
|
1044
1044
|
var REORIENT = 0.35;
|
|
1045
1045
|
var deg = Math.PI / 180;
|
|
@@ -1407,10 +1407,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1407
1407
|
}
|
|
1408
1408
|
};
|
|
1409
1409
|
}
|
|
1410
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1410
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
|
|
1411
1411
|
import * as THREE from "three";
|
|
1412
1412
|
|
|
1413
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1413
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/pack-io.ts
|
|
1414
1414
|
import { decompress } from "fzstd";
|
|
1415
1415
|
async function decompressPack(data) {
|
|
1416
1416
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1429,7 +1429,7 @@ function decodePack(buf) {
|
|
|
1429
1429
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1430
1430
|
}
|
|
1431
1431
|
|
|
1432
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1432
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/cull.ts
|
|
1433
1433
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1434
1434
|
var prepCache = new WeakMap;
|
|
1435
1435
|
function prepPart(H, part) {
|
|
@@ -1746,7 +1746,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1746
1746
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1747
1747
|
}
|
|
1748
1748
|
|
|
1749
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1749
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
|
|
1750
1750
|
async function loadPack(url) {
|
|
1751
1751
|
const res = await fetch(url);
|
|
1752
1752
|
if (!res.ok)
|
|
@@ -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,37 @@ 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
|
+
async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
|
|
3308
|
+
const sliceMs = opts.sliceMs ?? 8;
|
|
3309
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3310
|
+
let r = g.next();
|
|
3311
|
+
let sliceStart = performance.now();
|
|
3312
|
+
let longestSliceMs = 0;
|
|
3313
|
+
let yields = 0;
|
|
3314
|
+
while (!r.done) {
|
|
3315
|
+
const now = performance.now();
|
|
3316
|
+
if (now - sliceStart >= sliceMs) {
|
|
3317
|
+
longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
|
|
3318
|
+
yields++;
|
|
3319
|
+
if (opts.onSlice)
|
|
3320
|
+
await opts.onSlice(r.value);
|
|
3321
|
+
await new Promise((res) => setTimeout(res, 0));
|
|
3322
|
+
sliceStart = performance.now();
|
|
3323
|
+
}
|
|
3324
|
+
r = g.next();
|
|
3325
|
+
}
|
|
3326
|
+
longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
|
|
3327
|
+
const value = r.value;
|
|
3328
|
+
value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
|
|
3329
|
+
return value;
|
|
3330
|
+
}
|
|
3264
3331
|
async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
3265
3332
|
const { header: H, arr } = pack;
|
|
3266
3333
|
const list = [];
|
|
@@ -3283,7 +3350,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3283
3350
|
await new Promise((r) => setTimeout(r, 0));
|
|
3284
3351
|
}
|
|
3285
3352
|
}
|
|
3286
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3353
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/scene.ts
|
|
3287
3354
|
import * as THREE2 from "three";
|
|
3288
3355
|
function colorFn(src, pack, fallback) {
|
|
3289
3356
|
const table = new Map;
|
|
@@ -3343,6 +3410,12 @@ function toPlastic(old) {
|
|
|
3343
3410
|
return m;
|
|
3344
3411
|
}
|
|
3345
3412
|
function createLdrObject(instances, pack, options = {}) {
|
|
3413
|
+
return createLdrObjectInner(instances, pack, options, false);
|
|
3414
|
+
}
|
|
3415
|
+
async function createLdrObjectAsync(instances, pack, options = {}) {
|
|
3416
|
+
return createLdrObjectInner(instances, pack, options, true);
|
|
3417
|
+
}
|
|
3418
|
+
function createLdrObjectInner(instances, pack, options, progressive) {
|
|
3346
3419
|
const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
|
|
3347
3420
|
const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
|
|
3348
3421
|
const useTex = o.textures !== false;
|
|
@@ -3384,9 +3457,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3384
3457
|
};
|
|
3385
3458
|
const multiStep = uniq.length > 1;
|
|
3386
3459
|
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 =
|
|
3460
|
+
const sceneOpts = () => ({ cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
|
|
3461
|
+
const applyBuilt = (built, t0) => {
|
|
3462
|
+
cur = built;
|
|
3390
3463
|
pairs.clear();
|
|
3391
3464
|
if (o.material === "plastic")
|
|
3392
3465
|
cur.root.traverse((x) => {
|
|
@@ -3405,8 +3478,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3405
3478
|
cur.setCond(false);
|
|
3406
3479
|
if (!lodOn)
|
|
3407
3480
|
cur.setLod(false);
|
|
3408
|
-
|
|
3409
|
-
|
|
3481
|
+
if (cur.root.parent !== object)
|
|
3482
|
+
object.add(cur.root);
|
|
3483
|
+
Object.assign(stats, { drawn: drawnAt(null), studsTotal: cur.stats.studsTotal, studsHidden: cur.stats.studsHidden, undersTotal: cur.stats.undersTotal, undersHidden: cur.stats.undersHidden, condBatches: cur.stats.condBatches ?? 0, texBatches: cur.stats.texBatches ?? 0, textures: cur.stats.textures ?? 0, clusters: cur.stats.clusters ?? 0, longestSliceMs: cur.stats.longestSliceMs, buildYields: cur.stats.buildYields, buildMs: performance.now() - t0 });
|
|
3410
3484
|
api.texturesReady = cur.texturesReady;
|
|
3411
3485
|
};
|
|
3412
3486
|
const setStep = (step, mask = null) => {
|
|
@@ -3416,63 +3490,86 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3416
3490
|
Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
|
|
3417
3491
|
};
|
|
3418
3492
|
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);
|
|
3493
|
+
const finish = () => {
|
|
3494
|
+
if (o.step != null)
|
|
3495
|
+
setStep(o.step);
|
|
3496
|
+
return Object.assign(api, {
|
|
3497
|
+
object,
|
|
3498
|
+
stats,
|
|
3499
|
+
stepCount: uniq.length,
|
|
3500
|
+
stepViews,
|
|
3501
|
+
setStep,
|
|
3502
|
+
setEdges: (v) => {
|
|
3503
|
+
edges = v;
|
|
3504
|
+
cur.setEdges(v);
|
|
3505
|
+
},
|
|
3506
|
+
setConditionalLines: (v) => {
|
|
3507
|
+
cond = v;
|
|
3508
|
+
cur.setCond(v);
|
|
3509
|
+
},
|
|
3510
|
+
setCulling: (a, b) => {
|
|
3511
|
+
cs = a;
|
|
3512
|
+
cu = b;
|
|
3513
|
+
if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
|
|
3514
|
+
disposeCur();
|
|
3515
|
+
const t0 = performance.now();
|
|
3516
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3517
|
+
} else
|
|
3518
|
+
cur.setCull(a, b);
|
|
3519
|
+
},
|
|
3520
|
+
setLod: (v) => {
|
|
3521
|
+
lodOn = v;
|
|
3522
|
+
cur.setLod(v);
|
|
3523
|
+
},
|
|
3524
|
+
setSide: (s) => {
|
|
3525
|
+
side = s;
|
|
3526
|
+
cur.setSide(s === "front");
|
|
3527
|
+
for (const [p, old] of pairs) {
|
|
3528
|
+
p.side = old.side;
|
|
3529
|
+
p.needsUpdate = true;
|
|
3465
3530
|
}
|
|
3466
|
-
}
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3531
|
+
},
|
|
3532
|
+
getBox: (target = new THREE2.Box3) => {
|
|
3533
|
+
object.updateMatrixWorld(true);
|
|
3534
|
+
target.makeEmpty();
|
|
3535
|
+
object.traverse((x) => {
|
|
3536
|
+
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3537
|
+
x.computeBoundingBox();
|
|
3538
|
+
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3539
|
+
target.union(b);
|
|
3540
|
+
}
|
|
3541
|
+
});
|
|
3542
|
+
return target;
|
|
3543
|
+
},
|
|
3544
|
+
dispose: disposeCur
|
|
3545
|
+
});
|
|
3546
|
+
};
|
|
3547
|
+
if (!progressive) {
|
|
3548
|
+
const t0 = performance.now();
|
|
3549
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3550
|
+
return finish();
|
|
3551
|
+
}
|
|
3552
|
+
return (async () => {
|
|
3553
|
+
const t0 = performance.now();
|
|
3554
|
+
const so = sceneOpts();
|
|
3555
|
+
if (!so.cull)
|
|
3556
|
+
so.cull = cullCore(all, pack.header, so.steps);
|
|
3557
|
+
const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
|
|
3558
|
+
sliceMs: o.sliceMs,
|
|
3559
|
+
onSlice: async (root) => {
|
|
3560
|
+
if (root.parent !== object)
|
|
3561
|
+
object.add(root);
|
|
3562
|
+
await o.onSlice?.();
|
|
3563
|
+
}
|
|
3564
|
+
});
|
|
3565
|
+
applyBuilt(built, t0);
|
|
3566
|
+
return finish();
|
|
3567
|
+
})();
|
|
3471
3568
|
}
|
|
3472
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3569
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3473
3570
|
import { decompress as decompress2 } from "fzstd";
|
|
3474
3571
|
|
|
3475
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3572
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/embedded.ts
|
|
3476
3573
|
function splitFiles(text, fallback) {
|
|
3477
3574
|
const files = new Map;
|
|
3478
3575
|
let cur = null, saw = false;
|
|
@@ -3544,7 +3641,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3544
3641
|
return out;
|
|
3545
3642
|
}
|
|
3546
3643
|
|
|
3547
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3644
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3548
3645
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3549
3646
|
var indexCache = new Map;
|
|
3550
3647
|
var shardCache = new Map;
|
|
@@ -3704,10 +3801,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3704
3801
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3705
3802
|
}
|
|
3706
3803
|
|
|
3707
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3804
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/load-worker.gen.ts
|
|
3708
3805
|
var load_worker_gen_default = 'var ht=ArrayBuffer,W=Uint8Array,ge=Uint16Array,gt=Int16Array;var be=Int32Array,Ce=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},bt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},Be=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},xt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},yt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,p=Be(e,a,c);a+=c;var m=l?1<<l:s,h=Be(e,a,m)+(l==1&&256),d=h;if(!s){var C=1<<10+(e[5]>>3);d=C+(C>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:p,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return xt(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,p=o,m=new ht(512+(o<<2)),h=new gt(m,0,256),d=new ge(m,0,256),C=new ge(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,A=(1<<g+1)-1,z=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&A,x=(1<<g)-1,M=A-i-1,L=z&x;if(L<M)r+=g,z=L;else if(r+=g+1,z>x)z-=M;if(h[++l]=--z,z==-1)i+=z,b[--p]=l;else i-=z;if(!z)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var E=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var v=h[H];if(v<1){d[H]=-v;continue}for(c=0;c<v;++c){b[E]=H;do E=E+U&X;while(E>=p)}}if(E)K(0);for(c=0;c<o;++c){var w=d[b[c]]++,P=S[c]=s-re(w);C[c]=(w<<P)-o}return[r+7>>3,{b:s,s:b,n:S,t:C}]},wt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),p=c[0],m=c[1];t+=o;var h=p<<3,d=e[t];if(!d)K(0);var C=0,u=0,b=m.b,S=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(C+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=m.s[C],g-=S,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[C],C=m.t[C],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var A=e[++t];i[n]=A>>4,i[n+1]=A&15}++t}var z=0;for(n=0;n<r;++n){var x=i[n];if(x>11)K(0);z+=x&&1<<x-1}var M=re(z)+1,L=1<<M,D=L-z;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var x=i[n];++l[i[n]=x&&M+1-x]}var E=new W(L<<1),U=E.subarray(0,L),X=E.subarray(L);a[M]=0;for(n=M;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<M-n))}if(a[0]!=L)K(0);for(n=0;n<r;++n){var v=i[n];if(v){var w=a[v];ce(U,n,w,a[v]=w+(1<<M-v))}}return[t,{n:X,b:M,s:U}]},At=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],vt=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Mt=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],$e=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ct=$e(Ee,0),Se=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Et=$e(Se,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,p=(r<<3)-8+re(o)-c,m=-1;for(;p>l&&m<s;){var h=p>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(p&7);a=(a<<c|d)&i,t[++m]=n.s[a],p-=c=n.n[a]}if(p!=l||m+1!=s)K(0)},St=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},Lt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ce(e,s,a)}if(i==2){var c=e[s],p=c&3,m=c>>2&3,h=c>>4,d=0,C=0;if(p<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(C=m,m<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(p==0)u.set(e.subarray(s,s+=h),b);else if(p==1)ce(u,e[s++],b);else{var S=t.h;if(p==2){var g=wt(e,s);d+=s-(s=g[0]),t.h=S=g[1]}else if(!S)K(0);(C?St:le)(e.subarray(s,s+=d),u.subarray(b),S)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var A=e[s++];if(A&3)K(0);var z=[vt,Mt,At];for(var x=2;x>-1;--x){var M=A>>(x<<1)+2&3;if(M==1){var L=new W([0,0,e[s++]]);z[x]={s:L.subarray(2,3),n:L.subarray(0,1),t:new ge(L.buffer,0,1),b:0}}else if(M==2)r=ue(e,s,9-(x&1)),s=r[0],z[x]=r[1];else if(M==3){if(!t.t)K(0);z[x]=t.t[x]}}var D=t.t=z,E=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var v=(a<<3)-8+re(H)-X.b,w=v>>3,P=0,V=(e[w]|e[w+1]<<8)>>(v&7)&(1<<X.b)-1;w=(v-=U.b)>>3;var I=(e[w]|e[w+1]<<8)>>(v&7)&(1<<U.b)-1;w=(v-=E.b)>>3;var B=(e[w]|e[w+1]<<8)>>(v&7)&(1<<E.b)-1;for(++f;--f;){var T=X.s[V],y=X.n[V],N=E.s[B],R=E.n[B],k=U.s[I],O=U.n[I];w=(v-=k)>>3;var j=1<<k,F=j+((e[w]|e[w+1]<<8|e[w+2]<<16|e[w+3]<<24)>>>(v&7)&j-1);w=(v-=Se[N])>>3;var G=Et[N]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Se[N])-1);w=(v-=Ee[T])>>3;var _=Ct[T]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Ee[T])-1);if(w=(v-=y)>>3,V=X.t[V]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<y)-1),w=(v-=R)>>3,B=E.t[B]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<R)-1),w=(v-=O)>>3,I=U.t[I]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<O)-1),F>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=F-=3;else{var Z=F-(_!=0);if(Z){if(F=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=F}else F=t.o[0]}for(var x=0;x<_;++x)u[P+x]=u[b+x];P+=_,b+=_;var q=P-F;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var x=0;x<J;++x)u[P+x]=t.w[ee+x];P+=J,G-=J,q=0}for(var x=0;x<G;++x)u[P+x]=u[q+x];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ce(u,0,P)}else if(n){if(t.y+=h,b)for(var x=0;x<h;++x)u[x]=u[b+x]}else if(b)u=Ce(u,b);return t.b=a,u}K(2)},Tt=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function je(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=yt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Lt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,bt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Tt(n,o)}function de(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ve=/^~?\\s*moved\\s+to\\s+(.+)$/i,Pt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Ye=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),It=new Set(["model","submodel","configuration"]),Ft=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function He(e){let t=Ft.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ye.has(n)||It.has(n)?n:void 0}function Rt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function kt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Rt(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let p=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(p>0&&a[p+1])c.glossmap=a[p+1];if(t)c.next=!0;return c}var Dt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Ut(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let p=s();if(p===null)return null;i[c]=+p}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Le(o),m:i,file:Y(a)}}function Ge(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function Je(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],p=null,m=()=>{if(!a)return;let g=Dt(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(m(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],p=null,h=!0},C=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(g,f)=>{if(p){g.tex=p,p=null;return}let A=c[c.length-1];if(!A)return;if(A.fallback){if(!f)g.fallback=!0}else g.tex=A.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||C)continue;if(!o)d(t);let M=f.slice(2).trimStart(),L=M.search(/\\s/),D={t:f.charCodeAt(0)-48,color:Le(L<0?M:M.slice(0,L)),p:[],src:f};S(D,!1),o.cmds.push(D),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let M=2;while(f.charCodeAt(M)===32||f.charCodeAt(M)===9)M++;let L=M;while(L<f.length&&f.charCodeAt(L)!==32&&f.charCodeAt(L)!==9)L++;let D=f.slice(M,L);if(!Pt.has(D)){if(C||a)continue;if(!o)d(t);let E=f.slice(M),U={t:0,text:E};if(D.charCodeAt(0)===33)U.meta=D;if(p=null,h&&!o.org){let H=He(E);if(H)o.org=H}let X=E.match(Ve);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(U);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!C){let M=Ut(f);if(M){if(!o)d(t);S(M,!1),o.cmds.push(M),h=!1;continue}}let A=f.split(/\\s+/);if(+A[0]===0){let M=f.slice(1).trim();if(A[1]==="FILE"){b(),C=!1,d(M.slice(5));continue}if(A[1]==="NOFILE"){m(),o=null,C=!0;continue}if(A[1]==="!DATA"){b(),m(),o=null,C=!1,a={name:M.slice(5).trim(),chunks:[]};continue}if(C)continue;if(a){if(A[1]==="!:")a.chunks.push(A.slice(2).join(""));continue}if(!o)d(t);let L={t:0,text:M};if(A[1]==="STEP")L.step=!0,c=[],p=null;else if(A[1]==="BFC")L.bfc=A.slice(2).join(" ");else if(A[1]==="ROTSTEP")if(L.meta="ROTSTEP",L.step=!0,c=[],p=null,(A[2]??"").toUpperCase()==="END")L.rotstep={x:0,y:0,z:0,mode:"END"};else{let E=(A[5]??"REL").toUpperCase();L.rotstep={x:+A[2]||0,y:+A[3]||0,z:+A[4]||0,mode:["REL","ABS","ADD"].includes(E)?E:"REL"}}else if(A[1]==="BUFEXCHG"){L.meta="BUFEXCHG";let E=(A[2]??"").toUpperCase();L.bufexchg={op:E==="RETRIEVE"?"RETRIEVE":"STORE",buf:A[3]??"A"}}else if(A[1]?.startsWith("!"))L.meta=A[1];if(h&&!o.org){let E=He(M);if(E)o.org=E}if(A[1]==="!TEXMAP"){let E=(A[2]??"").toUpperCase();if(p=null,E==="START"||E==="NEXT"){let U=kt(M.replace(/^!TEXMAP\\s+\\S+/i,""),E==="NEXT");if(L.texmap={op:E,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),E==="START")c.push({map:U,fallback:!1});else p=U}else if(E==="FALLBACK"){L.texmap={op:E};let U=c[c.length-1];if(U)U.fallback=!0}else if(E==="END")L.texmap={op:E},c.pop()}else if(A[1]==="!:"){p=null;let E=Ge(A.slice(2));if(E)S(E,!0),L.geom=E}else p=null;let D=M.match(Ve);if(D&&!o.movedTo){let E=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=Y(E)}o.cmds.push(L);continue}if(a||C)continue;if(!o)d(t);let x=Ge(A);if(!x)continue;S(x,!1),o.cmds.push(x),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var tn=Math.PI/180;function qe(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function Qe(e,t){let[n,r,s,o,i,l,a,c,p,m,h,d]=e,[C,u,b,S,g,f,A,z,x,M,L,D]=t;return[o*C+i*u+l*b+n,a*C+c*u+p*b+r,m*C+h*u+d*b+s,o*S+i*A+l*M,o*g+i*z+l*L,o*f+i*x+l*D,a*S+c*A+p*M,a*g+c*z+p*L,a*f+c*x+p*D,m*S+h*A+d*M,m*g+h*z+d*L,m*f+h*x+d*D]}var Te=[0,0,0,1,0,0,0,1,0,0,0,1];var _e=new WeakMap,zt=/^(s|8|48)\\//;function Pe(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=_e.get(n);if(r)return r;if(n.org)r=Ye.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&zt.test(s.file))?"part":"model";return _e.set(n,r),r}var We=new WeakMap;function et(e){let t=We.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return We.set(e,t),t}var Ke=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),Ot=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ke(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ke(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Y(e)}#${t}`;function Nt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function tt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Nt(e,t).cmds.map(Ot)].join(`\n`)+`\n`}function Bt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function nt(e){let[t,n,r,s,o,i,l,a,c,p,m,h]=e,d=a*h-c*m,C=-(l*h-c*p),u=l*m-a*p,b=s*d+o*C+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,g=[d*S,-(o*h-i*m)*S,(o*c-i*a)*S,C*S,(s*h-i*p)*S,-(s*c-i*l)*S,u*S,-(s*m-o*p)*S,(s*a-o*l)*S];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var $t=(e)=>String(+e.toFixed(6)||0),Xe=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function rt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map($t).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Xe(t.texture)}${t.glossmap?" GLOSSMAP "+Xe(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Bt(r)}`,source:r}}var jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Vt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var Ze=new WeakMap;function st(e){let t=Ze.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Vt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Ze.set(e,n),n}var ot=999999,it=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Ht(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let d=m.name+"#"+h,C=l.get(d);if(!C){let u;C=Object.assign(()=>u??=tt(m,h),{file:m,step:h}),l.set(d,C)}return C},p=(m,h,d,C,u,b,S,g,f=null,A=[],z=[])=>{let x=m.files.get(h);if(!x||S>r)return;let M=0,L=S>0?++a:0,D=i&&L?[...A,L]:A,E=i&&L?[...z,d]:z,U=i&&!f?new Map:null,X=-1,H=0,v=(T,y,N,R,k,O)=>{if(X!==M)X=M,H=0;let j=U?.get(M+"|"+y);if(j)return j.n++,p(T,T===m?y:T.main,N,R,u+"/"+y,[...k,ot],S+1,O,[...k,ot],D,E);let F=[...k,H++],G=n.length;p(T,T===m?y:T.main,N,R,u+"/"+y,F,S+1,O,f,D,E),U?.set(M+"|"+y,{n:1,from:G,to:n.length})},w=st(x),P=s?et(x):[],V=0,I=(T,y,N,R,k,O,j)=>{if(f)R=f;let F={part:T,color:y,m:N,step:R[0],steps:R,localStep:k,path:u};if(L){if(F.sub=L,i)F.subPath=D,F.subMats=E}if(O)F.embedded=!0;if(j){let _=rt(T,j);F.texPart=_.name,F.texSource=_.source}let G=w[k];if(G)F.view=G;return n.push(F),F},B=(T)=>{while(V<P.length&&P[V]<=T){let y=P[V++];I(Ie(x.name,y),C,d,[...b,y],y,!1,null).source=c(x,y)}};for(let T of x.cmds){if(T.t===0&&T.step){M++;continue}let y=T;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){B(M);continue}if(y.t===0)if(o&&y.geom?.t===1)y=y.geom;else continue;if(y.t!==1)continue;if(o&&y.fallback)continue;let N=y.color===16?C:y.color,R=Qe(d,y.m),k=[...b,M],O=o?y.tex??g:null,j=O?nt(y.m):null,F=O&&j?qe(O,j):null;if(m.files.has(y.file)){if(Pe(m,y.file)==="model"){v(m,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!0,F);continue}let G=t.resolveModel?.(y.file);if(G){v(G,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!1,F)}if(B(1/0),U){for(let T of U.values())if(T.n>1)for(let y=T.from;y<T.to;y++)n[y].mult??=T.n}};if(Pe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Te],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return p(e,e.main,Te,16,e.main,[],0,null),n}function at(e,t="main.ldr",n){return Ht(Je(e,t,{geometryText:!0}),n)}function Gt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Y(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var _t=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Wt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function lt(e,t,n="main.ldr"){let r=Gt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let p of r.get(a.pop())){let m=_t(p);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((p)=>p!==i).sort()].map((p)=>"0 FILE "+(p===i?"":p)+`\n`+r.get(p).join(`\n`)).join(`\n`);s.set(i,`emb/${Wt(c)}.dat`)}return s}var ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,ut=new WeakMap;function Fe(e,t){let n=ut.get(e);if(!n)ut.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let C=0;C<12;C++)i[d*12+C]=h[2+C]});let c=null,p=0,m=0;if(s.mask){p=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:p,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Kt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],p=[],m=[],h=new Re(e.length*2),d=[],C=[];for(let v=0;v<e.length;v++){let w=e[v],P=w.m,V=t.parts[w.part];if(!V||!V.mask||!ct(P))continue;let I=V.bbox,B=1/0,T=-1/0,y=1/0,N=-1/0;for(let O=0;O<2;O++)for(let j=0;j<2;j++){let F=O?I[3]:I[0],G=j?I[5]:I[2],_=P[0]+P[3]*F+P[5]*G,Z=P[2]+P[9]*F+P[11]*G;if(_<B)B=_;if(_>T)T=_;if(Z<y)y=Z;if(Z>N)N=Z}let R=a.length;s.push(B),o.push(T),i.push(y),l.push(N),a.push(v),c.push(Fe(t,w.part)),p.push(I[0]),m.push(I[2]);let k=Math.round((P[1]+I[4])*2);for(let O=Math.floor(B/40);O<=Math.floor(T/40);O++)for(let j=Math.floor(y/40);j<=Math.floor(N/40);j++){if(!xe(k,O,j))continue;let F=C.length;C.push(R),d.push(h.put(k,O,j,F))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,g=NaN,f=NaN,A=-1,z=(v,w,P,V)=>{let I=Math.round(w*2),B=Math.floor(v/40),T=Math.floor(P/40);if(!xe(I,B,T))return fe;let y=fe;if(I!==S||B!==g||T!==f)S=I,g=B,f=T,A=h.get(I,B,T);for(let N=A;N>=0;N=d[N]){let R=C[N];if(a[R]===V||!(v-6>=s[R]-0.5&&v+6<=o[R]+0.5&&P-6>=i[R]-0.5&&P+6<=l[R]+0.5))continue;let k=e[a[R]].m,O=c[R],j=p[R],F=m[R],G=v-k[0],_=w-k[1],Z=P-k[2],q=k[3]*G+k[6]*_+k[9]*Z,J=k[5]*G+k[8]*_+k[11]*Z,{nx:ee,nz:se,mask:ae}=O,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-F)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[R]];if(Q<y)y=Q}}return y},x=0;for(let v of e){let w=Fe(t,v.part);if(w)x+=w.nStuds}let M=new Uint8Array(x),L=new Uint8Array(x),D=new Re(x),E=0,U=n?new Int32Array(x).fill(fe):void 0;for(let v=0,w=0;v<e.length;v++){let P=e[v],V=Fe(t,P.part);if(!V)continue;let I=P.m,B=V.studM,T=I[0],y=I[1],N=I[2],R=I[3],k=I[4],O=I[5],j=I[6],F=I[7],G=I[8],_=I[9],Z=I[10],q=I[11];for(let J=0;J<V.nStuds;J++,w++){let ee=J*12,se=B[ee+4],ae=B[ee+7],oe=B[ee+10];if(!(Math.abs(j*se+F*ae+G*oe-1)<0.001&&Math.abs(R*se+k*ae+O*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;L[w]=1;let Q=B[ee],te=B[ee+1],ne=B[ee+2],ke=T+R*Q+k*te+O*ne,De=y+j*Q+F*te+G*ne,Ue=N+_*Q+Z*te+q*ne,ze=z(ke,De,Ue,v);if(ze!==fe){if(M[w]=1,E++,U)U[w]=ze}let pe=Math.round(ke),me=Math.round(De),he=Math.round(Ue);if(!xe(pe,me,he))continue;if(!n){D.put(pe,me,he,1);continue}let Oe=n[v],Ne=D.get(pe,me,he);if(Ne<0||Oe<Ne)D.put(pe,me,he,Oe)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let w=e[v],P=t.parts[w.part];if(!P||!P.under||!ct(w.m))continue;let V=P.bbox,I=Math.round((V[3]-V[0])/20),B=Math.round((V[5]-V[2])/20);if(!I||!B||I*B>4096)continue;let T=w.m,y=!0,N=0;for(let R=0;R<I&&y;R++)for(let k=0;k<B;k++){let O=V[0]+10+20*R,j=V[2]+10+20*k,F=T[0]+T[3]*O+T[5]*j,G=T[2]+T[9]*O+T[11]*j,_=Math.round(F),Z=Math.round(T[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?D.get(_,Z,q):-1;if(J<0){y=!1;break}if(J>N)N=J}if(y){if(X[v]=1,H)H[v]=N}}return{nStuds:x,studHidden:M,studUp:L,underHidden:X,studsHidden:E,studHideStep:U,underHideStep:H}}function Xt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>it(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function ye(e,t,n=!0){let r=Xt(e,t,n);return Kt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Me="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,we=new Map;function pt(e=Me,t=fetch){let n=Ae.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ae.delete(e)),Ae.set(e,n);return n}var Zt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),ve=(e,t)=>Zt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function Yt(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let C=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+C),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,p=new Uint8Array(c+r);new DataView(p.buffer).setUint32(0,l.length+a,!0),p.set(l,4),p.fill(32,4+l.length,c);let m=c;for(let h of n)p.set(h,m),m+=h.byteLength;return de(p.buffer)}async function Jt(e,t={}){e=[...e];try{return await ft(e,t)}catch(n){let r=t.cdn??Me,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ft(e,{...t,fetch:o})}catch{throw n}}}async function ft(e,t){let n=t.cdn??Me,r=t.fetch??fetch,s=t.gap??16384,o=await pt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(we.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let p=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);p+=S.byteLength;for(let g of u.items){let f=je(S.subarray(g.off-u.start,g.off-u.start+g.len)),A=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);we.set(n+g.name,de(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>we.has(n+u)).map((u)=>we.get(n+u));return{pack:d.length?Yt(d,{colors:o.colors}):de(qt(o.colors)),missing:l,requests:c.length,bytes:p}}function qt(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}async function mt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=pt(t.cdn??Me,r);s.catch(()=>{});let o=t.text?e:await r(e).then((f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return f.text()}),i=performance.now(),l=t.name??(t.text?"main.ldr":decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr")),a=at(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let p=lt(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:m,missing:h,requests:d,bytes:C}=await Jt([...a.filter((f)=>!f.embedded).map((f)=>f.part),...p.values()],t),u=new Map([...p].map(([f,A])=>[A,f])),b=h.map((f)=>u.get(f)??f);for(let[f,A]of p){let z=m.header.parts[A];if(z)m.header.parts[f]=z}let S=performance.now(),g=t.cull?ye(a,m.header,t.textures!==!1):void 0;return{insts:a,pack:m,missing:b,requests:d,bytes:C,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:S-c,...g?{cull:performance.now()-S}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await mt(n,{...r,cull:!1,onParsed:(p)=>self.postMessage({id:t,insts:p})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=ye(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let p of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(p)c.push(p.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
3709
3806
|
|
|
3710
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3807
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/cdn.ts
|
|
3711
3808
|
var worker;
|
|
3712
3809
|
var seq = 0;
|
|
3713
3810
|
var pending = new Map;
|
|
@@ -3802,7 +3899,7 @@ async function loadModel(source, o = {}) {
|
|
|
3802
3899
|
} else
|
|
3803
3900
|
prep = await prepareModel(source, o);
|
|
3804
3901
|
const t3 = performance.now();
|
|
3805
|
-
const obj =
|
|
3902
|
+
const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
|
|
3806
3903
|
for (const m of prep.missing)
|
|
3807
3904
|
if (!obj.stats.missing.includes(m))
|
|
3808
3905
|
obj.stats.missing.push(m);
|
|
@@ -3816,7 +3913,7 @@ async function loadModel(source, o = {}) {
|
|
|
3816
3913
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
3817
3914
|
});
|
|
3818
3915
|
}
|
|
3819
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3916
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/library.ts
|
|
3820
3917
|
import { existsSync, readFileSync } from "fs";
|
|
3821
3918
|
import { join } from "path";
|
|
3822
3919
|
var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
|
|
@@ -4067,11 +4164,11 @@ class Library {
|
|
|
4067
4164
|
return insts;
|
|
4068
4165
|
}
|
|
4069
4166
|
}
|
|
4070
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4167
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
|
|
4071
4168
|
import fs3 from "node:fs";
|
|
4072
4169
|
import path3 from "node:path";
|
|
4073
4170
|
|
|
4074
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4171
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/resolver.ts
|
|
4075
4172
|
import fs from "node:fs";
|
|
4076
4173
|
import path from "node:path";
|
|
4077
4174
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4343,11 +4440,11 @@ function collectDeps(lib, refs) {
|
|
|
4343
4440
|
return out;
|
|
4344
4441
|
}
|
|
4345
4442
|
|
|
4346
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4443
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
|
|
4347
4444
|
import fs2 from "node:fs";
|
|
4348
4445
|
import path2 from "node:path";
|
|
4349
4446
|
|
|
4350
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4447
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/lod.ts
|
|
4351
4448
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4352
4449
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4353
4450
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4539,7 +4636,7 @@ function lodChain(P, C, I) {
|
|
|
4539
4636
|
return out;
|
|
4540
4637
|
}
|
|
4541
4638
|
|
|
4542
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4639
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
|
|
4543
4640
|
function loadColors(root) {
|
|
4544
4641
|
const map = new Map;
|
|
4545
4642
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -5122,7 +5219,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
5122
5219
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
5123
5220
|
}
|
|
5124
5221
|
|
|
5125
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5222
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
|
|
5126
5223
|
function buildPack(o) {
|
|
5127
5224
|
const lib = new Library2(o.ldrawRoot);
|
|
5128
5225
|
const refs = new Map;
|
|
@@ -5199,6 +5296,7 @@ export {
|
|
|
5199
5296
|
REORIENT,
|
|
5200
5297
|
Library2 as ResolverLibrary,
|
|
5201
5298
|
buildLdrScene,
|
|
5299
|
+
buildLdrSceneAsync,
|
|
5202
5300
|
buildPack,
|
|
5203
5301
|
collectDeps,
|
|
5204
5302
|
colorToken,
|
|
@@ -5210,6 +5308,7 @@ export {
|
|
|
5210
5308
|
createInstancedConditionalEdges,
|
|
5211
5309
|
createInstancedEdges,
|
|
5212
5310
|
createLdrObject,
|
|
5311
|
+
createLdrObjectAsync,
|
|
5213
5312
|
cullCore,
|
|
5214
5313
|
decodePack,
|
|
5215
5314
|
decompressPack,
|
package/dist/render.d.ts
CHANGED
|
@@ -70,29 +70,21 @@ export declare function computeCulling(insts: Inst[], H: any): {
|
|
|
70
70
|
}[];
|
|
71
71
|
underHidden: boolean[];
|
|
72
72
|
};
|
|
73
|
-
export declare function buildLdrScene(insts: Inst[], pack: Pack, P: LdrParams, color: (c: string) => THREE.Color, mark: (k: string) => void): {
|
|
74
|
-
root: THREE.Group;
|
|
75
|
-
stats: any;
|
|
76
|
-
setCull: (studs: boolean, under: boolean) => void;
|
|
77
|
-
setSide: (front: boolean) => void;
|
|
78
|
-
setEdges: (v: boolean) => void;
|
|
79
|
-
setCond: (v: boolean) => void;
|
|
80
|
-
setLod: (on: boolean) => void;
|
|
81
|
-
setStep: (s: number | null, mask?: ArrayLike<number | boolean> | null) => {
|
|
82
|
-
studsTotal: number;
|
|
83
|
-
studsHidden: number;
|
|
84
|
-
undersTotal: number;
|
|
85
|
-
undersHidden: number;
|
|
86
|
-
};
|
|
87
|
-
box: THREE.Box3;
|
|
88
|
-
texturesReady: Promise<void>;
|
|
89
|
-
trimmed: {
|
|
90
|
-
studs: boolean;
|
|
91
|
-
under: boolean;
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
73
|
/**
|
|
95
74
|
* Builds (and caches on the pack) the shared BufferGeometries `buildLdrScene` will use, in time slices of about `sliceMs` that yield
|
|
96
75
|
* to the event loop, until done or `stop()` returns true. Lets the main thread do this useful work while the load worker culls.
|
|
97
76
|
*/
|
|
77
|
+
/** Drive buildLdrSceneGen to completion without yielding (same as pre-Round-33 sync build). */
|
|
78
|
+
export declare function buildLdrScene(insts: Inst[], pack: Pack, P: LdrParams, color: (c: string) => THREE.Color, mark: (k: string) => void): any;
|
|
79
|
+
export type BuildLdrSceneAsyncOptions = {
|
|
80
|
+
/** Soft cap on contiguous main-thread work between yields (ms). Default 8. */
|
|
81
|
+
sliceMs?: number;
|
|
82
|
+
/** Called after each yield while the live root already holds finished batches (paint for TTFP). */
|
|
83
|
+
onSlice?: (root: THREE.Object3D) => void | Promise<void>;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Same scene as buildLdrScene, but yields to the event loop about every sliceMs so the main thread stays responsive
|
|
87
|
+
* and onSlice can render partial geometry for a fast time-to-first-pixel. Meshes are added to root as they are built.
|
|
88
|
+
*/
|
|
89
|
+
export declare function buildLdrSceneAsync(insts: Inst[], pack: Pack, P: LdrParams, color: (c: string) => THREE.Color, mark: (k: string) => void, opts?: BuildLdrSceneAsyncOptions): Promise<any>;
|
|
98
90
|
export declare function warmPackGeometry(pack: Pack, stop?: () => boolean, sliceMs?: number): Promise<void>;
|