ldr 0.34.11 → 0.34.12
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 +1 -1
- package/dist/cli.js +28 -11
- package/dist/index.d.ts +2 -1
- package/dist/index.js +347 -149
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/index.js +372 -157
- package/dist/parts-cdn.d.ts +2 -2
- package/dist/render.d.ts +12 -1
- package/dist/scene.d.ts +16 -3
- package/dist/stud-decal.d.ts +16 -0
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/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;
|
|
@@ -833,7 +833,7 @@ function fileStepViews(f) {
|
|
|
833
833
|
viewMemo.set(f, out);
|
|
834
834
|
return out;
|
|
835
835
|
}
|
|
836
|
-
// ../../../../../../../tmp/ldr-build-
|
|
836
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/model.ts
|
|
837
837
|
class ModelLimitError extends Error {
|
|
838
838
|
limit;
|
|
839
839
|
code = "ldr-model-limit";
|
|
@@ -1274,7 +1274,7 @@ function blendedColourHex(code) {
|
|
|
1274
1274
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1275
1275
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1276
1276
|
}
|
|
1277
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1277
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/instructions.ts
|
|
1278
1278
|
var MIN_VIS = 0.5;
|
|
1279
1279
|
var REORIENT = 0.35;
|
|
1280
1280
|
var deg = Math.PI / 180;
|
|
@@ -1642,10 +1642,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1642
1642
|
}
|
|
1643
1643
|
};
|
|
1644
1644
|
}
|
|
1645
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1646
|
-
import * as
|
|
1645
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/render.ts
|
|
1646
|
+
import * as THREE2 from "three";
|
|
1647
1647
|
|
|
1648
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1648
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/pack-io.ts
|
|
1649
1649
|
import { decompress } from "fzstd";
|
|
1650
1650
|
async function decompressPack(data) {
|
|
1651
1651
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1668,7 +1668,106 @@ function decodePack(buf) {
|
|
|
1668
1668
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1669
1669
|
}
|
|
1670
1670
|
|
|
1671
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1671
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/stud-decal.ts
|
|
1672
|
+
import * as THREE from "three";
|
|
1673
|
+
function studDecalUniforms(near = 0) {
|
|
1674
|
+
return { center: { value: new THREE.Vector3 }, near: { value: near } };
|
|
1675
|
+
}
|
|
1676
|
+
var _quad = new Map;
|
|
1677
|
+
function studDecalGeom(grid = 1) {
|
|
1678
|
+
const hit = _quad.get(grid);
|
|
1679
|
+
if (hit)
|
|
1680
|
+
return hit;
|
|
1681
|
+
const y = -4 / grid, r = 10;
|
|
1682
|
+
const pos = new Float32Array([-r, y, -r, r, y, -r, r, y, r, -r, y, -r, r, y, r, -r, y, r]);
|
|
1683
|
+
const nrm = new Int8Array(18);
|
|
1684
|
+
for (let i = 0;i < 6; i++)
|
|
1685
|
+
nrm[i * 3 + 1] = -127;
|
|
1686
|
+
const col = new Uint8Array(24);
|
|
1687
|
+
for (let i = 0;i < 6; i++) {
|
|
1688
|
+
col[i * 4] = col[i * 4 + 1] = col[i * 4 + 2] = 255;
|
|
1689
|
+
col[i * 4 + 3] = 0;
|
|
1690
|
+
}
|
|
1691
|
+
const g = new THREE.BufferGeometry;
|
|
1692
|
+
g.setAttribute("position", new THREE.BufferAttribute(pos, 3));
|
|
1693
|
+
g.setAttribute("normal", new THREE.BufferAttribute(nrm, 3, true));
|
|
1694
|
+
g.setAttribute("ldrColor", new THREE.BufferAttribute(col, 4, true));
|
|
1695
|
+
g.computeBoundingSphere();
|
|
1696
|
+
g.computeBoundingBox();
|
|
1697
|
+
_quad.set(grid, g);
|
|
1698
|
+
return g;
|
|
1699
|
+
}
|
|
1700
|
+
var cache = new WeakMap;
|
|
1701
|
+
function studDecalMaterial(base, U, grid) {
|
|
1702
|
+
let m = cache.get(base);
|
|
1703
|
+
if (!m)
|
|
1704
|
+
cache.set(base, m = new Map);
|
|
1705
|
+
const hit = m.get(grid);
|
|
1706
|
+
if (hit)
|
|
1707
|
+
return hit;
|
|
1708
|
+
const d = base.clone();
|
|
1709
|
+
const prev = base.onBeforeCompile;
|
|
1710
|
+
const key = base.customProgramCacheKey?.() ?? "";
|
|
1711
|
+
d.polygonOffset = true;
|
|
1712
|
+
d.polygonOffsetFactor = -2;
|
|
1713
|
+
d.polygonOffsetUnits = -4;
|
|
1714
|
+
d.onBeforeCompile = (s, r) => {
|
|
1715
|
+
prev.call(base, s, r);
|
|
1716
|
+
s.uniforms.uStudC = U.center;
|
|
1717
|
+
s.uniforms.uStudNear = U.near;
|
|
1718
|
+
s.vertexShader = s.vertexShader.replace("#include <common>", `#include <common>
|
|
1719
|
+
varying vec2 vSt;
|
|
1720
|
+
varying vec3 vSW;
|
|
1721
|
+
varying vec3 vTx;
|
|
1722
|
+
varying vec3 vTz;`).replace("#include <begin_vertex>", `#include <begin_vertex>
|
|
1723
|
+
vSt = position.xz;
|
|
1724
|
+
mat4 sdM = modelMatrix;
|
|
1725
|
+
#ifdef USE_INSTANCING
|
|
1726
|
+
sdM = modelMatrix * instanceMatrix;
|
|
1727
|
+
#endif
|
|
1728
|
+
vSW = (sdM * vec4(position, 1.0)).xyz;
|
|
1729
|
+
vTx = normalize((viewMatrix * sdM * vec4(1.0, 0.0, 0.0, 0.0)).xyz);
|
|
1730
|
+
vTz = normalize((viewMatrix * sdM * vec4(0.0, 0.0, 1.0, 0.0)).xyz);`);
|
|
1731
|
+
s.fragmentShader = s.fragmentShader.replace("#include <common>", `#include <common>
|
|
1732
|
+
uniform vec3 uStudC;
|
|
1733
|
+
uniform float uStudNear;
|
|
1734
|
+
varying vec2 vSt;
|
|
1735
|
+
varying vec3 vSW;
|
|
1736
|
+
varying vec3 vTx;
|
|
1737
|
+
varying vec3 vTz;`).replace("#include <roughnessmap_fragment>", `#include <roughnessmap_fragment>
|
|
1738
|
+
if (distance(vSW.xz, uStudC.xz) < uStudNear) discard; // the real studs stand here
|
|
1739
|
+
// parallax: march the view ray on from the studs' tops (the quad) down to the plate (they repeat every 20/SG LDU); the first point
|
|
1740
|
+
// inside a stud is its top (the first sample) or its wall (any later one), else the ray reaches the plate between studs
|
|
1741
|
+
const float SG = ${grid.toFixed(1)}, SC = 20.0 / SG, SR = 6.0 / SG, SH = 4.0 / SG; // cell, radius, height (LDU)
|
|
1742
|
+
vec3 sdUp = normalize(vNormal) * (gl_FrontFacing ? 1.0 : -1.0), sdV = normalize(vViewPosition);
|
|
1743
|
+
vec3 sdVt = vec3(dot(sdV, vTx), max(dot(sdV, sdUp), 0.08), dot(sdV, vTz)); // toward the eye, stud space (y: up)
|
|
1744
|
+
vec2 sdStep = sdVt.xz / sdVt.y * (SH / 8.0); if (length(sdStep) > SC * 0.2) sdStep *= SC * 0.2 / length(sdStep);
|
|
1745
|
+
float sdPxA = length(dFdx(vSt)), sdPxB = length(dFdy(vSt)), sdPx = min(sdPxA, sdPxB), sdPxM = max(sdPxA, sdPxB);
|
|
1746
|
+
float sdK = clamp((SC / sdPx - 2.5) / 3.0, 0.0, 1.0); // a stud cell under ~3 px: shading fades to the plate's average (no shimmer)
|
|
1747
|
+
float sdAa = max(sdPxM * 0.7, 0.05);
|
|
1748
|
+
float sdHit = -1.0; vec2 sdC = vec2(0.0);
|
|
1749
|
+
for (int i = 0; i <= 8; i++) { vec2 q = vSt - sdStep * float(i); vec2 c = (fract(q / SC + 0.5) - 0.5) * SC;
|
|
1750
|
+
if (length(c) < SR) { sdHit = float(i); sdC = c; break; } }
|
|
1751
|
+
vec2 sdG = (fract((vSt - sdStep * 8.0) / SC + 0.5) - 0.5) * SC; float sdRg = length(sdG); // the plate point, from its nearest stud
|
|
1752
|
+
float sdTop = sdHit == 0.0 ? 1.0 : 0.0, sdWall = sdHit > 0.0 ? 1.0 : 0.0;
|
|
1753
|
+
float sdRim = sdTop * smoothstep(SR - 0.9 * SH - sdAa, SR, length(sdC)); // the rounded edge of a top
|
|
1754
|
+
vec2 sdD = (sdHit >= 0.0 ? sdC : sdG) / max(length(sdHit >= 0.0 ? sdC : sdG), 1e-4);
|
|
1755
|
+
float sdAo = sdHit >= 0.0 ? 1.0 - 0.22 * sdWall * (sdHit / 8.0) // a wall darkens toward its foot
|
|
1756
|
+
: 1.0 - 0.45 * exp(-(sdRg - SR) / (0.5 * SH)); // the plate darkens next to a stud (contact shadow)
|
|
1757
|
+
float sdEdgeAvg = 0.9; // a cell's average darkening, what the shading fades to
|
|
1758
|
+
diffuseColor.rgb *= mix(sdEdgeAvg, sdAo, sdK);
|
|
1759
|
+
roughnessFactor = clamp(roughnessFactor * mix(1.0, sdTop > 0.5 ? 0.85 : 1.1, sdK), 0.04, 1.0);
|
|
1760
|
+
`).replace("#include <normal_fragment_maps>", `#include <normal_fragment_maps>
|
|
1761
|
+
{ vec3 sdN = sdUp; vec3 sdR = vTx * sdD.x + vTz * sdD.y;
|
|
1762
|
+
if (sdWall > 0.5) sdN = normalize(sdR + sdUp * 0.12); else if (sdRim > 0.0) sdN = normalize(sdUp + sdR * 1.2 * sdRim);
|
|
1763
|
+
normal = normalize(mix(normal, sdN, sdK)); }`);
|
|
1764
|
+
};
|
|
1765
|
+
d.customProgramCacheKey = () => key + `|stud-decal-${grid}`;
|
|
1766
|
+
m.set(grid, d);
|
|
1767
|
+
return d;
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/cull.ts
|
|
1672
1771
|
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;
|
|
1673
1772
|
var prepCache = new WeakMap;
|
|
1674
1773
|
var lastH = null;
|
|
@@ -2250,7 +2349,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
2250
2349
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
2251
2350
|
}
|
|
2252
2351
|
|
|
2253
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2352
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/render.ts
|
|
2254
2353
|
async function loadPack(url) {
|
|
2255
2354
|
const res = await fetch(url);
|
|
2256
2355
|
if (!res.ok)
|
|
@@ -2274,14 +2373,14 @@ var toF16 = (a) => {
|
|
|
2274
2373
|
const o = new Uint16Array(a.length);
|
|
2275
2374
|
for (let i = 0;i < a.length; i++) {
|
|
2276
2375
|
const v = a[i];
|
|
2277
|
-
o[i] =
|
|
2376
|
+
o[i] = THREE2.DataUtils.toHalfFloat(v > F16_MAX ? F16_MAX : v < -F16_MAX ? -F16_MAX : v);
|
|
2278
2377
|
}
|
|
2279
2378
|
return o;
|
|
2280
2379
|
};
|
|
2281
2380
|
function keepHalf(bm) {
|
|
2282
2381
|
const p = bm.geometry.getAttribute("position");
|
|
2283
2382
|
if (p && !p.isFloat16BufferAttribute && p.array instanceof Uint16Array)
|
|
2284
|
-
bm.geometry.setAttribute("position", new
|
|
2383
|
+
bm.geometry.setAttribute("position", new THREE2.Float16BufferAttribute(p.array, p.itemSize));
|
|
2285
2384
|
}
|
|
2286
2385
|
function flatNormals(pos, idx) {
|
|
2287
2386
|
const n = new Float32Array(pos.length);
|
|
@@ -2315,17 +2414,17 @@ function geom(b, arr) {
|
|
|
2315
2414
|
let g = c.get(b);
|
|
2316
2415
|
if (g)
|
|
2317
2416
|
return g;
|
|
2318
|
-
g = new
|
|
2417
|
+
g = new THREE2.BufferGeometry;
|
|
2319
2418
|
const pos = arr(b.pos);
|
|
2320
|
-
g.setAttribute("position", new
|
|
2419
|
+
g.setAttribute("position", new THREE2.Float16BufferAttribute(toF16(pos), 3));
|
|
2321
2420
|
const nrm = b.nrm ? arr(b.nrm) : flatNormals(pos, arr(b.idx));
|
|
2322
2421
|
const col = arr(b.col);
|
|
2323
|
-
g.setAttribute("normal", new
|
|
2324
|
-
g.setAttribute("ldrColor", new
|
|
2422
|
+
g.setAttribute("normal", new THREE2.BufferAttribute(toI8(nrm), 3, true));
|
|
2423
|
+
g.setAttribute("ldrColor", new THREE2.BufferAttribute(col instanceof Uint8Array ? col : toU8(col), 4, true));
|
|
2325
2424
|
if (b.idx)
|
|
2326
|
-
g.setIndex(new
|
|
2425
|
+
g.setIndex(new THREE2.BufferAttribute(arr(b.idx), 1));
|
|
2327
2426
|
if (b.uv)
|
|
2328
|
-
g.setAttribute("ldrUV", new
|
|
2427
|
+
g.setAttribute("ldrUV", new THREE2.BufferAttribute(arr(b.uv), 2));
|
|
2329
2428
|
g.computeBoundingSphere();
|
|
2330
2429
|
g.computeBoundingBox();
|
|
2331
2430
|
c.set(b, g);
|
|
@@ -2350,7 +2449,7 @@ function patchParticleFragment(shader, surface) {
|
|
|
2350
2449
|
const frac = Math.max(0.01, Math.min(0.95, surface.particleFraction ?? 0.3));
|
|
2351
2450
|
const size = Math.max(0.02, surface.particleSize ?? 1);
|
|
2352
2451
|
const sparkle = surface.finish === "glitter" ? 1 : 0;
|
|
2353
|
-
shader.uniforms.ldrParticle = { value: new
|
|
2452
|
+
shader.uniforms.ldrParticle = { value: new THREE2.Vector4(pr, pg, pb, frac) };
|
|
2354
2453
|
shader.uniforms.ldrParticleSize = { value: size };
|
|
2355
2454
|
shader.uniforms.ldrSparkle = { value: sparkle };
|
|
2356
2455
|
shader.vertexShader = `varying vec3 ldrGrainP;
|
|
@@ -2383,16 +2482,16 @@ function makeFinishMaterial(side, surface) {
|
|
|
2383
2482
|
transparent: surface.transparent,
|
|
2384
2483
|
opacity: surface.opacity,
|
|
2385
2484
|
depthWrite: surface.depthWrite,
|
|
2386
|
-
...surface.emissive > 0 ? { emissive: new
|
|
2485
|
+
...surface.emissive > 0 ? { emissive: new THREE2.Color(1, 1, 1), emissiveIntensity: surface.emissive } : {}
|
|
2387
2486
|
};
|
|
2388
|
-
const m = needPhysical ? new
|
|
2487
|
+
const m = needPhysical ? new THREE2.MeshPhysicalMaterial({
|
|
2389
2488
|
...common,
|
|
2390
2489
|
clearcoat: surface.clearcoat,
|
|
2391
2490
|
clearcoatRoughness: surface.clearcoatRoughness,
|
|
2392
2491
|
sheen: surface.sheen,
|
|
2393
2492
|
sheenRoughness: surface.sheenRoughness,
|
|
2394
|
-
sheenColor: new
|
|
2395
|
-
}) : new
|
|
2493
|
+
sheenColor: new THREE2.Color(1, 1, 1)
|
|
2494
|
+
}) : new THREE2.MeshStandardMaterial(common);
|
|
2396
2495
|
const particle = !!surface.particleHex;
|
|
2397
2496
|
m.onBeforeCompile = (s) => {
|
|
2398
2497
|
patchLdrColorVertex(s);
|
|
@@ -2459,10 +2558,10 @@ function pngHasAlpha(b) {
|
|
|
2459
2558
|
return false;
|
|
2460
2559
|
}
|
|
2461
2560
|
function packTexture(pack, i, data = false) {
|
|
2462
|
-
const t = new
|
|
2561
|
+
const t = new THREE2.Texture;
|
|
2463
2562
|
t.flipY = false;
|
|
2464
|
-
t.colorSpace = data ?
|
|
2465
|
-
t.wrapS = t.wrapT =
|
|
2563
|
+
t.colorSpace = data ? THREE2.NoColorSpace : THREE2.SRGBColorSpace;
|
|
2564
|
+
t.wrapS = t.wrapT = THREE2.ClampToEdgeWrapping;
|
|
2466
2565
|
const e = pack.header.textures?.[i];
|
|
2467
2566
|
const bytes = e?.data ? pack.arr(e.data) : null;
|
|
2468
2567
|
if (!bytes || typeof createImageBitmap === "undefined")
|
|
@@ -2481,7 +2580,7 @@ function packTexture(pack, i, data = false) {
|
|
|
2481
2580
|
return { texture: t, ready };
|
|
2482
2581
|
}
|
|
2483
2582
|
var decoded = new WeakMap;
|
|
2484
|
-
var sharedLineMat = () => new
|
|
2583
|
+
var sharedLineMat = () => new THREE2.ShaderMaterial({
|
|
2485
2584
|
vertexShader: `attribute mat4 instanceMatrix; void main(){ gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position,1.0); }`,
|
|
2486
2585
|
fragmentShader: `void main(){ gl_FragColor = vec4(0.13,0.13,0.13,1.0); }`
|
|
2487
2586
|
});
|
|
@@ -2555,8 +2654,8 @@ function conditionalLines(pack, entry, which = "all") {
|
|
|
2555
2654
|
}
|
|
2556
2655
|
return out;
|
|
2557
2656
|
}
|
|
2558
|
-
var condLineMat = () => new
|
|
2559
|
-
uniforms: { ldrViewProj: { value: new
|
|
2657
|
+
var condLineMat = () => new THREE2.ShaderMaterial({
|
|
2658
|
+
uniforms: { ldrViewProj: { value: new THREE2.Matrix4 } },
|
|
2560
2659
|
vertexShader: `uniform mat4 ldrViewProj; attribute mat4 instanceMatrix; attribute vec3 ldrP1; attribute vec3 ldrC0; attribute vec3 ldrC1; attribute float ldrSide;
|
|
2561
2660
|
void main(){
|
|
2562
2661
|
mat4 mvp = ldrViewProj * instanceMatrix;
|
|
@@ -2594,18 +2693,18 @@ function condBuffers(cond) {
|
|
|
2594
2693
|
}
|
|
2595
2694
|
side[l * 2 + 1] = 1;
|
|
2596
2695
|
}
|
|
2597
|
-
return { ib: new
|
|
2696
|
+
return { ib: new THREE2.InterleavedBuffer(buf, 12), side: new THREE2.BufferAttribute(side, 1) };
|
|
2598
2697
|
}
|
|
2599
2698
|
function condEdges({ ib, side }, im, material) {
|
|
2600
|
-
const g = new
|
|
2601
|
-
g.setAttribute("position", new
|
|
2602
|
-
g.setAttribute("ldrP1", new
|
|
2603
|
-
g.setAttribute("ldrC0", new
|
|
2604
|
-
g.setAttribute("ldrC1", new
|
|
2699
|
+
const g = new THREE2.InstancedBufferGeometry;
|
|
2700
|
+
g.setAttribute("position", new THREE2.InterleavedBufferAttribute(ib, 3, 0));
|
|
2701
|
+
g.setAttribute("ldrP1", new THREE2.InterleavedBufferAttribute(ib, 3, 3));
|
|
2702
|
+
g.setAttribute("ldrC0", new THREE2.InterleavedBufferAttribute(ib, 3, 6));
|
|
2703
|
+
g.setAttribute("ldrC1", new THREE2.InterleavedBufferAttribute(ib, 3, 9));
|
|
2605
2704
|
g.setAttribute("ldrSide", side);
|
|
2606
2705
|
g.setAttribute("instanceMatrix", im.instanceMatrix);
|
|
2607
2706
|
g.instanceCount = im.count;
|
|
2608
|
-
const l = new
|
|
2707
|
+
const l = new THREE2.LineSegments(g, material);
|
|
2609
2708
|
l.frustumCulled = false;
|
|
2610
2709
|
l.name = "ldrCondLines";
|
|
2611
2710
|
l.onBeforeRender = (_r, _s, cam, _g, mat) => {
|
|
@@ -2620,12 +2719,12 @@ function condEdges({ ib, side }, im, material) {
|
|
|
2620
2719
|
}
|
|
2621
2720
|
function sharedLines(pos, im, material = sharedLineMat()) {
|
|
2622
2721
|
const { P, I } = weldLines(pos);
|
|
2623
|
-
const g = new
|
|
2624
|
-
g.setAttribute("position", new
|
|
2625
|
-
g.setIndex(new
|
|
2722
|
+
const g = new THREE2.InstancedBufferGeometry;
|
|
2723
|
+
g.setAttribute("position", new THREE2.BufferAttribute(P, 3));
|
|
2724
|
+
g.setIndex(new THREE2.BufferAttribute(I, 1));
|
|
2626
2725
|
g.setAttribute("instanceMatrix", im.instanceMatrix);
|
|
2627
2726
|
g.instanceCount = im.count;
|
|
2628
|
-
const l = new
|
|
2727
|
+
const l = new THREE2.LineSegments(g, material);
|
|
2629
2728
|
l.frustumCulled = false;
|
|
2630
2729
|
return l;
|
|
2631
2730
|
}
|
|
@@ -2648,8 +2747,8 @@ function writeM4(t, o, m, mo = 0) {
|
|
|
2648
2747
|
t[o + 15] = 1;
|
|
2649
2748
|
}
|
|
2650
2749
|
function newIM(g, mat, n) {
|
|
2651
|
-
const im = new
|
|
2652
|
-
im.instanceMatrix = new
|
|
2750
|
+
const im = new THREE2.InstancedMesh(g, mat, 0);
|
|
2751
|
+
im.instanceMatrix = new THREE2.InstancedBufferAttribute(new Float32Array(n * 16), 16);
|
|
2653
2752
|
im.count = n;
|
|
2654
2753
|
return im;
|
|
2655
2754
|
}
|
|
@@ -2712,7 +2811,7 @@ function sphereUnion(S, A, n) {
|
|
|
2712
2811
|
S[3] = r;
|
|
2713
2812
|
}
|
|
2714
2813
|
function setSphere(im, S) {
|
|
2715
|
-
const sph = im.boundingSphere ?? new
|
|
2814
|
+
const sph = im.boundingSphere ?? new THREE2.Sphere;
|
|
2716
2815
|
sph.center.set(S[0], S[1], S[2]);
|
|
2717
2816
|
sph.radius = S[3];
|
|
2718
2817
|
if (S[3] < 0)
|
|
@@ -2782,7 +2881,7 @@ function fillInstances(im, ids, insts, color) {
|
|
|
2782
2881
|
writeM4(M, k * 16, it.m);
|
|
2783
2882
|
color(it.color).toArray(C, k * 3);
|
|
2784
2883
|
}
|
|
2785
|
-
im.instanceColor = new
|
|
2884
|
+
im.instanceColor = new THREE2.InstancedBufferAttribute(C, 3);
|
|
2786
2885
|
}
|
|
2787
2886
|
function computeCulling(insts, H) {
|
|
2788
2887
|
const c = cullCore(insts, H);
|
|
@@ -2914,10 +3013,10 @@ function studDiscGeom() {
|
|
|
2914
3013
|
col[i * 4 + 2] = 255;
|
|
2915
3014
|
col[i * 4 + 3] = 0;
|
|
2916
3015
|
}
|
|
2917
|
-
const g = new
|
|
2918
|
-
g.setAttribute("position", new
|
|
2919
|
-
g.setAttribute("normal", new
|
|
2920
|
-
g.setAttribute("ldrColor", new
|
|
3016
|
+
const g = new THREE2.BufferGeometry;
|
|
3017
|
+
g.setAttribute("position", new THREE2.Float16BufferAttribute(toF16(pos), 3));
|
|
3018
|
+
g.setAttribute("normal", new THREE2.BufferAttribute(toI8(nrm), 3, true));
|
|
3019
|
+
g.setAttribute("ldrColor", new THREE2.BufferAttribute(col, 4, true));
|
|
2921
3020
|
g.computeBoundingSphere();
|
|
2922
3021
|
g.computeBoundingBox();
|
|
2923
3022
|
return _studDisc = g;
|
|
@@ -2964,11 +3063,11 @@ function studBoxGeom(w) {
|
|
|
2964
3063
|
col[i * 4 + 2] = 255;
|
|
2965
3064
|
col[i * 4 + 3] = 0;
|
|
2966
3065
|
}
|
|
2967
|
-
g = new
|
|
2968
|
-
g.setAttribute("position", new
|
|
2969
|
-
g.setAttribute("normal", new
|
|
2970
|
-
g.setAttribute("ldrColor", new
|
|
2971
|
-
g.setIndex(new
|
|
3066
|
+
g = new THREE2.BufferGeometry;
|
|
3067
|
+
g.setAttribute("position", new THREE2.Float16BufferAttribute(toF16(new Float32Array(pos)), 3));
|
|
3068
|
+
g.setAttribute("normal", new THREE2.BufferAttribute(toI8(new Float32Array(nrm)), 3, true));
|
|
3069
|
+
g.setAttribute("ldrColor", new THREE2.BufferAttribute(col, 4, true));
|
|
3070
|
+
g.setIndex(new THREE2.BufferAttribute(new Uint16Array(idx), 1));
|
|
2972
3071
|
g.computeBoundingSphere();
|
|
2973
3072
|
g.computeBoundingBox();
|
|
2974
3073
|
_studBox.set(w, g);
|
|
@@ -3035,11 +3134,11 @@ function studTubeGeom(w, wi) {
|
|
|
3035
3134
|
col[i * 4 + 2] = 255;
|
|
3036
3135
|
col[i * 4 + 3] = 0;
|
|
3037
3136
|
}
|
|
3038
|
-
g = new
|
|
3039
|
-
g.setAttribute("position", new
|
|
3040
|
-
g.setAttribute("normal", new
|
|
3041
|
-
g.setAttribute("ldrColor", new
|
|
3042
|
-
g.setIndex(new
|
|
3137
|
+
g = new THREE2.BufferGeometry;
|
|
3138
|
+
g.setAttribute("position", new THREE2.Float16BufferAttribute(toF16(new Float32Array(pos)), 3));
|
|
3139
|
+
g.setAttribute("normal", new THREE2.BufferAttribute(toI8(new Float32Array(nrm)), 3, true));
|
|
3140
|
+
g.setAttribute("ldrColor", new THREE2.BufferAttribute(col, 4, true));
|
|
3141
|
+
g.setIndex(new THREE2.BufferAttribute(new Uint16Array(idx), 1));
|
|
3043
3142
|
g.computeBoundingSphere();
|
|
3044
3143
|
g.computeBoundingBox();
|
|
3045
3144
|
_studTube.set(key, g);
|
|
@@ -3185,7 +3284,7 @@ function studTopClosed(b, arr) {
|
|
|
3185
3284
|
}
|
|
3186
3285
|
var EDGE_CAP_MIN = 4;
|
|
3187
3286
|
|
|
3188
|
-
class LdrLodRoot extends
|
|
3287
|
+
class LdrLodRoot extends THREE2.LOD {
|
|
3189
3288
|
clusters = [];
|
|
3190
3289
|
vpH = 1080;
|
|
3191
3290
|
px = 0.5;
|
|
@@ -3194,8 +3293,8 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
3194
3293
|
edgeCap = 0;
|
|
3195
3294
|
enabled = true;
|
|
3196
3295
|
apply = () => {};
|
|
3197
|
-
inv = new
|
|
3198
|
-
cp = new
|
|
3296
|
+
inv = new THREE2.Matrix4;
|
|
3297
|
+
cp = new THREE2.Vector3;
|
|
3199
3298
|
lastW = new Float32Array(16).fill(NaN);
|
|
3200
3299
|
constructor() {
|
|
3201
3300
|
super();
|
|
@@ -3327,7 +3426,51 @@ function fillBucketIds(bIds, fill, studBucket, j0, j1) {
|
|
|
3327
3426
|
bIds[b][fill[b]++] = j;
|
|
3328
3427
|
}
|
|
3329
3428
|
}
|
|
3330
|
-
|
|
3429
|
+
var _studGrid = new WeakMap;
|
|
3430
|
+
function studGridGeom(g, n) {
|
|
3431
|
+
if (n <= 1)
|
|
3432
|
+
return g;
|
|
3433
|
+
let m = _studGrid.get(g);
|
|
3434
|
+
if (!m)
|
|
3435
|
+
_studGrid.set(g, m = new Map);
|
|
3436
|
+
const hit = m.get(n);
|
|
3437
|
+
if (hit)
|
|
3438
|
+
return hit;
|
|
3439
|
+
const src = g;
|
|
3440
|
+
const P = src.getAttribute("position"), nv = P.count, k = n * n, pos = new Float32Array(nv * 3 * k), out = new THREE2.BufferGeometry;
|
|
3441
|
+
for (let a = 0, c = 0;a < n; a++)
|
|
3442
|
+
for (let b = 0;b < n; b++, c++) {
|
|
3443
|
+
const ox = ((a + 0.5) / n - 0.5) * 20, oz = ((b + 0.5) / n - 0.5) * 20, o = c * nv * 3;
|
|
3444
|
+
for (let v = 0;v < nv; v++) {
|
|
3445
|
+
pos[o + v * 3] = P.getX(v) / n + ox;
|
|
3446
|
+
pos[o + v * 3 + 1] = P.getY(v) / n;
|
|
3447
|
+
pos[o + v * 3 + 2] = P.getZ(v) / n + oz;
|
|
3448
|
+
}
|
|
3449
|
+
}
|
|
3450
|
+
out.setAttribute("position", g.getAttribute("position") instanceof THREE2.Float16BufferAttribute ? new THREE2.Float16BufferAttribute(toF16(pos), 3) : new THREE2.BufferAttribute(pos, 3));
|
|
3451
|
+
for (const name of Object.keys(src.attributes)) {
|
|
3452
|
+
if (name === "position")
|
|
3453
|
+
continue;
|
|
3454
|
+
const A = src.getAttribute(name);
|
|
3455
|
+
const sa = A.array, dst = new sa.constructor(sa.length * k);
|
|
3456
|
+
for (let c = 0;c < k; c++)
|
|
3457
|
+
dst.set(sa, c * sa.length);
|
|
3458
|
+
out.setAttribute(name, new A.constructor(dst, A.itemSize, A.normalized));
|
|
3459
|
+
}
|
|
3460
|
+
const I = src.getIndex();
|
|
3461
|
+
if (I) {
|
|
3462
|
+
const ia = I.array, ni = ia.length, big = nv * k > 65535, dst = big ? new Uint32Array(ni * k) : new Uint16Array(ni * k);
|
|
3463
|
+
for (let c = 0;c < k; c++)
|
|
3464
|
+
for (let i = 0;i < ni; i++)
|
|
3465
|
+
dst[c * ni + i] = ia[i] + c * nv;
|
|
3466
|
+
out.setIndex(new THREE2.BufferAttribute(dst, 1));
|
|
3467
|
+
}
|
|
3468
|
+
out.computeBoundingSphere();
|
|
3469
|
+
out.computeBoundingBox();
|
|
3470
|
+
m.set(n, out);
|
|
3471
|
+
return out;
|
|
3472
|
+
}
|
|
3473
|
+
function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex, trim = false, grid = 1) {
|
|
3331
3474
|
const bKind = [], bMat = [];
|
|
3332
3475
|
const bAll = [];
|
|
3333
3476
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
@@ -3445,7 +3588,7 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3445
3588
|
}
|
|
3446
3589
|
const n = trim ? v : c.length;
|
|
3447
3590
|
const im = newIM(g, bMat[b], n);
|
|
3448
|
-
im.instanceColor = new
|
|
3591
|
+
im.instanceColor = new THREE2.InstancedBufferAttribute(new Float32Array(n * 3), 3);
|
|
3449
3592
|
sMesh.push({ im, kind, vis: v, all: c.length, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
|
|
3450
3593
|
}
|
|
3451
3594
|
};
|
|
@@ -3453,10 +3596,10 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3453
3596
|
if (b)
|
|
3454
3597
|
yield;
|
|
3455
3598
|
const kind = bKind[b];
|
|
3456
|
-
const
|
|
3599
|
+
const g0 = geom(H.studKinds[kind].body, arr), g = g0 && studGridGeom(g0, grid);
|
|
3457
3600
|
const ids = bIds[b];
|
|
3458
3601
|
const studTris = g ? (g.getIndex() ? g.getIndex().count : g.getAttribute("position").count) / 3 : 24;
|
|
3459
|
-
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 / Math.max(1, studTris)))) : Infinity;
|
|
3602
|
+
const kStud = LOD ? Math.max(256, Math.min(4096, Math.round(65536 * grid / Math.max(1, studTris)))) : Infinity;
|
|
3460
3603
|
const clusters = yield* gridClustersGen(ids.length, (i) => sx[ids[i]], (i) => sz[ids[i]], kStud);
|
|
3461
3604
|
for (let c0 = 0;c0 < clusters.length; c0 += 4) {
|
|
3462
3605
|
if (c0)
|
|
@@ -3604,6 +3747,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3604
3747
|
const { header: H, arr } = pack;
|
|
3605
3748
|
const LOD = P.lod !== false;
|
|
3606
3749
|
const EDGES = !!P.edges;
|
|
3750
|
+
const G = Math.max(1, Math.round(P.studGrid ?? 1));
|
|
3607
3751
|
const root = new LdrLodRoot;
|
|
3608
3752
|
root.enabled = LOD;
|
|
3609
3753
|
root.px = P.lodPx ?? 0.5;
|
|
@@ -3624,8 +3768,8 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3624
3768
|
base.apply(this, a);
|
|
3625
3769
|
};
|
|
3626
3770
|
};
|
|
3627
|
-
const matF = makeMaterial(P.side === "front" ?
|
|
3628
|
-
const matD = makeMaterial(
|
|
3771
|
+
const matF = makeMaterial(P.side === "front" ? THREE2.FrontSide : THREE2.DoubleSide), matB = makeMaterial(P.side === "front" ? THREE2.BackSide : THREE2.DoubleSide);
|
|
3772
|
+
const matD = makeMaterial(THREE2.DoubleSide);
|
|
3629
3773
|
let nUncert = 0;
|
|
3630
3774
|
matF.userData.ldrSideRole = "F";
|
|
3631
3775
|
matB.userData.ldrSideRole = "B";
|
|
@@ -3658,7 +3802,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3658
3802
|
const key = fk + "|" + role;
|
|
3659
3803
|
let m = matCache.get(key);
|
|
3660
3804
|
if (!m) {
|
|
3661
|
-
const side = uncert ?
|
|
3805
|
+
const side = uncert ? THREE2.DoubleSide : P.side === "front" ? mirror ? THREE2.BackSide : THREE2.FrontSide : THREE2.DoubleSide;
|
|
3662
3806
|
if (fk === "default:op" && lc.luminance === 0) {
|
|
3663
3807
|
m = role === "D" ? matD : role === "B" ? matB : matF;
|
|
3664
3808
|
} else {
|
|
@@ -3772,7 +3916,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3772
3916
|
let w = lineCache.get(ref);
|
|
3773
3917
|
if (!w) {
|
|
3774
3918
|
const r = weldLines(src ? src.pos : arr(ref), LOD && !src?.lens);
|
|
3775
|
-
lineCache.set(ref, w = { P: new
|
|
3919
|
+
lineCache.set(ref, w = { P: new THREE2.BufferAttribute(r.P, 3), I: new THREE2.BufferAttribute(r.I, 1), lens: src?.lens ?? r.lens, order: r.order });
|
|
3776
3920
|
}
|
|
3777
3921
|
return lineObj(w, im, cl);
|
|
3778
3922
|
};
|
|
@@ -3792,17 +3936,17 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3792
3936
|
I[n * 2 + 1] = FI[k * 2 + 1];
|
|
3793
3937
|
lens[n++] = full.lens[k];
|
|
3794
3938
|
}
|
|
3795
|
-
lineCache.set(ref, w = { P: full.P, I: new
|
|
3939
|
+
lineCache.set(ref, w = { P: full.P, I: new THREE2.BufferAttribute(I.subarray(0, n * 2), 1), lens: lens.subarray(0, n) });
|
|
3796
3940
|
}
|
|
3797
3941
|
return lineObj(w, im, cl);
|
|
3798
3942
|
};
|
|
3799
3943
|
const lineObj = (w, im, cl) => {
|
|
3800
|
-
const g = new
|
|
3944
|
+
const g = new THREE2.InstancedBufferGeometry;
|
|
3801
3945
|
g.setAttribute("position", w.P);
|
|
3802
3946
|
g.setIndex(w.I);
|
|
3803
3947
|
g.setAttribute("instanceMatrix", im.instanceMatrix);
|
|
3804
3948
|
g.instanceCount = im.count;
|
|
3805
|
-
const l = new
|
|
3949
|
+
const l = new THREE2.LineSegments(g, lmat());
|
|
3806
3950
|
l.frustumCulled = false;
|
|
3807
3951
|
if (LOD)
|
|
3808
3952
|
l.userData.ldrLens = w.lens;
|
|
@@ -3853,7 +3997,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3853
3997
|
return gm ?? undefined;
|
|
3854
3998
|
};
|
|
3855
3999
|
const texMat = (t, base, wrapU, g) => {
|
|
3856
|
-
const role = base.userData?.ldrSideRole ?? (base.side ===
|
|
4000
|
+
const role = base.userData?.ldrSideRole ?? (base.side === THREE2.BackSide ? "B" : base.side === THREE2.DoubleSide ? "D" : "F");
|
|
3857
4001
|
const fin = base.userData?.ldrFinish ?? "default";
|
|
3858
4002
|
const gloss = glossOf(g);
|
|
3859
4003
|
const k = t + ":" + role + ":" + fin + ":" + (wrapU ? 1 : 0) + (gloss ? ":g" + g : "");
|
|
@@ -3879,7 +4023,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3879
4023
|
return c;
|
|
3880
4024
|
};
|
|
3881
4025
|
const lodLevels = (b, base, mat) => !LOD || !b?.lod ? [] : b.lod.map((l) => {
|
|
3882
|
-
const im = new
|
|
4026
|
+
const im = new THREE2.InstancedMesh(geom(l, arr), mat, 0);
|
|
3883
4027
|
im.userData = { ...base.userData };
|
|
3884
4028
|
im.instanceMatrix = base.instanceMatrix;
|
|
3885
4029
|
im.count = base.count;
|
|
@@ -4071,8 +4215,8 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4071
4215
|
}
|
|
4072
4216
|
}
|
|
4073
4217
|
yield root;
|
|
4074
|
-
const tmpM = new
|
|
4075
|
-
const tmpC = new
|
|
4218
|
+
const tmpM = new THREE2.Matrix4;
|
|
4219
|
+
const tmpC = new THREE2.Color;
|
|
4076
4220
|
for (const [mat, items] of coldByMat) {
|
|
4077
4221
|
yield root;
|
|
4078
4222
|
const entries = [];
|
|
@@ -4112,7 +4256,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4112
4256
|
yield root;
|
|
4113
4257
|
}
|
|
4114
4258
|
}
|
|
4115
|
-
const bm = new
|
|
4259
|
+
const bm = new THREE2.BatchedMesh(members.length, Math.max(1, maxV), Math.max(1, maxI), mat);
|
|
4116
4260
|
bm.perObjectFrustumCulled = true;
|
|
4117
4261
|
bm.sortObjects = false;
|
|
4118
4262
|
bm.frustumCulled = true;
|
|
@@ -4156,7 +4300,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4156
4300
|
members.length = 0;
|
|
4157
4301
|
members.push(...live);
|
|
4158
4302
|
bm.computeBoundingSphere();
|
|
4159
|
-
const cl = newCluster(bm.boundingSphere ?? new
|
|
4303
|
+
const cl = newCluster(bm.boundingSphere ?? new THREE2.Sphere, bm);
|
|
4160
4304
|
const bodyErrs = live.map(({ p }) => [0, ...(p.body?.lod ?? []).map((l) => l.err)]);
|
|
4161
4305
|
bm.userData.ldrMergeGids = instGids;
|
|
4162
4306
|
cl.mergedLod = { bm, gids: instGids, errs: bodyErrs };
|
|
@@ -4177,7 +4321,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4177
4321
|
continue;
|
|
4178
4322
|
if (!pp.edges && !(wantCond && (pp.condl || pp.condlu)))
|
|
4179
4323
|
continue;
|
|
4180
|
-
const ghost = newIM(geom(pp.body, arr) || new
|
|
4324
|
+
const ghost = newIM(geom(pp.body, arr) || new THREE2.BufferGeometry, mat, ids.length);
|
|
4181
4325
|
fillInstances(ghost, ids, insts, color);
|
|
4182
4326
|
const nL = cl.lines.length, nC = cl.cond.length;
|
|
4183
4327
|
if (pp.edges)
|
|
@@ -4227,7 +4371,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4227
4371
|
yield root;
|
|
4228
4372
|
}
|
|
4229
4373
|
}
|
|
4230
|
-
const ubm = new
|
|
4374
|
+
const ubm = new THREE2.BatchedMesh(umembers.length, Math.max(1, uV), Math.max(1, uI), mat);
|
|
4231
4375
|
ubm.perObjectFrustumCulled = true;
|
|
4232
4376
|
ubm.sortObjects = false;
|
|
4233
4377
|
ubm.frustumCulled = true;
|
|
@@ -4277,7 +4421,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4277
4421
|
umembers.length = 0;
|
|
4278
4422
|
umembers.push(...uLive);
|
|
4279
4423
|
ubm.computeBoundingSphere();
|
|
4280
|
-
const ucl = newCluster(ubm.boundingSphere ?? new
|
|
4424
|
+
const ucl = newCluster(ubm.boundingSphere ?? new THREE2.Sphere, ubm);
|
|
4281
4425
|
const uErrs = uLive.map(({ p }) => [0, ...(p.under?.lod ?? []).map((l) => l.err)]);
|
|
4282
4426
|
ubm.userData._stepMode = !!steps;
|
|
4283
4427
|
ubm.userData.ldrMergeGids = uInstGids;
|
|
@@ -4299,7 +4443,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4299
4443
|
continue;
|
|
4300
4444
|
const ord = [...ids.filter((id) => !cull.underHidden[id]), ...ids.filter((id) => cull.underHidden[id])];
|
|
4301
4445
|
const vis = ids.length - ids.reduce((a, id) => a + cull.underHidden[id], 0);
|
|
4302
|
-
const ghost = newIM(geom(pp.under, arr) || new
|
|
4446
|
+
const ghost = newIM(geom(pp.under, arr) || new THREE2.BufferGeometry, mat, ord.length);
|
|
4303
4447
|
fillInstances(ghost, ord, insts, color);
|
|
4304
4448
|
const nC = ucl.cond.length;
|
|
4305
4449
|
addCond(pp, ghost, ucl, "under");
|
|
@@ -4351,7 +4495,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4351
4495
|
}
|
|
4352
4496
|
}
|
|
4353
4497
|
yield root;
|
|
4354
|
-
const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex, !steps && !!P.cullStuds);
|
|
4498
|
+
const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex, !steps && !!P.cullStuds, G);
|
|
4355
4499
|
let _studR = _studGen.next();
|
|
4356
4500
|
while (!_studR.done) {
|
|
4357
4501
|
yield root;
|
|
@@ -4360,10 +4504,10 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4360
4504
|
const sMesh = _studR.value;
|
|
4361
4505
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
4362
4506
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
4363
|
-
const STUD_ERR = 12;
|
|
4364
|
-
const STUD_BOX_ERR = 2.49;
|
|
4507
|
+
const STUD_ERR = 12 / G;
|
|
4508
|
+
const STUD_BOX_ERR = 2.49 / G;
|
|
4365
4509
|
const STUD_BOX_W_LOW = 5.317;
|
|
4366
|
-
const STUD_DISC_ERR = 8;
|
|
4510
|
+
const STUD_DISC_ERR = 8 / G;
|
|
4367
4511
|
let _coopS = 0;
|
|
4368
4512
|
const sqLineKey = new Map;
|
|
4369
4513
|
for (let ci = 0;ci < sMesh.length; ci++) {
|
|
@@ -4394,7 +4538,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4394
4538
|
const h = studTopClosed(k.body, arr) ? null : studHole(k.body, arr);
|
|
4395
4539
|
const hole = h ? { r: h.r, w: h.r * Math.sqrt(Math.PI) / 2 } : undefined;
|
|
4396
4540
|
if (LOD && (hole || studTopClosed(k.body, arr)) && (im.geometry.getIndex()?.count ?? im.geometry.getAttribute("position").count) > 30) {
|
|
4397
|
-
const box = new
|
|
4541
|
+
const box = new THREE2.InstancedMesh(studGridGeom(hole ? studTubeGeom(sqW, hole.w) : studBoxGeom(sqW), G), im.material, 0);
|
|
4398
4542
|
box.userData = { ldrStud: true, ldrLod: true };
|
|
4399
4543
|
box.instanceMatrix = im.instanceMatrix;
|
|
4400
4544
|
box.count = im.count;
|
|
@@ -4404,11 +4548,11 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4404
4548
|
box.onBeforeRender = trackVp;
|
|
4405
4549
|
root.add(box);
|
|
4406
4550
|
discObjs.push(box);
|
|
4407
|
-
cl.lv.push({ objs: [box], err: h ? Math.max(STUD_BOX_ERR, 6 * Math.SQRT2 - h.out) : STUD_BOX_ERR });
|
|
4551
|
+
cl.lv.push({ objs: [box], err: h ? Math.max(STUD_BOX_ERR, (6 * Math.SQRT2 - h.out) / G) : STUD_BOX_ERR });
|
|
4408
4552
|
cl.studLineLv = 1;
|
|
4409
4553
|
}
|
|
4410
4554
|
if (LOD) {
|
|
4411
|
-
const disc = new
|
|
4555
|
+
const disc = new THREE2.InstancedMesh(studGridGeom(studDiscGeom(), G), im.material, 0);
|
|
4412
4556
|
disc.userData = { ldrStud: true, ldrLod: true };
|
|
4413
4557
|
disc.instanceMatrix = im.instanceMatrix;
|
|
4414
4558
|
disc.count = im.count;
|
|
@@ -4421,7 +4565,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4421
4565
|
cl.lv.push({ objs: [disc], err: STUD_DISC_ERR });
|
|
4422
4566
|
cl.lv.push({ objs: [], err: STUD_ERR });
|
|
4423
4567
|
}
|
|
4424
|
-
if (EDGES && k.edges) {
|
|
4568
|
+
if (EDGES && k.edges && G === 1) {
|
|
4425
4569
|
const round = addLines(k.edges, im, cl);
|
|
4426
4570
|
let sq = cl.studLineLv === 1 && round ? sqLineKey.get(kind) : null;
|
|
4427
4571
|
if (sq === undefined) {
|
|
@@ -4447,6 +4591,18 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4447
4591
|
toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
|
|
4448
4592
|
if (sm.slots)
|
|
4449
4593
|
stepBatches.push({ im, objs, flag: "studs", ...sm.slots });
|
|
4594
|
+
if (sm.slots && P.studDecal && im.material.opacity === 1 && !im.material.transparent) {
|
|
4595
|
+
const n = im.instanceMatrix.count, decal = new THREE2.InstancedMesh(studDecalGeom(G), studDecalMaterial(im.material, P.studDecal, G), n);
|
|
4596
|
+
decal.instanceMatrix = new THREE2.InstancedBufferAttribute(im.instanceMatrix.array.slice(), 16);
|
|
4597
|
+
decal.instanceColor = new THREE2.InstancedBufferAttribute(im.instanceColor.array.slice(), 3);
|
|
4598
|
+
decal.count = im.count;
|
|
4599
|
+
decal.boundingSphere = im.boundingSphere;
|
|
4600
|
+
decal.visible = false;
|
|
4601
|
+
decal.userData = { ldrStudDecal: true };
|
|
4602
|
+
root.add(decal);
|
|
4603
|
+
stepBatches[stepBatches.length - 1].decal = decal;
|
|
4604
|
+
stats.studDecals = (stats.studDecals ?? 0) + 1;
|
|
4605
|
+
}
|
|
4450
4606
|
}
|
|
4451
4607
|
yield root;
|
|
4452
4608
|
stats.uncertParts = Object.values(H.parts).filter((x) => x.uncert).length;
|
|
@@ -4488,12 +4644,17 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4488
4644
|
const texturesReady = Promise.all(pending).then(() => {});
|
|
4489
4645
|
let stepS = STEP_NEVER - 1, cullS = !!P.cullStuds, cullU = !!P.cullUnder;
|
|
4490
4646
|
let only = null;
|
|
4491
|
-
|
|
4647
|
+
let studMask = null;
|
|
4648
|
+
const applySteps = (studsOnly = false) => {
|
|
4492
4649
|
const st = { studsTotal: 0, studsHidden: 0, undersTotal: 0, undersHidden: 0 };
|
|
4493
|
-
const S = stepS, O = only;
|
|
4650
|
+
const S = stepS, O = only, SM = studMask, SA = SM && !("r" in SM) ? SM : null, SCi = SM && "r" in SM ? SM : null, SR2 = SCi ? Math.sign(SCi.r) * SCi.r * SCi.r : 0;
|
|
4494
4651
|
const wm = new Float64Array(12);
|
|
4495
4652
|
for (const b of stepBatches) {
|
|
4653
|
+
if (studsOnly && b.flag !== "studs")
|
|
4654
|
+
continue;
|
|
4496
4655
|
const MA = b.im.instanceMatrix.array, CA = b.im.instanceColor.array;
|
|
4656
|
+
const D = b.decal, DM = D?.instanceMatrix.array, DC = D?.instanceColor.array, sm = b.flag === "studs" ? SM : null;
|
|
4657
|
+
let w2 = 0;
|
|
4497
4658
|
const useHide = b.flag === "studs" ? cullS : b.flag === "under" ? cullU : false;
|
|
4498
4659
|
const { own, hide, inst, stud, col } = b;
|
|
4499
4660
|
let w = 0;
|
|
@@ -4515,14 +4676,31 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4515
4676
|
const n = inst[i];
|
|
4516
4677
|
if (O && !O[n])
|
|
4517
4678
|
continue;
|
|
4518
|
-
if (stud)
|
|
4679
|
+
if (stud)
|
|
4519
4680
|
mul12To(instM, instPP[n].studM, stud[i] * 12, wm, n * 12);
|
|
4681
|
+
const real = !sm || (SA ? !!SA[n] : (wm[0] - SCi.x) ** 2 + (wm[2] - SCi.z) ** 2 < SR2);
|
|
4682
|
+
if (!real && !D)
|
|
4683
|
+
continue;
|
|
4684
|
+
if (D) {
|
|
4685
|
+
writeM4(DM, w2 * 16, wm);
|
|
4686
|
+
palette[col[i]].toArray(DC, w2 * 3);
|
|
4687
|
+
w2++;
|
|
4688
|
+
}
|
|
4689
|
+
if (!real)
|
|
4690
|
+
continue;
|
|
4691
|
+
if (stud)
|
|
4520
4692
|
writeM4(MA, w * 16, wm);
|
|
4521
|
-
|
|
4693
|
+
else
|
|
4522
4694
|
writeM4(MA, w * 16, instM, n * 12);
|
|
4523
4695
|
palette[col[i]].toArray(CA, w * 3);
|
|
4524
4696
|
w++;
|
|
4525
4697
|
}
|
|
4698
|
+
if (D) {
|
|
4699
|
+
D.instanceMatrix.needsUpdate = true;
|
|
4700
|
+
D.instanceColor.needsUpdate = true;
|
|
4701
|
+
D.count = w2;
|
|
4702
|
+
D.visible = !!SM;
|
|
4703
|
+
}
|
|
4526
4704
|
b.im.instanceMatrix.needsUpdate = true;
|
|
4527
4705
|
b.im.instanceColor.needsUpdate = true;
|
|
4528
4706
|
for (const o of b.objs) {
|
|
@@ -4532,20 +4710,21 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4532
4710
|
o.geometry.instanceCount = w;
|
|
4533
4711
|
}
|
|
4534
4712
|
}
|
|
4535
|
-
|
|
4536
|
-
const
|
|
4537
|
-
|
|
4538
|
-
|
|
4539
|
-
|
|
4540
|
-
|
|
4541
|
-
|
|
4542
|
-
|
|
4543
|
-
|
|
4713
|
+
if (!studsOnly)
|
|
4714
|
+
for (const b of stepBatched) {
|
|
4715
|
+
const useHide = b.flag === "under" ? cullU : false;
|
|
4716
|
+
const { own, hide, inst, bm } = b;
|
|
4717
|
+
for (let i = 0;i < own.length; i++) {
|
|
4718
|
+
const hid = !!hide && hide[i] <= S;
|
|
4719
|
+
if (b.flag === "under") {
|
|
4720
|
+
st.undersTotal++;
|
|
4721
|
+
if (hid)
|
|
4722
|
+
st.undersHidden++;
|
|
4723
|
+
}
|
|
4724
|
+
const on = own[i] <= S && !(useHide && hid) && !(O && !O[inst[i]]);
|
|
4725
|
+
bm.setVisibleAt(i, on);
|
|
4544
4726
|
}
|
|
4545
|
-
const on = own[i] <= S && !(useHide && hid) && !(O && !O[inst[i]]);
|
|
4546
|
-
bm.setVisibleAt(i, on);
|
|
4547
4727
|
}
|
|
4548
|
-
}
|
|
4549
4728
|
return st;
|
|
4550
4729
|
};
|
|
4551
4730
|
const setCull = (studs, under) => {
|
|
@@ -4565,7 +4744,14 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4565
4744
|
only = mask;
|
|
4566
4745
|
return applySteps();
|
|
4567
4746
|
};
|
|
4568
|
-
const
|
|
4747
|
+
const setStudMask = (mask) => {
|
|
4748
|
+
if (!steps)
|
|
4749
|
+
return false;
|
|
4750
|
+
studMask = mask;
|
|
4751
|
+
applySteps(true);
|
|
4752
|
+
return true;
|
|
4753
|
+
};
|
|
4754
|
+
const box = new THREE2.Box3;
|
|
4569
4755
|
for (const it of insts) {
|
|
4570
4756
|
if (!H.parts[it.part])
|
|
4571
4757
|
continue;
|
|
@@ -4587,11 +4773,11 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4587
4773
|
for (const m of new Set([matF, matB, matD, ...matCache.values(), ...texMats.values()])) {
|
|
4588
4774
|
const role = m.userData?.ldrSideRole;
|
|
4589
4775
|
if (role === "D") {
|
|
4590
|
-
m.side =
|
|
4776
|
+
m.side = THREE2.DoubleSide;
|
|
4591
4777
|
} else if (role === "B") {
|
|
4592
|
-
m.side = front ?
|
|
4778
|
+
m.side = front ? THREE2.BackSide : THREE2.DoubleSide;
|
|
4593
4779
|
} else {
|
|
4594
|
-
m.side = front ?
|
|
4780
|
+
m.side = front ? THREE2.FrontSide : THREE2.DoubleSide;
|
|
4595
4781
|
}
|
|
4596
4782
|
m.needsUpdate = true;
|
|
4597
4783
|
}
|
|
@@ -4623,7 +4809,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
4623
4809
|
o.matrixAutoUpdate = false;
|
|
4624
4810
|
o.matrixWorldNeedsUpdate = true;
|
|
4625
4811
|
}
|
|
4626
|
-
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, box, texturesReady, trimmed };
|
|
4812
|
+
return { root, stats, setCull, setSide, setEdges, setCond, setLod, setStep, setStudMask, box, texturesReady, trimmed };
|
|
4627
4813
|
}
|
|
4628
4814
|
function buildLdrScene(insts, pack, P, color, mark) {
|
|
4629
4815
|
const g = buildLdrSceneGen(insts, pack, P, color, mark);
|
|
@@ -4701,18 +4887,18 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
4701
4887
|
await new Promise((r) => setTimeout(r, 0));
|
|
4702
4888
|
}
|
|
4703
4889
|
}
|
|
4704
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4705
|
-
import * as
|
|
4706
|
-
var _box = new
|
|
4707
|
-
var _m4 = new
|
|
4890
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/scene.ts
|
|
4891
|
+
import * as THREE3 from "three";
|
|
4892
|
+
var _box = new THREE3.Box3;
|
|
4893
|
+
var _m4 = new THREE3.Matrix4;
|
|
4708
4894
|
function ghostMaterial(side, g) {
|
|
4709
|
-
const m = new
|
|
4710
|
-
m.blending =
|
|
4711
|
-
m.blendSrc =
|
|
4712
|
-
m.blendDst =
|
|
4713
|
-
m.blendSrcAlpha =
|
|
4714
|
-
m.blendDstAlpha =
|
|
4715
|
-
const tint = new
|
|
4895
|
+
const m = new THREE3.MeshStandardMaterial({ color: 16777215, roughness: 0.85, metalness: 0, side, transparent: false, depthWrite: true, opacity: g.opacity, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1 });
|
|
4896
|
+
m.blending = THREE3.CustomBlending;
|
|
4897
|
+
m.blendSrc = THREE3.SrcAlphaFactor;
|
|
4898
|
+
m.blendDst = THREE3.OneMinusSrcAlphaFactor;
|
|
4899
|
+
m.blendSrcAlpha = THREE3.OneFactor;
|
|
4900
|
+
m.blendDstAlpha = THREE3.OneMinusSrcAlphaFactor;
|
|
4901
|
+
const tint = new THREE3.Color(g.color);
|
|
4716
4902
|
const u = { ldrGhostTint: { value: tint }, ldrGhostMix: { value: g.whiten } };
|
|
4717
4903
|
m.onBeforeCompile = (sh) => {
|
|
4718
4904
|
Object.assign(sh.uniforms, u);
|
|
@@ -4726,13 +4912,13 @@ function ghostMaterial(side, g) {
|
|
|
4726
4912
|
}
|
|
4727
4913
|
function colorFn(src, pack, fallback) {
|
|
4728
4914
|
const table = new Map;
|
|
4729
|
-
const put = (k, v) => table.set(String(k), new
|
|
4915
|
+
const put = (k, v) => table.set(String(k), new THREE3.Color(typeof v === "string" ? v : v.hex));
|
|
4730
4916
|
if (typeof src === "function") {
|
|
4731
4917
|
return (c) => {
|
|
4732
4918
|
let col = table.get(c);
|
|
4733
4919
|
if (!col) {
|
|
4734
4920
|
const v = src(+c);
|
|
4735
|
-
col = v === undefined ? direct(c) ?? fallback : new
|
|
4921
|
+
col = v === undefined ? direct(c) ?? fallback : new THREE3.Color(v);
|
|
4736
4922
|
table.set(c, col);
|
|
4737
4923
|
}
|
|
4738
4924
|
return col;
|
|
@@ -4750,14 +4936,14 @@ function colorFn(src, pack, fallback) {
|
|
|
4750
4936
|
var direct = (c) => {
|
|
4751
4937
|
const n = +c;
|
|
4752
4938
|
if (n > 16777215 && n >>> 24 === 2)
|
|
4753
|
-
return new
|
|
4939
|
+
return new THREE3.Color(n & 16777215);
|
|
4754
4940
|
const b = blendedColourHex(n);
|
|
4755
|
-
return b ? new
|
|
4941
|
+
return b ? new THREE3.Color(b) : null;
|
|
4756
4942
|
};
|
|
4757
4943
|
function withLocalColours(base, local) {
|
|
4758
4944
|
if (!local.size)
|
|
4759
4945
|
return base;
|
|
4760
|
-
const own = new Map([...local].map(([k, v]) => [k, new
|
|
4946
|
+
const own = new Map([...local].map(([k, v]) => [k, new THREE3.Color(v.hex)]));
|
|
4761
4947
|
return (c) => own.get(c) ?? base(c);
|
|
4762
4948
|
}
|
|
4763
4949
|
var plasticCache = new WeakMap;
|
|
@@ -4769,7 +4955,7 @@ function toPlastic(old) {
|
|
|
4769
4955
|
return old;
|
|
4770
4956
|
let m = plasticCache.get(old);
|
|
4771
4957
|
if (!m) {
|
|
4772
|
-
const p = new
|
|
4958
|
+
const p = new THREE3.MeshPhysicalMaterial({
|
|
4773
4959
|
vertexColors: true,
|
|
4774
4960
|
roughness: 0.3,
|
|
4775
4961
|
clearcoat: 0.3,
|
|
@@ -4780,8 +4966,11 @@ function toPlastic(old) {
|
|
|
4780
4966
|
opacity: old.opacity,
|
|
4781
4967
|
depthWrite: old.depthWrite,
|
|
4782
4968
|
metalness: old.metalness,
|
|
4783
|
-
emissive: old.emissive?.clone?.() ?? new
|
|
4784
|
-
emissiveIntensity: old.emissiveIntensity ?? 0
|
|
4969
|
+
emissive: old.emissive?.clone?.() ?? new THREE3.Color(0),
|
|
4970
|
+
emissiveIntensity: old.emissiveIntensity ?? 0,
|
|
4971
|
+
polygonOffset: old.polygonOffset,
|
|
4972
|
+
polygonOffsetFactor: old.polygonOffsetFactor,
|
|
4973
|
+
polygonOffsetUnits: old.polygonOffsetUnits
|
|
4785
4974
|
});
|
|
4786
4975
|
p.onBeforeCompile = old.onBeforeCompile;
|
|
4787
4976
|
p.customProgramCacheKey = () => "Phys" + old.customProgramCacheKey() + old.side;
|
|
@@ -4801,7 +4990,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4801
4990
|
const useTex = o.textures !== false;
|
|
4802
4991
|
const { all, stepOf, nSteps, localColours } = sceneInstances(instances, pack.header, useTex);
|
|
4803
4992
|
const uniq = { length: nSteps };
|
|
4804
|
-
const color = withLocalColours(colorFn(o.colors, pack, new
|
|
4993
|
+
const color = withLocalColours(colorFn(o.colors, pack, new THREE3.Color(o.fallbackColor ?? 10528169)), localColours);
|
|
4805
4994
|
const stepViews = new Array(uniq.length).fill(null);
|
|
4806
4995
|
instances.forEach((i, k) => {
|
|
4807
4996
|
if (i.view)
|
|
@@ -4818,7 +5007,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4818
5007
|
miss.add(p);
|
|
4819
5008
|
}
|
|
4820
5009
|
const missing = [...miss];
|
|
4821
|
-
const object = new
|
|
5010
|
+
const object = new THREE3.Group;
|
|
4822
5011
|
object.name = "ldr";
|
|
4823
5012
|
if (!o.ldrawSpace)
|
|
4824
5013
|
object.rotation.x = Math.PI;
|
|
@@ -4837,7 +5026,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4837
5026
|
x.geometry?.dispose?.();
|
|
4838
5027
|
if (x.material)
|
|
4839
5028
|
mats.add(x.material);
|
|
4840
|
-
if (x.dispose && x.isInstancedMesh)
|
|
5029
|
+
if (x.dispose && (x.isInstancedMesh || x.isBatchedMesh))
|
|
4841
5030
|
x.dispose();
|
|
4842
5031
|
});
|
|
4843
5032
|
for (const m of [...mats, ...pairs.values()]) {
|
|
@@ -4848,16 +5037,17 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4848
5037
|
cur = null;
|
|
4849
5038
|
};
|
|
4850
5039
|
let ghostOn = false, ghost = null, ghostBuild = null, ghostGen = 0;
|
|
4851
|
-
let
|
|
5040
|
+
let studMaskShown = null;
|
|
5041
|
+
let shownStep = null, shownMask = null, shownGhost = null;
|
|
4852
5042
|
const ghostOpts = { opacity: 0.2, color: 16777215, whiten: 0.75 };
|
|
4853
5043
|
const ghostMats = new Map;
|
|
4854
5044
|
const syncGhost = () => {
|
|
4855
5045
|
if (!ghost)
|
|
4856
5046
|
return;
|
|
4857
|
-
const show = ghostOn && shownStep != null &&
|
|
5047
|
+
const show = ghostOn && shownStep != null && shownGhost != null && shownGhost < uniq.length - 1;
|
|
4858
5048
|
ghost.root.visible = show;
|
|
4859
5049
|
if (show)
|
|
4860
|
-
ghost.setStep(uniq.length - 2 -
|
|
5050
|
+
ghost.setStep(uniq.length - 2 - shownGhost, shownMask);
|
|
4861
5051
|
};
|
|
4862
5052
|
const disposeGhost = () => {
|
|
4863
5053
|
ghostGen++;
|
|
@@ -4882,7 +5072,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4882
5072
|
const rev = new Int32Array(stepOf.length);
|
|
4883
5073
|
for (let k = 0;k < rev.length; k++)
|
|
4884
5074
|
rev[k] = n - 1 - stepOf[k];
|
|
4885
|
-
const so = { ...sceneOpts(), edges: false, cond: false, tex: false, steps: rev, cull: undefined };
|
|
5075
|
+
const so = { ...sceneOpts(), studDecal: undefined, edges: false, cond: false, tex: false, steps: rev, cull: undefined };
|
|
4886
5076
|
so.cull = cullCore(all, pack.header, rev);
|
|
4887
5077
|
const g = await buildLdrSceneAsync(all, pack, so, color, () => {}, { postPaintSliceMs: 12 });
|
|
4888
5078
|
if (my !== ghostGen) {
|
|
@@ -4898,9 +5088,9 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4898
5088
|
return;
|
|
4899
5089
|
if (x.material)
|
|
4900
5090
|
old.add(x.material);
|
|
4901
|
-
let m = ghostMats.get(x.material?.side ??
|
|
5091
|
+
let m = ghostMats.get(x.material?.side ?? THREE3.FrontSide);
|
|
4902
5092
|
if (!m)
|
|
4903
|
-
ghostMats.set(x.material?.side ??
|
|
5093
|
+
ghostMats.set(x.material?.side ?? THREE3.FrontSide, m = ghostMaterial(x.material?.side ?? THREE3.FrontSide, ghostOpts));
|
|
4904
5094
|
x.material = m;
|
|
4905
5095
|
x.castShadow = x.receiveShadow = false;
|
|
4906
5096
|
x.renderOrder = 1;
|
|
@@ -4938,7 +5128,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4938
5128
|
}
|
|
4939
5129
|
return so;
|
|
4940
5130
|
};
|
|
4941
|
-
const sceneOpts = () => ({ localColours: localColours.size ? localColours : undefined, cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodEdgeCap: o.lodEdgeCap, lodUnder: o.lodUnder, steps: stepMode ? stepOf : undefined, cull: stepMode ? stepCull : flatCull });
|
|
5131
|
+
const sceneOpts = () => ({ localColours: localColours.size ? localColours : undefined, cullStuds: cs, cullUnder: cu, studGrid: o.studGrid, studDecal: o.studDecal, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodEdgeCap: o.lodEdgeCap, lodUnder: o.lodUnder, steps: stepMode ? stepOf : undefined, cull: stepMode ? stepCull : flatCull });
|
|
4942
5132
|
const applyBuilt = (built, t0) => {
|
|
4943
5133
|
cur = built;
|
|
4944
5134
|
pairs.clear();
|
|
@@ -4961,15 +5151,18 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4961
5151
|
cur.setLod(false);
|
|
4962
5152
|
if (cur.root.parent !== object)
|
|
4963
5153
|
object.add(cur.root);
|
|
5154
|
+
if (studMaskShown && stepMode)
|
|
5155
|
+
cur.setStudMask(studMaskShown);
|
|
4964
5156
|
Object.assign(stats, { drawn: drawnAt(null), studsTotal: cur.stats.studsTotal, studsHidden: cur.stats.studsHidden, undersTotal: cur.stats.undersTotal, undersHidden: cur.stats.undersHidden, condBatches: cur.stats.condBatches ?? 0, texBatches: cur.stats.texBatches ?? 0, textures: cur.stats.textures ?? 0, glossmaps: cur.stats.glossmaps ?? 0, clusters: cur.stats.clusters ?? 0, longestSliceMs: cur.stats.longestSliceMs, buildYields: cur.stats.buildYields, buildMs: performance.now() - t0 });
|
|
4965
5157
|
api.texturesReady = cur.texturesReady;
|
|
4966
5158
|
};
|
|
4967
|
-
const setStep = (step, mask = null) => {
|
|
5159
|
+
const setStep = (step, mask = null, ghostAfter) => {
|
|
4968
5160
|
if (!multiStep)
|
|
4969
5161
|
return;
|
|
4970
5162
|
const t0 = performance.now();
|
|
4971
5163
|
shownStep = step;
|
|
4972
5164
|
shownMask = mask;
|
|
5165
|
+
shownGhost = step == null ? null : Math.max(step, ghostAfter ?? step);
|
|
4973
5166
|
if (!stepMode) {
|
|
4974
5167
|
if (!mask && (step == null || step >= uniq.length - 1)) {
|
|
4975
5168
|
Object.assign(stats, { drawn: drawnAt(null), buildMs: performance.now() - t0 });
|
|
@@ -4995,6 +5188,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4995
5188
|
stepCount: uniq.length,
|
|
4996
5189
|
stepViews,
|
|
4997
5190
|
setStep,
|
|
5191
|
+
setStudMask: (m) => {
|
|
5192
|
+
studMaskShown = m;
|
|
5193
|
+
return stepMode ? cur.setStudMask(m) : false;
|
|
5194
|
+
},
|
|
4998
5195
|
setEdges: (v) => {
|
|
4999
5196
|
edges = v;
|
|
5000
5197
|
cur.setEdges(v);
|
|
@@ -5046,7 +5243,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
5046
5243
|
p.needsUpdate = true;
|
|
5047
5244
|
}
|
|
5048
5245
|
},
|
|
5049
|
-
getBox: (target = new
|
|
5246
|
+
getBox: (target = new THREE3.Box3) => {
|
|
5050
5247
|
object.updateMatrixWorld(true);
|
|
5051
5248
|
target.makeEmpty();
|
|
5052
5249
|
object.traverse((x) => {
|
|
@@ -5094,10 +5291,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
5094
5291
|
return finish();
|
|
5095
5292
|
})();
|
|
5096
5293
|
}
|
|
5097
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5294
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/parts-cdn.ts
|
|
5098
5295
|
import { decompress as decompress2 } from "fzstd";
|
|
5099
5296
|
|
|
5100
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5297
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/embedded.ts
|
|
5101
5298
|
function splitFiles(text, fallback) {
|
|
5102
5299
|
const files = new Map;
|
|
5103
5300
|
let cur = null, saw = false, skip = false;
|
|
@@ -5175,8 +5372,8 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
5175
5372
|
return out;
|
|
5176
5373
|
}
|
|
5177
5374
|
|
|
5178
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5179
|
-
var DEFAULT_PARTS_CDN = "https://ldr-
|
|
5375
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/parts-cdn.ts
|
|
5376
|
+
var DEFAULT_PARTS_CDN = "https://ldr-parts-cdn.baconbrix.workers.dev/v1/";
|
|
5180
5377
|
var indexCache = new Map;
|
|
5181
5378
|
var shardCache = new Map;
|
|
5182
5379
|
function loadPartsIndex(cdn = DEFAULT_PARTS_CDN, f = fetch) {
|
|
@@ -5436,10 +5633,10 @@ async function prepareModel(source, o = {}) {
|
|
|
5436
5633
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
5437
5634
|
}
|
|
5438
5635
|
|
|
5439
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5440
|
-
var load_worker_gen_default = 'var sn=ArrayBuffer,H=Uint8Array,$e=Uint16Array,on=Int16Array;var je=Int32Array,Ye=function(e,t,n){if(H.prototype.slice)return H.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 H(n-t);return r.set(e.subarray(t,n)),r},Be=function(e,t,n,r){if(H.prototype.fill)return H.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},an=function(e,t,n,r){if(H.prototype.copyWithin)return H.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 ln=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||ln[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},yt=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},cn=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},un=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,c=r>>6;if(r&8)Z(0);var a=6-s,u=i==3?4:i,l=yt(e,a,u);a+=u;var f=c?1<<c:s,h=yt(e,a,f)+(c==1&&256),g=h;if(!s){var p=1<<10+(e[5]>>3);g=p+(p>>3)*(e[5]&7)}if(g>2145386496)Z(1);var m=new H((t==1?h||g:t?0:g)+12);return m[0]=1,m[4]=4,m[8]=8,{b:a+f,y:0,l:0,d:l,w:t&&t!=1?t:m.subarray(12),e:g,o:new je(m.buffer,0,3),u:h,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return cn(e,4)+8;Z(0)},Se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},De=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,a=-1,u=-1,l=o,f=new sn(512+(o<<2)),h=new on(f,0,256),g=new $e(f,0,256),p=new $e(f,512,o),m=512+(o<<1),A=new H(f,m,o),b=new H(f,m+o);while(c<255&&i>0){var d=Se(i+1),x=r>>3,w=(1<<d+1)-1,v=(e[x]|e[x+1]<<8|e[x+2]<<16)>>(r&7)&w,M=(1<<d)-1,U=w-i-1,S=v&M;if(S<U)r+=d,v=S;else if(r+=d+1,v>M)v-=U;if(h[++c]=--v,v==-1)i+=v,A[--l]=c;else i-=v;if(!v)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,c+=a}while(a==3)}if(c>255||i)Z(0);var y=0,R=(o>>1)+(o>>3)+3,C=o-1;for(var F=0;F<=c;++F){var B=h[F];if(B<1){g[F]=-B;continue}for(u=0;u<B;++u){A[y]=F;do y=y+R&C;while(y>=l)}}if(y)Z(0);for(u=0;u<o;++u){var L=g[A[u]]++,V=b[u]=s-Se(L);p[u]=(L<<V)-o}return[r+7>>3,{b:s,s:A,n:b,t:p}]},fn=function(e,t){var n=0,r=-1,s=new H(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),a=new $e(s.buffer,268);if(o<128){var u=De(e,t+1,6),l=u[0],f=u[1];t+=o;var h=l<<3,g=e[t];if(!g)Z(0);var p=0,m=0,A=f.b,b=A,d=(++t<<3)-8+Se(g);for(;;){if(d-=A,d<h)break;var x=d>>3;if(p+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<A)-1,i[++r]=f.s[p],d-=b,d<h)break;x=d>>3,m+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=f.s[m],A=f.n[p],p=f.t[p],b=f.n[m],m=f.t[m]}if(++r>255)Z(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var v=0;for(n=0;n<r;++n){var M=i[n];if(M>11)Z(0);v+=M&&1<<M-1}var U=Se(v)+1,S=1<<U,D=S-v;if(D&D-1)Z(0);i[r++]=Se(D)+1;for(n=0;n<r;++n){var M=i[n];++c[i[n]=M&&U+1-M]}var y=new H(S<<1),R=y.subarray(0,S),C=y.subarray(S);a[U]=0;for(n=U;n>0;--n){var F=a[n];Be(C,n,F,a[n-1]=F+c[n]*(1<<U-n))}if(a[0]!=S)Z(0);for(n=0;n<r;++n){var B=i[n];if(B){var L=a[B];Be(R,n,L,a[B]=L+(1<<U-B))}}return[t,{n:C,b:U,s:R}]},pn=De(new H([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],mn=De(new H([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],hn=De(new H([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],xt=function(e,t){var n=e.length,r=new je(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Je=new H(new je([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),gn=xt(Je,0),Qe=new H(new je([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),dn=xt(Qe,3),Re=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var a=0,u=n.b,l=(r<<3)-8+Se(o)-u,f=-1;for(;l>c&&f<s;){var h=l>>3,g=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(l&7);a=(a<<u|g)&i,t[++f]=n.s[a],l-=u=n.n[a]}if(l!=c||f+1!=s)Z(0)},bn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;Re(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),Re(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),Re(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),Re(e.subarray(r),t.subarray(c),n)},yn=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Be(n,e[s],t.y,t.y+=c),n;return Be(new H(c),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=c,n;return Ye(e,s,a)}if(i==2){var u=e[s],l=u&3,f=u>>2&3,h=u>>4,g=0,p=0;if(l<2)if(f&1)h|=e[++s]<<4|(f&2&&e[++s]<<12);else h=u>>3;else if(p=f,f<2)h|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(f==2)h|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var m=n?n.subarray(t.y,t.y+t.m):new H(t.m),A=m.length-h;if(l==0)m.set(e.subarray(s,s+=h),A);else if(l==1)Be(m,e[s++],A);else{var b=t.h;if(l==2){var d=fn(e,s);g+=s-(s=d[0]),t.h=b=d[1]}else if(!b)Z(0);(p?bn:Re)(e.subarray(s,s+=g),m.subarray(A),b)}var x=e[s++];if(x){if(x==255)x=(e[s++]|e[s++]<<8)+32512;else if(x>127)x=x-128<<8|e[s++];var w=e[s++];if(w&3)Z(0);var v=[mn,hn,pn];for(var M=2;M>-1;--M){var U=w>>(M<<1)+2&3;if(U==1){var S=new H([0,0,e[s++]]);v[M]={s:S.subarray(2,3),n:S.subarray(0,1),t:new $e(S.buffer,0,1),b:0}}else if(U==2)r=De(e,s,9-(M&1)),s=r[0],v[M]=r[1];else if(U==3){if(!t.t)Z(0);v[M]=t.t[M]}}var D=t.t=v,y=D[0],R=D[1],C=D[2],F=e[a-1];if(!F)Z(0);var B=(a<<3)-8+Se(F)-C.b,L=B>>3,V=0,me=(e[L]|e[L+1]<<8)>>(B&7)&(1<<C.b)-1;L=(B-=R.b)>>3;var be=(e[L]|e[L+1]<<8)>>(B&7)&(1<<R.b)-1;L=(B-=y.b)>>3;var ye=(e[L]|e[L+1]<<8)>>(B&7)&(1<<y.b)-1;for(++x;--x;){var ue=C.s[me],Pe=C.n[me],xe=y.s[ye],Ce=y.n[ye],ke=R.s[be],he=R.n[be];L=(B-=ke)>>3;var O=1<<ke,k=O+((e[L]|e[L+1]<<8|e[L+2]<<16|e[L+3]<<24)>>>(B&7)&O-1);L=(B-=Qe[xe])>>3;var J=dn[xe]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Qe[xe])-1);L=(B-=Je[ue])>>3;var _=gn[ue]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Je[ue])-1);if(L=(B-=Pe)>>3,me=C.t[me]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Pe)-1),L=(B-=Ce)>>3,ye=y.t[ye]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Ce)-1),L=(B-=he)>>3,be=R.t[be]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<he)-1),k>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=k-=3;else{var W=k-(_!=0);if(W){if(k=W==3?t.o[0]-1:t.o[W],W>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=k}else k=t.o[0]}for(var M=0;M<_;++M)m[V+M]=m[A+M];V+=_,A+=_;var ne=V-k;if(ne<0){var q=-ne,le=t.e+ne;if(q>J)q=J;for(var M=0;M<q;++M)m[V+M]=t.w[le+M];V+=q,J-=q,ne=0}for(var M=0;M<J;++M)m[V+M]=m[ne+M];V+=J}if(V!=A)while(A<m.length)m[V++]=m[A++];else V=m.length;if(n)t.y+=V;else m=Ye(m,0,V)}else if(n){if(t.y+=h,A)for(var M=0;M<h;++M)m[M]=m[A+M]}else if(A)m=Ye(m,A);return t.b=a,m}Z(2)},xn=function(e,t){if(e.length==1)return e[0];var n=new H(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 Ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=un(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 c=yn(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,an(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return xn(n,o)}async function wn(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(Ve(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 wt(e){return new TextDecoder().decode(await wn(e))}var At=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function _e(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),et=/^[A-Za-z][A-Za-z0-9_]*$/,qe=new Map;function tt(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(!qe.has(r))qe.set(r,t);return r}function nt(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&et.test(e))return tt(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Mt=/^~?\\s*moved\\s+to\\s+(.+)$/i,An=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Mn=new Set(["FILE","NOFILE","!DATA"]),Pt=1000000000000000,It=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),vn=new Set(["model","submodel","configuration"]),Cn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function vt(e){let t=Cn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return It.has(n)||vn.has(n)?n:void 0}function kn(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 Tn(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((f)=>Number.isFinite(f)&&Math.abs(f)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let f=0;f<s;f++)c=c.replace(/^\\S+\\s*/,"");let a=kn(c);if(!a.length)return null;let u={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)u.a=i[9];if(s===11)u.b=i[10];let l=a.findIndex((f,h)=>h>0&&f.toUpperCase()==="GLOSSMAP");if(l>0&&a[l+1])u.glossmap=a[l+1];if(t)u.next=!0;return u}var Ln=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let 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 Sn(e,t){let n=e.length,r=1,s=(p)=>p===32||p===9,o=()=>{while(r<n&&s(e.charCodeAt(r)))r++;let p=r,m=e.charCodeAt(r),A=m===45;if(A)m=e.charCodeAt(++r);let b=0,d=0;while(m>=48&&m<=57)b=b*10+(m-48),d++,m=e.charCodeAt(++r);if(d>0&&d<=15&&(r>=n||s(m)))return A?-b:b;while(r<n&&!s(e.charCodeAt(r)))r++;return p<r?+e.slice(p,r):NaN};while(r<n&&s(e.charCodeAt(r)))r++;let i=r;if(r>=n)return null;let c=e.charCodeAt(r),a=c===45,u=0,l=0;if(a)c=e.charCodeAt(++r);while(c>=48&&c<=57)u=u*10+(c-48),l++,c=e.charCodeAt(++r);if(l>0&&l<=15&&(r>=n||s(c))){if(a)u=-u}else{while(r<n&&!s(e.charCodeAt(r)))r++;u=nt(e.slice(i,r))}let f=Array(12);for(let p=0;p<12;p++){let m=o();if(!Number.isFinite(m))return null;f[p]=m}while(r<n&&s(e.charCodeAt(r)))r++;if(r>=n)return null;let h=e.slice(r),g=t.get(h);if(g===void 0)g=Y(/[ \\t]{2,}|\\t/.test(h)?h.split(/\\s+/).join(" "):h),t.set(h,g);if(!Number.isFinite(u))return null;return{t:1,color:u,m:f,file:g}}var En=[0,12,6,9,12,12];function Ct(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=nt(e[1]),r=En[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Ft(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,a=null,u=[],l=null,f=()=>{if(!a)return;let x=Ln(a.chunks.join("")),w=x[0]===137&&x[1]===80&&x[2]===78&&x[3]===71;(c??=new Map).set(Y(a.name),{name:a.name,bytes:x,...w?{mime:"image/png"}:{}}),a=null},h=new Map,g=!0,p=(x)=>{if(f(),o={name:Y(x),cmds:[]},s.set(o.name,o),!i)i=o.name;u=[],l=null,g=!0},m=!1,A=!1,b=()=>{if(A)return;A=!0,s.clear(),o=null,i=""},d=(x,w)=>{if(l){x.tex=l,l=null;return}let v=u[u.length-1];if(!v)return;if(v.fallback){if(!w)x.fallback=!0}else x.tex=v.map};for(let x of e.split(`\n`)){let w=x.trim();if(!w)continue;if(r&&w.charCodeAt(0)>=50&&w.charCodeAt(0)<=53&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){if(a||m)continue;if(!o)p(t);let S=w.slice(2).trimStart(),D=S.search(/\\s/),y={t:w.charCodeAt(0)-48,color:nt(D<0?S:S.slice(0,D)),p:[],src:w};d(y,!1),o.cmds.push(y),g=!1;continue}if(w.charCodeAt(0)===48&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){let S=2;while(w.charCodeAt(S)===32||w.charCodeAt(S)===9)S++;let D=S;while(D<w.length&&w.charCodeAt(D)!==32&&w.charCodeAt(D)!==9)D++;let y=w.slice(S,D),R=/[^\\x21-\\x7e]/.test(y)?w.slice(S).trim().split(/\\s+/)[0]:y;if(!An.has(R)&&!(R.length>=4&&R.length<=6&&Mn.has(R.toUpperCase()))){if(m||a)continue;if(!o)p(t);let C=w.slice(S),F={t:0,text:C};if(y.charCodeAt(0)===33)F.meta=y;if(l=null,g&&!o.org){let L=vt(C);if(L)o.org=L}let B=C.match(Mt);if(B&&!o.movedTo){let L=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(L))L+=".dat";o.movedTo=Y(L)}o.cmds.push(F);continue}}if(w.charCodeAt(0)===49&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)&&!a&&!m){let S=Sn(w,h);if(S){if(!o)p(t);d(S,!1),o.cmds.push(S),g=!1;continue}}let v=w.split(/\\s+/);if(+v[0]===0){let S=w.slice(1).trim(),D=v.length>1&&v[1].length>=4&&v[1].length<=6?v[1].toUpperCase():v[1];if(D==="FILE"){let C=S.slice(5).trimStart().split("\\r")[0].trim();if(C){b(),m=!1,p(C);continue}}if(D==="NOFILE"){f(),o=null,m=!0;continue}if(D==="!DATA"){b(),f(),o=null,m=!1,a={name:S.slice(5).trim(),chunks:[]};continue}if(m)continue;if(a){if(v[1]==="!:")a.chunks.push(v.slice(2).join(""));continue}if(!o)p(t);let y={t:0,text:S};if(v[1]==="STEP")y.step=!0,u=[],l=null;else if(v[1]==="BFC")y.bfc=v.slice(2).join(" ");else if(v[1]==="ROTSTEP")if(y.meta="ROTSTEP",y.step=!0,u=[],l=null,(v[2]??"").toUpperCase()==="END")y.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(v[5]??"REL").toUpperCase(),F=(B)=>{let L=Number(B);return Number.isFinite(L)?L:0};y.rotstep={x:F(v[2]),y:F(v[3]),z:F(v[4]),mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(v[1]==="BUFEXCHG"){y.meta="BUFEXCHG";let C=(v[2]??"").toUpperCase();y.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:v[3]??"A"}}else if(v[1]?.startsWith("!"))y.meta=v[1];if(g&&!o.org){let C=vt(S);if(C)o.org=C}if(v[1]==="!TEXMAP"){let C=(v[2]??"").toUpperCase();if(l=null,C==="START"||C==="NEXT"){let F=Tn(S.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(y.texmap={op:C,...F?{map:F}:{}},F)if((o.texmaps??=[]).push(F),C==="START")u.push({map:F,fallback:!1});else l=F}else if(C==="FALLBACK"){y.texmap={op:C};let F=u[u.length-1];if(F)F.fallback=!0}else if(C==="END")y.texmap={op:C},u.pop()}else if(v[1]==="!:"){l=null;let C=Ct(v.slice(2));if(C)d(C,!0),y.geom=C}else l=null;let R=S.match(Mt);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(y);continue}if(a||m)continue;if(!o)p(t);let U=Ct(v);if(!U){if(/^[2-5][ \\t]/.test(w))g=!1;continue}d(U,!1),o.cmds.push(U),g=!1}return f(),c?{main:i,files:s,data:c}:{main:i,files:s}}var sr=Math.PI/180;function Rt(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 Bt(e,t){let[n,r,s,o,i,c,a,u,l,f,h,g]=e,[p,m,A,b,d,x,w,v,M,U,S,D]=t;return[o*p+i*m+c*A+n,a*p+u*m+l*A+r,f*p+h*m+g*A+s,o*b+i*w+c*U,o*d+i*v+c*S,o*x+i*M+c*D,a*b+u*w+l*U,a*d+u*v+l*S,a*x+u*M+l*D,f*b+h*w+g*U,f*d+h*v+g*S,f*x+h*M+g*D]}var rt=[0,0,0,1,0,0,0,1,0,0,0,1];var kt=new WeakMap,Pn=/^(s|8|48)\\//;function st(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=kt.get(n);if(r)return r;if(n.org)r=It.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&&Pn.test(s.file))?"part":"model";return kt.set(n,r),r}var Tt=new WeakMap;function Dt(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 Lt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?qe.get(e)??String(e):String(e),In=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Lt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Lt(e.color)} ${e.p.join(" ")}`,ot=(e,t)=>`${Y(e)}#${t}`;function Fn(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||o.meta==="!COLOUR"){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:ot(e.name,t),cmds:n}}function Ut(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Fn(e,t).cmds.map(In)].join(`\n`)+`\n`}function it(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Nt(e){let[t,n,r,s,o,i,c,a,u,l,f,h]=e,g=a*h-u*f,p=-(c*h-u*l),m=c*f-a*l,A=s*g+o*p+i*m;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let b=1/A,d=[g*b,-(o*h-i*f)*b,(o*u-i*a)*b,p*b,(s*h-i*l)*b,-(s*u-i*c)*b,m*b,-(s*f-o*l)*b,(s*a-o*c)*b];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Rn=(e)=>String(+e.toFixed(6)||0),St=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Ot(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Rn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${St(t.texture)}${t.glossmap?" GLOSSMAP "+St(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${it(r)}`,source:r}}var Bn=(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 Dn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),a=Math.sin(n*r),u=Math.cos(n*r);return[c*u,-c*a,i,o*a+s*i*u,o*u-s*i*a,-s*c,s*a-o*i*u,s*u+o*i*a,o*c]}var Et=new WeakMap;function zt(e){let t=Et.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=Dn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Bn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Et.set(e,n),n}class at extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var Un=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=Pt))return!1;return!0},$t=999999,_t=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Gt=new WeakMap,jt=new WeakMap;function Nn(e,t){let n=jt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Gt.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},jt.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${it(o)}`,source:o},n.parts.set(e,r)}return r}function On(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,a=0,u=new Set,l=t.maxInstances??2000000,f=0,h=(p,m)=>{let A=p.name+"#"+m,b=c.get(A);if(!b){let d;b=Object.assign(()=>d??=Ut(p,m),{file:p,step:m}),c.set(A,b)}return b},g=(p,m,A,b,d,x,w,v,M=null,U=[],S=[],D=void 0,y=null)=>{let R=p.files.get(m);if(!R||w>r||u.has(R))return;if(++f>l)throw new at("model",l);u.add(R);let C=y,F=0,B=w>0?++a:0,L=i&&B?[...U,B]:U,V=i&&B?[...S,A]:S,me=i&&!M?new Map:null,be=-1,ye=0,ue=(O,k,J,_,W,ne,q)=>{if(be!==F)be=F,ye=0;let le=me?.get(F+"|"+k);if(le)return le.n++,g(O,O===p?k:O.main,J,_,d+"/"+k,[...W,$t],w+1,ne,[...W,$t],L,V,q,C);let T=[...W,ye++],P=n.length;g(O,O===p?k:O.main,J,_,d+"/"+k,T,w+1,ne,M,L,V,q,C),me?.set(F+"|"+k,{n:1,from:P,to:n.length})},Pe=zt(R),xe=s?Dt(R):[],Ce=0,ke=(O,k,J,_,W,ne,q,le,T)=>{if(M)_=M;if(++f>l)throw new at("model",l);let P={part:O,color:k,m:J,step:_[0],steps:_,localStep:W,path:d};if(le)P.colour=le;if(B){if(P.sub=B,i)P.subPath=L,P.subMats=V}if(ne)P.embedded=!0;if(q){let N=Ot(O,q);P.texPart=N.name,P.texSource=N.source}else if(T){let N=Nn(O,T);P.colPart=N.name,P.colSource=N.source}let E=Pe[W];if(E)P.view=E;return n.push(P),P},he=(O)=>{while(Ce<xe.length&&xe[Ce]<=O){let k=xe[Ce++];ke(ot(R.name,k),b,A,[...x,k],k,!1,null,D,y).source=h(R,k)}};for(let O of R.cmds){if(O.t===0&&O.step){F++;continue}let k=O;if(k.t>=2||k.t===0&&k.geom&&k.geom.t>=2){he(F);continue}if(k.t===0){if(k.meta==="!COLOUR"){let E=$n(k.text);if(E&&E.code!==16&&E.code!==24)Gt.set(E,k.text),(C=new Map(C??[])).set(E.code,E);continue}if(o&&k.geom?.t===1)k=k.geom;else continue}if(k.t!==1)continue;if(o&&k.fallback)continue;let J=Bt(A,k.m);if(!Un(J))continue;let _=k.color===16?b:k.color,W=k.color===16?D:C?.get(k.color),ne=[...x,F],q=o?k.tex??v:null,le=q?Nt(k.m):null,T=q&&le?Rt(q,le):null;if(p.files.has(k.file)){if(st(p,k.file)==="model"){ue(p,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!0,T,W,C);continue}let P=t.resolveModel?.(k.file);if(P){ue(P,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!1,T,W,C)}if(he(1/0),u.delete(R),me){for(let O of me.values())if(O.n>1)for(let k=O.from;k<O.to;k++)n[k].mult??=O.n}};if(st(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...rt],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,rt,16,e.main,[],0,null),n}function Ht(e,t="main.ldr",n){return On(Ft(e,t,{geometryText:!0}),n)}var zn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function lt(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 Vt(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=lt(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 $n(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",c=255,a=0,u={type:"default"},l=1;while(l<n.length){let f=n[l].toUpperCase(),h=n[l+1];if(f==="CODE")s=h!==void 0&&et.test(h)?tt(h):h!==void 0&&/^\\d+$/.test(h)?+h:NaN,l+=2;else if(f==="VALUE"){let g=lt(h);if(g)o=g;l+=2}else if(f==="EDGE")i=lt(h)??h,l+=2;else if(f==="ALPHA")c=+h,l+=2;else if(f==="LUMINANCE")a=+h,l+=2;else if(f==="CHROME")u={type:"chrome"},l+=1;else if(f==="PEARLESCENT")u={type:"pearlescent"},l+=1;else if(f==="RUBBER")u={type:"rubber"},l+=1;else if(f==="MATTE_METALLIC")u={type:"matte_metallic"},l+=1;else if(f==="METAL")u={type:"metal"},l+=1;else if(f==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:p,next:m}=Vt(n,l+2);u={type:"glitter",material:p},l=m}else if(g==="SPECKLE"){let{grain:p,next:m}=Vt(n,l+2);u={type:"speckle",material:p},l=m}else if(g==="FABRIC"){let p=(n[l+2]||"").toUpperCase(),m=["VELVET","CANVAS","STRING","FUR"].includes(p)?p.toLowerCase():void 0;u={type:"fabric",kind:m},l+=m?3:2}else l=n.length}else if(zn.has(f))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(a)?a:0,finish:u}}function jn(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,c=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:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=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:c,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 ct(e){let t=jn(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 Vn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let a=i.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var _n=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Gn(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 Wt(e,t,n="main.ldr"){let r=[...t],s=new Map;if(!r.length)return s;let o=Vn(e,n);for(let i of r){let c=Y(i);if(!o.has(c)||s.has(c))continue;let a=new Set([c]),u=[c];while(u.length)for(let f of o.get(u.pop())){let h=_n(f);if(h&&o.has(h)&&!a.has(h))a.add(h),u.push(h)}let l=[c,...[...a].filter((f)=>f!==c).sort()].map((f)=>"0 FILE "+(f===c?"":f)+`\n`+o.get(f).join(`\n`)).join(`\n`);s.set(c,`emb/${Gn(l)}.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,Kt=new WeakMap,ut=null,ft="",pt=null;function Hn(e,t){if(e===ut&&t===ft)return pt;let n=Kt.get(e);if(!n)Kt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return ut=e,ft=t,pt=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],a=[];s.studs.forEach((g,p)=>{c.push(g[0]),a.push(g[1]);for(let m=0;m<12;m++)i[p*12+m]=g[2+m]});let u=null,l=0,f=0;if(s.mask){l=s.mask[0],f=s.mask[1];let g=s.mask[2];u=new Uint8Array(g.length);for(let p=0;p<g.length;p++)u[p]=g.charCodeAt(p)===49?1:0}let h=!!u;if(u){for(let g=0;g<u.length;g++)if(u[g]!==1){h=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:a,mask:u,nx:l,nz:f,full:h}),ut=e,ft=t,pt=r,r}var Ie=1073741824;class Ee{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=Ee.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let a=s[c];if(a===0)return-1;if(a===r){let u=c<<2;if(o[u]===e&&o[u+1]===t&&o[u+2]===n)return o[u+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=Ee.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,a=this.slot(e,t,n);for(;;){let u=o[a],l=a<<2;if(u===0)return o[a]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(u===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let f=i[l+3];return i[l+3]=r,f}a=a+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Yt{grp=new Ee(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],a=[];for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=(h%20+20)%20,A=(p%20+20)%20,b=this.group(g,m,A);if(b<0)b=s.length,this.grp.put(g,m,A,b),this.lg=b,s.push(0),o.push(h),i.push(h),c.push(p),a.push(p);if(s[b]++,h<o[b])o[b]=h;else if(h>i[b])i[b]=h;if(p<c[b])c[b]=p;else if(p>a[b])a[b]=p}let u=0,l=0;for(let f=0;f<s.length;f++){let h=(i[f]-o[f])/20+1,g=(a[f]-c[f])/20+1,p=h*g;if(this.gX0.push(o[f]),this.gZ0.push(c[f]),this.gNx.push(h),this.gNz.push(g),p<=64*s[f]+1024&&u+p<2147483648)this.gBits.push(u),u+=p;else this.gBits.push(-1),l+=s[f]}this.bits=new Uint8Array(Math.ceil(u/8)),this.rest=new Ee(l);for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=this.group(g,(h%20+20)%20,(p%20+20)%20),A=this.gBits[m];if(A<0){this.rest.put(h,g,p,1);continue}let b=A+(h-this.gX0[m])/20*this.gNz[m]+(p-this.gZ0[m])/20;this.bits[b>>>3]|=1<<(b&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Wn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),Fe=(e,t,n)=>e>-Ie&&e<Ie&&t>-Ie&&t<Ie&&n>-Ie&&n<Ie,Ue=2147483647;function Xn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function mt(e,t,n){return Zt(e,t,n,-1)??Zt(e,t,n,Jt)}var Jt=0;function Zt(e,t,n,r){let o=new Map,i=(T)=>{let P=o.get(T);if(P===void 0)o.set(T,P=Xn(t,T));return P},c=e.length,a=0,u=0,l=0,f=Array(c);for(let T=0;T<c;T++){let P=f[T]=Hn(t,e[T].part);if(P){if(l+=P.nStuds,P.mask)a++}}let h=new Float64Array(a),g=new Float64Array(a),p=new Float64Array(a),m=new Float64Array(a),A=new Int32Array(a),b=new Int32Array(a),d=new Float64Array(a),x=new Float64Array(a),w=[],v=new Int32Array(a),M=new Float64Array(a*9),U=new Uint8Array(a);if(r<0)r=a*4+64;let S=new Ee(e.length*2),D=new Int32Array(r),y=new Int32Array(r),R=0,C=0;for(let T=0;T<e.length;T++){let P=e[T],E=P.m,N=t.parts[P.part];if(!N||!N.mask||!Xt(E)||i(P.color))continue;let I=N.bbox,z=1/0,j=-1/0,ee=1/0,X=-1/0;for(let K=0;K<2;K++)for(let ae=0;ae<2;ae++){let te=K?I[3]:I[0],Le=ae?I[5]:I[2],ve=E[0]+E[3]*te+E[5]*Le,de=E[2]+E[9]*te+E[11]*Le;if(ve<z)z=ve;if(ve>j)j=ve;if(de<ee)ee=de;if(de>X)X=de}let G=Math.round((E[1]+I[4])*2),Q=f[T],ce=Math.floor(z/40),we=Math.floor(j/40),Ae=Math.floor(ee/40),Me=Math.floor(X/40);if(!((we-ce+1)*(Me-Ae+1)<=65536)||!Fe(G,ce,Ae)||!Fe(G,we,Me))continue;let ge=Math.floor((z+5)/40),re=Math.floor((j-5)/40),se=Math.floor((ee+5)/40),oe=Math.floor((X-5)/40),Te=ge<=re&&se<=oe?(re-ge+1)*(oe-se+1):0;C+=Te;let fe=-1;for(let K=ge<=re&&se<=oe?S.get(G,ge,se):-1,ae=0;K>=0&&ae<8;K=D[K],ae++){let te=y[K];if(h[te]!==z||g[te]!==j||p[te]!==ee||m[te]!==X||w[te]!==Q)continue;let Le=e[A[te]].m,ve=!0;for(let de=0;de<12;de++)if(Le[de]!==E[de]){ve=!1;break}if(ve){fe=te;break}}if(fe>=0){let K=n?n[T]:0;if(n&&K<n[A[fe]])b[fe]=A[fe],A[fe]=T;else if(b[fe]<0||n&&K<n[b[fe]])b[fe]=T;continue}let ie=u++;h[ie]=z,g[ie]=j,p[ie]=ee,m[ie]=X,A[ie]=T,b[ie]=-1,w.push(Q),d[ie]=I[0],x[ie]=I[2],v[ie]=G;let pe=ie*9;if(M[pe]=E[0],M[pe+1]=E[1],M[pe+2]=E[2],M[pe+3]=E[3],M[pe+4]=E[6],M[pe+5]=E[9],M[pe+6]=E[5],M[pe+7]=E[8],M[pe+8]=E[11],U[ie]=Q.full&&I[3]-I[0]<=20*Q.nx&&I[5]-I[2]<=20*Q.nz&&E[4]===0&&E[6]===0&&E[8]===0&&E[10]===0&&Wn(E[3],E[5],E[9],E[11])?1:0,R+Te>r){R=r+1;continue}for(let K=ge;K<=re;K++)for(let ae=se;ae<=oe;ae++){if(!Fe(G,K,ae))continue;let te=R++;y[te]=ie,D[te]=S.put(G,K,ae,te)}}if(R>r)return Jt=C,null;let F=[0,5,-5,5,-5],B=[0,5,5,-5,-5],L=(T,P,E,N)=>{if(!(P-6>=h[T]-0.5&&P+6<=g[T]+0.5&&N-6>=p[T]-0.5&&N+6<=m[T]+0.5))return!1;if(U[T]===1)return!0;let I=T*9,z=w[T],j=d[T],ee=x[T],X=P-M[I],G=E-M[I+1],Q=N-M[I+2],ce=M[I+3]*X+M[I+4]*G+M[I+5]*Q,we=M[I+6]*X+M[I+7]*G+M[I+8]*Q,{nx:Ae,nz:Me,mask:ge}=z;for(let re=0;re<5;re++){let se=Math.floor((ce+F[re]-j)/20),oe=Math.floor((we+B[re]-ee)/20);if(se<0||oe<0||se>=Ae||oe>=Me||ge[se*Me+oe]!==1)return!1}return!0},V=NaN,me=NaN,be=NaN,ye=-1,ue=-1,Pe=(T,P,E,N)=>{let I=Math.round(P*2),z=Math.floor(T/40),j=Math.floor(E/40);if(!Fe(I,z,j))return Ue;let ee=Ue;if(!n&&ue>=0&&v[ue]===I&&(A[ue]!==N||b[ue]>=0)&&L(ue,T,P,E))return 0;if(I!==V||z!==me||j!==be)V=I,me=z,be=j,ye=S.get(I,z,j);for(let X=ye;X>=0;X=D[X]){let G=y[X],Q=A[G];if(Q===N&&(Q=b[G])<0)continue;if(!L(G,T,P,E))continue;if(!n)return ue=G,0;let ce=n[Q];if(ce<ee)ee=ce}return ee},xe=new Uint8Array(l),Ce=new Uint8Array(l),ke=0,he=n?new Ee(l,4):null,O=n?null:new Int32Array(l),k=n?null:new Int32Array(l),J=n?null:new Int32Array(l),_=0,W=n?new Int32Array(l).fill(Ue):void 0;for(let T=0,P=0;T<e.length;T++){let E=e[T],N=f[T];if(!N)continue;let I=E.m,z=N.studM,j=I[0],ee=I[1],X=I[2],G=I[3],Q=I[4],ce=I[5],we=I[6],Ae=I[7],Me=I[8],ge=I[9],re=I[10],se=I[11];for(let oe=0;oe<N.nStuds;oe++,P++){let Te=oe*12,fe=z[Te+4],ie=z[Te+7],pe=z[Te+10];if(!(Math.abs(we*fe+Ae*ie+Me*pe-1)<0.001&&Math.abs(G*fe+Q*ie+ce*pe)<0.001&&Math.abs(ge*fe+re*ie+se*pe)<0.001))continue;Ce[P]=1;let K=z[Te],ae=z[Te+1],te=z[Te+2],Le=j+G*K+Q*ae+ce*te,ve=ee+we*K+Ae*ae+Me*te,de=X+ge*K+re*ae+se*te,gt=Pe(Le,ve,de,T);if(gt!==Ue){if(xe[P]=1,ke++,W)W[P]=gt}let Ne=Math.round(Le),Oe=Math.round(ve),ze=Math.round(de);if(!Fe(Ne,Oe,ze))continue;if(!he){O[_]=Ne,k[_]=Oe,J[_++]=ze;continue}let dt=n[T],bt=he.get(Ne,Oe,ze);if(bt<0||dt<bt)he.put(Ne,Oe,ze,dt)}}let ne=he?null:new Yt(O,k,J,_),q=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(Ue):void 0;for(let T=0;T<e.length;T++){let P=e[T],E=t.parts[P.part];if(!E||!E.under||!Xt(P.m)||i(P.color))continue;let N=E.bbox,I=Math.round((N[3]-N[0])/20),z=Math.round((N[5]-N[2])/20);if(!I||!z||I*z>4096)continue;let j=P.m,ee=Math.round(j[1]+N[4]),X=!0,G=0;for(let Q=0;Q<I&&X;Q++)for(let ce=0;ce<z;ce++){let we=N[0]+10+20*Q,Ae=N[2]+10+20*ce,Me=j[0]+j[3]*we+j[5]*Ae,ge=j[2]+j[9]*we+j[11]*Ae,re=Math.round(Me),se=Math.round(ge),oe=!Fe(re,ee,se)?-1:he?he.get(re,ee,se):ne.has(re,ee,se)?1:-1;if(oe<0){X=!1;break}if(oe>G)G=oe}if(X){if(q[T]=1,le)le[T]=G}}return{nStuds:l,studHidden:xe,studUp:Ce,underHidden:q,studsHidden:ke,studHideStep:W,underHideStep:le}}function ht(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let f=l.colour;if(!f)return String(l.color);let h=o.get(f);if(h!==void 0)return h;let g=t.colorTable?.[l.color],p=g?.hex??t.colors?.[l.color],m=g?ct({alpha:g.alpha??255,luminance:g.luminance??0,finish:g.finish??{type:"default"}}):"default:op",A=ct(f);if(h=p&&p.toUpperCase()===f.hex.toUpperCase()&&m===A?String(l.color):f.hex.toUpperCase()+"/"+A,h!==String(l.color))s.set(h,f);return o.set(f,h),h},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),{stepOf:a,nSteps:u}=Kn(c);return{all:c,stepOf:a,nSteps:u,localColours:s}}function Kn(e){let t=!0;for(let o=0;o<e.length;o++){let i=e[o].steps;if(i.length!==1){t=!1;break}let c=i[0];if(!(Number.isInteger(c)&&c>=0&&c<1e6)){t=!1;break}}if(t){let o=new Set;for(let a=0;a<e.length;a++)o.add(e[a].steps[0]);let i=[...o].sort((a,u)=>a-u),c=new Map(i.map((a,u)=>[a,u]));return{stepOf:e.map((a)=>c.get(a.steps[0])),nSteps:i.length}}let n=e.map((o)=>_t(o.steps)),r=[...new Set(n)].sort(),s=new Map(r.map((o,i)=>[o,i]));return{stepOf:n.map((o)=>s.get(o)),nSteps:r.length}}function Qt(e,t,n=!0){let r=ht(e,t,n);return mt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ke="https://ldr-demo.vercel.app/cdn/v1/",He=new Map,Ge=new Map;function We(e=Ke,t=fetch){let n=He.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(()=>He.delete(e)),He.set(e,n);return n}var Zn=(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"),Xe=(e,t)=>Zn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Xe(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Xe(r,t)])):e;function Yn(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let g=h.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let p=new DataView(g).getUint32(0,!0),m=new Uint8Array(g,4+p),A=r;n.push(m),r+=m.byteLength;let b=(4-r%4)%4;if(b)n.push(new Uint8Array(b)),r+=b;for(let[d,x]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Xe(x,A);for(let[d,x]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Xe(x,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+c.length)%4)%4,u=4+c.length+a,l=new Uint8Array(u+r);new DataView(l.buffer).setUint32(0,c.length+a,!0),l.set(c,4),l.fill(32,4+c.length,u);let f=u;for(let h of n)l.set(h,f),f+=h.byteLength;return _e(l.buffer)}async function Jn(e,t={}){e=[...e];try{return await qt(e,t)}catch(n){let r=t.cdn??Ke,s=t.fetch??fetch;He.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await qt(e,{...t,fetch:o})}catch{throw n}}}async function qt(e,t){let n=t.cdn??Ke,r=t.fetch??fetch,s=t.gap??16384,o=await We(n,r),i=[...new Set([...new Set(e)].map(Y))],c=[],a=[];for(let d of i){if(Ge.has(n+d))continue;let x=o.parts[d];if(x)a.push({name:d,off:x[0],len:x[1],file:x[2]??0});else c.push(d)}a.sort((d,x)=>d.file-x.file||d.off-x.off);let u=[];for(let d of a){let x=u[u.length-1];if(x&&x.file===d.file&&d.off-x.end<=s)x.end=Math.max(x.end,d.off+d.len),x.items.push(d);else u.push({file:d.file,start:d.off,end:d.off+d.len,items:[d]})}let l=0,f=0,h=0,g=new Map,p=async()=>{while(h<u.length){let d=u[h++],x=g.get(d.file);if(x)x=x.subarray(d.start,d.end);else{let w=await r(new URL(o.archives[d.file],n).href,{headers:{Range:`bytes=${d.start}-${d.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(f++,x=new Uint8Array(await w.arrayBuffer()),l+=x.byteLength,w.status===200)g.set(d.file,x),x=x.subarray(d.start,d.end)}for(let w of d.items){let v=Ve(x.subarray(w.off-d.start,w.off-d.start+w.len)),M=v.buffer.slice(v.byteOffset,v.byteOffset+v.byteLength);Ge.set(n+w.name,_e(M))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,u.length)},p));let m=i.filter((d)=>Ge.has(n+d)).map((d)=>Ge.get(n+d)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:m.length?Yn(m,A):_e(Qn(A)),missing:c,requests:f,bytes:l}}function Qn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...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 qn(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 en(e,t,n){let r=0,s=0,o=!1,i=new Set,c=new Map;for(let a of e){let u;if(a.embedded)u=t.get(a.part);else if(u=c.get(a.part),u===void 0)c.set(a.part,u=Y(a.part));let l=u?n.parts[u]:void 0;if(!l)continue;if(l[3]!=null)o=!0,r+=l[3];if(!i.has(u))i.add(u),s+=l[1]}return{bodyTris:r,packBytes:s,known:o}}class Ze 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 tn(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=We(t.cdn??Ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(y)=>{if(!y.ok)throw Error(`ldr: ${y.status} fetching ${e}`);return wt(await y.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":At(e)),a=Ht(o,c,{looseGeometry:!1,callouts:t.callouts}),u=performance.now();t.onParsed?.(a),await s;let l=Wt(o,new Set(a.filter((y)=>y.embedded).map((y)=>y.part)),c),f=(y,R)=>t.maxBodyTris!=null&&y>t.maxBodyTris||t.maxPackBytes!=null&&R>t.maxPackBytes,h=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(y)=>new Ze({...y,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),p="full";if(h){let y=en(a,l,await s);if(f(y.known?y.bodyTris:0,y.packBytes)){if(!t.lowCdn)throw g(y);let R=await We(t.lowCdn,r).catch(()=>null);if(!R)throw g(y);let C=en(a,l,R);if(f(C.known?C.bodyTris:0,C.packBytes))throw g(C);p="low"}}let m=[...a.filter((y)=>!y.embedded).map((y)=>y.part),...l.values()],A=async()=>{let y=await Jn(m,p==="low"?{...t,cdn:t.lowCdn}:t);for(let[R,C]of l){let F=y.pack.header.parts[C];if(F)y.pack.header.parts[R]=F}return{...y,packBytes:y.pack.buffer?.byteLength??y.pack.bytes??0,bodyTris:qn(a,y.pack)}},b=await A();if(h&&f(b.bodyTris,b.packBytes)&&p==="full"&&t.lowCdn&&await We(t.lowCdn,r).then(()=>!0,()=>!1)){p="low";let y=b;b=await A(),b.requests+=y.requests,b.bytes+=y.bytes}if(h&&f(b.bodyTris,b.packBytes))throw g(b);let{pack:d,missing:x,requests:w,bytes:v}=b,M=new Map([...l].map(([y,R])=>[R,y])),U=x.map((y)=>M.get(y)??y),S=performance.now(),D=t.cull?Qt(a,d.header,t.textures!==!1):void 0;return{insts:a,pack:d,tier:p,missing:U,requests:w,bytes:v,cull:D,timings:{fetchModel:i-n,parse:u-i,parts:S-u,...D?{cull:performance.now()-S}:{}}}}var er=new Set(["part","color","m","step","steps","localStep","path"]);function nn(e){let t=e.length,n=0;for(let p of e){if(typeof p.part!=="string"||typeof p.path!=="string"||typeof p.color!=="number"||typeof p.step!=="number"||typeof p.localStep!=="number"||!Array.isArray(p.m)||p.m.length!==12||!Array.isArray(p.steps))return null;n+=p.steps.length}let r=[],s=new Map,o=(p)=>{let m=s.get(p);if(m===void 0)s.set(p,m=r.length),r.push(p);return m},i=new Uint32Array(t),c=new Uint32Array(t),a=new Float64Array(t*3),u=new Float64Array(t*12),l=new Uint32Array(t+1),f=new Float64Array(n),h=[],g=0;for(let p=0;p<t;p++){let m=e[p];i[p]=o(m.part),c[p]=o(m.path),a[p*3]=m.color,a[p*3+1]=m.step,a[p*3+2]=m.localStep;let A=m.m,b=p*12;for(let w=0;w<12;w++)u[b+w]=A[w];let d=m.steps;for(let w=0;w<d.length;w++)f[g++]=d[w];l[p+1]=g;let x=null;for(let w in m)if(!er.has(w))(x??={})[w]=m[w];if(x)h.push([p,x])}return{n:t,strs:r,part:i,path:c,num:a,m:u,so:l,steps:f,extra:h}}var rn=(e)=>[e.part.buffer,e.path.buffer,e.num.buffer,e.m.buffer,e.so.buffer,e.steps.buffer];self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await tn(n,{...r,cull:!1,onParsed:(f)=>{let h=nn(f);if(h)self.postMessage({id:t,packed:h},rn(h));else 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(),c=ht(s.insts,s.pack.header,r.textures!==!1),a=mt(c.all,s.pack.header,r.stepCull&&c.nSteps>1?c.stepOf:void 0),u=performance.now()-i,l=[];for(let f of[a.studHidden,a.studUp,a.underHidden,a.studHideStep,a.underHideStep])if(f)l.push(f.buffer);self.postMessage({id:t,cull:a,ms:u},l)}catch(s){if(s instanceof Ze||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';
|
|
5636
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/load-worker.gen.ts
|
|
5637
|
+
var load_worker_gen_default = 'var sn=ArrayBuffer,H=Uint8Array,$e=Uint16Array,on=Int16Array;var je=Int32Array,Ye=function(e,t,n){if(H.prototype.slice)return H.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 H(n-t);return r.set(e.subarray(t,n)),r},Be=function(e,t,n,r){if(H.prototype.fill)return H.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},an=function(e,t,n,r){if(H.prototype.copyWithin)return H.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 ln=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||ln[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},yt=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},cn=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},un=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,c=r>>6;if(r&8)Z(0);var a=6-s,u=i==3?4:i,l=yt(e,a,u);a+=u;var f=c?1<<c:s,h=yt(e,a,f)+(c==1&&256),g=h;if(!s){var p=1<<10+(e[5]>>3);g=p+(p>>3)*(e[5]&7)}if(g>2145386496)Z(1);var m=new H((t==1?h||g:t?0:g)+12);return m[0]=1,m[4]=4,m[8]=8,{b:a+f,y:0,l:0,d:l,w:t&&t!=1?t:m.subarray(12),e:g,o:new je(m.buffer,0,3),u:h,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return cn(e,4)+8;Z(0)},Se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},De=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,a=-1,u=-1,l=o,f=new sn(512+(o<<2)),h=new on(f,0,256),g=new $e(f,0,256),p=new $e(f,512,o),m=512+(o<<1),A=new H(f,m,o),b=new H(f,m+o);while(c<255&&i>0){var d=Se(i+1),x=r>>3,w=(1<<d+1)-1,v=(e[x]|e[x+1]<<8|e[x+2]<<16)>>(r&7)&w,M=(1<<d)-1,U=w-i-1,S=v&M;if(S<U)r+=d,v=S;else if(r+=d+1,v>M)v-=U;if(h[++c]=--v,v==-1)i+=v,A[--l]=c;else i-=v;if(!v)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,c+=a}while(a==3)}if(c>255||i)Z(0);var y=0,R=(o>>1)+(o>>3)+3,C=o-1;for(var F=0;F<=c;++F){var B=h[F];if(B<1){g[F]=-B;continue}for(u=0;u<B;++u){A[y]=F;do y=y+R&C;while(y>=l)}}if(y)Z(0);for(u=0;u<o;++u){var L=g[A[u]]++,V=b[u]=s-Se(L);p[u]=(L<<V)-o}return[r+7>>3,{b:s,s:A,n:b,t:p}]},fn=function(e,t){var n=0,r=-1,s=new H(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),a=new $e(s.buffer,268);if(o<128){var u=De(e,t+1,6),l=u[0],f=u[1];t+=o;var h=l<<3,g=e[t];if(!g)Z(0);var p=0,m=0,A=f.b,b=A,d=(++t<<3)-8+Se(g);for(;;){if(d-=A,d<h)break;var x=d>>3;if(p+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<A)-1,i[++r]=f.s[p],d-=b,d<h)break;x=d>>3,m+=(e[x]|e[x+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=f.s[m],A=f.n[p],p=f.t[p],b=f.n[m],m=f.t[m]}if(++r>255)Z(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var v=0;for(n=0;n<r;++n){var M=i[n];if(M>11)Z(0);v+=M&&1<<M-1}var U=Se(v)+1,S=1<<U,D=S-v;if(D&D-1)Z(0);i[r++]=Se(D)+1;for(n=0;n<r;++n){var M=i[n];++c[i[n]=M&&U+1-M]}var y=new H(S<<1),R=y.subarray(0,S),C=y.subarray(S);a[U]=0;for(n=U;n>0;--n){var F=a[n];Be(C,n,F,a[n-1]=F+c[n]*(1<<U-n))}if(a[0]!=S)Z(0);for(n=0;n<r;++n){var B=i[n];if(B){var L=a[B];Be(R,n,L,a[B]=L+(1<<U-B))}}return[t,{n:C,b:U,s:R}]},pn=De(new H([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],mn=De(new H([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],hn=De(new H([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],xt=function(e,t){var n=e.length,r=new je(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Je=new H(new je([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),gn=xt(Je,0),Qe=new H(new je([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),dn=xt(Qe,3),Re=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var a=0,u=n.b,l=(r<<3)-8+Se(o)-u,f=-1;for(;l>c&&f<s;){var h=l>>3,g=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(l&7);a=(a<<u|g)&i,t[++f]=n.s[a],l-=u=n.n[a]}if(l!=c||f+1!=s)Z(0)},bn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;Re(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),Re(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),Re(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),Re(e.subarray(r),t.subarray(c),n)},yn=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Be(n,e[s],t.y,t.y+=c),n;return Be(new H(c),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=c,n;return Ye(e,s,a)}if(i==2){var u=e[s],l=u&3,f=u>>2&3,h=u>>4,g=0,p=0;if(l<2)if(f&1)h|=e[++s]<<4|(f&2&&e[++s]<<12);else h=u>>3;else if(p=f,f<2)h|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(f==2)h|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var m=n?n.subarray(t.y,t.y+t.m):new H(t.m),A=m.length-h;if(l==0)m.set(e.subarray(s,s+=h),A);else if(l==1)Be(m,e[s++],A);else{var b=t.h;if(l==2){var d=fn(e,s);g+=s-(s=d[0]),t.h=b=d[1]}else if(!b)Z(0);(p?bn:Re)(e.subarray(s,s+=g),m.subarray(A),b)}var x=e[s++];if(x){if(x==255)x=(e[s++]|e[s++]<<8)+32512;else if(x>127)x=x-128<<8|e[s++];var w=e[s++];if(w&3)Z(0);var v=[mn,hn,pn];for(var M=2;M>-1;--M){var U=w>>(M<<1)+2&3;if(U==1){var S=new H([0,0,e[s++]]);v[M]={s:S.subarray(2,3),n:S.subarray(0,1),t:new $e(S.buffer,0,1),b:0}}else if(U==2)r=De(e,s,9-(M&1)),s=r[0],v[M]=r[1];else if(U==3){if(!t.t)Z(0);v[M]=t.t[M]}}var D=t.t=v,y=D[0],R=D[1],C=D[2],F=e[a-1];if(!F)Z(0);var B=(a<<3)-8+Se(F)-C.b,L=B>>3,V=0,me=(e[L]|e[L+1]<<8)>>(B&7)&(1<<C.b)-1;L=(B-=R.b)>>3;var be=(e[L]|e[L+1]<<8)>>(B&7)&(1<<R.b)-1;L=(B-=y.b)>>3;var ye=(e[L]|e[L+1]<<8)>>(B&7)&(1<<y.b)-1;for(++x;--x;){var ue=C.s[me],Pe=C.n[me],xe=y.s[ye],Ce=y.n[ye],ke=R.s[be],he=R.n[be];L=(B-=ke)>>3;var O=1<<ke,k=O+((e[L]|e[L+1]<<8|e[L+2]<<16|e[L+3]<<24)>>>(B&7)&O-1);L=(B-=Qe[xe])>>3;var J=dn[xe]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Qe[xe])-1);L=(B-=Je[ue])>>3;var _=gn[ue]+((e[L]|e[L+1]<<8|e[L+2]<<16)>>(B&7)&(1<<Je[ue])-1);if(L=(B-=Pe)>>3,me=C.t[me]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Pe)-1),L=(B-=Ce)>>3,ye=y.t[ye]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<Ce)-1),L=(B-=he)>>3,be=R.t[be]+((e[L]|e[L+1]<<8)>>(B&7)&(1<<he)-1),k>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=k-=3;else{var W=k-(_!=0);if(W){if(k=W==3?t.o[0]-1:t.o[W],W>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=k}else k=t.o[0]}for(var M=0;M<_;++M)m[V+M]=m[A+M];V+=_,A+=_;var ne=V-k;if(ne<0){var q=-ne,le=t.e+ne;if(q>J)q=J;for(var M=0;M<q;++M)m[V+M]=t.w[le+M];V+=q,J-=q,ne=0}for(var M=0;M<J;++M)m[V+M]=m[ne+M];V+=J}if(V!=A)while(A<m.length)m[V++]=m[A++];else V=m.length;if(n)t.y+=V;else m=Ye(m,0,V)}else if(n){if(t.y+=h,A)for(var M=0;M<h;++M)m[M]=m[A+M]}else if(A)m=Ye(m,A);return t.b=a,m}Z(2)},xn=function(e,t){if(e.length==1)return e[0];var n=new H(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 Ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=un(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 c=yn(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,an(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return xn(n,o)}async function wn(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(Ve(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 wt(e){return new TextDecoder().decode(await wn(e))}var At=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function _e(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),et=/^[A-Za-z][A-Za-z0-9_]*$/,qe=new Map;function tt(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(!qe.has(r))qe.set(r,t);return r}function nt(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&et.test(e))return tt(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Mt=/^~?\\s*moved\\s+to\\s+(.+)$/i,An=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Mn=new Set(["FILE","NOFILE","!DATA"]),Pt=1000000000000000,It=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),vn=new Set(["model","submodel","configuration"]),Cn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function vt(e){let t=Cn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return It.has(n)||vn.has(n)?n:void 0}function kn(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 Tn(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((f)=>Number.isFinite(f)&&Math.abs(f)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let f=0;f<s;f++)c=c.replace(/^\\S+\\s*/,"");let a=kn(c);if(!a.length)return null;let u={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)u.a=i[9];if(s===11)u.b=i[10];let l=a.findIndex((f,h)=>h>0&&f.toUpperCase()==="GLOSSMAP");if(l>0&&a[l+1])u.glossmap=a[l+1];if(t)u.next=!0;return u}var Ln=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let 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 Sn(e,t){let n=e.length,r=1,s=(p)=>p===32||p===9,o=()=>{while(r<n&&s(e.charCodeAt(r)))r++;let p=r,m=e.charCodeAt(r),A=m===45;if(A)m=e.charCodeAt(++r);let b=0,d=0;while(m>=48&&m<=57)b=b*10+(m-48),d++,m=e.charCodeAt(++r);if(d>0&&d<=15&&(r>=n||s(m)))return A?-b:b;while(r<n&&!s(e.charCodeAt(r)))r++;return p<r?+e.slice(p,r):NaN};while(r<n&&s(e.charCodeAt(r)))r++;let i=r;if(r>=n)return null;let c=e.charCodeAt(r),a=c===45,u=0,l=0;if(a)c=e.charCodeAt(++r);while(c>=48&&c<=57)u=u*10+(c-48),l++,c=e.charCodeAt(++r);if(l>0&&l<=15&&(r>=n||s(c))){if(a)u=-u}else{while(r<n&&!s(e.charCodeAt(r)))r++;u=nt(e.slice(i,r))}let f=Array(12);for(let p=0;p<12;p++){let m=o();if(!Number.isFinite(m))return null;f[p]=m}while(r<n&&s(e.charCodeAt(r)))r++;if(r>=n)return null;let h=e.slice(r),g=t.get(h);if(g===void 0)g=Y(/[ \\t]{2,}|\\t/.test(h)?h.split(/\\s+/).join(" "):h),t.set(h,g);if(!Number.isFinite(u))return null;return{t:1,color:u,m:f,file:g}}var En=[0,12,6,9,12,12];function Ct(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=nt(e[1]),r=En[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Ft(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,a=null,u=[],l=null,f=()=>{if(!a)return;let x=Ln(a.chunks.join("")),w=x[0]===137&&x[1]===80&&x[2]===78&&x[3]===71;(c??=new Map).set(Y(a.name),{name:a.name,bytes:x,...w?{mime:"image/png"}:{}}),a=null},h=new Map,g=!0,p=(x)=>{if(f(),o={name:Y(x),cmds:[]},s.set(o.name,o),!i)i=o.name;u=[],l=null,g=!0},m=!1,A=!1,b=()=>{if(A)return;A=!0,s.clear(),o=null,i=""},d=(x,w)=>{if(l){x.tex=l,l=null;return}let v=u[u.length-1];if(!v)return;if(v.fallback){if(!w)x.fallback=!0}else x.tex=v.map};for(let x of e.split(`\n`)){let w=x.trim();if(!w)continue;if(r&&w.charCodeAt(0)>=50&&w.charCodeAt(0)<=53&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){if(a||m)continue;if(!o)p(t);let S=w.slice(2).trimStart(),D=S.search(/\\s/),y={t:w.charCodeAt(0)-48,color:nt(D<0?S:S.slice(0,D)),p:[],src:w};d(y,!1),o.cmds.push(y),g=!1;continue}if(w.charCodeAt(0)===48&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)){let S=2;while(w.charCodeAt(S)===32||w.charCodeAt(S)===9)S++;let D=S;while(D<w.length&&w.charCodeAt(D)!==32&&w.charCodeAt(D)!==9)D++;let y=w.slice(S,D),R=/[^\\x21-\\x7e]/.test(y)?w.slice(S).trim().split(/\\s+/)[0]:y;if(!An.has(R)&&!(R.length>=4&&R.length<=6&&Mn.has(R.toUpperCase()))){if(m||a)continue;if(!o)p(t);let C=w.slice(S),F={t:0,text:C};if(y.charCodeAt(0)===33)F.meta=y;if(l=null,g&&!o.org){let L=vt(C);if(L)o.org=L}let B=C.match(Mt);if(B&&!o.movedTo){let L=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(L))L+=".dat";o.movedTo=Y(L)}o.cmds.push(F);continue}}if(w.charCodeAt(0)===49&&(w.charCodeAt(1)===32||w.charCodeAt(1)===9)&&!a&&!m){let S=Sn(w,h);if(S){if(!o)p(t);d(S,!1),o.cmds.push(S),g=!1;continue}}let v=w.split(/\\s+/);if(+v[0]===0){let S=w.slice(1).trim(),D=v.length>1&&v[1].length>=4&&v[1].length<=6?v[1].toUpperCase():v[1];if(D==="FILE"){let C=S.slice(5).trimStart().split("\\r")[0].trim();if(C){b(),m=!1,p(C);continue}}if(D==="NOFILE"){f(),o=null,m=!0;continue}if(D==="!DATA"){b(),f(),o=null,m=!1,a={name:S.slice(5).trim(),chunks:[]};continue}if(m)continue;if(a){if(v[1]==="!:")a.chunks.push(v.slice(2).join(""));continue}if(!o)p(t);let y={t:0,text:S};if(v[1]==="STEP")y.step=!0,u=[],l=null;else if(v[1]==="BFC")y.bfc=v.slice(2).join(" ");else if(v[1]==="ROTSTEP")if(y.meta="ROTSTEP",y.step=!0,u=[],l=null,(v[2]??"").toUpperCase()==="END")y.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(v[5]??"REL").toUpperCase(),F=(B)=>{let L=Number(B);return Number.isFinite(L)?L:0};y.rotstep={x:F(v[2]),y:F(v[3]),z:F(v[4]),mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(v[1]==="BUFEXCHG"){y.meta="BUFEXCHG";let C=(v[2]??"").toUpperCase();y.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:v[3]??"A"}}else if(v[1]?.startsWith("!"))y.meta=v[1];if(g&&!o.org){let C=vt(S);if(C)o.org=C}if(v[1]==="!TEXMAP"){let C=(v[2]??"").toUpperCase();if(l=null,C==="START"||C==="NEXT"){let F=Tn(S.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(y.texmap={op:C,...F?{map:F}:{}},F)if((o.texmaps??=[]).push(F),C==="START")u.push({map:F,fallback:!1});else l=F}else if(C==="FALLBACK"){y.texmap={op:C};let F=u[u.length-1];if(F)F.fallback=!0}else if(C==="END")y.texmap={op:C},u.pop()}else if(v[1]==="!:"){l=null;let C=Ct(v.slice(2));if(C)d(C,!0),y.geom=C}else l=null;let R=S.match(Mt);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(y);continue}if(a||m)continue;if(!o)p(t);let U=Ct(v);if(!U){if(/^[2-5][ \\t]/.test(w))g=!1;continue}d(U,!1),o.cmds.push(U),g=!1}return f(),c?{main:i,files:s,data:c}:{main:i,files:s}}var sr=Math.PI/180;function Rt(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 Bt(e,t){let[n,r,s,o,i,c,a,u,l,f,h,g]=e,[p,m,A,b,d,x,w,v,M,U,S,D]=t;return[o*p+i*m+c*A+n,a*p+u*m+l*A+r,f*p+h*m+g*A+s,o*b+i*w+c*U,o*d+i*v+c*S,o*x+i*M+c*D,a*b+u*w+l*U,a*d+u*v+l*S,a*x+u*M+l*D,f*b+h*w+g*U,f*d+h*v+g*S,f*x+h*M+g*D]}var rt=[0,0,0,1,0,0,0,1,0,0,0,1];var kt=new WeakMap,Pn=/^(s|8|48)\\//;function st(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=kt.get(n);if(r)return r;if(n.org)r=It.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&&Pn.test(s.file))?"part":"model";return kt.set(n,r),r}var Tt=new WeakMap;function Dt(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 Lt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?qe.get(e)??String(e):String(e),In=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Lt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Lt(e.color)} ${e.p.join(" ")}`,ot=(e,t)=>`${Y(e)}#${t}`;function Fn(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||o.meta==="!COLOUR"){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:ot(e.name,t),cmds:n}}function Ut(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Fn(e,t).cmds.map(In)].join(`\n`)+`\n`}function it(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Nt(e){let[t,n,r,s,o,i,c,a,u,l,f,h]=e,g=a*h-u*f,p=-(c*h-u*l),m=c*f-a*l,A=s*g+o*p+i*m;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let b=1/A,d=[g*b,-(o*h-i*f)*b,(o*u-i*a)*b,p*b,(s*h-i*l)*b,-(s*u-i*c)*b,m*b,-(s*f-o*l)*b,(s*a-o*c)*b];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Rn=(e)=>String(+e.toFixed(6)||0),St=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Ot(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Rn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${St(t.texture)}${t.glossmap?" GLOSSMAP "+St(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${it(r)}`,source:r}}var Bn=(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 Dn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),a=Math.sin(n*r),u=Math.cos(n*r);return[c*u,-c*a,i,o*a+s*i*u,o*u-s*i*a,-s*c,s*a-o*i*u,s*u+o*i*a,o*c]}var Et=new WeakMap;function zt(e){let t=Et.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=Dn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Bn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Et.set(e,n),n}class at extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var Un=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=Pt))return!1;return!0},$t=999999,_t=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Gt=new WeakMap,jt=new WeakMap;function Nn(e,t){let n=jt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Gt.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},jt.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${it(o)}`,source:o},n.parts.set(e,r)}return r}function On(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,a=0,u=new Set,l=t.maxInstances??2000000,f=0,h=(p,m)=>{let A=p.name+"#"+m,b=c.get(A);if(!b){let d;b=Object.assign(()=>d??=Ut(p,m),{file:p,step:m}),c.set(A,b)}return b},g=(p,m,A,b,d,x,w,v,M=null,U=[],S=[],D=void 0,y=null)=>{let R=p.files.get(m);if(!R||w>r||u.has(R))return;if(++f>l)throw new at("model",l);u.add(R);let C=y,F=0,B=w>0?++a:0,L=i&&B?[...U,B]:U,V=i&&B?[...S,A]:S,me=i&&!M?new Map:null,be=-1,ye=0,ue=(O,k,J,_,W,ne,q)=>{if(be!==F)be=F,ye=0;let le=me?.get(F+"|"+k);if(le)return le.n++,g(O,O===p?k:O.main,J,_,d+"/"+k,[...W,$t],w+1,ne,[...W,$t],L,V,q,C);let T=[...W,ye++],P=n.length;g(O,O===p?k:O.main,J,_,d+"/"+k,T,w+1,ne,M,L,V,q,C),me?.set(F+"|"+k,{n:1,from:P,to:n.length})},Pe=zt(R),xe=s?Dt(R):[],Ce=0,ke=(O,k,J,_,W,ne,q,le,T)=>{if(M)_=M;if(++f>l)throw new at("model",l);let P={part:O,color:k,m:J,step:_[0],steps:_,localStep:W,path:d};if(le)P.colour=le;if(B){if(P.sub=B,i)P.subPath=L,P.subMats=V}if(ne)P.embedded=!0;if(q){let N=Ot(O,q);P.texPart=N.name,P.texSource=N.source}else if(T){let N=Nn(O,T);P.colPart=N.name,P.colSource=N.source}let E=Pe[W];if(E)P.view=E;return n.push(P),P},he=(O)=>{while(Ce<xe.length&&xe[Ce]<=O){let k=xe[Ce++];ke(ot(R.name,k),b,A,[...x,k],k,!1,null,D,y).source=h(R,k)}};for(let O of R.cmds){if(O.t===0&&O.step){F++;continue}let k=O;if(k.t>=2||k.t===0&&k.geom&&k.geom.t>=2){he(F);continue}if(k.t===0){if(k.meta==="!COLOUR"){let E=$n(k.text);if(E&&E.code!==16&&E.code!==24)Gt.set(E,k.text),(C=new Map(C??[])).set(E.code,E);continue}if(o&&k.geom?.t===1)k=k.geom;else continue}if(k.t!==1)continue;if(o&&k.fallback)continue;let J=Bt(A,k.m);if(!Un(J))continue;let _=k.color===16?b:k.color,W=k.color===16?D:C?.get(k.color),ne=[...x,F],q=o?k.tex??v:null,le=q?Nt(k.m):null,T=q&&le?Rt(q,le):null;if(p.files.has(k.file)){if(st(p,k.file)==="model"){ue(p,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!0,T,W,C);continue}let P=t.resolveModel?.(k.file);if(P){ue(P,k.file,J,_,ne,T,W);continue}ke(k.file,_,J,ne,F,!1,T,W,C)}if(he(1/0),u.delete(R),me){for(let O of me.values())if(O.n>1)for(let k=O.from;k<O.to;k++)n[k].mult??=O.n}};if(st(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...rt],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,rt,16,e.main,[],0,null),n}function Ht(e,t="main.ldr",n){return On(Ft(e,t,{geometryText:!0}),n)}var zn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function lt(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 Vt(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=lt(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 $n(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",c=255,a=0,u={type:"default"},l=1;while(l<n.length){let f=n[l].toUpperCase(),h=n[l+1];if(f==="CODE")s=h!==void 0&&et.test(h)?tt(h):h!==void 0&&/^\\d+$/.test(h)?+h:NaN,l+=2;else if(f==="VALUE"){let g=lt(h);if(g)o=g;l+=2}else if(f==="EDGE")i=lt(h)??h,l+=2;else if(f==="ALPHA")c=+h,l+=2;else if(f==="LUMINANCE")a=+h,l+=2;else if(f==="CHROME")u={type:"chrome"},l+=1;else if(f==="PEARLESCENT")u={type:"pearlescent"},l+=1;else if(f==="RUBBER")u={type:"rubber"},l+=1;else if(f==="MATTE_METALLIC")u={type:"matte_metallic"},l+=1;else if(f==="METAL")u={type:"metal"},l+=1;else if(f==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:p,next:m}=Vt(n,l+2);u={type:"glitter",material:p},l=m}else if(g==="SPECKLE"){let{grain:p,next:m}=Vt(n,l+2);u={type:"speckle",material:p},l=m}else if(g==="FABRIC"){let p=(n[l+2]||"").toUpperCase(),m=["VELVET","CANVAS","STRING","FUR"].includes(p)?p.toLowerCase():void 0;u={type:"fabric",kind:m},l+=m?3:2}else l=n.length}else if(zn.has(f))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(a)?a:0,finish:u}}function jn(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,c=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:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=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:c,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 ct(e){let t=jn(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 Vn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let a=i.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var _n=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Gn(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 Wt(e,t,n="main.ldr"){let r=[...t],s=new Map;if(!r.length)return s;let o=Vn(e,n);for(let i of r){let c=Y(i);if(!o.has(c)||s.has(c))continue;let a=new Set([c]),u=[c];while(u.length)for(let f of o.get(u.pop())){let h=_n(f);if(h&&o.has(h)&&!a.has(h))a.add(h),u.push(h)}let l=[c,...[...a].filter((f)=>f!==c).sort()].map((f)=>"0 FILE "+(f===c?"":f)+`\n`+o.get(f).join(`\n`)).join(`\n`);s.set(c,`emb/${Gn(l)}.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,Kt=new WeakMap,ut=null,ft="",pt=null;function Hn(e,t){if(e===ut&&t===ft)return pt;let n=Kt.get(e);if(!n)Kt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return ut=e,ft=t,pt=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],a=[];s.studs.forEach((g,p)=>{c.push(g[0]),a.push(g[1]);for(let m=0;m<12;m++)i[p*12+m]=g[2+m]});let u=null,l=0,f=0;if(s.mask){l=s.mask[0],f=s.mask[1];let g=s.mask[2];u=new Uint8Array(g.length);for(let p=0;p<g.length;p++)u[p]=g.charCodeAt(p)===49?1:0}let h=!!u;if(u){for(let g=0;g<u.length;g++)if(u[g]!==1){h=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:a,mask:u,nx:l,nz:f,full:h}),ut=e,ft=t,pt=r,r}var Ie=1073741824;class Ee{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=Ee.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let a=s[c];if(a===0)return-1;if(a===r){let u=c<<2;if(o[u]===e&&o[u+1]===t&&o[u+2]===n)return o[u+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=Ee.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,a=this.slot(e,t,n);for(;;){let u=o[a],l=a<<2;if(u===0)return o[a]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(u===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let f=i[l+3];return i[l+3]=r,f}a=a+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Yt{grp=new Ee(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],a=[];for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=(h%20+20)%20,A=(p%20+20)%20,b=this.group(g,m,A);if(b<0)b=s.length,this.grp.put(g,m,A,b),this.lg=b,s.push(0),o.push(h),i.push(h),c.push(p),a.push(p);if(s[b]++,h<o[b])o[b]=h;else if(h>i[b])i[b]=h;if(p<c[b])c[b]=p;else if(p>a[b])a[b]=p}let u=0,l=0;for(let f=0;f<s.length;f++){let h=(i[f]-o[f])/20+1,g=(a[f]-c[f])/20+1,p=h*g;if(this.gX0.push(o[f]),this.gZ0.push(c[f]),this.gNx.push(h),this.gNz.push(g),p<=64*s[f]+1024&&u+p<2147483648)this.gBits.push(u),u+=p;else this.gBits.push(-1),l+=s[f]}this.bits=new Uint8Array(Math.ceil(u/8)),this.rest=new Ee(l);for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=this.group(g,(h%20+20)%20,(p%20+20)%20),A=this.gBits[m];if(A<0){this.rest.put(h,g,p,1);continue}let b=A+(h-this.gX0[m])/20*this.gNz[m]+(p-this.gZ0[m])/20;this.bits[b>>>3]|=1<<(b&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Wn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),Fe=(e,t,n)=>e>-Ie&&e<Ie&&t>-Ie&&t<Ie&&n>-Ie&&n<Ie,Ue=2147483647;function Xn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function mt(e,t,n){return Zt(e,t,n,-1)??Zt(e,t,n,Jt)}var Jt=0;function Zt(e,t,n,r){let o=new Map,i=(T)=>{let P=o.get(T);if(P===void 0)o.set(T,P=Xn(t,T));return P},c=e.length,a=0,u=0,l=0,f=Array(c);for(let T=0;T<c;T++){let P=f[T]=Hn(t,e[T].part);if(P){if(l+=P.nStuds,P.mask)a++}}let h=new Float64Array(a),g=new Float64Array(a),p=new Float64Array(a),m=new Float64Array(a),A=new Int32Array(a),b=new Int32Array(a),d=new Float64Array(a),x=new Float64Array(a),w=[],v=new Int32Array(a),M=new Float64Array(a*9),U=new Uint8Array(a);if(r<0)r=a*4+64;let S=new Ee(e.length*2),D=new Int32Array(r),y=new Int32Array(r),R=0,C=0;for(let T=0;T<e.length;T++){let P=e[T],E=P.m,N=t.parts[P.part];if(!N||!N.mask||!Xt(E)||i(P.color))continue;let I=N.bbox,z=1/0,j=-1/0,ee=1/0,X=-1/0;for(let K=0;K<2;K++)for(let ae=0;ae<2;ae++){let te=K?I[3]:I[0],Le=ae?I[5]:I[2],ve=E[0]+E[3]*te+E[5]*Le,de=E[2]+E[9]*te+E[11]*Le;if(ve<z)z=ve;if(ve>j)j=ve;if(de<ee)ee=de;if(de>X)X=de}let G=Math.round((E[1]+I[4])*2),Q=f[T],ce=Math.floor(z/40),we=Math.floor(j/40),Ae=Math.floor(ee/40),Me=Math.floor(X/40);if(!((we-ce+1)*(Me-Ae+1)<=65536)||!Fe(G,ce,Ae)||!Fe(G,we,Me))continue;let ge=Math.floor((z+5)/40),re=Math.floor((j-5)/40),se=Math.floor((ee+5)/40),oe=Math.floor((X-5)/40),Te=ge<=re&&se<=oe?(re-ge+1)*(oe-se+1):0;C+=Te;let fe=-1;for(let K=ge<=re&&se<=oe?S.get(G,ge,se):-1,ae=0;K>=0&&ae<8;K=D[K],ae++){let te=y[K];if(h[te]!==z||g[te]!==j||p[te]!==ee||m[te]!==X||w[te]!==Q)continue;let Le=e[A[te]].m,ve=!0;for(let de=0;de<12;de++)if(Le[de]!==E[de]){ve=!1;break}if(ve){fe=te;break}}if(fe>=0){let K=n?n[T]:0;if(n&&K<n[A[fe]])b[fe]=A[fe],A[fe]=T;else if(b[fe]<0||n&&K<n[b[fe]])b[fe]=T;continue}let ie=u++;h[ie]=z,g[ie]=j,p[ie]=ee,m[ie]=X,A[ie]=T,b[ie]=-1,w.push(Q),d[ie]=I[0],x[ie]=I[2],v[ie]=G;let pe=ie*9;if(M[pe]=E[0],M[pe+1]=E[1],M[pe+2]=E[2],M[pe+3]=E[3],M[pe+4]=E[6],M[pe+5]=E[9],M[pe+6]=E[5],M[pe+7]=E[8],M[pe+8]=E[11],U[ie]=Q.full&&I[3]-I[0]<=20*Q.nx&&I[5]-I[2]<=20*Q.nz&&E[4]===0&&E[6]===0&&E[8]===0&&E[10]===0&&Wn(E[3],E[5],E[9],E[11])?1:0,R+Te>r){R=r+1;continue}for(let K=ge;K<=re;K++)for(let ae=se;ae<=oe;ae++){if(!Fe(G,K,ae))continue;let te=R++;y[te]=ie,D[te]=S.put(G,K,ae,te)}}if(R>r)return Jt=C,null;let F=[0,5,-5,5,-5],B=[0,5,5,-5,-5],L=(T,P,E,N)=>{if(!(P-6>=h[T]-0.5&&P+6<=g[T]+0.5&&N-6>=p[T]-0.5&&N+6<=m[T]+0.5))return!1;if(U[T]===1)return!0;let I=T*9,z=w[T],j=d[T],ee=x[T],X=P-M[I],G=E-M[I+1],Q=N-M[I+2],ce=M[I+3]*X+M[I+4]*G+M[I+5]*Q,we=M[I+6]*X+M[I+7]*G+M[I+8]*Q,{nx:Ae,nz:Me,mask:ge}=z;for(let re=0;re<5;re++){let se=Math.floor((ce+F[re]-j)/20),oe=Math.floor((we+B[re]-ee)/20);if(se<0||oe<0||se>=Ae||oe>=Me||ge[se*Me+oe]!==1)return!1}return!0},V=NaN,me=NaN,be=NaN,ye=-1,ue=-1,Pe=(T,P,E,N)=>{let I=Math.round(P*2),z=Math.floor(T/40),j=Math.floor(E/40);if(!Fe(I,z,j))return Ue;let ee=Ue;if(!n&&ue>=0&&v[ue]===I&&(A[ue]!==N||b[ue]>=0)&&L(ue,T,P,E))return 0;if(I!==V||z!==me||j!==be)V=I,me=z,be=j,ye=S.get(I,z,j);for(let X=ye;X>=0;X=D[X]){let G=y[X],Q=A[G];if(Q===N&&(Q=b[G])<0)continue;if(!L(G,T,P,E))continue;if(!n)return ue=G,0;let ce=n[Q];if(ce<ee)ee=ce}return ee},xe=new Uint8Array(l),Ce=new Uint8Array(l),ke=0,he=n?new Ee(l,4):null,O=n?null:new Int32Array(l),k=n?null:new Int32Array(l),J=n?null:new Int32Array(l),_=0,W=n?new Int32Array(l).fill(Ue):void 0;for(let T=0,P=0;T<e.length;T++){let E=e[T],N=f[T];if(!N)continue;let I=E.m,z=N.studM,j=I[0],ee=I[1],X=I[2],G=I[3],Q=I[4],ce=I[5],we=I[6],Ae=I[7],Me=I[8],ge=I[9],re=I[10],se=I[11];for(let oe=0;oe<N.nStuds;oe++,P++){let Te=oe*12,fe=z[Te+4],ie=z[Te+7],pe=z[Te+10];if(!(Math.abs(we*fe+Ae*ie+Me*pe-1)<0.001&&Math.abs(G*fe+Q*ie+ce*pe)<0.001&&Math.abs(ge*fe+re*ie+se*pe)<0.001))continue;Ce[P]=1;let K=z[Te],ae=z[Te+1],te=z[Te+2],Le=j+G*K+Q*ae+ce*te,ve=ee+we*K+Ae*ae+Me*te,de=X+ge*K+re*ae+se*te,gt=Pe(Le,ve,de,T);if(gt!==Ue){if(xe[P]=1,ke++,W)W[P]=gt}let Ne=Math.round(Le),Oe=Math.round(ve),ze=Math.round(de);if(!Fe(Ne,Oe,ze))continue;if(!he){O[_]=Ne,k[_]=Oe,J[_++]=ze;continue}let dt=n[T],bt=he.get(Ne,Oe,ze);if(bt<0||dt<bt)he.put(Ne,Oe,ze,dt)}}let ne=he?null:new Yt(O,k,J,_),q=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(Ue):void 0;for(let T=0;T<e.length;T++){let P=e[T],E=t.parts[P.part];if(!E||!E.under||!Xt(P.m)||i(P.color))continue;let N=E.bbox,I=Math.round((N[3]-N[0])/20),z=Math.round((N[5]-N[2])/20);if(!I||!z||I*z>4096)continue;let j=P.m,ee=Math.round(j[1]+N[4]),X=!0,G=0;for(let Q=0;Q<I&&X;Q++)for(let ce=0;ce<z;ce++){let we=N[0]+10+20*Q,Ae=N[2]+10+20*ce,Me=j[0]+j[3]*we+j[5]*Ae,ge=j[2]+j[9]*we+j[11]*Ae,re=Math.round(Me),se=Math.round(ge),oe=!Fe(re,ee,se)?-1:he?he.get(re,ee,se):ne.has(re,ee,se)?1:-1;if(oe<0){X=!1;break}if(oe>G)G=oe}if(X){if(q[T]=1,le)le[T]=G}}return{nStuds:l,studHidden:xe,studUp:Ce,underHidden:q,studsHidden:ke,studHideStep:W,underHideStep:le}}function ht(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let f=l.colour;if(!f)return String(l.color);let h=o.get(f);if(h!==void 0)return h;let g=t.colorTable?.[l.color],p=g?.hex??t.colors?.[l.color],m=g?ct({alpha:g.alpha??255,luminance:g.luminance??0,finish:g.finish??{type:"default"}}):"default:op",A=ct(f);if(h=p&&p.toUpperCase()===f.hex.toUpperCase()&&m===A?String(l.color):f.hex.toUpperCase()+"/"+A,h!==String(l.color))s.set(h,f);return o.set(f,h),h},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),{stepOf:a,nSteps:u}=Kn(c);return{all:c,stepOf:a,nSteps:u,localColours:s}}function Kn(e){let t=!0;for(let o=0;o<e.length;o++){let i=e[o].steps;if(i.length!==1){t=!1;break}let c=i[0];if(!(Number.isInteger(c)&&c>=0&&c<1e6)){t=!1;break}}if(t){let o=new Set;for(let a=0;a<e.length;a++)o.add(e[a].steps[0]);let i=[...o].sort((a,u)=>a-u),c=new Map(i.map((a,u)=>[a,u]));return{stepOf:e.map((a)=>c.get(a.steps[0])),nSteps:i.length}}let n=e.map((o)=>_t(o.steps)),r=[...new Set(n)].sort(),s=new Map(r.map((o,i)=>[o,i]));return{stepOf:n.map((o)=>s.get(o)),nSteps:r.length}}function Qt(e,t,n=!0){let r=ht(e,t,n);return mt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ke="https://ldr-parts-cdn.baconbrix.workers.dev/v1/",He=new Map,Ge=new Map;function We(e=Ke,t=fetch){let n=He.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(()=>He.delete(e)),He.set(e,n);return n}var Zn=(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"),Xe=(e,t)=>Zn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Xe(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Xe(r,t)])):e;function Yn(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let g=h.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let p=new DataView(g).getUint32(0,!0),m=new Uint8Array(g,4+p),A=r;n.push(m),r+=m.byteLength;let b=(4-r%4)%4;if(b)n.push(new Uint8Array(b)),r+=b;for(let[d,x]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Xe(x,A);for(let[d,x]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Xe(x,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+c.length)%4)%4,u=4+c.length+a,l=new Uint8Array(u+r);new DataView(l.buffer).setUint32(0,c.length+a,!0),l.set(c,4),l.fill(32,4+c.length,u);let f=u;for(let h of n)l.set(h,f),f+=h.byteLength;return _e(l.buffer)}async function Jn(e,t={}){e=[...e];try{return await qt(e,t)}catch(n){let r=t.cdn??Ke,s=t.fetch??fetch;He.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await qt(e,{...t,fetch:o})}catch{throw n}}}async function qt(e,t){let n=t.cdn??Ke,r=t.fetch??fetch,s=t.gap??16384,o=await We(n,r),i=[...new Set([...new Set(e)].map(Y))],c=[],a=[];for(let d of i){if(Ge.has(n+d))continue;let x=o.parts[d];if(x)a.push({name:d,off:x[0],len:x[1],file:x[2]??0});else c.push(d)}a.sort((d,x)=>d.file-x.file||d.off-x.off);let u=[];for(let d of a){let x=u[u.length-1];if(x&&x.file===d.file&&d.off-x.end<=s)x.end=Math.max(x.end,d.off+d.len),x.items.push(d);else u.push({file:d.file,start:d.off,end:d.off+d.len,items:[d]})}let l=0,f=0,h=0,g=new Map,p=async()=>{while(h<u.length){let d=u[h++],x=g.get(d.file);if(x)x=x.subarray(d.start,d.end);else{let w=await r(new URL(o.archives[d.file],n).href,{headers:{Range:`bytes=${d.start}-${d.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(f++,x=new Uint8Array(await w.arrayBuffer()),l+=x.byteLength,w.status===200)g.set(d.file,x),x=x.subarray(d.start,d.end)}for(let w of d.items){let v=Ve(x.subarray(w.off-d.start,w.off-d.start+w.len)),M=v.buffer.slice(v.byteOffset,v.byteOffset+v.byteLength);Ge.set(n+w.name,_e(M))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,u.length)},p));let m=i.filter((d)=>Ge.has(n+d)).map((d)=>Ge.get(n+d)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:m.length?Yn(m,A):_e(Qn(A)),missing:c,requests:f,bytes:l}}function Qn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...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 qn(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 en(e,t,n){let r=0,s=0,o=!1,i=new Set,c=new Map;for(let a of e){let u;if(a.embedded)u=t.get(a.part);else if(u=c.get(a.part),u===void 0)c.set(a.part,u=Y(a.part));let l=u?n.parts[u]:void 0;if(!l)continue;if(l[3]!=null)o=!0,r+=l[3];if(!i.has(u))i.add(u),s+=l[1]}return{bodyTris:r,packBytes:s,known:o}}class Ze 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 tn(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=We(t.cdn??Ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(y)=>{if(!y.ok)throw Error(`ldr: ${y.status} fetching ${e}`);return wt(await y.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":At(e)),a=Ht(o,c,{looseGeometry:!1,callouts:t.callouts}),u=performance.now();t.onParsed?.(a),await s;let l=Wt(o,new Set(a.filter((y)=>y.embedded).map((y)=>y.part)),c),f=(y,R)=>t.maxBodyTris!=null&&y>t.maxBodyTris||t.maxPackBytes!=null&&R>t.maxPackBytes,h=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(y)=>new Ze({...y,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),p="full";if(h){let y=en(a,l,await s);if(f(y.known?y.bodyTris:0,y.packBytes)){if(!t.lowCdn)throw g(y);let R=await We(t.lowCdn,r).catch(()=>null);if(!R)throw g(y);let C=en(a,l,R);if(f(C.known?C.bodyTris:0,C.packBytes))throw g(C);p="low"}}let m=[...a.filter((y)=>!y.embedded).map((y)=>y.part),...l.values()],A=async()=>{let y=await Jn(m,p==="low"?{...t,cdn:t.lowCdn}:t);for(let[R,C]of l){let F=y.pack.header.parts[C];if(F)y.pack.header.parts[R]=F}return{...y,packBytes:y.pack.buffer?.byteLength??y.pack.bytes??0,bodyTris:qn(a,y.pack)}},b=await A();if(h&&f(b.bodyTris,b.packBytes)&&p==="full"&&t.lowCdn&&await We(t.lowCdn,r).then(()=>!0,()=>!1)){p="low";let y=b;b=await A(),b.requests+=y.requests,b.bytes+=y.bytes}if(h&&f(b.bodyTris,b.packBytes))throw g(b);let{pack:d,missing:x,requests:w,bytes:v}=b,M=new Map([...l].map(([y,R])=>[R,y])),U=x.map((y)=>M.get(y)??y),S=performance.now(),D=t.cull?Qt(a,d.header,t.textures!==!1):void 0;return{insts:a,pack:d,tier:p,missing:U,requests:w,bytes:v,cull:D,timings:{fetchModel:i-n,parse:u-i,parts:S-u,...D?{cull:performance.now()-S}:{}}}}var er=new Set(["part","color","m","step","steps","localStep","path"]);function nn(e){let t=e.length,n=0;for(let p of e){if(typeof p.part!=="string"||typeof p.path!=="string"||typeof p.color!=="number"||typeof p.step!=="number"||typeof p.localStep!=="number"||!Array.isArray(p.m)||p.m.length!==12||!Array.isArray(p.steps))return null;n+=p.steps.length}let r=[],s=new Map,o=(p)=>{let m=s.get(p);if(m===void 0)s.set(p,m=r.length),r.push(p);return m},i=new Uint32Array(t),c=new Uint32Array(t),a=new Float64Array(t*3),u=new Float64Array(t*12),l=new Uint32Array(t+1),f=new Float64Array(n),h=[],g=0;for(let p=0;p<t;p++){let m=e[p];i[p]=o(m.part),c[p]=o(m.path),a[p*3]=m.color,a[p*3+1]=m.step,a[p*3+2]=m.localStep;let A=m.m,b=p*12;for(let w=0;w<12;w++)u[b+w]=A[w];let d=m.steps;for(let w=0;w<d.length;w++)f[g++]=d[w];l[p+1]=g;let x=null;for(let w in m)if(!er.has(w))(x??={})[w]=m[w];if(x)h.push([p,x])}return{n:t,strs:r,part:i,path:c,num:a,m:u,so:l,steps:f,extra:h}}var rn=(e)=>[e.part.buffer,e.path.buffer,e.num.buffer,e.m.buffer,e.so.buffer,e.steps.buffer];self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await tn(n,{...r,cull:!1,onParsed:(f)=>{let h=nn(f);if(h)self.postMessage({id:t,packed:h},rn(h));else 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(),c=ht(s.insts,s.pack.header,r.textures!==!1),a=mt(c.all,s.pack.header,r.stepCull&&c.nSteps>1?c.stepOf:void 0),u=performance.now()-i,l=[];for(let f of[a.studHidden,a.studUp,a.underHidden,a.studHideStep,a.underHideStep])if(f)l.push(f.buffer);self.postMessage({id:t,cull:a,ms:u},l)}catch(s){if(s instanceof Ze||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';
|
|
5441
5638
|
|
|
5442
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5639
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/inst-io.ts
|
|
5443
5640
|
var CORE = new Set(["part", "color", "m", "step", "steps", "localStep", "path"]);
|
|
5444
5641
|
function unpackInstances(p) {
|
|
5445
5642
|
const { n, strs, part, path, num, m, so, steps, extra } = p;
|
|
@@ -5464,7 +5661,7 @@ function unpackInstances(p) {
|
|
|
5464
5661
|
return out;
|
|
5465
5662
|
}
|
|
5466
5663
|
|
|
5467
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5664
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/cdn.ts
|
|
5468
5665
|
var worker;
|
|
5469
5666
|
var seq = 0;
|
|
5470
5667
|
var pending = new Map;
|
|
@@ -5580,7 +5777,7 @@ async function loadModel(source, o = {}) {
|
|
|
5580
5777
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
5581
5778
|
});
|
|
5582
5779
|
}
|
|
5583
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5780
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/usdz.ts
|
|
5584
5781
|
var IDENT = [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
5585
5782
|
var MAX_ERR = 8;
|
|
5586
5783
|
var REL_ERR = 0.1;
|
|
@@ -6212,7 +6409,7 @@ function hiddenInstances(n, items, geo, clear, RES = 512) {
|
|
|
6212
6409
|
hidden[k] = seen[k] ? 0 : 1;
|
|
6213
6410
|
return hidden;
|
|
6214
6411
|
}
|
|
6215
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6412
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/library.ts
|
|
6216
6413
|
import { existsSync, readFileSync, statSync } from "fs";
|
|
6217
6414
|
import { join } from "path";
|
|
6218
6415
|
var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
|
|
@@ -6562,11 +6759,11 @@ class Library {
|
|
|
6562
6759
|
return insts;
|
|
6563
6760
|
}
|
|
6564
6761
|
}
|
|
6565
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6762
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/build-pack.ts
|
|
6566
6763
|
import fs3 from "node:fs";
|
|
6567
6764
|
import path3 from "node:path";
|
|
6568
6765
|
|
|
6569
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6766
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/resolver.ts
|
|
6570
6767
|
import fs from "node:fs";
|
|
6571
6768
|
import path from "node:path";
|
|
6572
6769
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -6895,11 +7092,11 @@ function collectDeps(lib, refs) {
|
|
|
6895
7092
|
return out;
|
|
6896
7093
|
}
|
|
6897
7094
|
|
|
6898
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7095
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/compile.ts
|
|
6899
7096
|
import fs2 from "node:fs";
|
|
6900
7097
|
import path2 from "node:path";
|
|
6901
7098
|
|
|
6902
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7099
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/lod.ts
|
|
6903
7100
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
6904
7101
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
6905
7102
|
function reorderMesh(P, N, C, I) {
|
|
@@ -7205,7 +7402,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
|
|
|
7205
7402
|
return out;
|
|
7206
7403
|
}
|
|
7207
7404
|
|
|
7208
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7405
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/compile.ts
|
|
7209
7406
|
class BfcState {
|
|
7210
7407
|
accum;
|
|
7211
7408
|
ccw = true;
|
|
@@ -7508,6 +7705,22 @@ class Compiler {
|
|
|
7508
7705
|
seatStuds(out, fullKind, (k) => this.compile(k, false).bbox);
|
|
7509
7706
|
if (this.opts.tex && this.hasTex(key))
|
|
7510
7707
|
this.texPass(key, out, separateStuds, colorOf);
|
|
7708
|
+
const cap = OPEN_BOTTOM[key.replace(/^.*[\\/]/, "").toLowerCase()];
|
|
7709
|
+
if (cap && isFinite(out.bbox[0])) {
|
|
7710
|
+
const [cx0, cz0, cx1, cz1] = cap, y = out.bbox[4], b = out.body, per = b.col.length / (b.pos.length / 3);
|
|
7711
|
+
let v = -1;
|
|
7712
|
+
for (let i = 1;i < b.pos.length; i += 3)
|
|
7713
|
+
if (Math.abs(b.pos[i] - y) < 0.01) {
|
|
7714
|
+
v = (i - 1) / 3;
|
|
7715
|
+
break;
|
|
7716
|
+
}
|
|
7717
|
+
if (v >= 0) {
|
|
7718
|
+
const rgba = b.col.slice(v * per, v * per + per);
|
|
7719
|
+
b.pos.push(cx0, y, cz0, cx0, y, cz1, cx1, y, cz1, cx0, y, cz0, cx1, y, cz1, cx1, y, cz0);
|
|
7720
|
+
for (let k = 0;k < 6; k++)
|
|
7721
|
+
b.col.push(...rgba);
|
|
7722
|
+
}
|
|
7723
|
+
}
|
|
7511
7724
|
const [x0, y0, z0, x1, y1, z1] = out.bbox;
|
|
7512
7725
|
let ax0 = Infinity, ax1 = -Infinity, az0 = Infinity, az1 = -Infinity;
|
|
7513
7726
|
for (const b of [out.body, out.under])
|
|
@@ -7733,6 +7946,7 @@ class Compiler {
|
|
|
7733
7946
|
}
|
|
7734
7947
|
}
|
|
7735
7948
|
}
|
|
7949
|
+
var OPEN_BOTTOM = { "11477.dat": [-10, -20, 10, 20] };
|
|
7736
7950
|
function underEnclosed(c) {
|
|
7737
7951
|
const u = c.under.pos;
|
|
7738
7952
|
let uy0 = Infinity, uy1 = -Infinity, ux0 = Infinity, ux1 = -Infinity, uz0 = Infinity, uz1 = -Infinity;
|
|
@@ -8149,7 +8363,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
8149
8363
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
8150
8364
|
}
|
|
8151
8365
|
|
|
8152
|
-
// ../../../../../../../tmp/ldr-build-
|
|
8366
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/build-pack.ts
|
|
8153
8367
|
function packCompilerOpts(o) {
|
|
8154
8368
|
return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures, ...o.partWorkLimit ? { workLimit: o.partWorkLimit } : {} };
|
|
8155
8369
|
}
|
|
@@ -8221,7 +8435,7 @@ function buildPack(o) {
|
|
|
8221
8435
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
8222
8436
|
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 } : {} };
|
|
8223
8437
|
}
|
|
8224
|
-
// ../../../../../../../tmp/ldr-build-
|
|
8438
|
+
// ../../../../../../../tmp/ldr-build-vpoU1w/src/node/promote.ts
|
|
8225
8439
|
var GEOM = /^\s*[2-5]\s/;
|
|
8226
8440
|
var REF = /^\s*1\s/;
|
|
8227
8441
|
var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;
|
|
@@ -8550,6 +8764,7 @@ export {
|
|
|
8550
8764
|
splitModel,
|
|
8551
8765
|
stepKey,
|
|
8552
8766
|
stepViewMatrix,
|
|
8767
|
+
studDecalUniforms,
|
|
8553
8768
|
texWrapper,
|
|
8554
8769
|
texmapTriangleUV,
|
|
8555
8770
|
texmapUV,
|