ldr 0.24.1 → 0.24.2
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.js +122 -34
- package/dist/node/index.js +131 -43
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cli.ts
|
|
4
4
|
import fs4 from "node:fs";
|
|
5
5
|
import zlib from "node:zlib";
|
|
6
6
|
|
|
7
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/build-pack.ts
|
|
8
8
|
import fs3 from "node:fs";
|
|
9
9
|
import path3 from "node:path";
|
|
10
10
|
|
|
11
|
-
// ../../../../../../../tmp/ldr-build-
|
|
11
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/resolver.ts
|
|
12
12
|
import fs from "node:fs";
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
|
|
15
|
-
// ../../../../../../../tmp/ldr-build-
|
|
15
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/spec.ts
|
|
16
16
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
17
17
|
function parseColor(tok) {
|
|
18
18
|
if (/^0x/i.test(tok))
|
|
@@ -705,7 +705,7 @@ function fileStepViews(f) {
|
|
|
705
705
|
return out;
|
|
706
706
|
}
|
|
707
707
|
|
|
708
|
-
// ../../../../../../../tmp/ldr-build-
|
|
708
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/model.ts
|
|
709
709
|
var CALLOUT_END = 999999;
|
|
710
710
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
711
711
|
function flatten(doc, opts = {}) {
|
|
@@ -1055,7 +1055,7 @@ function parseLDConfig(text) {
|
|
|
1055
1055
|
return out;
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1058
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/resolver.ts
|
|
1059
1059
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
1060
1060
|
var UNDER_STUD_RE = /^(stud3|stud3a|stud4.*|stud12|stud16.*|stud18a)\.dat$/i;
|
|
1061
1061
|
var norm2 = (ref) => ref.trim().replace(/\\/g, "/").toLowerCase();
|
|
@@ -1325,11 +1325,11 @@ function collectDeps(lib, refs) {
|
|
|
1325
1325
|
return out;
|
|
1326
1326
|
}
|
|
1327
1327
|
|
|
1328
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1328
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/compile.ts
|
|
1329
1329
|
import fs2 from "node:fs";
|
|
1330
1330
|
import path2 from "node:path";
|
|
1331
1331
|
|
|
1332
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1332
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/lod.ts
|
|
1333
1333
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
1334
1334
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
1335
1335
|
function reorderMesh(P, N, C, I) {
|
|
@@ -1521,7 +1521,7 @@ function lodChain(P, C, I) {
|
|
|
1521
1521
|
return out;
|
|
1522
1522
|
}
|
|
1523
1523
|
|
|
1524
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1524
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/compile.ts
|
|
1525
1525
|
function loadColors(root) {
|
|
1526
1526
|
const map = new Map;
|
|
1527
1527
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -2151,7 +2151,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
2151
2151
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
2152
2152
|
}
|
|
2153
2153
|
|
|
2154
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2154
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/build-pack.ts
|
|
2155
2155
|
function buildPack(o) {
|
|
2156
2156
|
const lib = new Library(o.ldrawRoot);
|
|
2157
2157
|
const refs = new Map;
|
|
@@ -2219,7 +2219,7 @@ function buildPack(o) {
|
|
|
2219
2219
|
return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
|
|
2220
2220
|
}
|
|
2221
2221
|
|
|
2222
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2222
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cli.ts
|
|
2223
2223
|
var HELP = `ldr pack — build a parts pack for the ldr three.js renderer
|
|
2224
2224
|
|
|
2225
2225
|
Usage:
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/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-JiiKTe/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-JiiKTe/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-JiiKTe/src/render.ts
|
|
1410
1410
|
import * as THREE from "three";
|
|
1411
1411
|
|
|
1412
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1412
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/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);
|
|
@@ -1432,7 +1432,7 @@ function decodePack(buf) {
|
|
|
1432
1432
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1433
1433
|
}
|
|
1434
1434
|
|
|
1435
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1435
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cull.ts
|
|
1436
1436
|
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;
|
|
1437
1437
|
var prepCache = new WeakMap;
|
|
1438
1438
|
function prepPart(H, part) {
|
|
@@ -1749,7 +1749,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1749
1749
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1750
1750
|
}
|
|
1751
1751
|
|
|
1752
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1752
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/render.ts
|
|
1753
1753
|
async function loadPack(url) {
|
|
1754
1754
|
const res = await fetch(url);
|
|
1755
1755
|
if (!res.ok)
|
|
@@ -2276,6 +2276,68 @@ function gridClusters(n, x, z, k) {
|
|
|
2276
2276
|
}
|
|
2277
2277
|
return out;
|
|
2278
2278
|
}
|
|
2279
|
+
function* gridClustersGen(n, x, z, k) {
|
|
2280
|
+
const CH = 65536;
|
|
2281
|
+
if (n <= CH || n <= k || !isFinite(k))
|
|
2282
|
+
return gridClusters(n, x, z, k);
|
|
2283
|
+
const bb = [Infinity, -Infinity, Infinity, -Infinity];
|
|
2284
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2285
|
+
gcBounds(bb, x, z, i0, Math.min(n, i0 + CH));
|
|
2286
|
+
yield;
|
|
2287
|
+
}
|
|
2288
|
+
const [x0, x1, z0, z1] = bb;
|
|
2289
|
+
const G = Math.max(1, Math.ceil(Math.sqrt(n / k)));
|
|
2290
|
+
const sx = (x1 - x0) / G || 1, sz = (z1 - z0) / G || 1;
|
|
2291
|
+
const cell = new Int32Array(n), cnt = new Int32Array(G * G);
|
|
2292
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2293
|
+
gcCells(cell, cnt, x, z, i0, Math.min(n, i0 + CH), x0, z0, sx, sz, G);
|
|
2294
|
+
yield;
|
|
2295
|
+
}
|
|
2296
|
+
const out = [];
|
|
2297
|
+
const at = new Int32Array(G * G).fill(-1);
|
|
2298
|
+
const fill = new Int32Array(G * G);
|
|
2299
|
+
for (let c = 0;c < G * G; c++)
|
|
2300
|
+
if (cnt[c]) {
|
|
2301
|
+
at[c] = out.length;
|
|
2302
|
+
out.push(new Int32Array(cnt[c]));
|
|
2303
|
+
}
|
|
2304
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2305
|
+
gcFill(out, at, fill, cell, i0, Math.min(n, i0 + CH));
|
|
2306
|
+
yield;
|
|
2307
|
+
}
|
|
2308
|
+
return out;
|
|
2309
|
+
}
|
|
2310
|
+
function gcBounds(bb, x, z, i0, i1) {
|
|
2311
|
+
let x0 = bb[0], x1 = bb[1], z0 = bb[2], z1 = bb[3];
|
|
2312
|
+
for (let i = i0;i < i1; i++) {
|
|
2313
|
+
const a = x(i), b = z(i);
|
|
2314
|
+
if (a < x0)
|
|
2315
|
+
x0 = a;
|
|
2316
|
+
if (a > x1)
|
|
2317
|
+
x1 = a;
|
|
2318
|
+
if (b < z0)
|
|
2319
|
+
z0 = b;
|
|
2320
|
+
if (b > z1)
|
|
2321
|
+
z1 = b;
|
|
2322
|
+
}
|
|
2323
|
+
bb[0] = x0;
|
|
2324
|
+
bb[1] = x1;
|
|
2325
|
+
bb[2] = z0;
|
|
2326
|
+
bb[3] = z1;
|
|
2327
|
+
}
|
|
2328
|
+
function gcCells(cell, cnt, x, z, i0, i1, x0, z0, sx, sz, G) {
|
|
2329
|
+
for (let i = i0;i < i1; i++) {
|
|
2330
|
+
const c = Math.min(G - 1, Math.floor((x(i) - x0) / sx)) * G + Math.min(G - 1, Math.floor((z(i) - z0) / sz));
|
|
2331
|
+
cell[i] = c;
|
|
2332
|
+
cnt[c]++;
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2335
|
+
function gcFill(out, at, fill, cell, i0, i1) {
|
|
2336
|
+
for (let i = i0;i < i1; i++) {
|
|
2337
|
+
const c = cell[i];
|
|
2338
|
+
out[at[c]][fill[c]++] = i;
|
|
2339
|
+
}
|
|
2340
|
+
}
|
|
2279
2341
|
var _studDisc = null;
|
|
2280
2342
|
function studDiscGeom() {
|
|
2281
2343
|
if (_studDisc)
|
|
@@ -2474,12 +2536,9 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
2474
2536
|
}
|
|
2475
2537
|
const studCl = new Int32Array(cull.nStuds), studSlot = new Int32Array(cull.nStuds);
|
|
2476
2538
|
const sMesh = [];
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
|
|
2481
|
-
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
|
|
2482
|
-
for (const c of gridClusters(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud)) {
|
|
2539
|
+
const allocClusters = (b, kind, g, ids, cs, c0, c1) => {
|
|
2540
|
+
for (let q = c0;q < c1; q++) {
|
|
2541
|
+
const c = cs[q];
|
|
2483
2542
|
const ci = sMesh.length;
|
|
2484
2543
|
let v = 0;
|
|
2485
2544
|
for (const i of c)
|
|
@@ -2500,7 +2559,22 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
2500
2559
|
const n = c.length;
|
|
2501
2560
|
sMesh.push({ im, kind, vis: v, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
|
|
2502
2561
|
}
|
|
2503
|
-
}
|
|
2562
|
+
};
|
|
2563
|
+
for (let b = 0;b < bKind.length; b++) {
|
|
2564
|
+
if (b)
|
|
2565
|
+
yield;
|
|
2566
|
+
const kind = bKind[b];
|
|
2567
|
+
const g = geom(H.studKinds[kind].body, arr);
|
|
2568
|
+
const ids = bIds[b];
|
|
2569
|
+
const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
|
|
2570
|
+
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
|
|
2571
|
+
const clusters = yield* gridClustersGen(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud);
|
|
2572
|
+
for (let c0 = 0;c0 < clusters.length; c0 += 4) {
|
|
2573
|
+
if (c0)
|
|
2574
|
+
yield;
|
|
2575
|
+
allocClusters(b, kind, g, ids, clusters, c0, Math.min(clusters.length, c0 + 4));
|
|
2576
|
+
}
|
|
2577
|
+
}
|
|
2504
2578
|
const colCache = new Map;
|
|
2505
2579
|
const colorOf = (c) => {
|
|
2506
2580
|
let x = colCache.get(c);
|
|
@@ -2633,21 +2707,29 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
2633
2707
|
return m;
|
|
2634
2708
|
};
|
|
2635
2709
|
const byPart = new Map;
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2710
|
+
const bucketRange = (i0, i1) => {
|
|
2711
|
+
for (let i = i0;i < i1; i++) {
|
|
2712
|
+
const it = insts[i];
|
|
2713
|
+
const p = H.parts[it.part];
|
|
2714
|
+
if (!p)
|
|
2715
|
+
continue;
|
|
2716
|
+
const mirror = det12(it.m) < 0;
|
|
2717
|
+
const mat = materialFor(String(it.color), mirror, !!p.uncert);
|
|
2718
|
+
const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
|
|
2719
|
+
let b = byPart.get(k);
|
|
2720
|
+
if (!b) {
|
|
2721
|
+
if (p.uncert)
|
|
2722
|
+
nUncert++;
|
|
2723
|
+
byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
|
|
2724
|
+
}
|
|
2725
|
+
b.ids.push(i);
|
|
2648
2726
|
}
|
|
2649
|
-
|
|
2650
|
-
|
|
2727
|
+
};
|
|
2728
|
+
for (let i0 = 0;i0 < insts.length; i0 += 8192) {
|
|
2729
|
+
if (i0)
|
|
2730
|
+
yield root;
|
|
2731
|
+
bucketRange(i0, Math.min(insts.length, i0 + 8192));
|
|
2732
|
+
}
|
|
2651
2733
|
yield root;
|
|
2652
2734
|
const steps = P.steps;
|
|
2653
2735
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
@@ -2928,7 +3010,10 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
2928
3010
|
if (!entries.length)
|
|
2929
3011
|
continue;
|
|
2930
3012
|
const groups = gridClusters(entries.length, (i) => insts[entries[i].id].m[0], (i) => insts[entries[i].id].m[2], LOD ? 256 : Infinity);
|
|
3013
|
+
let _coopG = 0;
|
|
2931
3014
|
for (const g of groups) {
|
|
3015
|
+
if (_coopG++)
|
|
3016
|
+
yield root;
|
|
2932
3017
|
const members = Array.from(g, (i) => entries[i]);
|
|
2933
3018
|
const partSet = new Map;
|
|
2934
3019
|
for (const m of members)
|
|
@@ -3012,6 +3097,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3012
3097
|
if (pp.edges)
|
|
3013
3098
|
addLines(pp.edges, ghost, cl);
|
|
3014
3099
|
addCond(pp, ghost, cl);
|
|
3100
|
+
yield root;
|
|
3015
3101
|
if (steps)
|
|
3016
3102
|
stepBatches.push({ im: ghost, objs: [ghost, ...cl.lines.slice(nL), ...cl.cond.slice(nC)], own: Int32Array.from(ids, (id) => steps[id]), hide: null, flag: "body", inst: Int32Array.from(ids), stud: null, col: Uint16Array.from(ids, (id) => instCol[id]) });
|
|
3017
3103
|
}
|
|
@@ -3023,6 +3109,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3023
3109
|
const uEntries = withUnder.map((m) => m.id);
|
|
3024
3110
|
const uGroups = LOD && P.lodUnder !== false ? undersideGroups(uEntries, insts) : [{ ids: uEntries, ax: null }];
|
|
3025
3111
|
for (const { ids: uids, ax } of uGroups) {
|
|
3112
|
+
yield root;
|
|
3026
3113
|
const byId = new Map(members.map((m) => [m.id, m]));
|
|
3027
3114
|
const umembers = uids.map((id) => {
|
|
3028
3115
|
const m = byId.get(id);
|
|
@@ -3125,6 +3212,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3125
3212
|
};
|
|
3126
3213
|
setN(P.cullUnder ? vis : ord.length);
|
|
3127
3214
|
underGhostCounts.push({ set: setN, all: ord.length, vis });
|
|
3215
|
+
yield root;
|
|
3128
3216
|
if (steps)
|
|
3129
3217
|
stepBatches.push({ im: ghost, objs: [ghost, ...lineObjs], 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]) });
|
|
3130
3218
|
}
|
|
@@ -3463,7 +3551,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3463
3551
|
await new Promise((r) => setTimeout(r, 0));
|
|
3464
3552
|
}
|
|
3465
3553
|
}
|
|
3466
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3554
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/scene.ts
|
|
3467
3555
|
import * as THREE2 from "three";
|
|
3468
3556
|
function colorFn(src, pack, fallback) {
|
|
3469
3557
|
const table = new Map;
|
|
@@ -3681,10 +3769,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
3681
3769
|
return finish();
|
|
3682
3770
|
})();
|
|
3683
3771
|
}
|
|
3684
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3772
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/parts-cdn.ts
|
|
3685
3773
|
import { decompress as decompress2 } from "fzstd";
|
|
3686
3774
|
|
|
3687
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3775
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/embedded.ts
|
|
3688
3776
|
function splitFiles(text, fallback) {
|
|
3689
3777
|
const files = new Map;
|
|
3690
3778
|
let cur = null, saw = false;
|
|
@@ -3756,7 +3844,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3756
3844
|
return out;
|
|
3757
3845
|
}
|
|
3758
3846
|
|
|
3759
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3847
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/parts-cdn.ts
|
|
3760
3848
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3761
3849
|
var indexCache = new Map;
|
|
3762
3850
|
var shardCache = new Map;
|
|
@@ -3988,10 +4076,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3988
4076
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3989
4077
|
}
|
|
3990
4078
|
|
|
3991
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4079
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/load-worker.gen.ts
|
|
3992
4080
|
var load_worker_gen_default = 'var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=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},xt=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 wt=["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||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=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,f=je(e,a,c);a+=c;var m=l?1<<l:s,g=je(e,a,m)+(l==1&&256),y=g;if(!s){var v=1<<10+(e[5]>>3);y=v+(v>>3)*(e[5]&7)}if(y>2145386496)K(1);var x=new W((t==1?g||y:t?0:y)+12);return x[0]=1,x[4]=4,x[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:x.subarray(12),e:y,o:new be(x.buffer,0,3),u:g,c:o,m:Math.min(131072,y)}}else if((n>>4|e[3]<<20)==25481893)return At(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,f=o,m=new bt(512+(o<<2)),g=new yt(m,0,256),y=new de(m,0,256),v=new de(m,512,o),x=512+(o<<1),S=new W(m,x,o),h=new W(m,x+o);while(l<255&&i>0){var u=re(i+1),d=r>>3,p=(1<<u+1)-1,L=(e[d]|e[d+1]<<8|e[d+2]<<16)>>(r&7)&p,b=(1<<u)-1,T=p-i-1,E=L&b;if(E<T)r+=u,L=E;else if(r+=u+1,L>b)L-=T;if(g[++l]=--L,L==-1)i+=L,S[--f]=l;else i-=L;if(!L)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 C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=g[H];if(M<1){y[H]=-M;continue}for(c=0;c<M;++c){S[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=y[S[c]]++,k=h[c]=s-re(A);v[c]=(A<<k)-o}return[r+7>>3,{b:s,s:S,n:h,t:v}]},vt=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 de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var g=f<<3,y=e[t];if(!y)K(0);var v=0,x=0,S=m.b,h=S,u=(++t<<3)-8+re(y);for(;;){if(u-=S,u<g)break;var d=u>>3;if(v+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<S)-1,i[++r]=m.s[v],u-=h,u<g)break;d=u>>3,x+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<h)-1,i[++r]=m.s[x],S=m.n[v],v=m.t[v],h=m.n[x],x=m.t[x]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var L=0;for(n=0;n<r;++n){var b=i[n];if(b>11)K(0);L+=b&&1<<b-1}var T=re(L)+1,E=1<<T,D=E-L;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var b=i[n];++l[i[n]=b&&T+1-b]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[T]=0;for(n=T;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<T-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<T-M))}}return[t,{n:X,b:T,s:U}]},Tt=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],Ct=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],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=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},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,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,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var g=f>>3,y=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(f&7);a=(a<<c|y)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=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)},kt=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 Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,g=c>>4,y=0,v=0;if(f<2)if(m&1)g|=e[++s]<<4|(m&2&&e[++s]<<12);else g=c>>3;else if(v=m,m<2)g|=(e[++s]&63)<<4,y=e[s]>>6|e[++s]<<2;else if(m==2)g|=e[++s]<<4|(e[++s]&3)<<12,y=e[s]>>2|e[++s]<<6;else g|=e[++s]<<4|(e[++s]&63)<<12,y=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var x=n?n.subarray(t.y,t.y+t.m):new W(t.m),S=x.length-g;if(f==0)x.set(e.subarray(s,s+=g),S);else if(f==1)ce(x,e[s++],S);else{var h=t.h;if(f==2){var u=vt(e,s);y+=s-(s=u[0]),t.h=h=u[1]}else if(!h)K(0);(v?Lt:le)(e.subarray(s,s+=y),x.subarray(S),h)}var d=e[s++];if(d){if(d==255)d=(e[s++]|e[s++]<<8)+32512;else if(d>127)d=d-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var L=[Ct,Et,Tt];for(var b=2;b>-1;--b){var T=p>>(b<<1)+2&3;if(T==1){var E=new W([0,0,e[s++]]);L[b]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(T==2)r=ue(e,s,9-(b&1)),s=r[0],L[b]=r[1];else if(T==3){if(!t.t)K(0);L[b]=t.t[b]}}var D=t.t=L,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,k=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var B=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++d;--d;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[B],z=U.n[B];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,B=U.t[B]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var b=0;b<_;++b)x[k+b]=x[S+b];k+=_,S+=_;var q=k-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var b=0;b<J;++b)x[k+b]=t.w[ee+b];k+=J,G-=J,q=0}for(var b=0;b<G;++b)x[k+b]=x[q+b];k+=G}if(k!=S)while(S<x.length)x[k++]=x[S++];else k=x.length;if(n)t.y+=k;else x=Ee(x,0,k)}else if(n){if(t.y+=g,S)for(var b=0;b<g;++b)x[b]=x[S+b]}else if(S)x=Ee(x,S);return t.b=a,x}K(2)},Bt=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 ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(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=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(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 Bt(n,o)}async function It(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ye(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(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 Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(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 zt(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=Ut(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 f=a.findIndex((m,g)=>g>0&&m.toUpperCase()==="GLOSSMAP");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(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 Nt(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 f=s();if(f===null)return null;i[c]=+f}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:Z(a)}}function Ke(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:Z(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 et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],f=null,m=()=>{if(!a)return;let u=Ot(a.chunks.join("")),d=u[0]===137&&u[1]===80&&u[2]===78&&u[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:u,...d?{mime:"image/png"}:{}}),a=null},g=!0,y=(u)=>{if(m(),o={name:Z(u),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,g=!0},v=!1,x=!1,S=()=>{if(x)return;x=!0,s.clear(),o=null,i=""},h=(u,d)=>{if(f){u.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!d)u.fallback=!0}else u.tex=p.map};for(let u of e.split(`\n`)){let d=u.trim();if(!d)continue;if(r&&d.charCodeAt(0)>=50&&d.charCodeAt(0)<=53&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){if(a||v)continue;if(!o)y(t);let T=d.slice(2).trimStart(),E=T.search(/\\s/),D={t:d.charCodeAt(0)-48,color:Le(E<0?T:T.slice(0,E)),p:[],src:d};h(D,!1),o.cmds.push(D),g=!1;continue}if(d.charCodeAt(0)===48&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){let T=2;while(d.charCodeAt(T)===32||d.charCodeAt(T)===9)T++;let E=T;while(E<d.length&&d.charCodeAt(E)!==32&&d.charCodeAt(E)!==9)E++;let D=d.slice(T,E);if(!Ft.has(D)){if(v||a)continue;if(!o)y(t);let C=d.slice(T),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,g&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(d.charCodeAt(0)===49&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)&&!a&&!v){let T=Nt(d);if(T){if(!o)y(t);h(T,!1),o.cmds.push(T),g=!1;continue}}let p=d.split(/\\s+/);if(+p[0]===0){let T=d.slice(1).trim();if(p[1]==="FILE"){S(),v=!1,y(T.slice(5));continue}if(p[1]==="NOFILE"){m(),o=null,v=!0;continue}if(p[1]==="!DATA"){S(),m(),o=null,v=!1,a={name:T.slice(5).trim(),chunks:[]};continue}if(v)continue;if(a){if(p[1]==="!:")a.chunks.push(p.slice(2).join(""));continue}if(!o)y(t);let E={t:0,text:T};if(p[1]==="STEP")E.step=!0,c=[],f=null;else if(p[1]==="BFC")E.bfc=p.slice(2).join(" ");else if(p[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],f=null,(p[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(p[5]??"REL").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(p[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(p[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:p[3]??"A"}}else if(p[1]?.startsWith("!"))E.meta=p[1];if(g&&!o.org){let C=We(T);if(C)o.org=C}if(p[1]==="!TEXMAP"){let C=(p[2]??"").toUpperCase();if(f=null,C==="START"||C==="NEXT"){let U=zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else f=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(p[1]==="!:"){f=null;let C=Ke(p.slice(2));if(C)h(C,!0),E.geom=C}else f=null;let D=T.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||v)continue;if(!o)y(t);let b=Ke(p);if(!b)continue;h(b,!1),o.cmds.push(b),g=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(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 nt(e,t){let[n,r,s,o,i,l,a,c,f,m,g,y]=e,[v,x,S,h,u,d,p,L,b,T,E,D]=t;return[o*v+i*x+l*S+n,a*v+c*x+f*S+r,m*v+g*x+y*S+s,o*h+i*p+l*T,o*u+i*L+l*E,o*d+i*b+l*D,a*h+c*p+f*T,a*u+c*L+f*E,a*d+c*b+f*D,m*h+g*p+y*T,m*u+g*L+y*E,m*d+g*b+y*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.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&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.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 Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(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 st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(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 ot(e){let[t,n,r,s,o,i,l,a,c,f,m,g]=e,y=a*g-c*m,v=-(l*g-c*f),x=l*m-a*f,S=s*y+o*v+i*x;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,u=[y*h,-(o*g-i*m)*h,(o*c-i*a)*h,v*h,(s*g-i*f)*h,-(s*c-i*l)*h,x*h,-(s*m-o*f)*h,(s*a-o*l)*h];return[-(u[0]*t+u[1]*n+u[2]*r),-(u[3]*t+u[4]*n+u[5]*r),-(u[6]*t+u[7]*n+u[8]*r),...u]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(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 Wt(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 qe=new WeakMap;function at(e){let t=qe.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=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(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,g)=>{let y=m.name+"#"+g,v=l.get(y);if(!v){let x;v=Object.assign(()=>x??=st(m,g),{file:m,step:g}),l.set(y,v)}return v},f=(m,g,y,v,x,S,h,u,d=null,p=[],L=[])=>{let b=m.files.get(g);if(!b||h>r)return;let T=0,E=h>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...L,y]:L,U=i&&!d?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==T)X=T,H=0;let j=U?.get(T+"|"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,x+"/"+w,[...R,lt],h+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,x+"/"+w,I,h+1,z,d,D,C),U?.set(T+"|"+w,{n:1,from:G,to:n.length})},A=at(b),k=s?rt(b):[],V=0,B=(P,w,O,F,R,z,j)=>{if(d)F=d;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:x};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<k.length&&k[V]<=P){let w=k[V++];B(Ie(b.name,w),v,y,[...S,w],w,!1,null).source=c(b,w)}};for(let P of b.cmds){if(P.t===0&&P.step){T++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(T);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?v:w.color,F=nt(y,w.m),R=[...S,T],z=o?w.tex??u:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)==="model"){M(m,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(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(Z(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(Z(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Z(t.slice(14).join(" ")):null};function Yt(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 ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(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,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.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((g,y)=>{l.push(g[0]),a.push(g[1]);for(let v=0;v<12;v++)i[y*12+v]=g[2+v]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let g=s.mask[2];c=new Uint8Array(g.length);for(let y=0;y<g.length;y++)c[y]=g.charCodeAt(y)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,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 we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],g=new Re(e.length*2),y=[],v=[];for(let M=0;M<e.length;M++){let A=e[M],k=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(k))continue;let B=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?B[3]:B[0],G=j?B[5]:B[2],_=k[0]+k[3]*I+k[5]*G,Y=k[2]+k[9]*I+k[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(B[0]),m.push(B[2]);let R=Math.round((k[1]+B[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=v.length;v.push(F),y.push(g.put(R,z,j,I))}}let x=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,u=NaN,d=NaN,p=-1,L=(M,A,k,V)=>{let B=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(k/40);if(!we(B,N,P))return fe;let w=fe;if(B!==h||N!==u||P!==d)h=B,u=N,d=P,p=g.get(B,N,P);for(let O=p;O>=0;O=y[O]){let F=v[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&k-6>=i[F]-0.5&&k+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=k-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+x[Q]-j)/20),ne=Math.floor((J+S[Q]-I)/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[F]];if(Q<w)w=Q}}return w},b=0;for(let M of e){let A=Fe(t,M.part);if(A)b+=A.nStuds}let T=new Uint8Array(b),E=new Uint8Array(b),D=new Re(b),C=0,U=n?new Int32Array(b).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let k=e[M],V=Fe(t,k.part);if(!V)continue;let B=k.m,N=V.studM,P=B[0],w=B[1],O=B[2],F=B[3],R=B[4],z=B[5],j=B[6],I=B[7],G=B[8],_=B[9],Y=B[10],q=B[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=L(De,Ue,ze,M);if(Oe!==fe){if(T[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],k=t.parts[A.part];if(!k||!k.under||!pt(A.m))continue;let V=k.bbox,B=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!B||!N||B*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<B&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:b,studHidden:T,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(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)=>ct(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 Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.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(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(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"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let g of e){let y=g.buffer;if(!y)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let v=new DataView(y).getUint32(0,!0),x=new Uint8Array(y,4+v),S=r;n.push(x),r+=x.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[u,d]of Object.entries(g.header.parts??{}))if(!(u in s))s[u]=Te(d,S);for(let[u,d]of Object.entries(g.header.studKinds??{}))if(!(u in o))o[u]=Te(d,S)}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,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let g of n)f.set(g,m),m+=g.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let h of i){if(Me.has(n+h))continue;let u=o.parts[h];if(u)a.push({name:h,off:u[0],len:u[1],file:u[2]??0});else l.push(h)}a.sort((h,u)=>h.file-u.file||h.off-u.off);let c=[];for(let h of a){let u=c[c.length-1];if(u&&u.file===h.file&&h.off-u.end<=s)u.end=Math.max(u.end,h.off+h.len),u.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,m=0,g=0,y=new Map,v=async()=>{while(g<c.length){let h=c[g++],u=y.get(h.file);if(u)u=u.subarray(h.start,h.end);else{let d=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!d.ok)throw Error(`ldr: parts CDN ${d.status}`);if(m++,u=new Uint8Array(await d.arrayBuffer()),f+=u.byteLength,d.status===200)y.set(h.file,u),u=u.subarray(h.start,h.end)}for(let d of h.items){let p=ye(u.subarray(d.off-h.start,d.off-h.start+d.len)),L=p.buffer.slice(p.byteOffset,p.byteOffset+p.byteLength);Me.set(n+d.name,xe(L))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},v));let x=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:m,bytes:f}}function nn(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}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,L)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&L>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:g,missing:y,requests:v,bytes:x}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),S=new Map([...f].map(([p,L])=>[L,p])),h=y.map((p)=>S.get(p)??p);for(let[p,L]of f){let b=g.header.parts[L];if(b)g.header.parts[p]=b}let u=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=g.buffer?.byteLength??g.bytes??0,L=rn(a,g);if(m(L,p))throw new pe({bodyTris:L,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let d=t.cull?Ae(a,g.header,t.textures!==!1):void 0;return{insts:a,pack:g,missing:h,requests:v,bytes:x,cull:d,timings:{fetchModel:i-n,parse:c-i,parts:u-c,...d?{cull:performance.now()-u}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),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=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
3993
4081
|
|
|
3994
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4082
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cdn.ts
|
|
3995
4083
|
var worker;
|
|
3996
4084
|
var seq = 0;
|
|
3997
4085
|
var pending = new Map;
|
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/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-JiiKTe/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-JiiKTe/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-JiiKTe/src/render.ts
|
|
1411
1411
|
import * as THREE from "three";
|
|
1412
1412
|
|
|
1413
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1413
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/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);
|
|
@@ -1433,7 +1433,7 @@ function decodePack(buf) {
|
|
|
1433
1433
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1434
1434
|
}
|
|
1435
1435
|
|
|
1436
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1436
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cull.ts
|
|
1437
1437
|
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;
|
|
1438
1438
|
var prepCache = new WeakMap;
|
|
1439
1439
|
function prepPart(H, part) {
|
|
@@ -1750,7 +1750,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1750
1750
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1751
1751
|
}
|
|
1752
1752
|
|
|
1753
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1753
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/render.ts
|
|
1754
1754
|
async function loadPack(url) {
|
|
1755
1755
|
const res = await fetch(url);
|
|
1756
1756
|
if (!res.ok)
|
|
@@ -2277,6 +2277,68 @@ function gridClusters(n, x, z, k) {
|
|
|
2277
2277
|
}
|
|
2278
2278
|
return out;
|
|
2279
2279
|
}
|
|
2280
|
+
function* gridClustersGen(n, x, z, k) {
|
|
2281
|
+
const CH = 65536;
|
|
2282
|
+
if (n <= CH || n <= k || !isFinite(k))
|
|
2283
|
+
return gridClusters(n, x, z, k);
|
|
2284
|
+
const bb = [Infinity, -Infinity, Infinity, -Infinity];
|
|
2285
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2286
|
+
gcBounds(bb, x, z, i0, Math.min(n, i0 + CH));
|
|
2287
|
+
yield;
|
|
2288
|
+
}
|
|
2289
|
+
const [x0, x1, z0, z1] = bb;
|
|
2290
|
+
const G = Math.max(1, Math.ceil(Math.sqrt(n / k)));
|
|
2291
|
+
const sx = (x1 - x0) / G || 1, sz = (z1 - z0) / G || 1;
|
|
2292
|
+
const cell = new Int32Array(n), cnt = new Int32Array(G * G);
|
|
2293
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2294
|
+
gcCells(cell, cnt, x, z, i0, Math.min(n, i0 + CH), x0, z0, sx, sz, G);
|
|
2295
|
+
yield;
|
|
2296
|
+
}
|
|
2297
|
+
const out = [];
|
|
2298
|
+
const at = new Int32Array(G * G).fill(-1);
|
|
2299
|
+
const fill = new Int32Array(G * G);
|
|
2300
|
+
for (let c = 0;c < G * G; c++)
|
|
2301
|
+
if (cnt[c]) {
|
|
2302
|
+
at[c] = out.length;
|
|
2303
|
+
out.push(new Int32Array(cnt[c]));
|
|
2304
|
+
}
|
|
2305
|
+
for (let i0 = 0;i0 < n; i0 += CH) {
|
|
2306
|
+
gcFill(out, at, fill, cell, i0, Math.min(n, i0 + CH));
|
|
2307
|
+
yield;
|
|
2308
|
+
}
|
|
2309
|
+
return out;
|
|
2310
|
+
}
|
|
2311
|
+
function gcBounds(bb, x, z, i0, i1) {
|
|
2312
|
+
let x0 = bb[0], x1 = bb[1], z0 = bb[2], z1 = bb[3];
|
|
2313
|
+
for (let i = i0;i < i1; i++) {
|
|
2314
|
+
const a = x(i), b = z(i);
|
|
2315
|
+
if (a < x0)
|
|
2316
|
+
x0 = a;
|
|
2317
|
+
if (a > x1)
|
|
2318
|
+
x1 = a;
|
|
2319
|
+
if (b < z0)
|
|
2320
|
+
z0 = b;
|
|
2321
|
+
if (b > z1)
|
|
2322
|
+
z1 = b;
|
|
2323
|
+
}
|
|
2324
|
+
bb[0] = x0;
|
|
2325
|
+
bb[1] = x1;
|
|
2326
|
+
bb[2] = z0;
|
|
2327
|
+
bb[3] = z1;
|
|
2328
|
+
}
|
|
2329
|
+
function gcCells(cell, cnt, x, z, i0, i1, x0, z0, sx, sz, G) {
|
|
2330
|
+
for (let i = i0;i < i1; i++) {
|
|
2331
|
+
const c = Math.min(G - 1, Math.floor((x(i) - x0) / sx)) * G + Math.min(G - 1, Math.floor((z(i) - z0) / sz));
|
|
2332
|
+
cell[i] = c;
|
|
2333
|
+
cnt[c]++;
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
function gcFill(out, at, fill, cell, i0, i1) {
|
|
2337
|
+
for (let i = i0;i < i1; i++) {
|
|
2338
|
+
const c = cell[i];
|
|
2339
|
+
out[at[c]][fill[c]++] = i;
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2280
2342
|
var _studDisc = null;
|
|
2281
2343
|
function studDiscGeom() {
|
|
2282
2344
|
if (_studDisc)
|
|
@@ -2475,12 +2537,9 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
2475
2537
|
}
|
|
2476
2538
|
const studCl = new Int32Array(cull.nStuds), studSlot = new Int32Array(cull.nStuds);
|
|
2477
2539
|
const sMesh = [];
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
|
|
2482
|
-
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
|
|
2483
|
-
for (const c of gridClusters(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud)) {
|
|
2540
|
+
const allocClusters = (b, kind, g, ids, cs, c0, c1) => {
|
|
2541
|
+
for (let q = c0;q < c1; q++) {
|
|
2542
|
+
const c = cs[q];
|
|
2484
2543
|
const ci = sMesh.length;
|
|
2485
2544
|
let v = 0;
|
|
2486
2545
|
for (const i of c)
|
|
@@ -2501,7 +2560,22 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
2501
2560
|
const n = c.length;
|
|
2502
2561
|
sMesh.push({ im, kind, vis: v, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
|
|
2503
2562
|
}
|
|
2504
|
-
}
|
|
2563
|
+
};
|
|
2564
|
+
for (let b = 0;b < bKind.length; b++) {
|
|
2565
|
+
if (b)
|
|
2566
|
+
yield;
|
|
2567
|
+
const kind = bKind[b];
|
|
2568
|
+
const g = geom(H.studKinds[kind].body, arr);
|
|
2569
|
+
const ids = bIds[b];
|
|
2570
|
+
const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
|
|
2571
|
+
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
|
|
2572
|
+
const clusters = yield* gridClustersGen(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud);
|
|
2573
|
+
for (let c0 = 0;c0 < clusters.length; c0 += 4) {
|
|
2574
|
+
if (c0)
|
|
2575
|
+
yield;
|
|
2576
|
+
allocClusters(b, kind, g, ids, clusters, c0, Math.min(clusters.length, c0 + 4));
|
|
2577
|
+
}
|
|
2578
|
+
}
|
|
2505
2579
|
const colCache = new Map;
|
|
2506
2580
|
const colorOf = (c) => {
|
|
2507
2581
|
let x = colCache.get(c);
|
|
@@ -2634,21 +2708,29 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
2634
2708
|
return m;
|
|
2635
2709
|
};
|
|
2636
2710
|
const byPart = new Map;
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2711
|
+
const bucketRange = (i0, i1) => {
|
|
2712
|
+
for (let i = i0;i < i1; i++) {
|
|
2713
|
+
const it = insts[i];
|
|
2714
|
+
const p = H.parts[it.part];
|
|
2715
|
+
if (!p)
|
|
2716
|
+
continue;
|
|
2717
|
+
const mirror = det12(it.m) < 0;
|
|
2718
|
+
const mat = materialFor(String(it.color), mirror, !!p.uncert);
|
|
2719
|
+
const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
|
|
2720
|
+
let b = byPart.get(k);
|
|
2721
|
+
if (!b) {
|
|
2722
|
+
if (p.uncert)
|
|
2723
|
+
nUncert++;
|
|
2724
|
+
byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
|
|
2725
|
+
}
|
|
2726
|
+
b.ids.push(i);
|
|
2727
|
+
}
|
|
2728
|
+
};
|
|
2729
|
+
for (let i0 = 0;i0 < insts.length; i0 += 8192) {
|
|
2730
|
+
if (i0)
|
|
2731
|
+
yield root;
|
|
2732
|
+
bucketRange(i0, Math.min(insts.length, i0 + 8192));
|
|
2733
|
+
}
|
|
2652
2734
|
yield root;
|
|
2653
2735
|
const steps = P.steps;
|
|
2654
2736
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
@@ -2929,7 +3011,10 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
2929
3011
|
if (!entries.length)
|
|
2930
3012
|
continue;
|
|
2931
3013
|
const groups = gridClusters(entries.length, (i) => insts[entries[i].id].m[0], (i) => insts[entries[i].id].m[2], LOD ? 256 : Infinity);
|
|
3014
|
+
let _coopG = 0;
|
|
2932
3015
|
for (const g of groups) {
|
|
3016
|
+
if (_coopG++)
|
|
3017
|
+
yield root;
|
|
2933
3018
|
const members = Array.from(g, (i) => entries[i]);
|
|
2934
3019
|
const partSet = new Map;
|
|
2935
3020
|
for (const m of members)
|
|
@@ -3013,6 +3098,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3013
3098
|
if (pp.edges)
|
|
3014
3099
|
addLines(pp.edges, ghost, cl);
|
|
3015
3100
|
addCond(pp, ghost, cl);
|
|
3101
|
+
yield root;
|
|
3016
3102
|
if (steps)
|
|
3017
3103
|
stepBatches.push({ im: ghost, objs: [ghost, ...cl.lines.slice(nL), ...cl.cond.slice(nC)], own: Int32Array.from(ids, (id) => steps[id]), hide: null, flag: "body", inst: Int32Array.from(ids), stud: null, col: Uint16Array.from(ids, (id) => instCol[id]) });
|
|
3018
3104
|
}
|
|
@@ -3024,6 +3110,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3024
3110
|
const uEntries = withUnder.map((m) => m.id);
|
|
3025
3111
|
const uGroups = LOD && P.lodUnder !== false ? undersideGroups(uEntries, insts) : [{ ids: uEntries, ax: null }];
|
|
3026
3112
|
for (const { ids: uids, ax } of uGroups) {
|
|
3113
|
+
yield root;
|
|
3027
3114
|
const byId = new Map(members.map((m) => [m.id, m]));
|
|
3028
3115
|
const umembers = uids.map((id) => {
|
|
3029
3116
|
const m = byId.get(id);
|
|
@@ -3126,6 +3213,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3126
3213
|
};
|
|
3127
3214
|
setN(P.cullUnder ? vis : ord.length);
|
|
3128
3215
|
underGhostCounts.push({ set: setN, all: ord.length, vis });
|
|
3216
|
+
yield root;
|
|
3129
3217
|
if (steps)
|
|
3130
3218
|
stepBatches.push({ im: ghost, objs: [ghost, ...lineObjs], 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]) });
|
|
3131
3219
|
}
|
|
@@ -3464,7 +3552,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3464
3552
|
await new Promise((r) => setTimeout(r, 0));
|
|
3465
3553
|
}
|
|
3466
3554
|
}
|
|
3467
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3555
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/scene.ts
|
|
3468
3556
|
import * as THREE2 from "three";
|
|
3469
3557
|
function colorFn(src, pack, fallback) {
|
|
3470
3558
|
const table = new Map;
|
|
@@ -3682,10 +3770,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
3682
3770
|
return finish();
|
|
3683
3771
|
})();
|
|
3684
3772
|
}
|
|
3685
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3773
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/parts-cdn.ts
|
|
3686
3774
|
import { decompress as decompress2 } from "fzstd";
|
|
3687
3775
|
|
|
3688
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3776
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/embedded.ts
|
|
3689
3777
|
function splitFiles(text, fallback) {
|
|
3690
3778
|
const files = new Map;
|
|
3691
3779
|
let cur = null, saw = false;
|
|
@@ -3757,7 +3845,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3757
3845
|
return out;
|
|
3758
3846
|
}
|
|
3759
3847
|
|
|
3760
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3848
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/parts-cdn.ts
|
|
3761
3849
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3762
3850
|
var indexCache = new Map;
|
|
3763
3851
|
var shardCache = new Map;
|
|
@@ -3989,10 +4077,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3989
4077
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3990
4078
|
}
|
|
3991
4079
|
|
|
3992
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4080
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/load-worker.gen.ts
|
|
3993
4081
|
var load_worker_gen_default = 'var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=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},xt=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 wt=["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||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=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,f=je(e,a,c);a+=c;var m=l?1<<l:s,g=je(e,a,m)+(l==1&&256),y=g;if(!s){var v=1<<10+(e[5]>>3);y=v+(v>>3)*(e[5]&7)}if(y>2145386496)K(1);var x=new W((t==1?g||y:t?0:y)+12);return x[0]=1,x[4]=4,x[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:x.subarray(12),e:y,o:new be(x.buffer,0,3),u:g,c:o,m:Math.min(131072,y)}}else if((n>>4|e[3]<<20)==25481893)return At(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,f=o,m=new bt(512+(o<<2)),g=new yt(m,0,256),y=new de(m,0,256),v=new de(m,512,o),x=512+(o<<1),S=new W(m,x,o),h=new W(m,x+o);while(l<255&&i>0){var u=re(i+1),d=r>>3,p=(1<<u+1)-1,L=(e[d]|e[d+1]<<8|e[d+2]<<16)>>(r&7)&p,b=(1<<u)-1,T=p-i-1,E=L&b;if(E<T)r+=u,L=E;else if(r+=u+1,L>b)L-=T;if(g[++l]=--L,L==-1)i+=L,S[--f]=l;else i-=L;if(!L)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 C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=g[H];if(M<1){y[H]=-M;continue}for(c=0;c<M;++c){S[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=y[S[c]]++,k=h[c]=s-re(A);v[c]=(A<<k)-o}return[r+7>>3,{b:s,s:S,n:h,t:v}]},vt=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 de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var g=f<<3,y=e[t];if(!y)K(0);var v=0,x=0,S=m.b,h=S,u=(++t<<3)-8+re(y);for(;;){if(u-=S,u<g)break;var d=u>>3;if(v+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<S)-1,i[++r]=m.s[v],u-=h,u<g)break;d=u>>3,x+=(e[d]|e[d+1]<<8)>>(u&7)&(1<<h)-1,i[++r]=m.s[x],S=m.n[v],v=m.t[v],h=m.n[x],x=m.t[x]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var L=0;for(n=0;n<r;++n){var b=i[n];if(b>11)K(0);L+=b&&1<<b-1}var T=re(L)+1,E=1<<T,D=E-L;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var b=i[n];++l[i[n]=b&&T+1-b]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[T]=0;for(n=T;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<T-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<T-M))}}return[t,{n:X,b:T,s:U}]},Tt=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],Ct=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],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=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},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,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,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var g=f>>3,y=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(f&7);a=(a<<c|y)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=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)},kt=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 Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,g=c>>4,y=0,v=0;if(f<2)if(m&1)g|=e[++s]<<4|(m&2&&e[++s]<<12);else g=c>>3;else if(v=m,m<2)g|=(e[++s]&63)<<4,y=e[s]>>6|e[++s]<<2;else if(m==2)g|=e[++s]<<4|(e[++s]&3)<<12,y=e[s]>>2|e[++s]<<6;else g|=e[++s]<<4|(e[++s]&63)<<12,y=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var x=n?n.subarray(t.y,t.y+t.m):new W(t.m),S=x.length-g;if(f==0)x.set(e.subarray(s,s+=g),S);else if(f==1)ce(x,e[s++],S);else{var h=t.h;if(f==2){var u=vt(e,s);y+=s-(s=u[0]),t.h=h=u[1]}else if(!h)K(0);(v?Lt:le)(e.subarray(s,s+=y),x.subarray(S),h)}var d=e[s++];if(d){if(d==255)d=(e[s++]|e[s++]<<8)+32512;else if(d>127)d=d-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var L=[Ct,Et,Tt];for(var b=2;b>-1;--b){var T=p>>(b<<1)+2&3;if(T==1){var E=new W([0,0,e[s++]]);L[b]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(T==2)r=ue(e,s,9-(b&1)),s=r[0],L[b]=r[1];else if(T==3){if(!t.t)K(0);L[b]=t.t[b]}}var D=t.t=L,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,k=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var B=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++d;--d;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[B],z=U.n[B];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,B=U.t[B]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var b=0;b<_;++b)x[k+b]=x[S+b];k+=_,S+=_;var q=k-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var b=0;b<J;++b)x[k+b]=t.w[ee+b];k+=J,G-=J,q=0}for(var b=0;b<G;++b)x[k+b]=x[q+b];k+=G}if(k!=S)while(S<x.length)x[k++]=x[S++];else k=x.length;if(n)t.y+=k;else x=Ee(x,0,k)}else if(n){if(t.y+=g,S)for(var b=0;b<g;++b)x[b]=x[S+b]}else if(S)x=Ee(x,S);return t.b=a,x}K(2)},Bt=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 ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(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=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(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 Bt(n,o)}async function It(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ye(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(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 Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(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 zt(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=Ut(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 f=a.findIndex((m,g)=>g>0&&m.toUpperCase()==="GLOSSMAP");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(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 Nt(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 f=s();if(f===null)return null;i[c]=+f}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:Z(a)}}function Ke(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:Z(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 et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],f=null,m=()=>{if(!a)return;let u=Ot(a.chunks.join("")),d=u[0]===137&&u[1]===80&&u[2]===78&&u[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:u,...d?{mime:"image/png"}:{}}),a=null},g=!0,y=(u)=>{if(m(),o={name:Z(u),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,g=!0},v=!1,x=!1,S=()=>{if(x)return;x=!0,s.clear(),o=null,i=""},h=(u,d)=>{if(f){u.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!d)u.fallback=!0}else u.tex=p.map};for(let u of e.split(`\n`)){let d=u.trim();if(!d)continue;if(r&&d.charCodeAt(0)>=50&&d.charCodeAt(0)<=53&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){if(a||v)continue;if(!o)y(t);let T=d.slice(2).trimStart(),E=T.search(/\\s/),D={t:d.charCodeAt(0)-48,color:Le(E<0?T:T.slice(0,E)),p:[],src:d};h(D,!1),o.cmds.push(D),g=!1;continue}if(d.charCodeAt(0)===48&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){let T=2;while(d.charCodeAt(T)===32||d.charCodeAt(T)===9)T++;let E=T;while(E<d.length&&d.charCodeAt(E)!==32&&d.charCodeAt(E)!==9)E++;let D=d.slice(T,E);if(!Ft.has(D)){if(v||a)continue;if(!o)y(t);let C=d.slice(T),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,g&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(d.charCodeAt(0)===49&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)&&!a&&!v){let T=Nt(d);if(T){if(!o)y(t);h(T,!1),o.cmds.push(T),g=!1;continue}}let p=d.split(/\\s+/);if(+p[0]===0){let T=d.slice(1).trim();if(p[1]==="FILE"){S(),v=!1,y(T.slice(5));continue}if(p[1]==="NOFILE"){m(),o=null,v=!0;continue}if(p[1]==="!DATA"){S(),m(),o=null,v=!1,a={name:T.slice(5).trim(),chunks:[]};continue}if(v)continue;if(a){if(p[1]==="!:")a.chunks.push(p.slice(2).join(""));continue}if(!o)y(t);let E={t:0,text:T};if(p[1]==="STEP")E.step=!0,c=[],f=null;else if(p[1]==="BFC")E.bfc=p.slice(2).join(" ");else if(p[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],f=null,(p[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(p[5]??"REL").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(p[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(p[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:p[3]??"A"}}else if(p[1]?.startsWith("!"))E.meta=p[1];if(g&&!o.org){let C=We(T);if(C)o.org=C}if(p[1]==="!TEXMAP"){let C=(p[2]??"").toUpperCase();if(f=null,C==="START"||C==="NEXT"){let U=zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else f=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(p[1]==="!:"){f=null;let C=Ke(p.slice(2));if(C)h(C,!0),E.geom=C}else f=null;let D=T.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||v)continue;if(!o)y(t);let b=Ke(p);if(!b)continue;h(b,!1),o.cmds.push(b),g=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(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 nt(e,t){let[n,r,s,o,i,l,a,c,f,m,g,y]=e,[v,x,S,h,u,d,p,L,b,T,E,D]=t;return[o*v+i*x+l*S+n,a*v+c*x+f*S+r,m*v+g*x+y*S+s,o*h+i*p+l*T,o*u+i*L+l*E,o*d+i*b+l*D,a*h+c*p+f*T,a*u+c*L+f*E,a*d+c*b+f*D,m*h+g*p+y*T,m*u+g*L+y*E,m*d+g*b+y*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.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&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.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 Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(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 st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(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 ot(e){let[t,n,r,s,o,i,l,a,c,f,m,g]=e,y=a*g-c*m,v=-(l*g-c*f),x=l*m-a*f,S=s*y+o*v+i*x;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,u=[y*h,-(o*g-i*m)*h,(o*c-i*a)*h,v*h,(s*g-i*f)*h,-(s*c-i*l)*h,x*h,-(s*m-o*f)*h,(s*a-o*l)*h];return[-(u[0]*t+u[1]*n+u[2]*r),-(u[3]*t+u[4]*n+u[5]*r),-(u[6]*t+u[7]*n+u[8]*r),...u]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(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 Wt(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 qe=new WeakMap;function at(e){let t=qe.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=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(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,g)=>{let y=m.name+"#"+g,v=l.get(y);if(!v){let x;v=Object.assign(()=>x??=st(m,g),{file:m,step:g}),l.set(y,v)}return v},f=(m,g,y,v,x,S,h,u,d=null,p=[],L=[])=>{let b=m.files.get(g);if(!b||h>r)return;let T=0,E=h>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...L,y]:L,U=i&&!d?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==T)X=T,H=0;let j=U?.get(T+"|"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,x+"/"+w,[...R,lt],h+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,x+"/"+w,I,h+1,z,d,D,C),U?.set(T+"|"+w,{n:1,from:G,to:n.length})},A=at(b),k=s?rt(b):[],V=0,B=(P,w,O,F,R,z,j)=>{if(d)F=d;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:x};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<k.length&&k[V]<=P){let w=k[V++];B(Ie(b.name,w),v,y,[...S,w],w,!1,null).source=c(b,w)}};for(let P of b.cmds){if(P.t===0&&P.step){T++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(T);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?v:w.color,F=nt(y,w.m),R=[...S,T],z=o?w.tex??u:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)==="model"){M(m,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}B(w.file,O,F,R,T,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(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(Z(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(Z(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Z(t.slice(14).join(" ")):null};function Yt(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 ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(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,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.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((g,y)=>{l.push(g[0]),a.push(g[1]);for(let v=0;v<12;v++)i[y*12+v]=g[2+v]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let g=s.mask[2];c=new Uint8Array(g.length);for(let y=0;y<g.length;y++)c[y]=g.charCodeAt(y)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,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 we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],g=new Re(e.length*2),y=[],v=[];for(let M=0;M<e.length;M++){let A=e[M],k=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(k))continue;let B=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?B[3]:B[0],G=j?B[5]:B[2],_=k[0]+k[3]*I+k[5]*G,Y=k[2]+k[9]*I+k[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(B[0]),m.push(B[2]);let R=Math.round((k[1]+B[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=v.length;v.push(F),y.push(g.put(R,z,j,I))}}let x=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,u=NaN,d=NaN,p=-1,L=(M,A,k,V)=>{let B=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(k/40);if(!we(B,N,P))return fe;let w=fe;if(B!==h||N!==u||P!==d)h=B,u=N,d=P,p=g.get(B,N,P);for(let O=p;O>=0;O=y[O]){let F=v[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&k-6>=i[F]-0.5&&k+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=k-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+x[Q]-j)/20),ne=Math.floor((J+S[Q]-I)/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[F]];if(Q<w)w=Q}}return w},b=0;for(let M of e){let A=Fe(t,M.part);if(A)b+=A.nStuds}let T=new Uint8Array(b),E=new Uint8Array(b),D=new Re(b),C=0,U=n?new Int32Array(b).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let k=e[M],V=Fe(t,k.part);if(!V)continue;let B=k.m,N=V.studM,P=B[0],w=B[1],O=B[2],F=B[3],R=B[4],z=B[5],j=B[6],I=B[7],G=B[8],_=B[9],Y=B[10],q=B[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=L(De,Ue,ze,M);if(Oe!==fe){if(T[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],k=t.parts[A.part];if(!k||!k.under||!pt(A.m))continue;let V=k.bbox,B=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!B||!N||B*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<B&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:b,studHidden:T,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(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)=>ct(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 Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.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(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(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"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let g of e){let y=g.buffer;if(!y)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let v=new DataView(y).getUint32(0,!0),x=new Uint8Array(y,4+v),S=r;n.push(x),r+=x.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[u,d]of Object.entries(g.header.parts??{}))if(!(u in s))s[u]=Te(d,S);for(let[u,d]of Object.entries(g.header.studKinds??{}))if(!(u in o))o[u]=Te(d,S)}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,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let g of n)f.set(g,m),m+=g.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let h of i){if(Me.has(n+h))continue;let u=o.parts[h];if(u)a.push({name:h,off:u[0],len:u[1],file:u[2]??0});else l.push(h)}a.sort((h,u)=>h.file-u.file||h.off-u.off);let c=[];for(let h of a){let u=c[c.length-1];if(u&&u.file===h.file&&h.off-u.end<=s)u.end=Math.max(u.end,h.off+h.len),u.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,m=0,g=0,y=new Map,v=async()=>{while(g<c.length){let h=c[g++],u=y.get(h.file);if(u)u=u.subarray(h.start,h.end);else{let d=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!d.ok)throw Error(`ldr: parts CDN ${d.status}`);if(m++,u=new Uint8Array(await d.arrayBuffer()),f+=u.byteLength,d.status===200)y.set(h.file,u),u=u.subarray(h.start,h.end)}for(let d of h.items){let p=ye(u.subarray(d.off-h.start,d.off-h.start+d.len)),L=p.buffer.slice(p.byteOffset,p.byteOffset+p.byteLength);Me.set(n+d.name,xe(L))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},v));let x=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:m,bytes:f}}function nn(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}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,L)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&L>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:g,missing:y,requests:v,bytes:x}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),S=new Map([...f].map(([p,L])=>[L,p])),h=y.map((p)=>S.get(p)??p);for(let[p,L]of f){let b=g.header.parts[L];if(b)g.header.parts[p]=b}let u=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=g.buffer?.byteLength??g.bytes??0,L=rn(a,g);if(m(L,p))throw new pe({bodyTris:L,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let d=t.cull?Ae(a,g.header,t.textures!==!1):void 0;return{insts:a,pack:g,missing:h,requests:v,bytes:x,cull:d,timings:{fetchModel:i-n,parse:c-i,parts:u-c,...d?{cull:performance.now()-u}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),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=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
3994
4082
|
|
|
3995
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4083
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/cdn.ts
|
|
3996
4084
|
var worker;
|
|
3997
4085
|
var seq = 0;
|
|
3998
4086
|
var pending = new Map;
|
|
@@ -4105,7 +4193,7 @@ async function loadModel(source, o = {}) {
|
|
|
4105
4193
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
4106
4194
|
});
|
|
4107
4195
|
}
|
|
4108
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4196
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/library.ts
|
|
4109
4197
|
import { existsSync, readFileSync } from "fs";
|
|
4110
4198
|
import { join } from "path";
|
|
4111
4199
|
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]];
|
|
@@ -4359,11 +4447,11 @@ class Library {
|
|
|
4359
4447
|
return insts;
|
|
4360
4448
|
}
|
|
4361
4449
|
}
|
|
4362
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4450
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/build-pack.ts
|
|
4363
4451
|
import fs3 from "node:fs";
|
|
4364
4452
|
import path3 from "node:path";
|
|
4365
4453
|
|
|
4366
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4454
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/resolver.ts
|
|
4367
4455
|
import fs from "node:fs";
|
|
4368
4456
|
import path from "node:path";
|
|
4369
4457
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4635,11 +4723,11 @@ function collectDeps(lib, refs) {
|
|
|
4635
4723
|
return out;
|
|
4636
4724
|
}
|
|
4637
4725
|
|
|
4638
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4726
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/compile.ts
|
|
4639
4727
|
import fs2 from "node:fs";
|
|
4640
4728
|
import path2 from "node:path";
|
|
4641
4729
|
|
|
4642
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4730
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/lod.ts
|
|
4643
4731
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4644
4732
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4645
4733
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4831,7 +4919,7 @@ function lodChain(P, C, I) {
|
|
|
4831
4919
|
return out;
|
|
4832
4920
|
}
|
|
4833
4921
|
|
|
4834
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4922
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/compile.ts
|
|
4835
4923
|
function loadColors(root) {
|
|
4836
4924
|
const map = new Map;
|
|
4837
4925
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -5461,7 +5549,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
5461
5549
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
5462
5550
|
}
|
|
5463
5551
|
|
|
5464
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5552
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/build-pack.ts
|
|
5465
5553
|
function buildPack(o) {
|
|
5466
5554
|
const lib = new Library2(o.ldrawRoot);
|
|
5467
5555
|
const refs = new Map;
|
|
@@ -5528,7 +5616,7 @@ function buildPack(o) {
|
|
|
5528
5616
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
5529
5617
|
return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
|
|
5530
5618
|
}
|
|
5531
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5619
|
+
// ../../../../../../../tmp/ldr-build-JiiKTe/src/node/promote.ts
|
|
5532
5620
|
var GEOM = /^\s*[2-5]\s/;
|
|
5533
5621
|
var REF = /^\s*1\s/;
|
|
5534
5622
|
var FILE = /^\s*0\s+FILE\s+(.+?)\s*$/i;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ldr",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.2",
|
|
4
4
|
"description": "High-performance LEGO (LDraw) rendering for three.js: instanced parts packs, hidden stud/tube culling, low-detail studs, indexed edges, build steps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Evan Bacon",
|