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/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)
|
|
@@ -2106,41 +2106,24 @@ function newIM(g, mat, n) {
|
|
|
2106
2106
|
im.count = n;
|
|
2107
2107
|
return im;
|
|
2108
2108
|
}
|
|
2109
|
-
function
|
|
2109
|
+
function trimCulledIM(im, vis, linked) {
|
|
2110
|
+
if (vis >= im.instanceMatrix.count || !im.instanceColor)
|
|
2111
|
+
return false;
|
|
2112
|
+
const M = im.instanceMatrix.array.slice(0, vis * 16), C = im.instanceColor.array.slice(0, vis * 3);
|
|
2110
2113
|
im.instanceMatrix = new THREE.InstancedBufferAttribute(M, 16);
|
|
2111
2114
|
im.instanceColor = new THREE.InstancedBufferAttribute(C, 3);
|
|
2112
|
-
im.count =
|
|
2115
|
+
im.count = vis;
|
|
2113
2116
|
for (const o of linked) {
|
|
2114
2117
|
if (o.isInstancedMesh) {
|
|
2115
2118
|
o.instanceMatrix = im.instanceMatrix;
|
|
2116
2119
|
o.instanceColor = im.instanceColor;
|
|
2117
|
-
o.count =
|
|
2120
|
+
o.count = vis;
|
|
2118
2121
|
} else if (o.geometry) {
|
|
2119
2122
|
o.geometry.setAttribute("instanceMatrix", im.instanceMatrix);
|
|
2120
|
-
o.geometry.instanceCount =
|
|
2123
|
+
o.geometry.instanceCount = vis;
|
|
2121
2124
|
}
|
|
2122
2125
|
}
|
|
2123
|
-
|
|
2124
|
-
function trimCulledIM(im, vis, linked) {
|
|
2125
|
-
const all = im.instanceMatrix.count;
|
|
2126
|
-
if (vis >= all || !im.instanceColor)
|
|
2127
|
-
return null;
|
|
2128
|
-
const fullM = im.instanceMatrix.array, fullC = im.instanceColor.array;
|
|
2129
|
-
const slimM = fullM.slice(0, vis * 16), slimC = fullC.slice(0, vis * 3);
|
|
2130
|
-
const tailM = fullM.slice(vis * 16), tailC = fullC.slice(vis * 3);
|
|
2131
|
-
applyIMBuffers(im, linked, slimM, slimC, vis);
|
|
2132
|
-
return { im, linked, slimM, slimC, tailM, tailC, vis, all };
|
|
2133
|
-
}
|
|
2134
|
-
function setTrimmedCull(t, showAll) {
|
|
2135
|
-
if (showAll) {
|
|
2136
|
-
const M = new Float32Array(t.all * 16), C = new Float32Array(t.all * 3);
|
|
2137
|
-
M.set(t.slimM);
|
|
2138
|
-
M.set(t.tailM, t.vis * 16);
|
|
2139
|
-
C.set(t.slimC);
|
|
2140
|
-
C.set(t.tailC, t.vis * 3);
|
|
2141
|
-
applyIMBuffers(t.im, t.linked, M, C, t.all);
|
|
2142
|
-
} else
|
|
2143
|
-
applyIMBuffers(t.im, t.linked, t.slimM, t.slimC, t.vis);
|
|
2126
|
+
return true;
|
|
2144
2127
|
}
|
|
2145
2128
|
function instancedBoundingSphere(im) {
|
|
2146
2129
|
const g = im.geometry;
|
|
@@ -2346,7 +2329,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2346
2329
|
}
|
|
2347
2330
|
}
|
|
2348
2331
|
}
|
|
2349
|
-
function
|
|
2332
|
+
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
|
|
2350
2333
|
const bKind = [], bMat = [];
|
|
2351
2334
|
const bAll = [];
|
|
2352
2335
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -2401,6 +2384,8 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2401
2384
|
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
2402
2385
|
const B = pp.studM;
|
|
2403
2386
|
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
2387
|
+
if ((j & 32767) === 0 && j)
|
|
2388
|
+
yield;
|
|
2404
2389
|
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
2405
2390
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
2406
2391
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
@@ -2463,23 +2448,39 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorInd
|
|
|
2463
2448
|
colCache.set(c, x = color(c));
|
|
2464
2449
|
return x;
|
|
2465
2450
|
};
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
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
|
+
}
|
|
2483
2484
|
return sMesh;
|
|
2484
2485
|
}
|
|
2485
2486
|
function undersideGroups(ids, insts) {
|
|
@@ -2509,7 +2510,7 @@ function undersideGroups(ids, insts) {
|
|
|
2509
2510
|
out.push({ ids: rest, ax: null });
|
|
2510
2511
|
return out;
|
|
2511
2512
|
}
|
|
2512
|
-
function
|
|
2513
|
+
function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
2513
2514
|
const { header: H, arr } = pack;
|
|
2514
2515
|
const LOD = P.lod !== false;
|
|
2515
2516
|
const EDGES = !!P.edges;
|
|
@@ -2518,6 +2519,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2518
2519
|
root.px = P.lodPx ?? 0.5;
|
|
2519
2520
|
root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
|
|
2520
2521
|
root.edgeMinPx = P.lodEdgeMinPx ?? 0.15;
|
|
2522
|
+
yield root;
|
|
2521
2523
|
const trackVp = (r) => {
|
|
2522
2524
|
const rt = r.getRenderTarget();
|
|
2523
2525
|
const h = rt ? rt.height : r.getContext().drawingBufferHeight;
|
|
@@ -2586,9 +2588,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2586
2588
|
}
|
|
2587
2589
|
b.ids.push(i);
|
|
2588
2590
|
});
|
|
2591
|
+
yield root;
|
|
2589
2592
|
const steps = P.steps;
|
|
2590
2593
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
2591
2594
|
mark("culling");
|
|
2595
|
+
yield root;
|
|
2592
2596
|
const stepBatches = [];
|
|
2593
2597
|
const stepBatched = [];
|
|
2594
2598
|
const instM = steps ? new Float64Array(insts.length * 12) : null;
|
|
@@ -2664,7 +2668,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2664
2668
|
};
|
|
2665
2669
|
const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
|
|
2666
2670
|
const toggles = [];
|
|
2667
|
-
const trimmed =
|
|
2671
|
+
const trimmed = { studs: false, under: false };
|
|
2668
2672
|
const countTo = (objs) => ({ set count(n) {
|
|
2669
2673
|
for (const o of objs()) {
|
|
2670
2674
|
if (o.isInstancedMesh)
|
|
@@ -2731,6 +2735,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2731
2735
|
};
|
|
2732
2736
|
const coldByMat = new Map;
|
|
2733
2737
|
for (const [, bucket] of byPart) {
|
|
2738
|
+
yield root;
|
|
2734
2739
|
const part = bucket.part;
|
|
2735
2740
|
const p = H.parts[part];
|
|
2736
2741
|
const idsAll = bucket.ids;
|
|
@@ -2819,12 +2824,10 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2819
2824
|
if (!o.isInstancedMesh)
|
|
2820
2825
|
o.geometry.instanceCount = im.count;
|
|
2821
2826
|
});
|
|
2822
|
-
|
|
2823
|
-
if (
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
trimmed.push(t);
|
|
2827
|
-
}
|
|
2827
|
+
const trim = !steps && P.cullUnder && trimCulledIM(im, vis, objs);
|
|
2828
|
+
if (trim)
|
|
2829
|
+
trimmed.under = true;
|
|
2830
|
+
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : uids.length, visible: vis, flag: "under" });
|
|
2828
2831
|
if (steps)
|
|
2829
2832
|
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]) });
|
|
2830
2833
|
}
|
|
@@ -2834,9 +2837,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2834
2837
|
list.push({ part, p, mat, ids: idsAll });
|
|
2835
2838
|
}
|
|
2836
2839
|
}
|
|
2840
|
+
yield root;
|
|
2837
2841
|
const tmpM = new THREE.Matrix4;
|
|
2838
2842
|
const tmpC = new THREE.Color;
|
|
2839
2843
|
for (const [mat, items] of coldByMat) {
|
|
2844
|
+
yield root;
|
|
2840
2845
|
const entries = [];
|
|
2841
2846
|
for (const it of items)
|
|
2842
2847
|
for (const id of it.ids)
|
|
@@ -3079,13 +3084,24 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3079
3084
|
}
|
|
3080
3085
|
}
|
|
3081
3086
|
}
|
|
3082
|
-
|
|
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;
|
|
3083
3095
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
3084
3096
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
3085
3097
|
const STUD_ERR = 12;
|
|
3086
|
-
|
|
3098
|
+
let _coopS = 0;
|
|
3099
|
+
for (let ci = 0;ci < sMesh.length; ci++) {
|
|
3100
|
+
const sm = sMesh[ci];
|
|
3087
3101
|
if (!sm)
|
|
3088
|
-
|
|
3102
|
+
continue;
|
|
3103
|
+
if ((++_coopS & 3) === 0)
|
|
3104
|
+
yield root;
|
|
3089
3105
|
const im = sm.im;
|
|
3090
3106
|
const kind = sKind[ci];
|
|
3091
3107
|
const k = H.studKinds[kind];
|
|
@@ -3108,15 +3124,14 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3108
3124
|
if (!o.isInstancedMesh)
|
|
3109
3125
|
o.geometry.instanceCount = im.count;
|
|
3110
3126
|
});
|
|
3111
|
-
|
|
3112
|
-
if (
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
trimmed.push(t);
|
|
3116
|
-
}
|
|
3127
|
+
const trim = !steps && P.cullStuds && trimCulledIM(im, vis, objs);
|
|
3128
|
+
if (trim)
|
|
3129
|
+
trimmed.studs = true;
|
|
3130
|
+
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
|
|
3117
3131
|
if (sm.slots)
|
|
3118
3132
|
stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
|
|
3119
|
-
}
|
|
3133
|
+
}
|
|
3134
|
+
yield root;
|
|
3120
3135
|
stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
|
|
3121
3136
|
stats.uncertBatches = nUncert;
|
|
3122
3137
|
let condOn = true, edgesOn = true;
|
|
@@ -3218,11 +3233,6 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3218
3233
|
applySteps();
|
|
3219
3234
|
return;
|
|
3220
3235
|
}
|
|
3221
|
-
if (trimmed.length) {
|
|
3222
|
-
for (const t of trimmed)
|
|
3223
|
-
setTrimmedCull(t, t.im.userData.ldrStud ? !studs : !under);
|
|
3224
|
-
return;
|
|
3225
|
-
}
|
|
3226
3236
|
for (const t of toggles)
|
|
3227
3237
|
t.mesh.count = (t.flag === "studs" ? studs : under) ? t.visible : t.all;
|
|
3228
3238
|
};
|
|
@@ -3285,7 +3295,38 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
3285
3295
|
insts = null;
|
|
3286
3296
|
cull = null;
|
|
3287
3297
|
byPart.clear();
|
|
3288
|
-
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady };
|
|
3298
|
+
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
|
|
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;
|
|
3289
3330
|
}
|
|
3290
3331
|
async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
3291
3332
|
const { header: H, arr } = pack;
|
|
@@ -3309,7 +3350,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3309
3350
|
await new Promise((r) => setTimeout(r, 0));
|
|
3310
3351
|
}
|
|
3311
3352
|
}
|
|
3312
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3353
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/scene.ts
|
|
3313
3354
|
import * as THREE2 from "three";
|
|
3314
3355
|
function colorFn(src, pack, fallback) {
|
|
3315
3356
|
const table = new Map;
|
|
@@ -3369,6 +3410,12 @@ function toPlastic(old) {
|
|
|
3369
3410
|
return m;
|
|
3370
3411
|
}
|
|
3371
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) {
|
|
3372
3419
|
const o = { edges: true, conditionalLines: true, cullStuds: true, cullUndersides: true, side: "front", material: "plastic", ...options };
|
|
3373
3420
|
const color = colorFn(o.colors, pack, new THREE2.Color(o.fallbackColor ?? 10528169));
|
|
3374
3421
|
const useTex = o.textures !== false;
|
|
@@ -3388,7 +3435,7 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3388
3435
|
object.scale.setScalar(o.scale);
|
|
3389
3436
|
const pairs = new Map;
|
|
3390
3437
|
let cur = null;
|
|
3391
|
-
let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o;
|
|
3438
|
+
let { edges, conditionalLines: cond, cullStuds: cs, cullUndersides: cu, side } = o, lodOn = true;
|
|
3392
3439
|
const stats = { instances: all.length, drawn: 0, missing, studsTotal: 0, studsHidden: 0, undersTotal: 0, undersHidden: 0, buildMs: 0 };
|
|
3393
3440
|
const disposeCur = () => {
|
|
3394
3441
|
if (!cur)
|
|
@@ -3410,9 +3457,9 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3410
3457
|
};
|
|
3411
3458
|
const multiStep = uniq.length > 1;
|
|
3412
3459
|
const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
|
|
3413
|
-
const
|
|
3414
|
-
|
|
3415
|
-
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;
|
|
3416
3463
|
pairs.clear();
|
|
3417
3464
|
if (o.material === "plastic")
|
|
3418
3465
|
cur.root.traverse((x) => {
|
|
@@ -3429,8 +3476,11 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3429
3476
|
cur.setEdges(false);
|
|
3430
3477
|
if (!cond)
|
|
3431
3478
|
cur.setCond(false);
|
|
3432
|
-
|
|
3433
|
-
|
|
3479
|
+
if (!lodOn)
|
|
3480
|
+
cur.setLod(false);
|
|
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 });
|
|
3434
3484
|
api.texturesReady = cur.texturesReady;
|
|
3435
3485
|
};
|
|
3436
3486
|
const setStep = (step, mask = null) => {
|
|
@@ -3440,56 +3490,86 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3440
3490
|
Object.assign(stats, cur.setStep(step, mask), { drawn: drawnAt(step, mask), buildMs: performance.now() - t0 });
|
|
3441
3491
|
};
|
|
3442
3492
|
const api = { texturesReady: Promise.resolve() };
|
|
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
|
-
|
|
3480
|
-
const b = x.boundingBox.clone().applyMatrix4(x.matrixWorld);
|
|
3481
|
-
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;
|
|
3482
3530
|
}
|
|
3483
|
-
}
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
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
|
+
})();
|
|
3488
3568
|
}
|
|
3489
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3569
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3490
3570
|
import { decompress as decompress2 } from "fzstd";
|
|
3491
3571
|
|
|
3492
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3572
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/embedded.ts
|
|
3493
3573
|
function splitFiles(text, fallback) {
|
|
3494
3574
|
const files = new Map;
|
|
3495
3575
|
let cur = null, saw = false;
|
|
@@ -3561,7 +3641,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3561
3641
|
return out;
|
|
3562
3642
|
}
|
|
3563
3643
|
|
|
3564
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3644
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/parts-cdn.ts
|
|
3565
3645
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3566
3646
|
var indexCache = new Map;
|
|
3567
3647
|
var shardCache = new Map;
|
|
@@ -3721,10 +3801,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3721
3801
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3722
3802
|
}
|
|
3723
3803
|
|
|
3724
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3804
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/load-worker.gen.ts
|
|
3725
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';
|
|
3726
3806
|
|
|
3727
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3807
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/cdn.ts
|
|
3728
3808
|
var worker;
|
|
3729
3809
|
var seq = 0;
|
|
3730
3810
|
var pending = new Map;
|
|
@@ -3819,7 +3899,7 @@ async function loadModel(source, o = {}) {
|
|
|
3819
3899
|
} else
|
|
3820
3900
|
prep = await prepareModel(source, o);
|
|
3821
3901
|
const t3 = performance.now();
|
|
3822
|
-
const obj =
|
|
3902
|
+
const obj = await createLdrObjectAsync(prep.insts, prep.pack, prep.cull ? { ...o, precomputedCull: prep.cull } : o);
|
|
3823
3903
|
for (const m of prep.missing)
|
|
3824
3904
|
if (!obj.stats.missing.includes(m))
|
|
3825
3905
|
obj.stats.missing.push(m);
|
|
@@ -3833,7 +3913,7 @@ async function loadModel(source, o = {}) {
|
|
|
3833
3913
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
3834
3914
|
});
|
|
3835
3915
|
}
|
|
3836
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3916
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/library.ts
|
|
3837
3917
|
import { existsSync, readFileSync } from "fs";
|
|
3838
3918
|
import { join } from "path";
|
|
3839
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]];
|
|
@@ -4084,11 +4164,11 @@ class Library {
|
|
|
4084
4164
|
return insts;
|
|
4085
4165
|
}
|
|
4086
4166
|
}
|
|
4087
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4167
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
|
|
4088
4168
|
import fs3 from "node:fs";
|
|
4089
4169
|
import path3 from "node:path";
|
|
4090
4170
|
|
|
4091
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4171
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/resolver.ts
|
|
4092
4172
|
import fs from "node:fs";
|
|
4093
4173
|
import path from "node:path";
|
|
4094
4174
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4360,11 +4440,11 @@ function collectDeps(lib, refs) {
|
|
|
4360
4440
|
return out;
|
|
4361
4441
|
}
|
|
4362
4442
|
|
|
4363
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4443
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
|
|
4364
4444
|
import fs2 from "node:fs";
|
|
4365
4445
|
import path2 from "node:path";
|
|
4366
4446
|
|
|
4367
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4447
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/lod.ts
|
|
4368
4448
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4369
4449
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4370
4450
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4556,7 +4636,7 @@ function lodChain(P, C, I) {
|
|
|
4556
4636
|
return out;
|
|
4557
4637
|
}
|
|
4558
4638
|
|
|
4559
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4639
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/compile.ts
|
|
4560
4640
|
function loadColors(root) {
|
|
4561
4641
|
const map = new Map;
|
|
4562
4642
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -5139,7 +5219,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
5139
5219
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
5140
5220
|
}
|
|
5141
5221
|
|
|
5142
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5222
|
+
// ../../../../../../../tmp/ldr-build-MHOtAg/src/node/build-pack.ts
|
|
5143
5223
|
function buildPack(o) {
|
|
5144
5224
|
const lib = new Library2(o.ldrawRoot);
|
|
5145
5225
|
const refs = new Map;
|
|
@@ -5216,6 +5296,7 @@ export {
|
|
|
5216
5296
|
REORIENT,
|
|
5217
5297
|
Library2 as ResolverLibrary,
|
|
5218
5298
|
buildLdrScene,
|
|
5299
|
+
buildLdrSceneAsync,
|
|
5219
5300
|
buildPack,
|
|
5220
5301
|
collectDeps,
|
|
5221
5302
|
colorToken,
|
|
@@ -5227,6 +5308,7 @@ export {
|
|
|
5227
5308
|
createInstancedConditionalEdges,
|
|
5228
5309
|
createInstancedEdges,
|
|
5229
5310
|
createLdrObject,
|
|
5311
|
+
createLdrObjectAsync,
|
|
5230
5312
|
cullCore,
|
|
5231
5313
|
decodePack,
|
|
5232
5314
|
decompressPack,
|