ldr 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +11 -11
- package/dist/index.d.ts +3 -3
- package/dist/index.js +213 -131
- package/dist/node/index.js +220 -138
- package/dist/render.d.ts +13 -17
- package/dist/scene.d.ts +20 -0
- package/package.json +1 -1
package/dist/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))
|
|
@@ -689,7 +689,7 @@ function fileStepViews(f) {
|
|
|
689
689
|
viewMemo.set(f, out);
|
|
690
690
|
return out;
|
|
691
691
|
}
|
|
692
|
-
// ../../../../../../../tmp/ldr-build-
|
|
692
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/model.ts
|
|
693
693
|
var CALLOUT_END = 999999;
|
|
694
694
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
695
695
|
function flatten(doc, opts = {}) {
|
|
@@ -1038,7 +1038,7 @@ function parseLDConfig(text) {
|
|
|
1038
1038
|
}
|
|
1039
1039
|
return out;
|
|
1040
1040
|
}
|
|
1041
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1041
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/instructions.ts
|
|
1042
1042
|
var MIN_VIS = 0.5;
|
|
1043
1043
|
var REORIENT = 0.35;
|
|
1044
1044
|
var deg = Math.PI / 180;
|
|
@@ -1406,10 +1406,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1406
1406
|
}
|
|
1407
1407
|
};
|
|
1408
1408
|
}
|
|
1409
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1409
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
|
|
1410
1410
|
import * as THREE from "three";
|
|
1411
1411
|
|
|
1412
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1412
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/pack-io.ts
|
|
1413
1413
|
import { decompress } from "fzstd";
|
|
1414
1414
|
async function decompressPack(data) {
|
|
1415
1415
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1428,7 +1428,7 @@ function decodePack(buf) {
|
|
|
1428
1428
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1429
1429
|
}
|
|
1430
1430
|
|
|
1431
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1431
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/cull.ts
|
|
1432
1432
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1433
1433
|
var prepCache = new WeakMap;
|
|
1434
1434
|
function prepPart(H, part) {
|
|
@@ -1745,7 +1745,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1745
1745
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1746
1746
|
}
|
|
1747
1747
|
|
|
1748
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1748
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/render.ts
|
|
1749
1749
|
async function loadPack(url) {
|
|
1750
1750
|
const res = await fetch(url);
|
|
1751
1751
|
if (!res.ok)
|
|
@@ -2105,41 +2105,24 @@ function newIM(g, mat, n) {
|
|
|
2105
2105
|
im.count = n;
|
|
2106
2106
|
return im;
|
|
2107
2107
|
}
|
|
2108
|
-
function
|
|
2108
|
+
function trimCulledIM(im, vis, linked) {
|
|
2109
|
+
if (vis >= im.instanceMatrix.count || !im.instanceColor)
|
|
2110
|
+
return false;
|
|
2111
|
+
const M = im.instanceMatrix.array.slice(0, vis * 16), C = im.instanceColor.array.slice(0, vis * 3);
|
|
2109
2112
|
im.instanceMatrix = new THREE.InstancedBufferAttribute(M, 16);
|
|
2110
2113
|
im.instanceColor = new THREE.InstancedBufferAttribute(C, 3);
|
|
2111
|
-
im.count =
|
|
2114
|
+
im.count = vis;
|
|
2112
2115
|
for (const o of linked) {
|
|
2113
2116
|
if (o.isInstancedMesh) {
|
|
2114
2117
|
o.instanceMatrix = im.instanceMatrix;
|
|
2115
2118
|
o.instanceColor = im.instanceColor;
|
|
2116
|
-
o.count =
|
|
2119
|
+
o.count = vis;
|
|
2117
2120
|
} else if (o.geometry) {
|
|
2118
2121
|
o.geometry.setAttribute("instanceMatrix", im.instanceMatrix);
|
|
2119
|
-
o.geometry.instanceCount =
|
|
2122
|
+
o.geometry.instanceCount = vis;
|
|
2120
2123
|
}
|
|
2121
2124
|
}
|
|
2122
|
-
|
|
2123
|
-
function trimCulledIM(im, vis, linked) {
|
|
2124
|
-
const all = im.instanceMatrix.count;
|
|
2125
|
-
if (vis >= all || !im.instanceColor)
|
|
2126
|
-
return null;
|
|
2127
|
-
const fullM = im.instanceMatrix.array, fullC = im.instanceColor.array;
|
|
2128
|
-
const slimM = fullM.slice(0, vis * 16), slimC = fullC.slice(0, vis * 3);
|
|
2129
|
-
const tailM = fullM.slice(vis * 16), tailC = fullC.slice(vis * 3);
|
|
2130
|
-
applyIMBuffers(im, linked, slimM, slimC, vis);
|
|
2131
|
-
return { im, linked, slimM, slimC, tailM, tailC, vis, all };
|
|
2132
|
-
}
|
|
2133
|
-
function setTrimmedCull(t, showAll) {
|
|
2134
|
-
if (showAll) {
|
|
2135
|
-
const M = new Float32Array(t.all * 16), C = new Float32Array(t.all * 3);
|
|
2136
|
-
M.set(t.slimM);
|
|
2137
|
-
M.set(t.tailM, t.vis * 16);
|
|
2138
|
-
C.set(t.slimC);
|
|
2139
|
-
C.set(t.tailC, t.vis * 3);
|
|
2140
|
-
applyIMBuffers(t.im, t.linked, M, C, t.all);
|
|
2141
|
-
} else
|
|
2142
|
-
applyIMBuffers(t.im, t.linked, t.slimM, t.slimC, t.vis);
|
|
2125
|
+
return true;
|
|
2143
2126
|
}
|
|
2144
2127
|
function instancedBoundingSphere(im) {
|
|
2145
2128
|
const g = im.geometry;
|
|
@@ -2345,7 +2328,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2345
2328
|
}
|
|
2346
2329
|
}
|
|
2347
2330
|
}
|
|
2348
|
-
function
|
|
2331
|
+
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
|
|
2349
2332
|
const bKind = [], bMat = [];
|
|
2350
2333
|
const bAll = [];
|
|
2351
2334
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -2400,6 +2383,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2400
2383
|
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
2401
2384
|
const B = pp.studM;
|
|
2402
2385
|
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2386
|
+
if ((j & 32767) === 0 && j)
|
|
2387
|
+
yield;
|
|
2403
2388
|
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
2404
2389
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
2405
2390
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
@@ -2462,23 +2447,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2462
2447
|
colCache.set(c, x = color(c));
|
|
2463
2448
|
return x;
|
|
2464
2449
|
};
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2450
|
+
yield;
|
|
2451
|
+
{
|
|
2452
|
+
const w = new Float64Array(12);
|
|
2453
|
+
let j = 0;
|
|
2454
|
+
for (let idx = 0;idx < insts.length; idx++) {
|
|
2455
|
+
const it = insts[idx];
|
|
2456
|
+
const pp = prepPart(H, it.part);
|
|
2457
|
+
if (!pp || !pp.nStuds)
|
|
2458
|
+
continue;
|
|
2459
|
+
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2460
|
+
if ((j & 32767) === 0 && j)
|
|
2461
|
+
yield;
|
|
2462
|
+
mul12To(it.m, pp.studM, si * 12, w);
|
|
2463
|
+
const sm = sMesh[studCl[j]];
|
|
2464
|
+
if (!sm)
|
|
2465
|
+
continue;
|
|
2466
|
+
const im = sm.im;
|
|
2467
|
+
const slot = studSlot[j];
|
|
2468
|
+
const sc = pp.color[si];
|
|
2469
|
+
const col = sc === "16" ? it.color : sc;
|
|
2470
|
+
if (sm.slots) {
|
|
2471
|
+
const t = sm.slots;
|
|
2472
|
+
t.own[slot] = steps[idx];
|
|
2473
|
+
t.hide[slot] = cull.studHideStep[j];
|
|
2474
|
+
t.inst[slot] = idx;
|
|
2475
|
+
t.stud[slot] = si;
|
|
2476
|
+
t.col[slot] = colorIndex(col);
|
|
2477
|
+
}
|
|
2478
|
+
writeM4(im.instanceMatrix.array, slot * 16, w);
|
|
2479
|
+
colorOf(col).toArray(im.instanceColor.array, slot * 3);
|
|
2480
|
+
}
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2482
2483
|
return sMesh;
|
|
2483
2484
|
}
|
|
2484
2485
|
function undersideGroups(ids, insts) {
|
|
@@ -2508,7 +2509,7 @@ function undersideGroups(ids, insts) {
|
|
|
2508
2509
|
out.push({ ids: rest, ax: null });
|
|
2509
2510
|
return out;
|
|
2510
2511
|
}
|
|
2511
|
-
function
|
|
2512
|
+
function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
2512
2513
|
const { header: H, arr } = pack;
|
|
2513
2514
|
const LOD = P.lod !== false;
|
|
2514
2515
|
const EDGES = !!P.edges;
|
|
@@ -2517,6 +2518,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2517
2518
|
root.px = P.lodPx ?? 0.5;
|
|
2518
2519
|
root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
|
|
2519
2520
|
root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
|
|
2521
|
+
yield root;
|
|
2520
2522
|
const trackVp = (r) => {
|
|
2521
2523
|
const rt = r.getRenderTarget();
|
|
2522
2524
|
const h = rt ? rt.height : r.getContext().drawingBufferHeight;
|
|
@@ -2585,9 +2587,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2585
2587
|
}
|
|
2586
2588
|
b.ids.push(i);
|
|
2587
2589
|
});
|
|
2590
|
+
yield root;
|
|
2588
2591
|
const steps = P.steps;
|
|
2589
2592
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
2590
2593
|
mark("culling");
|
|
2594
|
+
yield root;
|
|
2591
2595
|
const stepBatches = [];
|
|
2592
2596
|
const stepBatched = [];
|
|
2593
2597
|
const instM = steps ? new Float64Array(insts.length * 12) : null;
|
|
@@ -2663,7 +2667,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2663
2667
|
};
|
|
2664
2668
|
const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
|
|
2665
2669
|
const toggles = [];
|
|
2666
|
-
const trimmed =
|
|
2670
|
+
const trimmed = { studs: false, under: false };
|
|
2667
2671
|
const countTo = (objs) => ({ set count(n) {
|
|
2668
2672
|
for (const o of objs()) {
|
|
2669
2673
|
if (o.isInstancedMesh)
|
|
@@ -2730,6 +2734,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2730
2734
|
};
|
|
2731
2735
|
const coldByMat = new Map;
|
|
2732
2736
|
for (const [, bucket] of byPart) {
|
|
2737
|
+
yield root;
|
|
2733
2738
|
const part = bucket.part;
|
|
2734
2739
|
const p = H.parts[part];
|
|
2735
2740
|
const idsAll = bucket.ids;
|
|
@@ -2818,12 +2823,10 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2818
2823
|
if (!o.isInstancedMesh)
|
|
2819
2824
|
o.geometry.instanceCount = im.count;
|
|
2820
2825
|
});
|
|
2821
|
-
|
|
2822
|
-
if (
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
trimmed.push(t);
|
|
2826
|
-
}
|
|
2826
|
+
const trim = !steps && P.cullUnder && trimCulledIM(im, vis, objs);
|
|
2827
|
+
if (trim)
|
|
2828
|
+
trimmed.under = true;
|
|
2829
|
+
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : uids.length, visible: vis, flag: "under" });
|
|
2827
2830
|
if (steps)
|
|
2828
2831
|
stepBatches.push({ im, objs, own: Int32Array.from(ord, (id) => steps[id]), hide: Int32Array.from(ord, (id) => cull.underHideStep[id]), flag: "under", inst: Int32Array.from(ord), stud: null, col: Uint16Array.from(ord, (id) => instCol[id]) });
|
|
2829
2832
|
}
|
|
@@ -2833,9 +2836,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2833
2836
|
list.push({ part, p, mat, ids: idsAll });
|
|
2834
2837
|
}
|
|
2835
2838
|
}
|
|
2839
|
+
yield root;
|
|
2836
2840
|
const tmpM = new THREE.Matrix4;
|
|
2837
2841
|
const tmpC = new THREE.Color;
|
|
2838
2842
|
for (const [mat, items] of coldByMat) {
|
|
2843
|
+
yield root;
|
|
2839
2844
|
const entries = [];
|
|
2840
2845
|
for (const it of items)
|
|
2841
2846
|
for (const id of it.ids)
|
|
@@ -3078,13 +3083,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3078
3083
|
}
|
|
3079
3084
|
}
|
|
3080
3085
|
}
|
|
3081
|
-
|
|
3086
|
+
yield root;
|
|
3087
|
+
const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
|
|
3088
|
+
let _studR = _studGen.next();
|
|
3089
|
+
while (!_studR.done) {
|
|
3090
|
+
yield root;
|
|
3091
|
+
_studR = _studGen.next();
|
|
3092
|
+
}
|
|
3093
|
+
const sMesh = _studR.value;
|
|
3082
3094
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
3083
3095
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
3084
3096
|
const STUD_ERR = 12;
|
|
3085
|
-
|
|
3097
|
+
let _coopS = 0;
|
|
3098
|
+
for (let ci = 0;ci < sMesh.length; ci++) {
|
|
3099
|
+
const sm = sMesh[ci];
|
|
3086
3100
|
if (!sm)
|
|
3087
|
-
|
|
3101
|
+
continue;
|
|
3102
|
+
if ((++_coopS & 3) === 0)
|
|
3103
|
+
yield root;
|
|
3088
3104
|
const im = sm.im;
|
|
3089
3105
|
const kind = sKind[ci];
|
|
3090
3106
|
const k = H.studKinds[kind];
|
|
@@ -3107,15 +3123,14 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3107
3123
|
if (!o.isInstancedMesh)
|
|
3108
3124
|
o.geometry.instanceCount = im.count;
|
|
3109
3125
|
});
|
|
3110
|
-
|
|
3111
|
-
if (
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
trimmed.push(t);
|
|
3115
|
-
}
|
|
3126
|
+
const trim = !steps && P.cullStuds && trimCulledIM(im, vis, objs);
|
|
3127
|
+
if (trim)
|
|
3128
|
+
trimmed.studs = true;
|
|
3129
|
+
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
|
|
3116
3130
|
if (sm.slots)
|
|
3117
3131
|
stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
|
|
3118
|
-
}
|
|
3132
|
+
}
|
|
3133
|
+
yield root;
|
|
3119
3134
|
stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
|
|
3120
3135
|
stats.uncertBatches = nUncert;
|
|
3121
3136
|
let condOn = true, edgesOn = true;
|
|
@@ -3217,11 +3232,6 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3217
3232
|
applySteps();
|
|
3218
3233
|
return;
|
|
3219
3234
|
}
|
|
3220
|
-
if (trimmed.length) {
|
|
3221
|
-
for (const t of trimmed)
|
|
3222
|
-
setTrimmedCull(t, t.im.userData.ldrStud ? !studs : !under);
|
|
3223
|
-
return;
|
|
3224
|
-
}
|
|
3225
3235
|
for (const t of toggles)
|
|
3226
3236
|
t.mesh.count = (t.flag === "studs" ? studs : under) ? t.visible : t.all;
|
|
3227
3237
|
};
|
|
@@ -3284,7 +3294,38 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3284
3294
|
insts = null;
|
|
3285
3295
|
cull = null;
|
|
3286
3296
|
byPart.clear();
|
|
3287
|
-
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady };
|
|
3297
|
+
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
|
|
3298
|
+
}
|
|
3299
|
+
function buildLdrScene(insts, pack, P, color, mark) {
|
|
3300
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3301
|
+
let r = g.next();
|
|
3302
|
+
while (!r.done)
|
|
3303
|
+
r = g.next();
|
|
3304
|
+
return r.value;
|
|
3305
|
+
}
|
|
3306
|
+
async function buildLdrSceneAsync(insts, pack, P, color, mark, opts = {}) {
|
|
3307
|
+
const sliceMs = opts.sliceMs ?? 8;
|
|
3308
|
+
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
3309
|
+
let r = g.next();
|
|
3310
|
+
let sliceStart = performance.now();
|
|
3311
|
+
let longestSliceMs = 0;
|
|
3312
|
+
let yields = 0;
|
|
3313
|
+
while (!r.done) {
|
|
3314
|
+
const now = performance.now();
|
|
3315
|
+
if (now - sliceStart >= sliceMs) {
|
|
3316
|
+
longestSliceMs = Math.max(longestSliceMs, now - sliceStart);
|
|
3317
|
+
yields++;
|
|
3318
|
+
if (opts.onSlice)
|
|
3319
|
+
await opts.onSlice(r.value);
|
|
3320
|
+
await new Promise((res) => setTimeout(res, 0));
|
|
3321
|
+
sliceStart = performance.now();
|
|
3322
|
+
}
|
|
3323
|
+
r = g.next();
|
|
3324
|
+
}
|
|
3325
|
+
longestSliceMs = Math.max(longestSliceMs, performance.now() - sliceStart);
|
|
3326
|
+
const value = r.value;
|
|
3327
|
+
value.stats = { ...value.stats, longestSliceMs: +longestSliceMs.toFixed(2), buildYields: yields };
|
|
3328
|
+
return value;
|
|
3288
3329
|
}
|
|
3289
3330
|
async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
3290
3331
|
const { header: H, arr } = pack;
|
|
@@ -3308,7 +3349,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3308
3349
|
await new Promise((r) => setTimeout(r, 0));
|
|
3309
3350
|
}
|
|
3310
3351
|
}
|
|
3311
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3352
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/scene.ts
|
|
3312
3353
|
import * as THREE2 from "three";
|
|
3313
3354
|
function colorFn(src, pack, fallback) {
|
|
3314
3355
|
const table = new Map;
|
|
@@ -3368,6 +3409,12 @@ function toPlastic(old) {
|
|
|
3368
3409
|
return m;
|
|
3369
3410
|
}
|
|
3370
3411
|
function createLdrObject(instances, pack, options = {}) {
|
|
3412
|
+
return createLdrObjectInner(instances, pack, options, false);
|
|
3413
|
+
}
|
|
3414
|
+
async function createLdrObjectAsync(instances, pack, options = {}) {
|
|
3415
|
+
return createLdrObjectInner(instances, pack, options, true);
|
|
3416
|
+
}
|
|
3417
|
+
function createLdrObjectInner(instances, pack, options, progressive) {
|
|
3371
3418
|
const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
|
|
3372
3419
|
const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
|
|
3373
3420
|
const useTex = o.textures !== false;
|
|
@@ -3387,7 +3434,7 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3387
3434
|
object.scale.setScalar(o.scale);
|
|
3388
3435
|
const pairs = new Map;
|
|
3389
3436
|
let cur = null;
|
|
3390
|
-
let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o;
|
|
3437
|
+
let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o, lodOn = true;
|
|
3391
3438
|
const stats = { instances: all.length, drawn: 0, missing, studsTotal: 0, studsHidden: 0, undersTotal: 0, undersHidden: 0, buildMs: 0 };
|
|
3392
3439
|
const disposeCur = () => {
|
|
3393
3440
|
if (!cur)
|
|
@@ -3409,9 +3456,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3409
3456
|
};
|
|
3410
3457
|
const multiStep = uniq.length > 1;
|
|
3411
3458
|
const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
|
|
3412
|
-
const
|
|
3413
|
-
|
|
3414
|
-
cur =
|
|
3459
|
+
const sceneOpts = () => ({ cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
|
|
3460
|
+
const applyBuilt = (built, t0) => {
|
|
3461
|
+
cur = built;
|
|
3415
3462
|
pairs.clear();
|
|
3416
3463
|
if (o.material === "plastic")
|
|
3417
3464
|
cur.root.traverse((x) => {
|
|
@@ -3428,8 +3475,11 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3428
3475
|
cur.setEdges(false);
|
|
3429
3476
|
if (!cond)
|
|
3430
3477
|
cur.setCond(false);
|
|
3431
|
-
|
|
3432
|
-
|
|
3478
|
+
if (!lodOn)
|
|
3479
|
+
cur.setLod(false);
|
|
3480
|
+
if (cur.root.parent !== object)
|
|
3481
|
+
object.add(cur.root);
|
|
3482
|
+
Object.assign(stats, { drawn: drawnAt(null), studsTotal: cur.stats.studsTotal, studsHidden: cur.stats.studsHidden, undersTotal: cur.stats.undersTotal, undersHidden: cur.stats.undersHidden, condBatches: cur.stats.condBatches ?? 0, texBatches: cur.stats.texBatches ?? 0, textures: cur.stats.textures ?? 0, clusters: cur.stats.clusters ?? 0, longestSliceMs: cur.stats.longestSliceMs, buildYields: cur.stats.buildYields, buildMs: performance.now() - t0 });
|
|
3433
3483
|
api.texturesReady = cur.texturesReady;
|
|
3434
3484
|
};
|
|
3435
3485
|
const setStep = (step, mask = null) => {
|
|
@@ -3439,56 +3489,86 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3439
3489
|
Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
|
|
3440
3490
|
};
|
|
3441
3491
|
const api = { texturesReady: Promise.resolve() };
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3480
|
-
target.union(b);
|
|
3492
|
+
const finish = () => {
|
|
3493
|
+
if (o.step != null)
|
|
3494
|
+
setStep(o.step);
|
|
3495
|
+
return Object.assign(api, {
|
|
3496
|
+
object,
|
|
3497
|
+
stats,
|
|
3498
|
+
stepCount: uniq.length,
|
|
3499
|
+
stepViews,
|
|
3500
|
+
setStep,
|
|
3501
|
+
setEdges: (v) => {
|
|
3502
|
+
edges = v;
|
|
3503
|
+
cur.setEdges(v);
|
|
3504
|
+
},
|
|
3505
|
+
setConditionalLines: (v) => {
|
|
3506
|
+
cond = v;
|
|
3507
|
+
cur.setCond(v);
|
|
3508
|
+
},
|
|
3509
|
+
setCulling: (a, b) => {
|
|
3510
|
+
cs = a;
|
|
3511
|
+
cu = b;
|
|
3512
|
+
if (!a && cur.trimmed.studs || !b && cur.trimmed.under) {
|
|
3513
|
+
disposeCur();
|
|
3514
|
+
const t0 = performance.now();
|
|
3515
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3516
|
+
} else
|
|
3517
|
+
cur.setCull(a, b);
|
|
3518
|
+
},
|
|
3519
|
+
setLod: (v) => {
|
|
3520
|
+
lodOn = v;
|
|
3521
|
+
cur.setLod(v);
|
|
3522
|
+
},
|
|
3523
|
+
setSide: (s) => {
|
|
3524
|
+
side = s;
|
|
3525
|
+
cur.setSide(s === "front");
|
|
3526
|
+
for (const [p, old] of pairs) {
|
|
3527
|
+
p.side = old.side;
|
|
3528
|
+
p.needsUpdate = true;
|
|
3481
3529
|
}
|
|
3482
|
-
}
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3530
|
+
},
|
|
3531
|
+
getBox: (target = new THREE2.Box3) => {
|
|
3532
|
+
object.updateMatrixWorld(true);
|
|
3533
|
+
target.makeEmpty();
|
|
3534
|
+
object.traverse((x) => {
|
|
3535
|
+
if (x.isInstancedMesh && x.count && !x.userData.ldrLod) {
|
|
3536
|
+
x.computeBoundingBox();
|
|
3537
|
+
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3538
|
+
target.union(b);
|
|
3539
|
+
}
|
|
3540
|
+
});
|
|
3541
|
+
return target;
|
|
3542
|
+
},
|
|
3543
|
+
dispose: disposeCur
|
|
3544
|
+
});
|
|
3545
|
+
};
|
|
3546
|
+
if (!progressive) {
|
|
3547
|
+
const t0 = performance.now();
|
|
3548
|
+
applyBuilt(buildLdrScene(all, pack, sceneOpts(), color, () => {}), t0);
|
|
3549
|
+
return finish();
|
|
3550
|
+
}
|
|
3551
|
+
return (async () => {
|
|
3552
|
+
const t0 = performance.now();
|
|
3553
|
+
const so = sceneOpts();
|
|
3554
|
+
if (!so.cull)
|
|
3555
|
+
so.cull = cullCore(all, pack.header, so.steps);
|
|
3556
|
+
const built = await buildLdrSceneAsync(all, pack, so, color, () => {}, {
|
|
3557
|
+
sliceMs: o.sliceMs,
|
|
3558
|
+
onSlice: async (root) => {
|
|
3559
|
+
if (root.parent !== object)
|
|
3560
|
+
object.add(root);
|
|
3561
|
+
await o.onSlice?.();
|
|
3562
|
+
}
|
|
3563
|
+
});
|
|
3564
|
+
applyBuilt(built, t0);
|
|
3565
|
+
return finish();
|
|
3566
|
+
})();
|
|
3487
3567
|
}
|
|
3488
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3568
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3489
3569
|
import { decompress as decompress2 } from "fzstd";
|
|
3490
3570
|
|
|
3491
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3571
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/embedded.ts
|
|
3492
3572
|
function splitFiles(text, fallback) {
|
|
3493
3573
|
const files = new Map;
|
|
3494
3574
|
let cur = null, saw = false;
|
|
@@ -3560,7 +3640,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3560
3640
|
return out;
|
|
3561
3641
|
}
|
|
3562
3642
|
|
|
3563
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3643
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3564
3644
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3565
3645
|
var indexCache = new Map;
|
|
3566
3646
|
var shardCache = new Map;
|
|
@@ -3720,10 +3800,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3720
3800
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3721
3801
|
}
|
|
3722
3802
|
|
|
3723
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3803
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/load-worker.gen.ts
|
|
3724
3804
|
var load_worker_gen_default = 'var ht=ArrayBuffer,W=Uint8Array,ge=Uint16Array,gt=Int16Array;var be=Int32Array,Ce=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},bt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},Be=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},xt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},yt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,p=Be(e,a,c);a+=c;var m=l?1<<l:s,h=Be(e,a,m)+(l==1&&256),d=h;if(!s){var C=1<<10+(e[5]>>3);d=C+(C>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:p,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return xt(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,p=o,m=new ht(512+(o<<2)),h=new gt(m,0,256),d=new ge(m,0,256),C=new ge(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,A=(1<<g+1)-1,z=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&A,x=(1<<g)-1,M=A-i-1,L=z&x;if(L<M)r+=g,z=L;else if(r+=g+1,z>x)z-=M;if(h[++l]=--z,z==-1)i+=z,b[--p]=l;else i-=z;if(!z)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var E=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var v=h[H];if(v<1){d[H]=-v;continue}for(c=0;c<v;++c){b[E]=H;do E=E+U&X;while(E>=p)}}if(E)K(0);for(c=0;c<o;++c){var w=d[b[c]]++,P=S[c]=s-re(w);C[c]=(w<<P)-o}return[r+7>>3,{b:s,s:b,n:S,t:C}]},wt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),p=c[0],m=c[1];t+=o;var h=p<<3,d=e[t];if(!d)K(0);var C=0,u=0,b=m.b,S=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(C+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=m.s[C],g-=S,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[C],C=m.t[C],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var A=e[++t];i[n]=A>>4,i[n+1]=A&15}++t}var z=0;for(n=0;n<r;++n){var x=i[n];if(x>11)K(0);z+=x&&1<<x-1}var M=re(z)+1,L=1<<M,D=L-z;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var x=i[n];++l[i[n]=x&&M+1-x]}var E=new W(L<<1),U=E.subarray(0,L),X=E.subarray(L);a[M]=0;for(n=M;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<M-n))}if(a[0]!=L)K(0);for(n=0;n<r;++n){var v=i[n];if(v){var w=a[v];ce(U,n,w,a[v]=w+(1<<M-v))}}return[t,{n:X,b:M,s:U}]},At=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],vt=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Mt=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],$e=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ct=$e(Ee,0),Se=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Et=$e(Se,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,p=(r<<3)-8+re(o)-c,m=-1;for(;p>l&&m<s;){var h=p>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(p&7);a=(a<<c|d)&i,t[++m]=n.s[a],p-=c=n.n[a]}if(p!=l||m+1!=s)K(0)},St=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},Lt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ce(e,s,a)}if(i==2){var c=e[s],p=c&3,m=c>>2&3,h=c>>4,d=0,C=0;if(p<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(C=m,m<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(p==0)u.set(e.subarray(s,s+=h),b);else if(p==1)ce(u,e[s++],b);else{var S=t.h;if(p==2){var g=wt(e,s);d+=s-(s=g[0]),t.h=S=g[1]}else if(!S)K(0);(C?St:le)(e.subarray(s,s+=d),u.subarray(b),S)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var A=e[s++];if(A&3)K(0);var z=[vt,Mt,At];for(var x=2;x>-1;--x){var M=A>>(x<<1)+2&3;if(M==1){var L=new W([0,0,e[s++]]);z[x]={s:L.subarray(2,3),n:L.subarray(0,1),t:new ge(L.buffer,0,1),b:0}}else if(M==2)r=ue(e,s,9-(x&1)),s=r[0],z[x]=r[1];else if(M==3){if(!t.t)K(0);z[x]=t.t[x]}}var D=t.t=z,E=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var v=(a<<3)-8+re(H)-X.b,w=v>>3,P=0,V=(e[w]|e[w+1]<<8)>>(v&7)&(1<<X.b)-1;w=(v-=U.b)>>3;var I=(e[w]|e[w+1]<<8)>>(v&7)&(1<<U.b)-1;w=(v-=E.b)>>3;var B=(e[w]|e[w+1]<<8)>>(v&7)&(1<<E.b)-1;for(++f;--f;){var T=X.s[V],y=X.n[V],N=E.s[B],R=E.n[B],k=U.s[I],O=U.n[I];w=(v-=k)>>3;var j=1<<k,F=j+((e[w]|e[w+1]<<8|e[w+2]<<16|e[w+3]<<24)>>>(v&7)&j-1);w=(v-=Se[N])>>3;var G=Et[N]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Se[N])-1);w=(v-=Ee[T])>>3;var _=Ct[T]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Ee[T])-1);if(w=(v-=y)>>3,V=X.t[V]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<y)-1),w=(v-=R)>>3,B=E.t[B]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<R)-1),w=(v-=O)>>3,I=U.t[I]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<O)-1),F>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=F-=3;else{var Z=F-(_!=0);if(Z){if(F=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=F}else F=t.o[0]}for(var x=0;x<_;++x)u[P+x]=u[b+x];P+=_,b+=_;var q=P-F;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var x=0;x<J;++x)u[P+x]=t.w[ee+x];P+=J,G-=J,q=0}for(var x=0;x<G;++x)u[P+x]=u[q+x];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ce(u,0,P)}else if(n){if(t.y+=h,b)for(var x=0;x<h;++x)u[x]=u[b+x]}else if(b)u=Ce(u,b);return t.b=a,u}K(2)},Tt=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function je(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=yt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Lt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,bt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Tt(n,o)}function de(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ve=/^~?\\s*moved\\s+to\\s+(.+)$/i,Pt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Ye=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),It=new Set(["model","submodel","configuration"]),Ft=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function He(e){let t=Ft.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ye.has(n)||It.has(n)?n:void 0}function Rt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function kt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Rt(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let p=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(p>0&&a[p+1])c.glossmap=a[p+1];if(t)c.next=!0;return c}var Dt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Ut(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let p=s();if(p===null)return null;i[c]=+p}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Le(o),m:i,file:Y(a)}}function Ge(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function Je(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],p=null,m=()=>{if(!a)return;let g=Dt(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(m(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],p=null,h=!0},C=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(g,f)=>{if(p){g.tex=p,p=null;return}let A=c[c.length-1];if(!A)return;if(A.fallback){if(!f)g.fallback=!0}else g.tex=A.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||C)continue;if(!o)d(t);let M=f.slice(2).trimStart(),L=M.search(/\\s/),D={t:f.charCodeAt(0)-48,color:Le(L<0?M:M.slice(0,L)),p:[],src:f};S(D,!1),o.cmds.push(D),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let M=2;while(f.charCodeAt(M)===32||f.charCodeAt(M)===9)M++;let L=M;while(L<f.length&&f.charCodeAt(L)!==32&&f.charCodeAt(L)!==9)L++;let D=f.slice(M,L);if(!Pt.has(D)){if(C||a)continue;if(!o)d(t);let E=f.slice(M),U={t:0,text:E};if(D.charCodeAt(0)===33)U.meta=D;if(p=null,h&&!o.org){let H=He(E);if(H)o.org=H}let X=E.match(Ve);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(U);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!C){let M=Ut(f);if(M){if(!o)d(t);S(M,!1),o.cmds.push(M),h=!1;continue}}let A=f.split(/\\s+/);if(+A[0]===0){let M=f.slice(1).trim();if(A[1]==="FILE"){b(),C=!1,d(M.slice(5));continue}if(A[1]==="NOFILE"){m(),o=null,C=!0;continue}if(A[1]==="!DATA"){b(),m(),o=null,C=!1,a={name:M.slice(5).trim(),chunks:[]};continue}if(C)continue;if(a){if(A[1]==="!:")a.chunks.push(A.slice(2).join(""));continue}if(!o)d(t);let L={t:0,text:M};if(A[1]==="STEP")L.step=!0,c=[],p=null;else if(A[1]==="BFC")L.bfc=A.slice(2).join(" ");else if(A[1]==="ROTSTEP")if(L.meta="ROTSTEP",L.step=!0,c=[],p=null,(A[2]??"").toUpperCase()==="END")L.rotstep={x:0,y:0,z:0,mode:"END"};else{let E=(A[5]??"REL").toUpperCase();L.rotstep={x:+A[2]||0,y:+A[3]||0,z:+A[4]||0,mode:["REL","ABS","ADD"].includes(E)?E:"REL"}}else if(A[1]==="BUFEXCHG"){L.meta="BUFEXCHG";let E=(A[2]??"").toUpperCase();L.bufexchg={op:E==="RETRIEVE"?"RETRIEVE":"STORE",buf:A[3]??"A"}}else if(A[1]?.startsWith("!"))L.meta=A[1];if(h&&!o.org){let E=He(M);if(E)o.org=E}if(A[1]==="!TEXMAP"){let E=(A[2]??"").toUpperCase();if(p=null,E==="START"||E==="NEXT"){let U=kt(M.replace(/^!TEXMAP\\s+\\S+/i,""),E==="NEXT");if(L.texmap={op:E,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),E==="START")c.push({map:U,fallback:!1});else p=U}else if(E==="FALLBACK"){L.texmap={op:E};let U=c[c.length-1];if(U)U.fallback=!0}else if(E==="END")L.texmap={op:E},c.pop()}else if(A[1]==="!:"){p=null;let E=Ge(A.slice(2));if(E)S(E,!0),L.geom=E}else p=null;let D=M.match(Ve);if(D&&!o.movedTo){let E=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=Y(E)}o.cmds.push(L);continue}if(a||C)continue;if(!o)d(t);let x=Ge(A);if(!x)continue;S(x,!1),o.cmds.push(x),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var tn=Math.PI/180;function qe(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function Qe(e,t){let[n,r,s,o,i,l,a,c,p,m,h,d]=e,[C,u,b,S,g,f,A,z,x,M,L,D]=t;return[o*C+i*u+l*b+n,a*C+c*u+p*b+r,m*C+h*u+d*b+s,o*S+i*A+l*M,o*g+i*z+l*L,o*f+i*x+l*D,a*S+c*A+p*M,a*g+c*z+p*L,a*f+c*x+p*D,m*S+h*A+d*M,m*g+h*z+d*L,m*f+h*x+d*D]}var Te=[0,0,0,1,0,0,0,1,0,0,0,1];var _e=new WeakMap,zt=/^(s|8|48)\\//;function Pe(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=_e.get(n);if(r)return r;if(n.org)r=Ye.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&zt.test(s.file))?"part":"model";return _e.set(n,r),r}var We=new WeakMap;function et(e){let t=We.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return We.set(e,t),t}var Ke=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),Ot=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ke(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ke(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Y(e)}#${t}`;function Nt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function tt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Nt(e,t).cmds.map(Ot)].join(`\n`)+`\n`}function Bt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function nt(e){let[t,n,r,s,o,i,l,a,c,p,m,h]=e,d=a*h-c*m,C=-(l*h-c*p),u=l*m-a*p,b=s*d+o*C+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,g=[d*S,-(o*h-i*m)*S,(o*c-i*a)*S,C*S,(s*h-i*p)*S,-(s*c-i*l)*S,u*S,-(s*m-o*p)*S,(s*a-o*l)*S];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var $t=(e)=>String(+e.toFixed(6)||0),Xe=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function rt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map($t).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Xe(t.texture)}${t.glossmap?" GLOSSMAP "+Xe(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Bt(r)}`,source:r}}var jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Vt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var Ze=new WeakMap;function st(e){let t=Ze.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Vt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Ze.set(e,n),n}var ot=999999,it=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Ht(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let d=m.name+"#"+h,C=l.get(d);if(!C){let u;C=Object.assign(()=>u??=tt(m,h),{file:m,step:h}),l.set(d,C)}return C},p=(m,h,d,C,u,b,S,g,f=null,A=[],z=[])=>{let x=m.files.get(h);if(!x||S>r)return;let M=0,L=S>0?++a:0,D=i&&L?[...A,L]:A,E=i&&L?[...z,d]:z,U=i&&!f?new Map:null,X=-1,H=0,v=(T,y,N,R,k,O)=>{if(X!==M)X=M,H=0;let j=U?.get(M+"|"+y);if(j)return j.n++,p(T,T===m?y:T.main,N,R,u+"/"+y,[...k,ot],S+1,O,[...k,ot],D,E);let F=[...k,H++],G=n.length;p(T,T===m?y:T.main,N,R,u+"/"+y,F,S+1,O,f,D,E),U?.set(M+"|"+y,{n:1,from:G,to:n.length})},w=st(x),P=s?et(x):[],V=0,I=(T,y,N,R,k,O,j)=>{if(f)R=f;let F={part:T,color:y,m:N,step:R[0],steps:R,localStep:k,path:u};if(L){if(F.sub=L,i)F.subPath=D,F.subMats=E}if(O)F.embedded=!0;if(j){let _=rt(T,j);F.texPart=_.name,F.texSource=_.source}let G=w[k];if(G)F.view=G;return n.push(F),F},B=(T)=>{while(V<P.length&&P[V]<=T){let y=P[V++];I(Ie(x.name,y),C,d,[...b,y],y,!1,null).source=c(x,y)}};for(let T of x.cmds){if(T.t===0&&T.step){M++;continue}let y=T;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){B(M);continue}if(y.t===0)if(o&&y.geom?.t===1)y=y.geom;else continue;if(y.t!==1)continue;if(o&&y.fallback)continue;let N=y.color===16?C:y.color,R=Qe(d,y.m),k=[...b,M],O=o?y.tex??g:null,j=O?nt(y.m):null,F=O&&j?qe(O,j):null;if(m.files.has(y.file)){if(Pe(m,y.file)==="model"){v(m,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!0,F);continue}let G=t.resolveModel?.(y.file);if(G){v(G,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!1,F)}if(B(1/0),U){for(let T of U.values())if(T.n>1)for(let y=T.from;y<T.to;y++)n[y].mult??=T.n}};if(Pe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Te],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return p(e,e.main,Te,16,e.main,[],0,null),n}function at(e,t="main.ldr",n){return Ht(Je(e,t,{geometryText:!0}),n)}function Gt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Y(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var _t=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Wt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function lt(e,t,n="main.ldr"){let r=Gt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let p of r.get(a.pop())){let m=_t(p);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((p)=>p!==i).sort()].map((p)=>"0 FILE "+(p===i?"":p)+`\n`+r.get(p).join(`\n`)).join(`\n`);s.set(i,`emb/${Wt(c)}.dat`)}return s}var ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,ut=new WeakMap;function Fe(e,t){let n=ut.get(e);if(!n)ut.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let C=0;C<12;C++)i[d*12+C]=h[2+C]});let c=null,p=0,m=0;if(s.mask){p=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:p,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Kt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],p=[],m=[],h=new Re(e.length*2),d=[],C=[];for(let v=0;v<e.length;v++){let w=e[v],P=w.m,V=t.parts[w.part];if(!V||!V.mask||!ct(P))continue;let I=V.bbox,B=1/0,T=-1/0,y=1/0,N=-1/0;for(let O=0;O<2;O++)for(let j=0;j<2;j++){let F=O?I[3]:I[0],G=j?I[5]:I[2],_=P[0]+P[3]*F+P[5]*G,Z=P[2]+P[9]*F+P[11]*G;if(_<B)B=_;if(_>T)T=_;if(Z<y)y=Z;if(Z>N)N=Z}let R=a.length;s.push(B),o.push(T),i.push(y),l.push(N),a.push(v),c.push(Fe(t,w.part)),p.push(I[0]),m.push(I[2]);let k=Math.round((P[1]+I[4])*2);for(let O=Math.floor(B/40);O<=Math.floor(T/40);O++)for(let j=Math.floor(y/40);j<=Math.floor(N/40);j++){if(!xe(k,O,j))continue;let F=C.length;C.push(R),d.push(h.put(k,O,j,F))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,g=NaN,f=NaN,A=-1,z=(v,w,P,V)=>{let I=Math.round(w*2),B=Math.floor(v/40),T=Math.floor(P/40);if(!xe(I,B,T))return fe;let y=fe;if(I!==S||B!==g||T!==f)S=I,g=B,f=T,A=h.get(I,B,T);for(let N=A;N>=0;N=d[N]){let R=C[N];if(a[R]===V||!(v-6>=s[R]-0.5&&v+6<=o[R]+0.5&&P-6>=i[R]-0.5&&P+6<=l[R]+0.5))continue;let k=e[a[R]].m,O=c[R],j=p[R],F=m[R],G=v-k[0],_=w-k[1],Z=P-k[2],q=k[3]*G+k[6]*_+k[9]*Z,J=k[5]*G+k[8]*_+k[11]*Z,{nx:ee,nz:se,mask:ae}=O,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-F)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[R]];if(Q<y)y=Q}}return y},x=0;for(let v of e){let w=Fe(t,v.part);if(w)x+=w.nStuds}let M=new Uint8Array(x),L=new Uint8Array(x),D=new Re(x),E=0,U=n?new Int32Array(x).fill(fe):void 0;for(let v=0,w=0;v<e.length;v++){let P=e[v],V=Fe(t,P.part);if(!V)continue;let I=P.m,B=V.studM,T=I[0],y=I[1],N=I[2],R=I[3],k=I[4],O=I[5],j=I[6],F=I[7],G=I[8],_=I[9],Z=I[10],q=I[11];for(let J=0;J<V.nStuds;J++,w++){let ee=J*12,se=B[ee+4],ae=B[ee+7],oe=B[ee+10];if(!(Math.abs(j*se+F*ae+G*oe-1)<0.001&&Math.abs(R*se+k*ae+O*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;L[w]=1;let Q=B[ee],te=B[ee+1],ne=B[ee+2],ke=T+R*Q+k*te+O*ne,De=y+j*Q+F*te+G*ne,Ue=N+_*Q+Z*te+q*ne,ze=z(ke,De,Ue,v);if(ze!==fe){if(M[w]=1,E++,U)U[w]=ze}let pe=Math.round(ke),me=Math.round(De),he=Math.round(Ue);if(!xe(pe,me,he))continue;if(!n){D.put(pe,me,he,1);continue}let Oe=n[v],Ne=D.get(pe,me,he);if(Ne<0||Oe<Ne)D.put(pe,me,he,Oe)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let w=e[v],P=t.parts[w.part];if(!P||!P.under||!ct(w.m))continue;let V=P.bbox,I=Math.round((V[3]-V[0])/20),B=Math.round((V[5]-V[2])/20);if(!I||!B||I*B>4096)continue;let T=w.m,y=!0,N=0;for(let R=0;R<I&&y;R++)for(let k=0;k<B;k++){let O=V[0]+10+20*R,j=V[2]+10+20*k,F=T[0]+T[3]*O+T[5]*j,G=T[2]+T[9]*O+T[11]*j,_=Math.round(F),Z=Math.round(T[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?D.get(_,Z,q):-1;if(J<0){y=!1;break}if(J>N)N=J}if(y){if(X[v]=1,H)H[v]=N}}return{nStuds:x,studHidden:M,studUp:L,underHidden:X,studsHidden:E,studHideStep:U,underHideStep:H}}function Xt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>it(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function ye(e,t,n=!0){let r=Xt(e,t,n);return Kt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Me="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,we=new Map;function pt(e=Me,t=fetch){let n=Ae.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ae.delete(e)),Ae.set(e,n);return n}var Zt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),ve=(e,t)=>Zt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function Yt(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let C=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+C),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,p=new Uint8Array(c+r);new DataView(p.buffer).setUint32(0,l.length+a,!0),p.set(l,4),p.fill(32,4+l.length,c);let m=c;for(let h of n)p.set(h,m),m+=h.byteLength;return de(p.buffer)}async function Jt(e,t={}){e=[...e];try{return await ft(e,t)}catch(n){let r=t.cdn??Me,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ft(e,{...t,fetch:o})}catch{throw n}}}async function ft(e,t){let n=t.cdn??Me,r=t.fetch??fetch,s=t.gap??16384,o=await pt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(we.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let p=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);p+=S.byteLength;for(let g of u.items){let f=je(S.subarray(g.off-u.start,g.off-u.start+g.len)),A=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);we.set(n+g.name,de(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>we.has(n+u)).map((u)=>we.get(n+u));return{pack:d.length?Yt(d,{colors:o.colors}):de(qt(o.colors)),missing:l,requests:c.length,bytes:p}}function qt(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}async function mt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=pt(t.cdn??Me,r);s.catch(()=>{});let o=t.text?e:await r(e).then((f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return f.text()}),i=performance.now(),l=t.name??(t.text?"main.ldr":decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr")),a=at(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let p=lt(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:m,missing:h,requests:d,bytes:C}=await Jt([...a.filter((f)=>!f.embedded).map((f)=>f.part),...p.values()],t),u=new Map([...p].map(([f,A])=>[A,f])),b=h.map((f)=>u.get(f)??f);for(let[f,A]of p){let z=m.header.parts[A];if(z)m.header.parts[f]=z}let S=performance.now(),g=t.cull?ye(a,m.header,t.textures!==!1):void 0;return{insts:a,pack:m,missing:b,requests:d,bytes:C,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:S-c,...g?{cull:performance.now()-S}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await mt(n,{...r,cull:!1,onParsed:(p)=>self.postMessage({id:t,insts:p})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=ye(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let p of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(p)c.push(p.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
3725
3805
|
|
|
3726
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3806
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/cdn.ts
|
|
3727
3807
|
var worker;
|
|
3728
3808
|
var seq = 0;
|
|
3729
3809
|
var pending = new Map;
|
|
@@ -3818,7 +3898,7 @@ async function loadModel(source, o = {}) {
|
|
|
3818
3898
|
} else
|
|
3819
3899
|
prep = await prepareModel(source, o);
|
|
3820
3900
|
const t3 = performance.now();
|
|
3821
|
-
const obj =
|
|
3901
|
+
const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
|
|
3822
3902
|
for (const m of prep.missing)
|
|
3823
3903
|
if (!obj.stats.missing.includes(m))
|
|
3824
3904
|
obj.stats.missing.push(m);
|
|
@@ -3839,6 +3919,7 @@ export {
|
|
|
3839
3919
|
MIN_VIS,
|
|
3840
3920
|
REORIENT,
|
|
3841
3921
|
buildLdrScene,
|
|
3922
|
+
buildLdrSceneAsync,
|
|
3842
3923
|
colorToken,
|
|
3843
3924
|
colourMaterialKey,
|
|
3844
3925
|
colourSurface,
|
|
@@ -3848,6 +3929,7 @@ export {
|
|
|
3848
3929
|
createInstancedConditionalEdges,
|
|
3849
3930
|
createInstancedEdges,
|
|
3850
3931
|
createLdrObject,
|
|
3932
|
+
createLdrObjectAsync,
|
|
3851
3933
|
cullCore,
|
|
3852
3934
|
decodePack,
|
|
3853
3935
|
decompressPack,
|