ldr 0.27.0 → 0.27.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/README.md +2 -1
- package/dist/cdn.d.ts +2 -1
- package/dist/cli.js +62 -14
- package/dist/index.js +54 -32
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/build-pack.d.ts +7 -2
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.js +113 -42
- package/dist/node/low-detail.d.ts +20 -0
- package/dist/node/see-through.d.ts +12 -0
- package/dist/parts-cdn.d.ts +6 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -114,6 +114,7 @@ MPD-embedded parts, such as Studio/OMR unofficial parts or stickers, become part
|
|
|
114
114
|
| `decompressPack(bytes)` / `decodePack(buffer)` | Same, from bytes you already have. |
|
|
115
115
|
| `decodeModelText(bytes) → Promise<string>` / `modelFileName(url)` | Model file bytes to LDraw text (zstd / gzip detected and inflated, then UTF-8), and the file name `loadModel` uses for a URL (`8466-1.mpd.zst` → `8466-1.mpd`). `loadModel` reads model URLs this way, so large models can be hosted as `.mpd.zst`. |
|
|
116
116
|
| `bodyTriangles(insts, pack)` / `BudgetError` / `maxBodyTris` / `maxPackBytes` | Full-detail body triangle count; `prepareModel` / `loadModel` abort with `BudgetError` when the merged pack exceeds the caller's triangle or byte limits (phones). |
|
|
117
|
+
| `lowCdn` / `tier` | Lower-detail tier of the parts CDN (the demo's is `<cdn>low/`, built by `build-parts-cdn.ts --low`: per-part simplified bodies, kept only where they are no more see-through than full detail). With a budget set, a model over it at full detail is checked against and loaded from `lowCdn`; `BudgetError` only when it is over there too. `LoadedModel.tier` / `PreparedModel.tier` is `"full"` or `"low"`. |
|
|
117
118
|
| `promoteFlexParts` / `decimateFlexGeometry` / `prepareFlexParts` (node) | Relabel LDCad flex Model files as embedded parts, then lower tube ring tessellation (16→8) and drop rib-detail quads for cheaper hose meshes. |
|
|
118
119
|
| `createLdrObject(instances, pack, options?) → LdrObject` | High-level three.js object (see below). |
|
|
119
120
|
| `createInstancedEdges(pos, instancedMesh, material?)` | Welded, indexed edge lines that share an `InstancedMesh`'s instance matrices. |
|
|
@@ -165,7 +166,7 @@ Everything above, plus:
|
|
|
165
166
|
|
|
166
167
|
| export | description |
|
|
167
168
|
|---|---|
|
|
168
|
-
| `buildPack(options) → { data, parts, studKinds, missing, warnings? }` | Builds a pack. Options: `ldrawRoot`, `models`, `parts`, `allParts`, `studs` (`"low"` \| `"full"`), `primitives` (`"low"` \| `"full"`, default `"low"`), `weld` (`true`), `cond` (`false`), `textures` (`false`), `looseGeometry` (`true`), `colors` (`true`), `lod` (`true`: meshoptimizer-simplified LOD meshes, pack feature `lod`), `reorder` (`false`: vertex-cache order), `onProgress`. |
|
|
169
|
+
| `buildPack(options) → { data, parts, studKinds, missing, warnings? }` | Builds a pack. Options: `ldrawRoot`, `models`, `parts`, `allParts`, `studs` (`"low"` \| `"full"`), `primitives` (`"low"` \| `"full"`, default `"full"`; `"low"` substitutes p/8 primitives and leaves gaps in round parts), `weld` (`true`), `cond` (`false`), `textures` (`false`), `looseGeometry` (`true`), `colors` (`true`), `lod` (`true`: meshoptimizer-simplified LOD meshes, pack feature `lod`), `reorder` (`false`: vertex-cache order), `onProgress`. |
|
|
169
170
|
| `Library(root, unofficialRoot?)` | Filesystem LDraw resolver: `where`, `flatten`, `mesh` (`{ texmap: true }` adds `uv`, per-triangle `texture`, `textures` and, when a map has one, `glossmaps`), `colors`, `texture`, `register`. Handles case-insensitive lookup and `~Moved to` aliases. |
|
|
170
171
|
| `Compiler`, `encodePack`, `writePack`, `loadColors` | Lower-level pack compiler. |
|
|
171
172
|
| `ResolverLibrary`, `splitModel`, `flattenWithLibrary`, `collectDeps` | The resolver that `buildPack` uses. |
|
package/dist/cdn.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export interface LoadModelOptions extends LdrObjectOptions, PrepareOptions {
|
|
|
8
8
|
worker?: boolean;
|
|
9
9
|
}
|
|
10
10
|
export interface LoadedModel extends LdrObject {
|
|
11
|
-
pack: Pack; /**
|
|
11
|
+
pack: Pack; /** Parts CDN tier the parts came from (`"low"`: `lowCdn`, see `PrepareOptions.lowCdn`). */
|
|
12
|
+
tier: "full" | "low"; /** The flattened model (part instances). */
|
|
12
13
|
instances: PartInstance[];
|
|
13
14
|
timings: {
|
|
14
15
|
fetchModel: number;
|
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-B5BCpX/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-B5BCpX/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-B5BCpX/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-B5BCpX/src/spec.ts
|
|
16
16
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
17
17
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
18
18
|
var namedCodes = new Map;
|
|
@@ -723,7 +723,7 @@ function fileStepViews(f) {
|
|
|
723
723
|
return out;
|
|
724
724
|
}
|
|
725
725
|
|
|
726
|
-
// ../../../../../../../tmp/ldr-build-
|
|
726
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/model.ts
|
|
727
727
|
var CALLOUT_END = 999999;
|
|
728
728
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
729
729
|
function flatten(doc, opts = {}) {
|
|
@@ -1106,7 +1106,7 @@ function blendedColourHex(code) {
|
|
|
1106
1106
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1107
1107
|
}
|
|
1108
1108
|
|
|
1109
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1109
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/node/resolver.ts
|
|
1110
1110
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
1111
1111
|
var UNDER_STUD_RE = /^(stud3|stud3a|stud4.*|stud12|stud16.*|stud18a)\.dat$/i;
|
|
1112
1112
|
var norm2 = (ref) => ref.trim().replace(/\\/g, "/").toLowerCase();
|
|
@@ -1376,11 +1376,11 @@ function collectDeps(lib, refs) {
|
|
|
1376
1376
|
return out;
|
|
1377
1377
|
}
|
|
1378
1378
|
|
|
1379
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1379
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/node/compile.ts
|
|
1380
1380
|
import fs2 from "node:fs";
|
|
1381
1381
|
import path2 from "node:path";
|
|
1382
1382
|
|
|
1383
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1383
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/node/lod.ts
|
|
1384
1384
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
1385
1385
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
1386
1386
|
function reorderMesh(P, N, C, I) {
|
|
@@ -1572,7 +1572,7 @@ function lodChain(P, C, I) {
|
|
|
1572
1572
|
return out;
|
|
1573
1573
|
}
|
|
1574
1574
|
|
|
1575
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1575
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/node/compile.ts
|
|
1576
1576
|
function loadColors(root) {
|
|
1577
1577
|
const map = new Map;
|
|
1578
1578
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -1668,6 +1668,7 @@ class Compiler {
|
|
|
1668
1668
|
invertNext = false;
|
|
1669
1669
|
if (isTop && separateStuds) {
|
|
1670
1670
|
out.studs.push({ kind: ck2, color: childColor, m: Mc });
|
|
1671
|
+
fullKind.set(out.studs.length - 1, this.lib.resolve(r.name));
|
|
1671
1672
|
growBox(out.bbox, Mc, this.compile(ck2, false).bbox);
|
|
1672
1673
|
continue;
|
|
1673
1674
|
}
|
|
@@ -1714,7 +1715,9 @@ class Compiler {
|
|
|
1714
1715
|
if (!certified)
|
|
1715
1716
|
out.uncertified = true;
|
|
1716
1717
|
};
|
|
1718
|
+
const fullKind = new Map;
|
|
1717
1719
|
walk(key, IDENT, "16", false, "body", 0);
|
|
1720
|
+
seatStuds(out, fullKind, (k) => this.compile(k, false).bbox);
|
|
1718
1721
|
if (this.opts.tex && this.hasTex(key))
|
|
1719
1722
|
this.texPass(key, out, separateStuds, colorOf);
|
|
1720
1723
|
const [x0, y0, z0, x1, y1, z1] = out.bbox;
|
|
@@ -2005,6 +2008,48 @@ function enclosureMask(c) {
|
|
|
2005
2008
|
}
|
|
2006
2009
|
return { nx, nz, bits };
|
|
2007
2010
|
}
|
|
2011
|
+
function seatStuds(out, fullKind, kindBox) {
|
|
2012
|
+
if (!out.studs.length)
|
|
2013
|
+
return;
|
|
2014
|
+
const tris = [out.body.pos, out.under.pos];
|
|
2015
|
+
const covered = (c, up) => {
|
|
2016
|
+
for (const p of tris)
|
|
2017
|
+
for (let i = 0;i < p.length; i += 9) {
|
|
2018
|
+
const ax = p[i], ay = p[i + 1], az = p[i + 2], ux = p[i + 3] - ax, uy = p[i + 4] - ay, uz = p[i + 5] - az, vx = p[i + 6] - ax, vy = p[i + 7] - ay, vz = p[i + 8] - az;
|
|
2019
|
+
const nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx, nl = Math.hypot(nx, ny, nz);
|
|
2020
|
+
if (nl < 0.000000001)
|
|
2021
|
+
continue;
|
|
2022
|
+
if (!out.uncertified && nx * up[0] + ny * up[1] + nz * up[2] <= 0)
|
|
2023
|
+
continue;
|
|
2024
|
+
const wx = c[0] - ax, wy = c[1] - ay, wz = c[2] - az;
|
|
2025
|
+
if (Math.abs((wx * nx + wy * ny + wz * nz) / nl) > 0.05)
|
|
2026
|
+
continue;
|
|
2027
|
+
const uu = ux * ux + uy * uy + uz * uz, vv = vx * vx + vy * vy + vz * vz, uv = ux * vx + uy * vy + uz * vz, wu = wx * ux + wy * uy + wz * uz, wv = wx * vx + wy * vy + wz * vz;
|
|
2028
|
+
const d = uv * uv - uu * vv, s = (uv * wv - vv * wu) / d, t = (uv * wu - uu * wv) / d, e = 0.0001;
|
|
2029
|
+
if (s >= -e && t >= -e && s + t <= 1 + e)
|
|
2030
|
+
return true;
|
|
2031
|
+
}
|
|
2032
|
+
return false;
|
|
2033
|
+
};
|
|
2034
|
+
out.studs.forEach((s, i) => {
|
|
2035
|
+
const full = fullKind.get(i);
|
|
2036
|
+
if (!full || full === s.kind)
|
|
2037
|
+
return;
|
|
2038
|
+
const b = kindBox(s.kind), r = 0.975 * Math.min(b[3] - b[0], b[5] - b[2]) / 2, cx = (b[0] + b[3]) / 2, cz = (b[2] + b[5]) / 2;
|
|
2039
|
+
const up = [-s.m[4], -s.m[7], -s.m[10]];
|
|
2040
|
+
if (!(r > 0) || !covered(xf(s.m, [cx, 0, cz]), up)) {
|
|
2041
|
+
s.kind = full;
|
|
2042
|
+
return;
|
|
2043
|
+
}
|
|
2044
|
+
for (let k = 0;k < 8; k++) {
|
|
2045
|
+
const a = (k + 0.5) * Math.PI / 4;
|
|
2046
|
+
if (!covered(xf(s.m, [cx + r * Math.cos(a), 0, cz + r * Math.sin(a)]), up)) {
|
|
2047
|
+
s.kind = full;
|
|
2048
|
+
return;
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
});
|
|
2052
|
+
}
|
|
2008
2053
|
function grow(b, p) {
|
|
2009
2054
|
for (let i = 0;i < 3; i++) {
|
|
2010
2055
|
if (p[i] < b[i])
|
|
@@ -2209,7 +2254,10 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
2209
2254
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
2210
2255
|
}
|
|
2211
2256
|
|
|
2212
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2257
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/node/build-pack.ts
|
|
2258
|
+
function packCompilerOpts(o) {
|
|
2259
|
+
return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures };
|
|
2260
|
+
}
|
|
2213
2261
|
function buildPack(o) {
|
|
2214
2262
|
const lib = new Library(o.ldrawRoot);
|
|
2215
2263
|
const refs = new Map;
|
|
@@ -2243,7 +2291,7 @@ function buildPack(o) {
|
|
|
2243
2291
|
if (lib.isPart(k) && /\.dat$/.test(k))
|
|
2244
2292
|
refs.set(k.slice(6), k);
|
|
2245
2293
|
}
|
|
2246
|
-
const comp = new Compiler(lib,
|
|
2294
|
+
const comp = new Compiler(lib, packCompilerOpts(o));
|
|
2247
2295
|
const parts = new Map, kinds = new Map;
|
|
2248
2296
|
let n = 0;
|
|
2249
2297
|
for (const [ref, key] of refs) {
|
|
@@ -2277,7 +2325,7 @@ function buildPack(o) {
|
|
|
2277
2325
|
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 } : {} };
|
|
2278
2326
|
}
|
|
2279
2327
|
|
|
2280
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2328
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/cli.ts
|
|
2281
2329
|
var HELP = `ldr pack — build a parts pack for the ldr three.js renderer
|
|
2282
2330
|
|
|
2283
2331
|
Usage:
|
|
@@ -2289,7 +2337,7 @@ Options:
|
|
|
2289
2337
|
--part <ref> Include a part (repeatable), e.g. --part 3001.dat
|
|
2290
2338
|
--all-parts Include every part in the library (large)
|
|
2291
2339
|
--studs low|full Stud detail (default low)
|
|
2292
|
-
--prims low|full Other primitive detail (default low)
|
|
2340
|
+
--prims low|full Other primitive detail (default full; low leaves gaps in round parts)
|
|
2293
2341
|
--no-weld Don't index/weld vertices
|
|
2294
2342
|
--cond Keep conditional (type-5) lines for curved-surface outlines (pack v2, ~+8-14% zstd)
|
|
2295
2343
|
--textures Keep printed/sticker parts' !TEXMAP geometry + UVs and embed their PNGs (pack v2; packs without
|
|
@@ -2311,7 +2359,7 @@ var parts = [];
|
|
|
2311
2359
|
var ldraw = "";
|
|
2312
2360
|
var out = "";
|
|
2313
2361
|
var studs = "low";
|
|
2314
|
-
var prims = "
|
|
2362
|
+
var prims = "full";
|
|
2315
2363
|
var weld = true;
|
|
2316
2364
|
var colors = true;
|
|
2317
2365
|
var all = false;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
4
4
|
var namedCodes = new Map;
|
|
@@ -707,7 +707,7 @@ function fileStepViews(f) {
|
|
|
707
707
|
viewMemo.set(f, out);
|
|
708
708
|
return out;
|
|
709
709
|
}
|
|
710
|
-
// ../../../../../../../tmp/ldr-build-
|
|
710
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/model.ts
|
|
711
711
|
var CALLOUT_END = 999999;
|
|
712
712
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
713
713
|
function flatten(doc, opts = {}) {
|
|
@@ -1089,7 +1089,7 @@ function blendedColourHex(code) {
|
|
|
1089
1089
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1090
1090
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1091
1091
|
}
|
|
1092
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1092
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/instructions.ts
|
|
1093
1093
|
var MIN_VIS = 0.5;
|
|
1094
1094
|
var REORIENT = 0.35;
|
|
1095
1095
|
var deg = Math.PI / 180;
|
|
@@ -1457,10 +1457,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1457
1457
|
}
|
|
1458
1458
|
};
|
|
1459
1459
|
}
|
|
1460
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1460
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/render.ts
|
|
1461
1461
|
import * as THREE from "three";
|
|
1462
1462
|
|
|
1463
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1463
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/pack-io.ts
|
|
1464
1464
|
import { decompress } from "fzstd";
|
|
1465
1465
|
async function decompressPack(data) {
|
|
1466
1466
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1483,7 +1483,7 @@ function decodePack(buf) {
|
|
|
1483
1483
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1484
1484
|
}
|
|
1485
1485
|
|
|
1486
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1486
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/cull.ts
|
|
1487
1487
|
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;
|
|
1488
1488
|
var prepCache = new WeakMap;
|
|
1489
1489
|
function prepPart(H, part) {
|
|
@@ -1818,7 +1818,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1818
1818
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1819
1819
|
}
|
|
1820
1820
|
|
|
1821
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1821
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/render.ts
|
|
1822
1822
|
async function loadPack(url) {
|
|
1823
1823
|
const res = await fetch(url);
|
|
1824
1824
|
if (!res.ok)
|
|
@@ -3672,7 +3672,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3672
3672
|
await new Promise((r) => setTimeout(r, 0));
|
|
3673
3673
|
}
|
|
3674
3674
|
}
|
|
3675
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3675
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/scene.ts
|
|
3676
3676
|
import * as THREE2 from "three";
|
|
3677
3677
|
function ghostMaterial(side, g) {
|
|
3678
3678
|
const m = new THREE2.MeshStandardMaterial({ color: 16777215, roughness: 0.85, metalness: 0, side, transparent: false, depthWrite: true, opacity: g.opacity });
|
|
@@ -4016,10 +4016,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4016
4016
|
return finish();
|
|
4017
4017
|
})();
|
|
4018
4018
|
}
|
|
4019
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4019
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/parts-cdn.ts
|
|
4020
4020
|
import { decompress as decompress2 } from "fzstd";
|
|
4021
4021
|
|
|
4022
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4022
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/embedded.ts
|
|
4023
4023
|
function splitFiles(text, fallback) {
|
|
4024
4024
|
const files = new Map;
|
|
4025
4025
|
let cur = null, saw = false;
|
|
@@ -4091,7 +4091,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
4091
4091
|
return out;
|
|
4092
4092
|
}
|
|
4093
4093
|
|
|
4094
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4094
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/parts-cdn.ts
|
|
4095
4095
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
4096
4096
|
var indexCache = new Map;
|
|
4097
4097
|
var shardCache = new Map;
|
|
@@ -4300,33 +4300,54 @@ async function prepareModel(source, o = {}) {
|
|
|
4300
4300
|
await idxP;
|
|
4301
4301
|
const emb = embeddedKeys(text, new Set(insts.filter((i) => i.embedded).map((i) => i.part)), name);
|
|
4302
4302
|
const over = (t, b) => o.maxBodyTris != null && t > o.maxBodyTris || o.maxPackBytes != null && b > o.maxPackBytes;
|
|
4303
|
-
|
|
4303
|
+
const budget = o.maxBodyTris != null || o.maxPackBytes != null;
|
|
4304
|
+
const refuse = (m) => new BudgetError({ ...m, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
|
|
4305
|
+
let tier = "full";
|
|
4306
|
+
if (budget) {
|
|
4304
4307
|
const est = estimateBudgetFromIndex(insts, emb, await idxP);
|
|
4305
|
-
if (over(est.known ? est.bodyTris : 0, est.packBytes))
|
|
4306
|
-
|
|
4308
|
+
if (over(est.known ? est.bodyTris : 0, est.packBytes)) {
|
|
4309
|
+
if (!o.lowCdn)
|
|
4310
|
+
throw refuse(est);
|
|
4311
|
+
const li = await loadPartsIndex(o.lowCdn, f).catch(() => null);
|
|
4312
|
+
if (!li)
|
|
4313
|
+
throw refuse(est);
|
|
4314
|
+
const lo = estimateBudgetFromIndex(insts, emb, li);
|
|
4315
|
+
if (over(lo.known ? lo.bodyTris : 0, lo.packBytes))
|
|
4316
|
+
throw refuse(lo);
|
|
4317
|
+
tier = "low";
|
|
4318
|
+
}
|
|
4307
4319
|
}
|
|
4308
|
-
const
|
|
4309
|
-
const
|
|
4310
|
-
|
|
4311
|
-
const
|
|
4312
|
-
|
|
4313
|
-
|
|
4320
|
+
const names = [...insts.filter((i) => !i.embedded).map((i) => i.part), ...emb.values()];
|
|
4321
|
+
const fetchTier = async () => {
|
|
4322
|
+
const r = await loadParts(names, tier === "low" ? { ...o, cdn: o.lowCdn } : o);
|
|
4323
|
+
for (const [n, k] of emb) {
|
|
4324
|
+
const e = r.pack.header.parts[k];
|
|
4325
|
+
if (e)
|
|
4326
|
+
r.pack.header.parts[n] = e;
|
|
4327
|
+
}
|
|
4328
|
+
return { ...r, packBytes: r.pack.buffer?.byteLength ?? r.pack.bytes ?? 0, bodyTris: bodyTriangles(insts, r.pack) };
|
|
4329
|
+
};
|
|
4330
|
+
let got = await fetchTier();
|
|
4331
|
+
if (budget && over(got.bodyTris, got.packBytes) && tier === "full" && o.lowCdn && await loadPartsIndex(o.lowCdn, f).then(() => true, () => false)) {
|
|
4332
|
+
tier = "low";
|
|
4333
|
+
const r1 = got;
|
|
4334
|
+
got = await fetchTier();
|
|
4335
|
+
got.requests += r1.requests;
|
|
4336
|
+
got.bytes += r1.bytes;
|
|
4314
4337
|
}
|
|
4338
|
+
if (budget && over(got.bodyTris, got.packBytes))
|
|
4339
|
+
throw refuse(got);
|
|
4340
|
+
const { pack, missing: miss, requests, bytes } = got;
|
|
4341
|
+
const back = new Map([...emb].map(([n, k]) => [k, n])), missing = miss.map((m) => back.get(m) ?? m);
|
|
4315
4342
|
const t3 = performance.now();
|
|
4316
|
-
if (o.maxBodyTris != null || o.maxPackBytes != null) {
|
|
4317
|
-
const packBytes = pack.buffer?.byteLength ?? pack.bytes ?? 0;
|
|
4318
|
-
const bodyTris = bodyTriangles(insts, pack);
|
|
4319
|
-
if (over(bodyTris, packBytes))
|
|
4320
|
-
throw new BudgetError({ bodyTris, packBytes, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
|
|
4321
|
-
}
|
|
4322
4343
|
const cull = o.cull ? precomputeCull(insts, pack.header, o.textures !== false) : undefined;
|
|
4323
|
-
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
4344
|
+
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
4324
4345
|
}
|
|
4325
4346
|
|
|
4326
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4327
|
-
var load_worker_gen_default = 'var vt=ArrayBuffer,Z=Uint8Array,de=Uint16Array,Ct=Int16Array;var be=Int32Array,Le=function(e,t,n){if(Z.prototype.slice)return Z.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 Z(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(Z.prototype.fill)return Z.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},Tt=function(e,t,n,r){if(Z.prototype.copyWithin)return Z.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 Lt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],J=function(e,t,n){var r=Error(t||Lt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,J);if(!n)throw r;return r},Ke=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Et=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},St=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,a=r>>6;if(r&8)J(0);var u=6-s,c=i==3?4:i,f=Ke(e,u,c);u+=c;var l=a?1<<a:s,p=Ke(e,u,l)+(a==1&&256),d=p;if(!s){var w=1<<10+(e[5]>>3);d=w+(w>>3)*(e[5]&7)}if(d>2145386496)J(1);var y=new Z((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+l,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new be(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Et(e,4)+8;J(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)J(3);var o=1<<s,i=o,a=-1,u=-1,c=-1,f=o,l=new vt(512+(o<<2)),p=new Ct(l,0,256),d=new de(l,0,256),w=new de(l,512,o),y=512+(o<<1),L=new Z(l,y,o),g=new Z(l,y+o);while(a<255&&i>0){var m=re(i+1),b=r>>3,h=(1<<m+1)-1,P=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&h,A=(1<<m)-1,E=h-i-1,T=P&A;if(T<E)r+=m,P=T;else if(r+=m+1,P>A)P-=E;if(p[++a]=--P,P==-1)i+=P,L[--f]=a;else i-=P;if(!P)do{var B=r>>3;u=(e[B]|e[B+1]<<8)>>(r&7)&3,r+=2,a+=u}while(u==3)}if(a>255||i)J(0);var v=0,F=(o>>1)+(o>>3)+3,Y=o-1;for(var _=0;_<=a;++_){var C=p[_];if(C<1){d[_]=-C;continue}for(c=0;c<C;++c){L[v]=_;do v=v+F&Y;while(v>=f)}}if(v)J(0);for(c=0;c<o;++c){var M=d[L[c]]++,k=g[c]=s-re(M);w[c]=(M<<k)-o}return[r+7>>3,{b:s,s:L,n:g,t:w}]},Pt=function(e,t){var n=0,r=-1,s=new Z(292),o=e[t],i=s.subarray(0,256),a=s.subarray(256,268),u=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],l=c[1];t+=o;var p=f<<3,d=e[t];if(!d)J(0);var w=0,y=0,L=l.b,g=L,m=(++t<<3)-8+re(d);for(;;){if(m-=L,m<p)break;var b=m>>3;if(w+=(e[b]|e[b+1]<<8)>>(m&7)&(1<<L)-1,i[++r]=l.s[w],m-=g,m<p)break;b=m>>3,y+=(e[b]|e[b+1]<<8)>>(m&7)&(1<<g)-1,i[++r]=l.s[y],L=l.n[w],w=l.t[w],g=l.n[y],y=l.t[y]}if(++r>255)J(0)}else{r=o-127;for(;n<r;n+=2){var h=e[++t];i[n]=h>>4,i[n+1]=h&15}++t}var P=0;for(n=0;n<r;++n){var A=i[n];if(A>11)J(0);P+=A&&1<<A-1}var E=re(P)+1,T=1<<E,B=T-P;if(B&B-1)J(0);i[r++]=re(B)+1;for(n=0;n<r;++n){var A=i[n];++a[i[n]=A&&E+1-A]}var v=new Z(T<<1),F=v.subarray(0,T),Y=v.subarray(T);u[E]=0;for(n=E;n>0;--n){var _=u[n];ce(Y,n,_,u[n-1]=_+a[n]*(1<<E-n))}if(u[0]!=T)J(0);for(n=0;n<r;++n){var C=i[n];if(C){var M=u[C];ce(F,n,M,u[C]=M+(1<<E-C))}}return[t,{n:Y,b:E,s:F}]},kt=ue(new Z([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],It=ue(new Z([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],Bt=ue(new Z([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],We=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new Z(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ft=We(Ee,0),Se=new Z(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Rt=We(Se,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,a=-n.b;if(!o)J(0);var u=0,c=n.b,f=(r<<3)-8+re(o)-c,l=-1;for(;f>a&&l<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++l]=n.s[u],f-=c=n.n[u]}if(f!=a||l+1!=s)J(0)},Dt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,a=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,a),n),le(e.subarray(r),t.subarray(a),n)},Ut=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var a=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+a;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=a),n;return ce(new Z(a),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=a,n;return Le(e,s,u)}if(i==2){var c=e[s],f=c&3,l=c>>2&3,p=c>>4,d=0,w=0;if(f<2)if(l&1)p|=e[++s]<<4|(l&2&&e[++s]<<12);else p=c>>3;else if(w=l,l<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(l==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Z(t.m),L=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),L);else if(f==1)ce(y,e[s++],L);else{var g=t.h;if(f==2){var m=Pt(e,s);d+=s-(s=m[0]),t.h=g=m[1]}else if(!g)J(0);(w?Dt:le)(e.subarray(s,s+=d),y.subarray(L),g)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var h=e[s++];if(h&3)J(0);var P=[It,Bt,kt];for(var A=2;A>-1;--A){var E=h>>(A<<1)+2&3;if(E==1){var T=new Z([0,0,e[s++]]);P[A]={s:T.subarray(2,3),n:T.subarray(0,1),t:new de(T.buffer,0,1),b:0}}else if(E==2)r=ue(e,s,9-(A&1)),s=r[0],P[A]=r[1];else if(E==3){if(!t.t)J(0);P[A]=t.t[A]}}var B=t.t=P,v=B[0],F=B[1],Y=B[2],_=e[u-1];if(!_)J(0);var C=(u<<3)-8+re(_)-Y.b,M=C>>3,k=0,G=(e[M]|e[M+1]<<8)>>(C&7)&(1<<Y.b)-1;M=(C-=F.b)>>3;var I=(e[M]|e[M+1]<<8)>>(C&7)&(1<<F.b)-1;M=(C-=v.b)>>3;var N=(e[M]|e[M+1]<<8)>>(C&7)&(1<<v.b)-1;for(++b;--b;){var j=Y.s[G],X=Y.n[G],W=v.s[N],S=v.n[N],x=F.s[I],R=F.n[I];M=(C-=x)>>3;var D=1<<x,U=D+((e[M]|e[M+1]<<8|e[M+2]<<16|e[M+3]<<24)>>>(C&7)&D-1);M=(C-=Se[W])>>3;var H=Rt[W]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(C&7)&(1<<Se[W])-1);M=(C-=Ee[j])>>3;var z=Ft[j]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(C&7)&(1<<Ee[j])-1);if(M=(C-=X)>>3,G=Y.t[G]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<X)-1),M=(C-=S)>>3,N=v.t[N]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<S)-1),M=(C-=R)>>3,I=F.t[I]+((e[M]|e[M+1]<<8)>>(C&7)&(1<<R)-1),U>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=U-=3;else{var V=U-(z!=0);if(V){if(U=V==3?t.o[0]-1:t.o[V],V>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=U}else U=t.o[0]}for(var A=0;A<z;++A)y[k+A]=y[L+A];k+=z,L+=z;var O=k-U;if(O<0){var K=-O,q=t.e+O;if(K>H)K=H;for(var A=0;A<K;++A)y[k+A]=t.w[q+A];k+=K,H-=K,O=0}for(var A=0;A<H;++A)y[k+A]=y[O+A];k+=H}if(k!=L)while(L<y.length)y[k++]=y[L++];else k=y.length;if(n)t.y+=k;else y=Le(y,0,k)}else if(n){if(t.y+=p,L)for(var A=0;A<p;++A)y[A]=y[L+A]}else if(L)y=Le(y,L);return t.b=u,y}J(2)},Ot=function(e,t){if(e.length==1)return e[0];var n=new Z(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=St(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 a=Ut(e,i,t);if(!a)J(5);if(t)i.e=i.y;else n.push(a),o+=a.length,Tt(i.w,0,a.length),i.w.set(a,i.w.length-a.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Ot(n,o)}async function Nt(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 Xe(e){return new TextDecoder().decode(await Nt(e))}var Ze=(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 Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),ke=/^[A-Za-z][A-Za-z0-9_]*$/,Pe=new Map;function Ie(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Pe.has(r))Pe.set(r,t);return r}function Be(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&ke.test(e))return Ie(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ye=/^~?\\s*moved\\s+to\\s+(.+)$/i,zt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),st=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),$t=new Set(["model","submodel","configuration"]),jt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Je(e){let t=jt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return st.has(n)||$t.has(n)?n:void 0}function Vt(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 _t(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 a=n[2].trim();for(let l=0;l<s;l++)a=a.replace(/^\\S+\\s*/,"");let u=Vt(a);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((l,p)=>p>0&&l.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Ht=(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 Gt(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 a=e.slice(n),u=/[ \\t]{2,}|\\t/.test(a)?a.split(/\\s+/).join(" "):a;return{t:1,color:Be(o),m:i,file:Q(u)}}function qe(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Be(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(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 ot(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",a,u=null,c=[],f=null,l=()=>{if(!u)return;let m=Ht(u.chunks.join("")),b=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(a??=new Map).set(Q(u.name),{name:u.name,bytes:m,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(m)=>{if(l(),o={name:Q(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},w=!1,y=!1,L=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},g=(m,b)=>{if(f){m.tex=f,f=null;return}let h=c[c.length-1];if(!h)return;if(h.fallback){if(!b)m.fallback=!0}else m.tex=h.map};for(let m of e.split(`\n`)){let b=m.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||w)continue;if(!o)d(t);let E=b.slice(2).trimStart(),T=E.search(/\\s/),B={t:b.charCodeAt(0)-48,color:Be(T<0?E:E.slice(0,T)),p:[],src:b};g(B,!1),o.cmds.push(B),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let E=2;while(b.charCodeAt(E)===32||b.charCodeAt(E)===9)E++;let T=E;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let B=b.slice(E,T);if(!zt.has(B)){if(w||u)continue;if(!o)d(t);let v=b.slice(E),F={t:0,text:v};if(B.charCodeAt(0)===33)F.meta=B;if(f=null,p&&!o.org){let _=Je(v);if(_)o.org=_}let Y=v.match(Ye);if(Y&&!o.movedTo){let _=Y[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(_))_+=".dat";o.movedTo=Q(_)}o.cmds.push(F);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!w){let E=Gt(b);if(E){if(!o)d(t);g(E,!1),o.cmds.push(E),p=!1;continue}}let h=b.split(/\\s+/);if(+h[0]===0){let E=b.slice(1).trim();if(h[1]==="FILE"){L(),w=!1,d(E.slice(5));continue}if(h[1]==="NOFILE"){l(),o=null,w=!0;continue}if(h[1]==="!DATA"){L(),l(),o=null,w=!1,u={name:E.slice(5).trim(),chunks:[]};continue}if(w)continue;if(u){if(h[1]==="!:")u.chunks.push(h.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:E};if(h[1]==="STEP")T.step=!0,c=[],f=null;else if(h[1]==="BFC")T.bfc=h.slice(2).join(" ");else if(h[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(h[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let v=(h[5]??"REL").toUpperCase();T.rotstep={x:+h[2]||0,y:+h[3]||0,z:+h[4]||0,mode:["REL","ABS","ADD"].includes(v)?v:"REL"}}else if(h[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let v=(h[2]??"").toUpperCase();T.bufexchg={op:v==="RETRIEVE"?"RETRIEVE":"STORE",buf:h[3]??"A"}}else if(h[1]?.startsWith("!"))T.meta=h[1];if(p&&!o.org){let v=Je(E);if(v)o.org=v}if(h[1]==="!TEXMAP"){let v=(h[2]??"").toUpperCase();if(f=null,v==="START"||v==="NEXT"){let F=_t(E.replace(/^!TEXMAP\\s+\\S+/i,""),v==="NEXT");if(T.texmap={op:v,...F?{map:F}:{}},F)if((o.texmaps??=[]).push(F),v==="START")c.push({map:F,fallback:!1});else f=F}else if(v==="FALLBACK"){T.texmap={op:v};let F=c[c.length-1];if(F)F.fallback=!0}else if(v==="END")T.texmap={op:v},c.pop()}else if(h[1]==="!:"){f=null;let v=qe(h.slice(2));if(v)g(v,!0),T.geom=v}else f=null;let B=E.match(Ye);if(B&&!o.movedTo){let v=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(v))v+=".dat";o.movedTo=Q(v)}o.cmds.push(T);continue}if(u||w)continue;if(!o)d(t);let A=qe(h);if(!A)continue;g(A,!1),o.cmds.push(A),p=!1}return l(),a?{main:i,files:s,data:a}:{main:i,files:s}}var yn=Math.PI/180;function it(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 at(e,t){let[n,r,s,o,i,a,u,c,f,l,p,d]=e,[w,y,L,g,m,b,h,P,A,E,T,B]=t;return[o*w+i*y+a*L+n,u*w+c*y+f*L+r,l*w+p*y+d*L+s,o*g+i*h+a*E,o*m+i*P+a*T,o*b+i*A+a*B,u*g+c*h+f*E,u*m+c*P+f*T,u*b+c*A+f*B,l*g+p*h+d*E,l*m+p*P+d*T,l*b+p*A+d*B]}var Fe=[0,0,0,1,0,0,0,1,0,0,0,1];var Qe=new WeakMap,Kt=/^(s|8|48)\\//;function Re(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=Qe.get(n);if(r)return r;if(n.org)r=st.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&&Kt.test(s.file))?"part":"model";return Qe.set(n,r),r}var et=new WeakMap;function lt(e){let t=et.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 et.set(e,t),t}var tt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Pe.get(e)??String(e):String(e),Wt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${tt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${tt(e.color)} ${e.p.join(" ")}`,De=(e,t)=>`${Q(e)}#${t}`;function Xt(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:De(e.name,t),cmds:n}}function ct(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Xt(e,t).cmds.map(Wt)].join(`\n`)+`\n`}function Zt(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 ut(e){let[t,n,r,s,o,i,a,u,c,f,l,p]=e,d=u*p-c*l,w=-(a*p-c*f),y=a*l-u*f,L=s*d+o*w+i*y;if(!Number.isFinite(L)||Math.abs(L)<0.000000000001)return null;let g=1/L,m=[d*g,-(o*p-i*l)*g,(o*c-i*u)*g,w*g,(s*p-i*f)*g,-(s*c-i*a)*g,y*g,-(s*l-o*f)*g,(s*u-o*a)*g];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var Yt=(e)=>String(+e.toFixed(6)||0),nt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function ft(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Yt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${nt(t.texture)}${t.glossmap?" GLOSSMAP "+nt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${Zt(r)}`,source:r}}var Jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function qt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),a=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[a*c,-a*u,i,o*u+s*i*c,o*c-s*i*u,-s*a,s*u-o*i*c,s*c+o*i*u,o*a]}var rt=new WeakMap;function pt(e){let t=rt.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=qt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),rt.set(e,n),n}var mt=999999,gt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Qt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,a=new Map,u=0,c=(l,p)=>{let d=l.name+"#"+p,w=a.get(d);if(!w){let y;w=Object.assign(()=>y??=ct(l,p),{file:l,step:p}),a.set(d,w)}return w},f=(l,p,d,w,y,L,g,m,b=null,h=[],P=[],A=void 0,E=null)=>{let T=l.files.get(p);if(!T||g>r)return;let B=E,v=0,F=g>0?++u:0,Y=i&&F?[...h,F]:h,_=i&&F?[...P,d]:P,C=i&&!b?new Map:null,M=-1,k=0,G=(S,x,R,D,U,H,z)=>{if(M!==v)M=v,k=0;let V=C?.get(v+"|"+x);if(V)return V.n++,f(S,S===l?x:S.main,R,D,y+"/"+x,[...U,mt],g+1,H,[...U,mt],Y,_,z,B);let O=[...U,k++],K=n.length;f(S,S===l?x:S.main,R,D,y+"/"+x,O,g+1,H,b,Y,_,z,B),C?.set(v+"|"+x,{n:1,from:K,to:n.length})},I=pt(T),N=s?lt(T):[],j=0,X=(S,x,R,D,U,H,z,V)=>{if(b)D=b;let O={part:S,color:x,m:R,step:D[0],steps:D,localStep:U,path:y};if(V)O.colour=V;if(F){if(O.sub=F,i)O.subPath=Y,O.subMats=_}if(H)O.embedded=!0;if(z){let q=ft(S,z);O.texPart=q.name,O.texSource=q.source}let K=I[U];if(K)O.view=K;return n.push(O),O},W=(S)=>{while(j<N.length&&N[j]<=S){let x=N[j++];X(De(T.name,x),w,d,[...L,x],x,!1,null,A).source=c(T,x)}};for(let S of T.cmds){if(S.t===0&&S.step){v++;continue}let x=S;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){W(v);continue}if(x.t===0){if(x.meta==="!COLOUR"){let q=tn(x.text);if(q&&q.code!==16&&q.code!==24)(B=new Map(B??[])).set(q.code,q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let R=x.color===16?w:x.color,D=x.color===16?A:B?.get(x.color),U=at(d,x.m),H=[...L,v],z=o?x.tex??m:null,V=z?ut(x.m):null,O=z&&V?it(z,V):null;if(l.files.has(x.file)){if(Re(l,x.file)==="model"){G(l,x.file,U,R,H,O,D);continue}X(x.file,R,U,H,v,!0,O,D);continue}let K=t.resolveModel?.(x.file);if(K){G(K,x.file,U,R,H,O,D);continue}X(x.file,R,U,H,v,!1,O,D)}if(W(1/0),C){for(let S of C.values())if(S.n>1)for(let x=S.from;x<S.to;x++)n[x].mult??=S.n}};if(Re(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Fe],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Fe,16,e.main,[],0,null),n}function dt(e,t="main.ldr",n){return Qt(ot(e,t,{geometryText:!0}),n)}var en=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ue(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function ht(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Ue(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function tn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",a=255,u=0,c={type:"default"},f=1;while(f<n.length){let l=n[f].toUpperCase(),p=n[f+1];if(l==="CODE")s=p!==void 0&&ke.test(p)?Ie(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(l==="VALUE"){let d=Ue(p);if(d)o=d;f+=2}else if(l==="EDGE")i=Ue(p)??p,f+=2;else if(l==="ALPHA")a=+p,f+=2;else if(l==="LUMINANCE")u=+p,f+=2;else if(l==="CHROME")c={type:"chrome"},f+=1;else if(l==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(l==="RUBBER")c={type:"rubber"},f+=1;else if(l==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(l==="METAL")c={type:"metal"},f+=1;else if(l==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:w,next:y}=ht(n,f+2);c={type:"glitter",material:w},f=y}else if(d==="SPECKLE"){let{grain:w,next:y}=ht(n,f+2);c={type:"speckle",material:w},f=y}else if(d==="FABRIC"){let w=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(w)?w.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(en.has(l))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(a)?a:255,luminance:Number.isFinite(u)?u:0,finish:c}}function nn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,a=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:a,finish:"glitter"}}case"speckle":{let i=e.finish.material,a=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:a,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function Oe(e){let t=nn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function rn(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(Q(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(Q(t),r)}let a=o.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var sn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function on(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 bt(e,t,n="main.ldr"){let r=rn(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let a=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let l=sn(f);if(l&&r.has(l)&&!a.has(l))a.add(l),u.push(l)}let c=[i,...[...a].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${on(c)}.dat`)}return s}var yt=(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,xt=new WeakMap;function Ne(e,t){let n=xt.get(e);if(!n)xt.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),a=[],u=[];s.studs.forEach((p,d)=>{a.push(p[0]),u.push(p[1]);for(let w=0;w<12;w++)i[d*12+w]=p[2+w]});let c=null,f=0,l=0;if(s.mask){f=s.mask[0],l=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:a,color:u,mask:c,nx:f,nz:l}),r}var ie=1073741824;class ze{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,a=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&a[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,a=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,a[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&a[s]===t&&u[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 an(e,t,n){let s=[],o=[],i=[],a=[],u=[],c=[],f=[],l=[],p=new ze(e.length*2),d=[],w=[];for(let C=0;C<e.length;C++){let M=e[C],k=M.m,G=t.parts[M.part];if(!G||!G.mask||!yt(k))continue;let I=G.bbox,N=1/0,j=-1/0,X=1/0,W=-1/0;for(let R=0;R<2;R++)for(let D=0;D<2;D++){let U=R?I[3]:I[0],H=D?I[5]:I[2],z=k[0]+k[3]*U+k[5]*H,V=k[2]+k[9]*U+k[11]*H;if(z<N)N=z;if(z>j)j=z;if(V<X)X=V;if(V>W)W=V}let S=u.length;s.push(N),o.push(j),i.push(X),a.push(W),u.push(C),c.push(Ne(t,M.part)),f.push(I[0]),l.push(I[2]);let x=Math.round((k[1]+I[4])*2);for(let R=Math.floor(N/40);R<=Math.floor(j/40);R++)for(let D=Math.floor(X/40);D<=Math.floor(W/40);D++){if(!we(x,R,D))continue;let U=w.length;w.push(S),d.push(p.put(x,R,D,U))}}let y=[0,5,-5,5,-5],L=[0,5,5,-5,-5],g=NaN,m=NaN,b=NaN,h=-1,P=(C,M,k,G)=>{let I=Math.round(M*2),N=Math.floor(C/40),j=Math.floor(k/40);if(!we(I,N,j))return fe;let X=fe;if(I!==g||N!==m||j!==b)g=I,m=N,b=j,h=p.get(I,N,j);for(let W=h;W>=0;W=d[W]){let S=w[W];if(u[S]===G||!(C-6>=s[S]-0.5&&C+6<=o[S]+0.5&&k-6>=i[S]-0.5&&k+6<=a[S]+0.5))continue;let x=e[u[S]].m,R=c[S],D=f[S],U=l[S],H=C-x[0],z=M-x[1],V=k-x[2],O=x[3]*H+x[6]*z+x[9]*V,K=x[5]*H+x[8]*z+x[11]*V,{nx:q,nz:se,mask:ae}=R,oe=!0;for(let ee=0;ee<5;ee++){let te=Math.floor((O+y[ee]-D)/20),ne=Math.floor((K+L[ee]-U)/20);if(te<0||ne<0||te>=q||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let ee=n[u[S]];if(ee<X)X=ee}}return X},A=0;for(let C of e){let M=Ne(t,C.part);if(M)A+=M.nStuds}let E=new Uint8Array(A),T=new Uint8Array(A),B=new ze(A),v=0,F=n?new Int32Array(A).fill(fe):void 0;for(let C=0,M=0;C<e.length;C++){let k=e[C],G=Ne(t,k.part);if(!G)continue;let I=k.m,N=G.studM,j=I[0],X=I[1],W=I[2],S=I[3],x=I[4],R=I[5],D=I[6],U=I[7],H=I[8],z=I[9],V=I[10],O=I[11];for(let K=0;K<G.nStuds;K++,M++){let q=K*12,se=N[q+4],ae=N[q+7],oe=N[q+10];if(!(Math.abs(D*se+U*ae+H*oe-1)<0.001&&Math.abs(S*se+x*ae+R*oe)<0.001&&Math.abs(z*se+V*ae+O*oe)<0.001))continue;T[M]=1;let ee=N[q],te=N[q+1],ne=N[q+2],$e=j+S*ee+x*te+R*ne,je=X+D*ee+U*te+H*ne,Ve=W+z*ee+V*te+O*ne,_e=P($e,je,Ve,C);if(_e!==fe){if(E[M]=1,v++,F)F[M]=_e}let me=Math.round($e),he=Math.round(je),ge=Math.round(Ve);if(!we(me,he,ge))continue;if(!n){B.put(me,he,ge,1);continue}let He=n[C],Ge=B.get(me,he,ge);if(Ge<0||He<Ge)B.put(me,he,ge,He)}}let Y=new Uint8Array(e.length),_=n?new Int32Array(e.length).fill(fe):void 0;for(let C=0;C<e.length;C++){let M=e[C],k=t.parts[M.part];if(!k||!k.under||!yt(M.m))continue;let G=k.bbox,I=Math.round((G[3]-G[0])/20),N=Math.round((G[5]-G[2])/20);if(!I||!N||I*N>4096)continue;let j=M.m,X=!0,W=0;for(let S=0;S<I&&X;S++)for(let x=0;x<N;x++){let R=G[0]+10+20*S,D=G[2]+10+20*x,U=j[0]+j[3]*R+j[5]*D,H=j[2]+j[9]*R+j[11]*D,z=Math.round(U),V=Math.round(j[1]+G[4]),O=Math.round(H),K=we(z,V,O)?B.get(z,V,O):-1;if(K<0){X=!1;break}if(K>W)W=K}if(X){if(Y[C]=1,_)_[C]=W}}return{nStuds:A,studHidden:E,studUp:T,underHidden:Y,studsHidden:v,studHideStep:F,underHideStep:_}}function ln(e,t,n){let r=(l)=>n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let p=l.colour;if(!p)return String(l.color);let d=o.get(p);if(d!==void 0)return d;let w=t.colorTable?.[l.color],y=w?.hex??t.colors?.[l.color],L=w?Oe({alpha:w.alpha??255,luminance:w.luminance??0,finish:w.finish??{type:"default"}}):"default:op",g=Oe(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&L===g?String(l.color):p.hex.toUpperCase()+"/"+g,d!==String(l.color))s.set(d,p);return o.set(p,d),d},a=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=a.map((l)=>gt(l.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((l,p)=>[l,p]));return{all:a,stepOf:u.map((l)=>f.get(l)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=ln(e,t,n);return an(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function At(e=Te,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 cn=(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"),Ce=(e,t)=>cn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function un(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let w=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+w),L=r;n.push(y),r+=y.byteLength;let g=(4-r%4)%4;if(g)n.push(new Uint8Array(g)),r+=g;for(let[m,b]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Ce(b,L);for(let[m,b]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Ce(b,L)}let i=e[0]?.header??{version:1,weld:!0},a=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+a.length)%4)%4,c=4+a.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,a.length+u,!0),f.set(a,4),f.fill(32,4+a.length,c);let l=c;for(let p of n)f.set(p,l),l+=p.byteLength;return xe(f.buffer)}async function fn(e,t={}){e=[...e];try{return await wt(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;ve.delete(r);let o=(i,a)=>s(i,{...a,cache:"reload"});try{return await wt(e,{...t,fetch:o})}catch{throw n}}}async function wt(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await At(n,r),i=[...new Set([...e].map(Q))],a=[],u=[];for(let g of i){if(Me.has(n+g))continue;let m=o.parts[g];if(m)u.push({name:g,off:m[0],len:m[1],file:m[2]??0});else a.push(g)}u.sort((g,m)=>g.file-m.file||g.off-m.off);let c=[];for(let g of u){let m=c[c.length-1];if(m&&m.file===g.file&&g.off-m.end<=s)m.end=Math.max(m.end,g.off+g.len),m.items.push(g);else c.push({file:g.file,start:g.off,end:g.off+g.len,items:[g]})}let f=0,l=0,p=0,d=new Map,w=async()=>{while(p<c.length){let g=c[p++],m=d.get(g.file);if(m)m=m.subarray(g.start,g.end);else{let b=await r(new URL(o.archives[g.file],n).href,{headers:{Range:`bytes=${g.start}-${g.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(l++,m=new Uint8Array(await b.arrayBuffer()),f+=m.byteLength,b.status===200)d.set(g.file,m),m=m.subarray(g.start,g.end)}for(let b of g.items){let h=ye(m.subarray(b.off-g.start,b.off-g.start+b.len)),P=h.buffer.slice(h.byteOffset,h.byteOffset+h.byteLength);Me.set(n+b.name,xe(P))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},w));let y=i.filter((g)=>Me.has(n+g)).map((g)=>Me.get(n+g));return{pack:y.length?un(y,{colors:o.colors}):xe(pn(o.colors)),missing:a,requests:l,bytes:f}}function pn(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 mn(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 hn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let a of e){let u=a.embedded?t.get(a.part):Q(a.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),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 Mt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=At(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return Xe(await h.arrayBuffer())}),i=performance.now(),a=t.name??(t.text?"main.ldr":Ze(e)),u=dt(o,a,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=bt(o,new Set(u.filter((h)=>h.embedded).map((h)=>h.part)),a),l=(h,P)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let h=hn(u,f,await s);if(l(h.known?h.bodyTris:0,h.packBytes))throw new pe({bodyTris:h.bodyTris,packBytes:h.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:p,missing:d,requests:w,bytes:y}=await fn([...u.filter((h)=>!h.embedded).map((h)=>h.part),...f.values()],t),L=new Map([...f].map(([h,P])=>[P,h])),g=d.map((h)=>L.get(h)??h);for(let[h,P]of f){let A=p.header.parts[P];if(A)p.header.parts[h]=A}let m=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let h=p.buffer?.byteLength??p.bytes??0,P=mn(u,p);if(l(P,h))throw new pe({bodyTris:P,packBytes:h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let b=t.cull?Ae(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,missing:g,requests:w,bytes:y,cull:b,timings:{fetchModel:i-n,parse:c-i,parts:m-c,...b?{cull:performance.now()-m}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Mt(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(),a=Ae(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[a.studHidden,a.studUp,a.underHidden,a.studHideStep,a.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:a,ms:u},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';
|
|
4347
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/load-worker.gen.ts
|
|
4348
|
+
var load_worker_gen_default = 'var Ct=ArrayBuffer,q=Uint8Array,ge=Uint16Array,Tt=Int16Array;var de=Int32Array,Ee=function(e,t,n){if(q.prototype.slice)return q.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 q(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(q.prototype.fill)return q.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},Lt=function(e,t,n,r){if(q.prototype.copyWithin)return q.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 Et=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Y=function(e,t,n){var r=Error(t||Et[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Y);if(!n)throw r;return r},We=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},St=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Pt=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)Y(0);var u=6-s,c=i==3?4:i,f=We(e,u,c);u+=c;var a=l?1<<l:s,p=We(e,u,a)+(l==1&&256),d=p;if(!s){var x=1<<10+(e[5]>>3);d=x+(x>>3)*(e[5]&7)}if(d>2145386496)Y(1);var y=new q((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new de(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return St(e,4)+8;Y(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)Y(3);var o=1<<s,i=o,l=-1,u=-1,c=-1,f=o,a=new Ct(512+(o<<2)),p=new Tt(a,0,256),d=new ge(a,0,256),x=new ge(a,512,o),y=512+(o<<1),L=new q(a,y,o),h=new q(a,y+o);while(l<255&&i>0){var g=re(i+1),b=r>>3,C=(1<<g+1)-1,F=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&C,A=(1<<g)-1,E=C-i-1,T=F&A;if(T<E)r+=g,F=T;else if(r+=g+1,F>A)F-=E;if(p[++l]=--F,F==-1)i+=F,L[--f]=l;else i-=F;if(!F)do{var k=r>>3;u=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=u}while(u==3)}if(l>255||i)Y(0);var m=0,P=(o>>1)+(o>>3)+3,V=o-1;for(var N=0;N<=l;++N){var v=p[N];if(v<1){d[N]=-v;continue}for(c=0;c<v;++c){L[m]=N;do m=m+P&V;while(m>=f)}}if(m)Y(0);for(c=0;c<o;++c){var M=d[L[c]]++,I=h[c]=s-re(M);x[c]=(M<<I)-o}return[r+7>>3,{b:s,s:L,n:h,t:x}]},kt=function(e,t){var n=0,r=-1,s=new q(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),u=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],a=c[1];t+=o;var p=f<<3,d=e[t];if(!d)Y(0);var x=0,y=0,L=a.b,h=L,g=(++t<<3)-8+re(d);for(;;){if(g-=L,g<p)break;var b=g>>3;if(x+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<L)-1,i[++r]=a.s[x],g-=h,g<p)break;b=g>>3,y+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<h)-1,i[++r]=a.s[y],L=a.n[x],x=a.t[x],h=a.n[y],y=a.t[y]}if(++r>255)Y(0)}else{r=o-127;for(;n<r;n+=2){var C=e[++t];i[n]=C>>4,i[n+1]=C&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)Y(0);F+=A&&1<<A-1}var E=re(F)+1,T=1<<E,k=T-F;if(k&k-1)Y(0);i[r++]=re(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&E+1-A]}var m=new q(T<<1),P=m.subarray(0,T),V=m.subarray(T);u[E]=0;for(n=E;n>0;--n){var N=u[n];ce(V,n,N,u[n-1]=N+l[n]*(1<<E-n))}if(u[0]!=T)Y(0);for(n=0;n<r;++n){var v=i[n];if(v){var M=u[v];ce(P,n,M,u[v]=M+(1<<E-v))}}return[t,{n:V,b:E,s:P}]},It=ue(new q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Bt=ue(new q([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],Ft=ue(new q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Xe=function(e,t){var n=e.length,r=new de(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new q(new de([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Rt=Xe(Se,0),Pe=new q(new de([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Dt=Xe(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)Y(0);var u=0,c=n.b,f=(r<<3)-8+re(o)-c,a=-1;for(;f>l&&a<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++a]=n.s[u],f-=c=n.n[u]}if(f!=l||a+1!=s)Y(0)},Ut=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)},Ot=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,u=(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 q(l),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=l,n;return Ee(e,s,u)}if(i==2){var c=e[s],f=c&3,a=c>>2&3,p=c>>4,d=0,x=0;if(f<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(x=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new q(t.m),L=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),L);else if(f==1)ce(y,e[s++],L);else{var h=t.h;if(f==2){var g=kt(e,s);d+=s-(s=g[0]),t.h=h=g[1]}else if(!h)Y(0);(x?Ut:le)(e.subarray(s,s+=d),y.subarray(L),h)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var C=e[s++];if(C&3)Y(0);var F=[Bt,Ft,It];for(var A=2;A>-1;--A){var E=C>>(A<<1)+2&3;if(E==1){var T=new q([0,0,e[s++]]);F[A]={s:T.subarray(2,3),n:T.subarray(0,1),t:new ge(T.buffer,0,1),b:0}}else if(E==2)r=ue(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(E==3){if(!t.t)Y(0);F[A]=t.t[A]}}var k=t.t=F,m=k[0],P=k[1],V=k[2],N=e[u-1];if(!N)Y(0);var v=(u<<3)-8+re(N)-V.b,M=v>>3,I=0,K=(e[M]|e[M+1]<<8)>>(v&7)&(1<<V.b)-1;M=(v-=P.b)>>3;var B=(e[M]|e[M+1]<<8)>>(v&7)&(1<<P.b)-1;M=(v-=m.b)>>3;var z=(e[M]|e[M+1]<<8)>>(v&7)&(1<<m.b)-1;for(++b;--b;){var _=V.s[K],Z=V.n[K],X=m.s[z],S=m.n[z],w=P.s[B],R=P.n[B];M=(v-=w)>>3;var D=1<<w,U=D+((e[M]|e[M+1]<<8|e[M+2]<<16|e[M+3]<<24)>>>(v&7)&D-1);M=(v-=Pe[X])>>3;var G=Dt[X]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(v&7)&(1<<Pe[X])-1);M=(v-=Se[_])>>3;var j=Rt[_]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(v&7)&(1<<Se[_])-1);if(M=(v-=Z)>>3,K=V.t[K]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<Z)-1),M=(v-=S)>>3,z=m.t[z]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<S)-1),M=(v-=R)>>3,B=P.t[B]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<R)-1),U>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=U-=3;else{var H=U-(j!=0);if(H){if(U=H==3?t.o[0]-1:t.o[H],H>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=U}else U=t.o[0]}for(var A=0;A<j;++A)y[I+A]=y[L+A];I+=j,L+=j;var O=I-U;if(O<0){var W=-O,J=t.e+O;if(W>G)W=G;for(var A=0;A<W;++A)y[I+A]=t.w[J+A];I+=W,G-=W,O=0}for(var A=0;A<G;++A)y[I+A]=y[O+A];I+=G}if(I!=L)while(L<y.length)y[I++]=y[L++];else I=y.length;if(n)t.y+=I;else y=Ee(y,0,I)}else if(n){if(t.y+=p,L)for(var A=0;A<p;++A)y[A]=y[L+A]}else if(L)y=Ee(y,L);return t.b=u,y}Y(2)},Nt=function(e,t){if(e.length==1)return e[0];var n=new q(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 be(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Pt(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=Ot(e,i,t);if(!l)Y(5);if(t)i.e=i.y;else n.push(l),o+=l.length,Lt(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 Nt(n,o)}async function zt(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(be(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 Ze(e){return new TextDecoder().decode(await zt(e))}var qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(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 Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Ie=/^[A-Za-z][A-Za-z0-9_]*$/,ke=new Map;function Be(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!ke.has(r))ke.set(r,t);return r}function Fe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Ie.test(e))return Be(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ye=/^~?\\s*moved\\s+to\\s+(.+)$/i,$t=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),ot=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),jt=new Set(["model","submodel","configuration"]),Vt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Je(e){let t=Vt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return ot.has(n)||jt.has(n)?n:void 0}function _t(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 Ht(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 a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let u=_t(l);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Gt=(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 Kt(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),u=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Fe(o),m:i,file:Q(u)}}function Qe(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Fe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(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 it(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,u=null,c=[],f=null,a=()=>{if(!u)return;let g=Gt(u.chunks.join("")),b=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Q(u.name),{name:u.name,bytes:g,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(g)=>{if(a(),o={name:Q(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},x=!1,y=!1,L=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},h=(g,b)=>{if(f){g.tex=f,f=null;return}let C=c[c.length-1];if(!C)return;if(C.fallback){if(!b)g.fallback=!0}else g.tex=C.map};for(let g of e.split(`\n`)){let b=g.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||x)continue;if(!o)d(t);let E=b.slice(2).trimStart(),T=E.search(/\\s/),k={t:b.charCodeAt(0)-48,color:Fe(T<0?E:E.slice(0,T)),p:[],src:b};h(k,!1),o.cmds.push(k),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let E=2;while(b.charCodeAt(E)===32||b.charCodeAt(E)===9)E++;let T=E;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let k=b.slice(E,T);if(!$t.has(k)){if(x||u)continue;if(!o)d(t);let m=b.slice(E),P={t:0,text:m};if(k.charCodeAt(0)===33)P.meta=k;if(f=null,p&&!o.org){let N=Je(m);if(N)o.org=N}let V=m.match(Ye);if(V&&!o.movedTo){let N=V[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(N))N+=".dat";o.movedTo=Q(N)}o.cmds.push(P);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!x){let E=Kt(b);if(E){if(!o)d(t);h(E,!1),o.cmds.push(E),p=!1;continue}}let C=b.split(/\\s+/);if(+C[0]===0){let E=b.slice(1).trim();if(C[1]==="FILE"){L(),x=!1,d(E.slice(5));continue}if(C[1]==="NOFILE"){a(),o=null,x=!0;continue}if(C[1]==="!DATA"){L(),a(),o=null,x=!1,u={name:E.slice(5).trim(),chunks:[]};continue}if(x)continue;if(u){if(C[1]==="!:")u.chunks.push(C.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:E};if(C[1]==="STEP")T.step=!0,c=[],f=null;else if(C[1]==="BFC")T.bfc=C.slice(2).join(" ");else if(C[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(C[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let m=(C[5]??"REL").toUpperCase();T.rotstep={x:+C[2]||0,y:+C[3]||0,z:+C[4]||0,mode:["REL","ABS","ADD"].includes(m)?m:"REL"}}else if(C[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let m=(C[2]??"").toUpperCase();T.bufexchg={op:m==="RETRIEVE"?"RETRIEVE":"STORE",buf:C[3]??"A"}}else if(C[1]?.startsWith("!"))T.meta=C[1];if(p&&!o.org){let m=Je(E);if(m)o.org=m}if(C[1]==="!TEXMAP"){let m=(C[2]??"").toUpperCase();if(f=null,m==="START"||m==="NEXT"){let P=Ht(E.replace(/^!TEXMAP\\s+\\S+/i,""),m==="NEXT");if(T.texmap={op:m,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),m==="START")c.push({map:P,fallback:!1});else f=P}else if(m==="FALLBACK"){T.texmap={op:m};let P=c[c.length-1];if(P)P.fallback=!0}else if(m==="END")T.texmap={op:m},c.pop()}else if(C[1]==="!:"){f=null;let m=Qe(C.slice(2));if(m)h(m,!0),T.geom=m}else f=null;let k=E.match(Ye);if(k&&!o.movedTo){let m=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(m))m+=".dat";o.movedTo=Q(m)}o.cmds.push(T);continue}if(u||x)continue;if(!o)d(t);let A=Qe(C);if(!A)continue;h(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var yn=Math.PI/180;function at(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 lt(e,t){let[n,r,s,o,i,l,u,c,f,a,p,d]=e,[x,y,L,h,g,b,C,F,A,E,T,k]=t;return[o*x+i*y+l*L+n,u*x+c*y+f*L+r,a*x+p*y+d*L+s,o*h+i*C+l*E,o*g+i*F+l*T,o*b+i*A+l*k,u*h+c*C+f*E,u*g+c*F+f*T,u*b+c*A+f*k,a*h+p*C+d*E,a*g+p*F+d*T,a*b+p*A+d*k]}var Re=[0,0,0,1,0,0,0,1,0,0,0,1];var et=new WeakMap,Wt=/^(s|8|48)\\//;function De(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=et.get(n);if(r)return r;if(n.org)r=ot.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&&Wt.test(s.file))?"part":"model";return et.set(n,r),r}var tt=new WeakMap;function ct(e){let t=tt.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 tt.set(e,t),t}var nt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?ke.get(e)??String(e):String(e),Xt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${nt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${nt(e.color)} ${e.p.join(" ")}`,Ue=(e,t)=>`${Q(e)}#${t}`;function Zt(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:Ue(e.name,t),cmds:n}}function ut(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Zt(e,t).cmds.map(Xt)].join(`\n`)+`\n`}function qt(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 ft(e){let[t,n,r,s,o,i,l,u,c,f,a,p]=e,d=u*p-c*a,x=-(l*p-c*f),y=l*a-u*f,L=s*d+o*x+i*y;if(!Number.isFinite(L)||Math.abs(L)<0.000000000001)return null;let h=1/L,g=[d*h,-(o*p-i*a)*h,(o*c-i*u)*h,x*h,(s*p-i*f)*h,-(s*c-i*l)*h,y*h,-(s*a-o*f)*h,(s*u-o*l)*h];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Yt=(e)=>String(+e.toFixed(6)||0),rt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function pt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Yt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${rt(t.texture)}${t.glossmap?" GLOSSMAP "+rt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${qt(r)}`,source:r}}var Jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Qt(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),u=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*u,i,o*u+s*i*c,o*c-s*i*u,-s*l,s*u-o*i*c,s*c+o*i*u,o*l]}var st=new WeakMap;function mt(e){let t=st.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=Qt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),st.set(e,n),n}var ht=999999,dt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function en(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,u=0,c=(a,p)=>{let d=a.name+"#"+p,x=l.get(d);if(!x){let y;x=Object.assign(()=>y??=ut(a,p),{file:a,step:p}),l.set(d,x)}return x},f=(a,p,d,x,y,L,h,g,b=null,C=[],F=[],A=void 0,E=null)=>{let T=a.files.get(p);if(!T||h>r)return;let k=E,m=0,P=h>0?++u:0,V=i&&P?[...C,P]:C,N=i&&P?[...F,d]:F,v=i&&!b?new Map:null,M=-1,I=0,K=(S,w,R,D,U,G,j)=>{if(M!==m)M=m,I=0;let H=v?.get(m+"|"+w);if(H)return H.n++,f(S,S===a?w:S.main,R,D,y+"/"+w,[...U,ht],h+1,G,[...U,ht],V,N,j,k);let O=[...U,I++],W=n.length;f(S,S===a?w:S.main,R,D,y+"/"+w,O,h+1,G,b,V,N,j,k),v?.set(m+"|"+w,{n:1,from:W,to:n.length})},B=mt(T),z=s?ct(T):[],_=0,Z=(S,w,R,D,U,G,j,H)=>{if(b)D=b;let O={part:S,color:w,m:R,step:D[0],steps:D,localStep:U,path:y};if(H)O.colour=H;if(P){if(O.sub=P,i)O.subPath=V,O.subMats=N}if(G)O.embedded=!0;if(j){let J=pt(S,j);O.texPart=J.name,O.texSource=J.source}let W=B[U];if(W)O.view=W;return n.push(O),O},X=(S)=>{while(_<z.length&&z[_]<=S){let w=z[_++];Z(Ue(T.name,w),x,d,[...L,w],w,!1,null,A).source=c(T,w)}};for(let S of T.cmds){if(S.t===0&&S.step){m++;continue}let w=S;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){X(m);continue}if(w.t===0){if(w.meta==="!COLOUR"){let J=nn(w.text);if(J&&J.code!==16&&J.code!==24)(k=new Map(k??[])).set(J.code,J);continue}if(o&&w.geom?.t===1)w=w.geom;else continue}if(w.t!==1)continue;if(o&&w.fallback)continue;let R=w.color===16?x:w.color,D=w.color===16?A:k?.get(w.color),U=lt(d,w.m),G=[...L,m],j=o?w.tex??g:null,H=j?ft(w.m):null,O=j&&H?at(j,H):null;if(a.files.has(w.file)){if(De(a,w.file)==="model"){K(a,w.file,U,R,G,O,D);continue}Z(w.file,R,U,G,m,!0,O,D);continue}let W=t.resolveModel?.(w.file);if(W){K(W,w.file,U,R,G,O,D);continue}Z(w.file,R,U,G,m,!1,O,D)}if(X(1/0),v){for(let S of v.values())if(S.n>1)for(let w=S.from;w<S.to;w++)n[w].mult??=S.n}};if(De(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Re],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Re,16,e.main,[],0,null),n}function bt(e,t="main.ldr",n){return en(it(e,t,{geometryText:!0}),n)}var tn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Oe(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function gt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Oe(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function nn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,u=0,c={type:"default"},f=1;while(f<n.length){let a=n[f].toUpperCase(),p=n[f+1];if(a==="CODE")s=p!==void 0&&Ie.test(p)?Be(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(a==="VALUE"){let d=Oe(p);if(d)o=d;f+=2}else if(a==="EDGE")i=Oe(p)??p,f+=2;else if(a==="ALPHA")l=+p,f+=2;else if(a==="LUMINANCE")u=+p,f+=2;else if(a==="CHROME")c={type:"chrome"},f+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(a==="RUBBER")c={type:"rubber"},f+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(a==="METAL")c={type:"metal"},f+=1;else if(a==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:x,next:y}=gt(n,f+2);c={type:"glitter",material:x},f=y}else if(d==="SPECKLE"){let{grain:x,next:y}=gt(n,f+2);c={type:"speckle",material:x},f=y}else if(d==="FABRIC"){let x=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(x)?x.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(tn.has(a))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(u)?u:0,finish:c}}function rn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function Ne(e){let t=rn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function sn(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(Q(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(Q(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var on=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function an(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 yt(e,t,n="main.ldr"){let r=sn(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let a=on(f);if(a&&r.has(a)&&!l.has(a))l.add(a),u.push(a)}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/${an(c)}.dat`)}return s}var xt=(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,wt=new WeakMap;function ze(e,t){let n=wt.get(e);if(!n)wt.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=[],u=[];s.studs.forEach((p,d)=>{l.push(p[0]),u.push(p[1]);for(let x=0;x<12;x++)i[d*12+x]=p[2+x]});let c=null,f=0,a=0;if(s.mask){f=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:u,mask:c,nx:f,nz:a}),r}var ie=1073741824;class $e{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,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function ln(e,t,n){let s=[],o=[],i=[],l=[],u=[],c=[],f=[],a=[],p=new $e(e.length*2),d=[],x=[];for(let v=0;v<e.length;v++){let M=e[v],I=M.m,K=t.parts[M.part];if(!K||!K.mask||!xt(I))continue;let B=K.bbox,z=1/0,_=-1/0,Z=1/0,X=-1/0;for(let R=0;R<2;R++)for(let D=0;D<2;D++){let U=R?B[3]:B[0],G=D?B[5]:B[2],j=I[0]+I[3]*U+I[5]*G,H=I[2]+I[9]*U+I[11]*G;if(j<z)z=j;if(j>_)_=j;if(H<Z)Z=H;if(H>X)X=H}let S=u.length;s.push(z),o.push(_),i.push(Z),l.push(X),u.push(v),c.push(ze(t,M.part)),f.push(B[0]),a.push(B[2]);let w=Math.round((I[1]+B[4])*2);for(let R=Math.floor(z/40);R<=Math.floor(_/40);R++)for(let D=Math.floor(Z/40);D<=Math.floor(X/40);D++){if(!xe(w,R,D))continue;let U=x.length;x.push(S),d.push(p.put(w,R,D,U))}}let y=[0,5,-5,5,-5],L=[0,5,5,-5,-5],h=NaN,g=NaN,b=NaN,C=-1,F=(v,M,I,K)=>{let B=Math.round(M*2),z=Math.floor(v/40),_=Math.floor(I/40);if(!xe(B,z,_))return fe;let Z=fe;if(B!==h||z!==g||_!==b)h=B,g=z,b=_,C=p.get(B,z,_);for(let X=C;X>=0;X=d[X]){let S=x[X];if(u[S]===K||!(v-6>=s[S]-0.5&&v+6<=o[S]+0.5&&I-6>=i[S]-0.5&&I+6<=l[S]+0.5))continue;let w=e[u[S]].m,R=c[S],D=f[S],U=a[S],G=v-w[0],j=M-w[1],H=I-w[2],O=w[3]*G+w[6]*j+w[9]*H,W=w[5]*G+w[8]*j+w[11]*H,{nx:J,nz:se,mask:ae}=R,oe=!0;for(let ee=0;ee<5;ee++){let te=Math.floor((O+y[ee]-D)/20),ne=Math.floor((W+L[ee]-U)/20);if(te<0||ne<0||te>=J||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let ee=n[u[S]];if(ee<Z)Z=ee}}return Z},A=0;for(let v of e){let M=ze(t,v.part);if(M)A+=M.nStuds}let E=new Uint8Array(A),T=new Uint8Array(A),k=new $e(A),m=0,P=n?new Int32Array(A).fill(fe):void 0;for(let v=0,M=0;v<e.length;v++){let I=e[v],K=ze(t,I.part);if(!K)continue;let B=I.m,z=K.studM,_=B[0],Z=B[1],X=B[2],S=B[3],w=B[4],R=B[5],D=B[6],U=B[7],G=B[8],j=B[9],H=B[10],O=B[11];for(let W=0;W<K.nStuds;W++,M++){let J=W*12,se=z[J+4],ae=z[J+7],oe=z[J+10];if(!(Math.abs(D*se+U*ae+G*oe-1)<0.001&&Math.abs(S*se+w*ae+R*oe)<0.001&&Math.abs(j*se+H*ae+O*oe)<0.001))continue;T[M]=1;let ee=z[J],te=z[J+1],ne=z[J+2],je=_+S*ee+w*te+R*ne,Ve=Z+D*ee+U*te+G*ne,_e=X+j*ee+H*te+O*ne,He=F(je,Ve,_e,v);if(He!==fe){if(E[M]=1,m++,P)P[M]=He}let pe=Math.round(je),me=Math.round(Ve),he=Math.round(_e);if(!xe(pe,me,he))continue;if(!n){k.put(pe,me,he,1);continue}let Ge=n[v],Ke=k.get(pe,me,he);if(Ke<0||Ge<Ke)k.put(pe,me,he,Ge)}}let V=new Uint8Array(e.length),N=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let M=e[v],I=t.parts[M.part];if(!I||!I.under||!xt(M.m))continue;let K=I.bbox,B=Math.round((K[3]-K[0])/20),z=Math.round((K[5]-K[2])/20);if(!B||!z||B*z>4096)continue;let _=M.m,Z=!0,X=0;for(let S=0;S<B&&Z;S++)for(let w=0;w<z;w++){let R=K[0]+10+20*S,D=K[2]+10+20*w,U=_[0]+_[3]*R+_[5]*D,G=_[2]+_[9]*R+_[11]*D,j=Math.round(U),H=Math.round(_[1]+K[4]),O=Math.round(G),W=xe(j,H,O)?k.get(j,H,O):-1;if(W<0){Z=!1;break}if(W>X)X=W}if(Z){if(V[v]=1,N)N[v]=X}}return{nStuds:A,studHidden:E,studUp:T,underHidden:V,studsHidden:m,studHideStep:P,underHideStep:N}}function cn(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let x=t.colorTable?.[a.color],y=x?.hex??t.colors?.[a.color],L=x?Ne({alpha:x.alpha??255,luminance:x.luminance??0,finish:x.finish??{type:"default"}}):"default:op",h=Ne(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&L===h?String(a.color):p.hex.toUpperCase()+"/"+h,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=l.map((a)=>dt(a.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:u.map((a)=>f.get(a)),nSteps:c.length,localColours:s}}function we(e,t,n=!0){let r=cn(e,t,n);return ln(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Me=new Map,Ae=new Map;function ve(e=Te,t=fetch){let n=Me.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(()=>Me.delete(e)),Me.set(e,n);return n}var un=(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"),Ce=(e,t)=>un(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function fn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let x=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+x),L=r;n.push(y),r+=y.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ce(b,L);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ce(b,L)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+l.length)%4)%4,c=4+l.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+u,!0),f.set(l,4),f.fill(32,4+l.length,c);let a=c;for(let p of n)f.set(p,a),a+=p.byteLength;return ye(f.buffer)}async function pn(e,t={}){e=[...e];try{return await At(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Me.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await At(e,{...t,fetch:o})}catch{throw n}}}async function At(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await ve(n,r),i=[...new Set([...e].map(Q))],l=[],u=[];for(let h of i){if(Ae.has(n+h))continue;let g=o.parts[h];if(g)u.push({name:h,off:g[0],len:g[1],file:g[2]??0});else l.push(h)}u.sort((h,g)=>h.file-g.file||h.off-g.off);let c=[];for(let h of u){let g=c[c.length-1];if(g&&g.file===h.file&&h.off-g.end<=s)g.end=Math.max(g.end,h.off+h.len),g.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,a=0,p=0,d=new Map,x=async()=>{while(p<c.length){let h=c[p++],g=d.get(h.file);if(g)g=g.subarray(h.start,h.end);else{let b=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(a++,g=new Uint8Array(await b.arrayBuffer()),f+=g.byteLength,b.status===200)d.set(h.file,g),g=g.subarray(h.start,h.end)}for(let b of h.items){let C=be(g.subarray(b.off-h.start,b.off-h.start+b.len)),F=C.buffer.slice(C.byteOffset,C.byteOffset+C.byteLength);Ae.set(n+b.name,ye(F))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},x));let y=i.filter((h)=>Ae.has(n+h)).map((h)=>Ae.get(n+h));return{pack:y.length?fn(y,{colors:o.colors}):ye(mn(o.colors)),missing:l,requests:a,bytes:f}}function mn(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 hn(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 Mt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let u=l.embedded?t.get(l.part):Q(l.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Le 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 vt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=ve(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(m)=>{if(!m.ok)throw Error(`ldr: ${m.status} fetching ${e}`);return Ze(await m.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":qe(e)),u=bt(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=yt(o,new Set(u.filter((m)=>m.embedded).map((m)=>m.part)),l),a=(m,P)=>t.maxBodyTris!=null&&m>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(m)=>new Le({...m,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),x="full";if(p){let m=Mt(u,f,await s);if(a(m.known?m.bodyTris:0,m.packBytes)){if(!t.lowCdn)throw d(m);let P=await ve(t.lowCdn,r).catch(()=>null);if(!P)throw d(m);let V=Mt(u,f,P);if(a(V.known?V.bodyTris:0,V.packBytes))throw d(V);x="low"}}let y=[...u.filter((m)=>!m.embedded).map((m)=>m.part),...f.values()],L=async()=>{let m=await pn(y,x==="low"?{...t,cdn:t.lowCdn}:t);for(let[P,V]of f){let N=m.pack.header.parts[V];if(N)m.pack.header.parts[P]=N}return{...m,packBytes:m.pack.buffer?.byteLength??m.pack.bytes??0,bodyTris:hn(u,m.pack)}},h=await L();if(p&&a(h.bodyTris,h.packBytes)&&x==="full"&&t.lowCdn&&await ve(t.lowCdn,r).then(()=>!0,()=>!1)){x="low";let m=h;h=await L(),h.requests+=m.requests,h.bytes+=m.bytes}if(p&&a(h.bodyTris,h.packBytes))throw d(h);let{pack:g,missing:b,requests:C,bytes:F}=h,A=new Map([...f].map(([m,P])=>[P,m])),E=b.map((m)=>A.get(m)??m),T=performance.now(),k=t.cull?we(u,g.header,t.textures!==!1):void 0;return{insts:u,pack:g,tier:x,missing:E,requests:C,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:T-c,...k?{cull:performance.now()-T}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await vt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),u=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:u},c)}catch(s){if(s instanceof Le||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';
|
|
4328
4349
|
|
|
4329
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4350
|
+
// ../../../../../../../tmp/ldr-build-B5BCpX/src/cdn.ts
|
|
4330
4351
|
var worker;
|
|
4331
4352
|
var seq = 0;
|
|
4332
4353
|
var pending = new Map;
|
|
@@ -4384,7 +4405,7 @@ var abs = (u) => {
|
|
|
4384
4405
|
};
|
|
4385
4406
|
function prepareInWorker(w, source, o) {
|
|
4386
4407
|
const id = ++seq;
|
|
4387
|
-
const opts = { cdn: abs(o.cdn ?? DEFAULT_PARTS_CDN), gap: o.gap, concurrency: o.concurrency, text: o.text, name: o.name, cull: true, textures: o.textures, callouts: o.callouts, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes };
|
|
4408
|
+
const opts = { cdn: abs(o.cdn ?? DEFAULT_PARTS_CDN), gap: o.gap, concurrency: o.concurrency, text: o.text, name: o.name, cull: true, textures: o.textures, callouts: o.callouts, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes, lowCdn: o.lowCdn && abs(o.lowCdn) };
|
|
4388
4409
|
const name = o.name ?? (o.text ? undefined : modelFileName(source));
|
|
4389
4410
|
let insts;
|
|
4390
4411
|
pendingInsts.set(id, (v) => {
|
|
@@ -4402,7 +4423,7 @@ function prepareInWorker(w, source, o) {
|
|
|
4402
4423
|
await warmPackGeometry(pack, () => done);
|
|
4403
4424
|
const c = await cull;
|
|
4404
4425
|
pendingInsts.delete(id);
|
|
4405
|
-
return { insts, pack, missing: d.missing, requests: d.requests, bytes: d.bytes, timings: { ...d.timings, cull: c.ms }, cull: c.cull };
|
|
4426
|
+
return { insts, pack, tier: d.tier ?? "full", missing: d.missing, requests: d.requests, bytes: d.bytes, timings: { ...d.timings, cull: c.ms }, cull: c.cull };
|
|
4406
4427
|
}, (e) => {
|
|
4407
4428
|
pendingCull.delete(id);
|
|
4408
4429
|
pendingInsts.delete(id);
|
|
@@ -4432,6 +4453,7 @@ async function loadModel(source, o = {}) {
|
|
|
4432
4453
|
const t4 = performance.now();
|
|
4433
4454
|
return Object.assign(obj, {
|
|
4434
4455
|
pack: prep.pack,
|
|
4456
|
+
tier: prep.tier,
|
|
4435
4457
|
instances: prep.insts,
|
|
4436
4458
|
requests: prep.requests,
|
|
4437
4459
|
bytes: prep.bytes,
|