ldr 0.33.10 → 0.33.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 +3 -2
- package/dist/cli.js +11 -11
- package/dist/cull.d.ts +11 -7
- package/dist/index.js +153 -88
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/index.js +161 -96
- package/dist/render.d.ts +4 -1
- package/dist/scene.d.ts +3 -0
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/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;
|
|
@@ -802,7 +802,7 @@ function fileStepViews(f) {
|
|
|
802
802
|
viewMemo.set(f, out);
|
|
803
803
|
return out;
|
|
804
804
|
}
|
|
805
|
-
// ../../../../../../../tmp/ldr-build-
|
|
805
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/model.ts
|
|
806
806
|
class ModelLimitError extends Error {
|
|
807
807
|
limit;
|
|
808
808
|
code = "ldr-model-limit";
|
|
@@ -1243,7 +1243,7 @@ function blendedColourHex(code) {
|
|
|
1243
1243
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1244
1244
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1245
1245
|
}
|
|
1246
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1246
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/instructions.ts
|
|
1247
1247
|
var MIN_VIS = 0.5;
|
|
1248
1248
|
var REORIENT = 0.35;
|
|
1249
1249
|
var deg = Math.PI / 180;
|
|
@@ -1611,10 +1611,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1611
1611
|
}
|
|
1612
1612
|
};
|
|
1613
1613
|
}
|
|
1614
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1614
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
|
|
1615
1615
|
import * as THREE from "three";
|
|
1616
1616
|
|
|
1617
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1617
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/pack-io.ts
|
|
1618
1618
|
import { decompress } from "fzstd";
|
|
1619
1619
|
async function decompressPack(data) {
|
|
1620
1620
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1637,16 +1637,25 @@ function decodePack(buf) {
|
|
|
1637
1637
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1638
1638
|
}
|
|
1639
1639
|
|
|
1640
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1640
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/cull.ts
|
|
1641
1641
|
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;
|
|
1642
1642
|
var prepCache = new WeakMap;
|
|
1643
|
+
var lastH = null;
|
|
1644
|
+
var lastPart = "";
|
|
1645
|
+
var lastPrep = null;
|
|
1643
1646
|
function prepPart(H, part) {
|
|
1647
|
+
if (H === lastH && part === lastPart)
|
|
1648
|
+
return lastPrep;
|
|
1644
1649
|
let c = prepCache.get(H);
|
|
1645
1650
|
if (!c)
|
|
1646
1651
|
prepCache.set(H, c = new Map);
|
|
1647
1652
|
let r = c.get(part);
|
|
1648
|
-
if (r !== undefined)
|
|
1653
|
+
if (r !== undefined) {
|
|
1654
|
+
lastH = H;
|
|
1655
|
+
lastPart = part;
|
|
1656
|
+
lastPrep = r;
|
|
1649
1657
|
return r;
|
|
1658
|
+
}
|
|
1650
1659
|
const p = H.parts[part];
|
|
1651
1660
|
if (!p) {
|
|
1652
1661
|
c.set(part, null);
|
|
@@ -1671,6 +1680,9 @@ function prepPart(H, part) {
|
|
|
1671
1680
|
mask[i] = bits.charCodeAt(i) === 49 ? 1 : 0;
|
|
1672
1681
|
}
|
|
1673
1682
|
c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz });
|
|
1683
|
+
lastH = H;
|
|
1684
|
+
lastPart = part;
|
|
1685
|
+
lastPrep = r;
|
|
1674
1686
|
return r;
|
|
1675
1687
|
}
|
|
1676
1688
|
function mul12To(a, b, bo, w, ao = 0) {
|
|
@@ -1687,78 +1699,91 @@ var singular12 = (m, d = det12(m)) => d * d <= 0.000000000000000001 * (m[3] * m[
|
|
|
1687
1699
|
var BIG = 1073741824;
|
|
1688
1700
|
|
|
1689
1701
|
class Int3Table {
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
c;
|
|
1693
|
-
vals;
|
|
1694
|
-
used;
|
|
1702
|
+
t;
|
|
1703
|
+
tag;
|
|
1695
1704
|
mask;
|
|
1696
1705
|
size = 0;
|
|
1697
|
-
|
|
1706
|
+
shift;
|
|
1707
|
+
constructor(cap = 1024, shift = -1) {
|
|
1698
1708
|
let n = 1024;
|
|
1699
1709
|
while (n < cap * 2)
|
|
1700
1710
|
n *= 2;
|
|
1701
|
-
this.
|
|
1702
|
-
this.
|
|
1703
|
-
this.c = new Int32Array(n);
|
|
1704
|
-
this.vals = new Int32Array(n);
|
|
1705
|
-
this.used = new Uint8Array(n);
|
|
1711
|
+
this.t = new Int32Array(n * 4);
|
|
1712
|
+
this.tag = new Uint8Array(n);
|
|
1706
1713
|
this.mask = n - 1;
|
|
1714
|
+
this.shift = shift;
|
|
1707
1715
|
}
|
|
1708
1716
|
slot(x, y, z) {
|
|
1709
|
-
|
|
1717
|
+
const s = this.shift;
|
|
1718
|
+
if (s < 0) {
|
|
1719
|
+
let h = Math.imul(x, 2654435761) ^ Math.imul(y, 2246822507) ^ Math.imul(z, 3266489909);
|
|
1720
|
+
h ^= h >>> 15;
|
|
1721
|
+
h = Math.imul(h, 739982445);
|
|
1722
|
+
h ^= h >>> 12;
|
|
1723
|
+
return h & this.mask;
|
|
1724
|
+
}
|
|
1725
|
+
let h = Math.imul(x >> s + 2, 2654435761) ^ Math.imul(y, 2246822507) ^ Math.imul(z >> s + 2, 3266489909);
|
|
1710
1726
|
h ^= h >>> 15;
|
|
1711
1727
|
h = Math.imul(h, 739982445);
|
|
1712
1728
|
h ^= h >>> 12;
|
|
1713
|
-
return h & this.mask;
|
|
1729
|
+
return (h << 4 | (x >> s & 3) << 2 | z >> s & 3) & this.mask;
|
|
1730
|
+
}
|
|
1731
|
+
static tagOf(x, y, z) {
|
|
1732
|
+
const g = Math.imul(x ^ Math.imul(y, 374761393) ^ Math.imul(z, 668265261), 2654435761);
|
|
1733
|
+
return g >>> 24 | 1;
|
|
1714
1734
|
}
|
|
1715
1735
|
get(x, y, z) {
|
|
1736
|
+
const g = Int3Table.tagOf(x, y, z), G = this.tag, T = this.t, M = this.mask;
|
|
1716
1737
|
let i = this.slot(x, y, z);
|
|
1717
|
-
const U = this.used, A = this.a, B = this.b, C = this.c;
|
|
1718
1738
|
for (;; ) {
|
|
1719
|
-
|
|
1739
|
+
const q = G[i];
|
|
1740
|
+
if (q === 0)
|
|
1720
1741
|
return -1;
|
|
1721
|
-
if (
|
|
1722
|
-
|
|
1723
|
-
|
|
1742
|
+
if (q === g) {
|
|
1743
|
+
const o = i << 2;
|
|
1744
|
+
if (T[o] === x && T[o + 1] === y && T[o + 2] === z)
|
|
1745
|
+
return T[o + 3];
|
|
1746
|
+
}
|
|
1747
|
+
i = i + 1 & M;
|
|
1724
1748
|
}
|
|
1725
1749
|
}
|
|
1726
1750
|
put(x, y, z, v) {
|
|
1727
|
-
if ((this.size + 1) * 2 > this.
|
|
1751
|
+
if ((this.size + 1) * 2 > this.tag.length)
|
|
1728
1752
|
this.grow();
|
|
1753
|
+
const g = Int3Table.tagOf(x, y, z), G = this.tag, T = this.t, M = this.mask;
|
|
1729
1754
|
let i = this.slot(x, y, z);
|
|
1730
|
-
const U = this.used, A = this.a, B = this.b, C = this.c;
|
|
1731
1755
|
for (;; ) {
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1756
|
+
const q = G[i];
|
|
1757
|
+
const o = i << 2;
|
|
1758
|
+
if (q === 0) {
|
|
1759
|
+
G[i] = g;
|
|
1760
|
+
T[o] = x;
|
|
1761
|
+
T[o + 1] = y;
|
|
1762
|
+
T[o + 2] = z;
|
|
1763
|
+
T[o + 3] = v;
|
|
1738
1764
|
this.size++;
|
|
1739
1765
|
return -1;
|
|
1740
1766
|
}
|
|
1741
|
-
if (
|
|
1742
|
-
const
|
|
1743
|
-
|
|
1744
|
-
return
|
|
1767
|
+
if (q === g && T[o] === x && T[o + 1] === y && T[o + 2] === z) {
|
|
1768
|
+
const w = T[o + 3];
|
|
1769
|
+
T[o + 3] = v;
|
|
1770
|
+
return w;
|
|
1745
1771
|
}
|
|
1746
|
-
i = i + 1 &
|
|
1772
|
+
i = i + 1 & M;
|
|
1747
1773
|
}
|
|
1748
1774
|
}
|
|
1749
1775
|
grow() {
|
|
1750
|
-
const
|
|
1751
|
-
const n =
|
|
1752
|
-
this.
|
|
1753
|
-
this.
|
|
1754
|
-
this.c = new Int32Array(n);
|
|
1755
|
-
this.vals = new Int32Array(n);
|
|
1756
|
-
this.used = new Uint8Array(n);
|
|
1776
|
+
const T = this.t, G = this.tag;
|
|
1777
|
+
const n = G.length * 2;
|
|
1778
|
+
this.t = new Int32Array(n * 4);
|
|
1779
|
+
this.tag = new Uint8Array(n);
|
|
1757
1780
|
this.mask = n - 1;
|
|
1758
1781
|
this.size = 0;
|
|
1759
|
-
for (let i = 0;i <
|
|
1760
|
-
if (
|
|
1761
|
-
|
|
1782
|
+
for (let i = 0;i < G.length; i++)
|
|
1783
|
+
if (G[i]) {
|
|
1784
|
+
const o = i << 2;
|
|
1785
|
+
this.put(T[o], T[o + 1], T[o + 2], T[o + 3]);
|
|
1786
|
+
}
|
|
1762
1787
|
}
|
|
1763
1788
|
}
|
|
1764
1789
|
var inRange = (x, y, z) => x > -BIG && x < BIG && y > -BIG && y < BIG && z > -BIG && z < BIG;
|
|
@@ -1794,6 +1819,7 @@ function cullCore(insts, H, steps) {
|
|
|
1794
1819
|
return v;
|
|
1795
1820
|
};
|
|
1796
1821
|
const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rInst2 = [], rPrep = [], rBx = [], rBz = [];
|
|
1822
|
+
const rLv = [], rM = [];
|
|
1797
1823
|
const cells = new Int3Table(insts.length * 2);
|
|
1798
1824
|
const nextE = [], rectE = [];
|
|
1799
1825
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
@@ -1858,6 +1884,8 @@ function cullCore(insts, H, steps) {
|
|
|
1858
1884
|
rPrep.push(pp);
|
|
1859
1885
|
rBx.push(b[0]);
|
|
1860
1886
|
rBz.push(b[2]);
|
|
1887
|
+
rLv.push(lv2);
|
|
1888
|
+
rM.push(m[0], m[1], m[2], m[3], m[6], m[9], m[5], m[8], m[11]);
|
|
1861
1889
|
for (let cx = cx0;cx <= cx1; cx++)
|
|
1862
1890
|
for (let cz = cz0;cz <= cz1; cz++) {
|
|
1863
1891
|
if (!inRange(lv2, cx, cz))
|
|
@@ -1868,12 +1896,29 @@ function cullCore(insts, H, steps) {
|
|
|
1868
1896
|
}
|
|
1869
1897
|
}
|
|
1870
1898
|
const SX = [0, 5, -5, 5, -5], SZ = [0, 5, 5, -5, -5];
|
|
1899
|
+
const covers = (ri, x, y, z) => {
|
|
1900
|
+
if (!(x - 6 >= rx0[ri] - 0.5 && x + 6 <= rx1[ri] + 0.5 && z - 6 >= rz0[ri] - 0.5 && z + 6 <= rz1[ri] + 0.5))
|
|
1901
|
+
return false;
|
|
1902
|
+
const o = ri * 9, pp = rPrep[ri], bx = rBx[ri], bz = rBz[ri];
|
|
1903
|
+
const dx = x - rM[o], dy = y - rM[o + 1], dz = z - rM[o + 2];
|
|
1904
|
+
const lx = rM[o + 3] * dx + rM[o + 4] * dy + rM[o + 5] * dz, lz = rM[o + 6] * dx + rM[o + 7] * dy + rM[o + 8] * dz;
|
|
1905
|
+
const { nx, nz, mask: bits } = pp;
|
|
1906
|
+
for (let s = 0;s < 5; s++) {
|
|
1907
|
+
const ca = Math.floor((lx + SX[s] - bx) / 20), cb = Math.floor((lz + SZ[s] - bz) / 20);
|
|
1908
|
+
if (ca < 0 || cb < 0 || ca >= nx || cb >= nz || bits[ca * nz + cb] !== 1)
|
|
1909
|
+
return false;
|
|
1910
|
+
}
|
|
1911
|
+
return true;
|
|
1912
|
+
};
|
|
1871
1913
|
let kl = NaN, kx = NaN, kz = NaN, ke = -1;
|
|
1914
|
+
let lastRi = -1;
|
|
1872
1915
|
const coverStep = (x, y, z, self) => {
|
|
1873
1916
|
const l2 = Math.round(y * 2), gx = Math.floor(x / CELL), gz = Math.floor(z / CELL);
|
|
1874
1917
|
if (!inRange(l2, gx, gz))
|
|
1875
1918
|
return STEP_NEVER;
|
|
1876
1919
|
let best = STEP_NEVER;
|
|
1920
|
+
if (!steps && lastRi >= 0 && rLv[lastRi] === l2 && (rInst[lastRi] !== self || rInst2[lastRi] >= 0) && covers(lastRi, x, y, z))
|
|
1921
|
+
return 0;
|
|
1877
1922
|
if (l2 !== kl || gx !== kx || gz !== kz) {
|
|
1878
1923
|
kl = l2;
|
|
1879
1924
|
kx = gx;
|
|
@@ -1885,29 +1930,15 @@ function cullCore(insts, H, steps) {
|
|
|
1885
1930
|
let by = rInst[ri];
|
|
1886
1931
|
if (by === self && (by = rInst2[ri]) < 0)
|
|
1887
1932
|
continue;
|
|
1888
|
-
if (!(
|
|
1933
|
+
if (!covers(ri, x, y, z))
|
|
1889
1934
|
continue;
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
const dx = x - m[0], dy = y - m[1], dz = z - m[2];
|
|
1894
|
-
const lx = m[3] * dx + m[6] * dy + m[9] * dz, lz = m[5] * dx + m[8] * dy + m[11] * dz;
|
|
1895
|
-
const { nx, nz, mask: bits } = pp;
|
|
1896
|
-
let ok = true;
|
|
1897
|
-
for (let s = 0;s < 5; s++) {
|
|
1898
|
-
const ca = Math.floor((lx + SX[s] - bx) / 20), cb = Math.floor((lz + SZ[s] - bz) / 20);
|
|
1899
|
-
if (ca < 0 || cb < 0 || ca >= nx || cb >= nz || bits[ca * nz + cb] !== 1) {
|
|
1900
|
-
ok = false;
|
|
1901
|
-
break;
|
|
1902
|
-
}
|
|
1903
|
-
}
|
|
1904
|
-
if (ok) {
|
|
1905
|
-
if (!steps)
|
|
1906
|
-
return 0;
|
|
1907
|
-
const st = steps[by];
|
|
1908
|
-
if (st < best)
|
|
1909
|
-
best = st;
|
|
1935
|
+
if (!steps) {
|
|
1936
|
+
lastRi = ri;
|
|
1937
|
+
return 0;
|
|
1910
1938
|
}
|
|
1939
|
+
const st = steps[by];
|
|
1940
|
+
if (st < best)
|
|
1941
|
+
best = st;
|
|
1911
1942
|
}
|
|
1912
1943
|
return best;
|
|
1913
1944
|
};
|
|
@@ -1918,7 +1949,7 @@ function cullCore(insts, H, steps) {
|
|
|
1918
1949
|
nStuds += pp.nStuds;
|
|
1919
1950
|
}
|
|
1920
1951
|
const studHidden = new Uint8Array(nStuds), studUp = new Uint8Array(nStuds);
|
|
1921
|
-
const tops = new Int3Table(nStuds);
|
|
1952
|
+
const tops = new Int3Table(nStuds, 4);
|
|
1922
1953
|
let studsHidden = 0;
|
|
1923
1954
|
const studHideStep = steps ? new Int32Array(nStuds).fill(STEP_NEVER) : undefined;
|
|
1924
1955
|
for (let idx = 0, j = 0;idx < insts.length; idx++) {
|
|
@@ -1966,13 +1997,13 @@ function cullCore(insts, H, steps) {
|
|
|
1966
1997
|
const nx = Math.round((b[3] - b[0]) / 20), nz = Math.round((b[5] - b[2]) / 20);
|
|
1967
1998
|
if (!nx || !nz || nx * nz > 4096)
|
|
1968
1999
|
continue;
|
|
1969
|
-
const m = it.m;
|
|
2000
|
+
const m = it.m, ry = Math.round(m[1] + b[4]);
|
|
1970
2001
|
let all = true, at = 0;
|
|
1971
2002
|
for (let a = 0;a < nx && all; a++)
|
|
1972
2003
|
for (let c = 0;c < nz; c++) {
|
|
1973
2004
|
const lx = b[0] + 10 + 20 * a, lz = b[2] + 10 + 20 * c;
|
|
1974
2005
|
const x = m[0] + m[3] * lx + m[5] * lz, z = m[2] + m[9] * lx + m[11] * lz;
|
|
1975
|
-
const rx = Math.round(x),
|
|
2006
|
+
const rx = Math.round(x), rz = Math.round(z);
|
|
1976
2007
|
const t = inRange(rx, ry, rz) ? tops.get(rx, ry, rz) : -1;
|
|
1977
2008
|
if (t < 0) {
|
|
1978
2009
|
all = false;
|
|
@@ -2020,7 +2051,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
2020
2051
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
2021
2052
|
}
|
|
2022
2053
|
|
|
2023
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2054
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
|
|
2024
2055
|
async function loadPack(url) {
|
|
2025
2056
|
const res = await fetch(url);
|
|
2026
2057
|
if (!res.ok)
|
|
@@ -2941,6 +2972,7 @@ function studTopClosed(b, arr) {
|
|
|
2941
2972
|
_topClosed.set(b, v);
|
|
2942
2973
|
return v;
|
|
2943
2974
|
}
|
|
2975
|
+
var EDGE_CAP_MIN = 4;
|
|
2944
2976
|
|
|
2945
2977
|
class LdrLodRoot extends THREE.LOD {
|
|
2946
2978
|
clusters = [];
|
|
@@ -2948,6 +2980,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2948
2980
|
px = 0.5;
|
|
2949
2981
|
edgePpl = 0.5 / 20;
|
|
2950
2982
|
edgeMinPx = 0.15;
|
|
2983
|
+
edgeCap = 0;
|
|
2951
2984
|
enabled = true;
|
|
2952
2985
|
apply = () => {};
|
|
2953
2986
|
inv = new THREE.Matrix4;
|
|
@@ -2999,7 +3032,7 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2999
3032
|
this.inv.copy(this.matrixWorld).invert();
|
|
3000
3033
|
this.cp.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(this.inv);
|
|
3001
3034
|
const { x, y, z } = this.cp;
|
|
3002
|
-
const tau = this.px, eppl = this.edgePpl;
|
|
3035
|
+
const tau = this.px, eppl = this.edgePpl, cap = this.edgeCap;
|
|
3003
3036
|
for (const c of this.clusters) {
|
|
3004
3037
|
let d;
|
|
3005
3038
|
const B = c.b;
|
|
@@ -3063,6 +3096,13 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
3063
3096
|
else
|
|
3064
3097
|
hi = mid;
|
|
3065
3098
|
}
|
|
3099
|
+
const D = l.userData.ldrD;
|
|
3100
|
+
if (cap > 0 && D) {
|
|
3101
|
+
const dp = D * ppl;
|
|
3102
|
+
const n = Math.max(EDGE_CAP_MIN, Math.ceil(cap * dp * dp));
|
|
3103
|
+
if (n < lo)
|
|
3104
|
+
lo = n;
|
|
3105
|
+
}
|
|
3066
3106
|
l.geometry.drawRange.count = lo * 2;
|
|
3067
3107
|
l.visible = lo > 0 && l.userData.ldrVis !== false;
|
|
3068
3108
|
}
|
|
@@ -3281,6 +3321,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3281
3321
|
root.px = P.lodPx ?? 0.5;
|
|
3282
3322
|
root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
|
|
3283
3323
|
root.edgeMinPx = P.lodEdgeMinPx ?? 0.4;
|
|
3324
|
+
root.edgeCap = P.lodEdgeCap ?? 0.75;
|
|
3284
3325
|
yield root;
|
|
3285
3326
|
const trackVp = (r) => {
|
|
3286
3327
|
const rt = r.getRenderTarget();
|
|
@@ -3341,6 +3382,8 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3341
3382
|
return m;
|
|
3342
3383
|
};
|
|
3343
3384
|
const byPart = new Map;
|
|
3385
|
+
const matMemo = new Map;
|
|
3386
|
+
const bucketMemo = new Map;
|
|
3344
3387
|
const bucketRange = (i0, i1) => {
|
|
3345
3388
|
for (let i = i0;i < i1; i++) {
|
|
3346
3389
|
const it = insts[i];
|
|
@@ -3348,13 +3391,27 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3348
3391
|
if (!p)
|
|
3349
3392
|
continue;
|
|
3350
3393
|
const d = det12(it.m), mirror = d < 0;
|
|
3351
|
-
const
|
|
3352
|
-
|
|
3353
|
-
|
|
3394
|
+
const code = String(it.color), uncert = !!p.uncert || singular12(it.m, d), role = uncert ? 2 : mirror ? 1 : 0;
|
|
3395
|
+
let me = matMemo.get(code);
|
|
3396
|
+
if (!me)
|
|
3397
|
+
matMemo.set(code, me = [undefined, undefined, undefined]);
|
|
3398
|
+
const mat = me[role] ?? (me[role] = materialFor(code, mirror, uncert));
|
|
3399
|
+
let pm = bucketMemo.get(it.part);
|
|
3400
|
+
if (!pm)
|
|
3401
|
+
bucketMemo.set(it.part, pm = new Map);
|
|
3402
|
+
let pb = pm.get(mat);
|
|
3403
|
+
if (!pb)
|
|
3404
|
+
pm.set(mat, pb = [undefined, undefined]);
|
|
3405
|
+
let b = pb[mirror ? 1 : 0];
|
|
3354
3406
|
if (!b) {
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3407
|
+
const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
|
|
3408
|
+
b = byPart.get(k);
|
|
3409
|
+
if (!b) {
|
|
3410
|
+
if (p.uncert)
|
|
3411
|
+
nUncert++;
|
|
3412
|
+
byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
|
|
3413
|
+
}
|
|
3414
|
+
pb[mirror ? 1 : 0] = b;
|
|
3358
3415
|
}
|
|
3359
3416
|
b.ids.push(i);
|
|
3360
3417
|
}
|
|
@@ -3464,6 +3521,14 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
|
|
|
3464
3521
|
edgeObjs.push(l);
|
|
3465
3522
|
cl.lines.push(l);
|
|
3466
3523
|
root.add(l);
|
|
3524
|
+
if (LOD && !im.userData.ldrStud && im.geometry.getAttribute("position")) {
|
|
3525
|
+
const gg = im.geometry;
|
|
3526
|
+
if (!gg.boundingSphere)
|
|
3527
|
+
gg.computeBoundingSphere();
|
|
3528
|
+
const r = gg.boundingSphere.radius;
|
|
3529
|
+
if (r > 0)
|
|
3530
|
+
l.userData.ldrD = 2 * r;
|
|
3531
|
+
}
|
|
3467
3532
|
return l;
|
|
3468
3533
|
};
|
|
3469
3534
|
const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
|
|
@@ -4323,7 +4388,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
4323
4388
|
await new Promise((r) => setTimeout(r, 0));
|
|
4324
4389
|
}
|
|
4325
4390
|
}
|
|
4326
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4391
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/scene.ts
|
|
4327
4392
|
import * as THREE2 from "three";
|
|
4328
4393
|
var _box = new THREE2.Box3;
|
|
4329
4394
|
var _m4 = new THREE2.Matrix4;
|
|
@@ -4530,7 +4595,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4530
4595
|
})();
|
|
4531
4596
|
const multiStep = uniq.length > 1;
|
|
4532
4597
|
const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
|
|
4533
|
-
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, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
|
|
4598
|
+
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: multiStep ? stepOf : undefined, cull: o.precomputedCull });
|
|
4534
4599
|
const applyBuilt = (built, t0) => {
|
|
4535
4600
|
cur = built;
|
|
4536
4601
|
pairs.clear();
|
|
@@ -4678,10 +4743,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4678
4743
|
return finish();
|
|
4679
4744
|
})();
|
|
4680
4745
|
}
|
|
4681
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4746
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
|
|
4682
4747
|
import { decompress as decompress2 } from "fzstd";
|
|
4683
4748
|
|
|
4684
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4749
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/embedded.ts
|
|
4685
4750
|
function splitFiles(text, fallback) {
|
|
4686
4751
|
const files = new Map;
|
|
4687
4752
|
let cur = null, saw = false, skip = false;
|
|
@@ -4756,7 +4821,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
4756
4821
|
return out;
|
|
4757
4822
|
}
|
|
4758
4823
|
|
|
4759
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4824
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
|
|
4760
4825
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
4761
4826
|
var indexCache = new Map;
|
|
4762
4827
|
var shardCache = new Map;
|
|
@@ -5010,10 +5075,10 @@ async function prepareModel(source, o = {}) {
|
|
|
5010
5075
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
5011
5076
|
}
|
|
5012
5077
|
|
|
5013
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5014
|
-
var load_worker_gen_default = 'var Ft=ArrayBuffer,ee=Uint8Array,we=Uint16Array,Rt=Int16Array;var Me=Int32Array,Ie=function(e,t,n){if(ee.prototype.slice)return ee.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 ee(n-t);return r.set(e.subarray(t,n)),r},he=function(e,t,n,r){if(ee.prototype.fill)return ee.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Bt=function(e,t,n,r){if(ee.prototype.copyWithin)return ee.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],te=function(e,t,n){var r=Error(t||Dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,te);if(!n)throw r;return r},Qe=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Ut=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ot=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)te(0);var u=6-s,f=i==3?4:i,a=Qe(e,u,f);u+=f;var l=c?1<<c:s,m=Qe(e,u,l)+(c==1&&256),g=m;if(!s){var d=1<<10+(e[5]>>3);g=d+(d>>3)*(e[5]&7)}if(g>2145386496)te(1);var b=new ee((t==1?m||g:t?0:g)+12);return b[0]=1,b[4]=4,b[8]=8,{b:u+l,y:0,l:0,d:a,w:t&&t!=1?t:b.subarray(12),e:g,o:new Me(b.buffer,0,3),u:m,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return Ut(e,4)+8;te(0)},le=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ge=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)te(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,a=o,l=new Ft(512+(o<<2)),m=new Rt(l,0,256),g=new we(l,0,256),d=new we(l,512,o),b=512+(o<<1),C=new ee(l,b,o),A=new ee(l,b+o);while(c<255&&i>0){var p=le(i+1),h=r>>3,M=(1<<p+1)-1,D=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(r&7)&M,v=(1<<p)-1,L=M-i-1,R=D&v;if(R<L)r+=p,D=R;else if(r+=p+1,D>v)D-=L;if(m[++c]=--D,D==-1)i+=D,C[--a]=c;else i-=D;if(!D)do{var T=r>>3;u=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)te(0);var x=0,w=(o>>1)+(o>>3)+3,E=o-1;for(var z=0;z<=c;++z){var k=m[z];if(k<1){g[z]=-k;continue}for(f=0;f<k;++f){C[x]=z;do x=x+w&E;while(x>=a)}}if(x)te(0);for(f=0;f<o;++f){var P=g[C[f]]++,Y=A[f]=s-le(P);d[f]=(P<<Y)-o}return[r+7>>3,{b:s,s:C,n:A,t:d}]},Nt=function(e,t){var n=0,r=-1,s=new ee(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new we(s.buffer,268);if(o<128){var f=ge(e,t+1,6),a=f[0],l=f[1];t+=o;var m=a<<3,g=e[t];if(!g)te(0);var d=0,b=0,C=l.b,A=C,p=(++t<<3)-8+le(g);for(;;){if(p-=C,p<m)break;var h=p>>3;if(d+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<C)-1,i[++r]=l.s[d],p-=A,p<m)break;h=p>>3,b+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<A)-1,i[++r]=l.s[b],C=l.n[d],d=l.t[d],A=l.n[b],b=l.t[b]}if(++r>255)te(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var D=0;for(n=0;n<r;++n){var v=i[n];if(v>11)te(0);D+=v&&1<<v-1}var L=le(D)+1,R=1<<L,T=R-D;if(T&T-1)te(0);i[r++]=le(T)+1;for(n=0;n<r;++n){var v=i[n];++c[i[n]=v&&L+1-v]}var x=new ee(R<<1),w=x.subarray(0,R),E=x.subarray(R);u[L]=0;for(n=L;n>0;--n){var z=u[n];he(E,n,z,u[n-1]=z+c[n]*(1<<L-n))}if(u[0]!=R)te(0);for(n=0;n<r;++n){var k=i[n];if(k){var P=u[k];he(w,n,P,u[k]=P+(1<<L-k))}}return[t,{n:E,b:L,s:w}]},zt=ge(new ee([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],$t=ge(new ee([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],jt=ge(new ee([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new Me(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Fe=new ee(new Me([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Vt=qe(Fe,0),Re=new ee(new Me([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),_t=qe(Re,3),me=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)te(0);var u=0,f=n.b,a=(r<<3)-8+le(o)-f,l=-1;for(;a>c&&l<s;){var m=a>>3,g=(e[m]|e[m+1]<<8|e[m+2]<<16)>>(a&7);u=(u<<f|g)&i,t[++l]=n.s[u],a-=f=n.n[u]}if(a!=c||l+1!=s)te(0)},Ht=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;me(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),me(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),me(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),me(e.subarray(r),t.subarray(c),n)},Gt=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,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return he(n,e[s],t.y,t.y+=c),n;return he(new ee(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return Ie(e,s,u)}if(i==2){var f=e[s],a=f&3,l=f>>2&3,m=f>>4,g=0,d=0;if(a<2)if(l&1)m|=e[++s]<<4|(l&2&&e[++s]<<12);else m=f>>3;else if(d=l,l<2)m|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(l==2)m|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else m|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new ee(t.m),C=b.length-m;if(a==0)b.set(e.subarray(s,s+=m),C);else if(a==1)he(b,e[s++],C);else{var A=t.h;if(a==2){var p=Nt(e,s);g+=s-(s=p[0]),t.h=A=p[1]}else if(!A)te(0);(d?Ht:me)(e.subarray(s,s+=g),b.subarray(C),A)}var h=e[s++];if(h){if(h==255)h=(e[s++]|e[s++]<<8)+32512;else if(h>127)h=h-128<<8|e[s++];var M=e[s++];if(M&3)te(0);var D=[$t,jt,zt];for(var v=2;v>-1;--v){var L=M>>(v<<1)+2&3;if(L==1){var R=new ee([0,0,e[s++]]);D[v]={s:R.subarray(2,3),n:R.subarray(0,1),t:new we(R.buffer,0,1),b:0}}else if(L==2)r=ge(e,s,9-(v&1)),s=r[0],D[v]=r[1];else if(L==3){if(!t.t)te(0);D[v]=t.t[v]}}var T=t.t=D,x=T[0],w=T[1],E=T[2],z=e[u-1];if(!z)te(0);var k=(u<<3)-8+le(z)-E.b,P=k>>3,Y=0,I=(e[P]|e[P+1]<<8)>>(k&7)&(1<<E.b)-1;P=(k-=w.b)>>3;var j=(e[P]|e[P+1]<<8)>>(k&7)&(1<<w.b)-1;P=(k-=x.b)>>3;var H=(e[P]|e[P+1]<<8)>>(k&7)&(1<<x.b)-1;for(++h;--h;){var Z=E.s[I],O=E.n[I],G=x.s[H],K=x.n[H],J=w.s[j],Q=w.n[j];P=(k-=J)>>3;var S=1<<J,y=S+((e[P]|e[P+1]<<8|e[P+2]<<16|e[P+3]<<24)>>>(k&7)&S-1);P=(k-=Re[G])>>3;var B=_t[G]+((e[P]|e[P+1]<<8|e[P+2]<<16)>>(k&7)&(1<<Re[G])-1);P=(k-=Fe[Z])>>3;var _=Vt[Z]+((e[P]|e[P+1]<<8|e[P+2]<<16)>>(k&7)&(1<<Fe[Z])-1);if(P=(k-=O)>>3,I=E.t[I]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<O)-1),P=(k-=K)>>3,H=x.t[H]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<K)-1),P=(k-=Q)>>3,j=w.t[j]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<Q)-1),y>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=y-=3;else{var W=y-(_!=0);if(W){if(y=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]=y}else y=t.o[0]}for(var v=0;v<_;++v)b[Y+v]=b[C+v];Y+=_,C+=_;var X=Y-y;if(X<0){var N=-X,q=t.e+X;if(N>B)N=B;for(var v=0;v<N;++v)b[Y+v]=t.w[q+v];Y+=N,B-=N,X=0}for(var v=0;v<B;++v)b[Y+v]=b[X+v];Y+=B}if(Y!=C)while(C<b.length)b[Y++]=b[C++];else Y=b.length;if(n)t.y+=Y;else b=Ie(b,0,Y)}else if(n){if(t.y+=m,C)for(var v=0;v<m;++v)b[v]=b[C+v]}else if(C)b=Ie(b,C);return t.b=u,b}te(2)},Wt=function(e,t){if(e.length==1)return e[0];var n=new ee(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 Ae(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ot(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=Gt(e,i,t);if(!c)te(5);if(t)i.e=i.y;else n.push(c),o+=c.length,Bt(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 Wt(n,o)}async function Kt(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(Ae(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 et(e){return new TextDecoder().decode(await Kt(e))}var tt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ve(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 ne=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),De=/^[A-Za-z][A-Za-z0-9_]*$/,Be=new Map;function Ue(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(!Be.has(r))Be.set(r,t);return r}function Oe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&De.test(e))return Ue(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var nt=/^~?\\s*moved\\s+to\\s+(.+)$/i,Xt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Zt=new Set(["FILE","NOFILE","!DATA"]),ut=1000000000000000,ft=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Yt=new Set(["model","submodel","configuration"]),Jt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function rt(e){let t=Jt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return ft.has(n)||Yt.has(n)?n:void 0}function Qt(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 qt(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((l)=>Number.isFinite(l)&&Math.abs(l)<=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 l=0;l<s;l++)c=c.replace(/^\\S+\\s*/,"");let u=Qt(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let a=u.findIndex((l,m)=>m>0&&l.toUpperCase()==="GLOSSMAP");if(a>0&&u[a+1])f.glossmap=u[a+1];if(t)f.next=!0;return f}var en=(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 tn(e){let t=e.length,n=1,r=(a)=>a===32||a===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let a=n;while(n<t&&!r(e.charCodeAt(n)))n++;return a<n?e.slice(a,n):null},o=s();if(o===null)return null;let i=Array(12);for(let a=0;a<12;a++){let l=s();if(l===null)return null;let m=+l;if(!Number.isFinite(m))return null;i[a]=m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=Oe(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:ne(u)}}var nn=[0,12,6,9,12,12];function st(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=Oe(e[1]),r=nn[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=ne(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 pt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],a=null,l=()=>{if(!u)return;let p=en(u.chunks.join("")),h=p[0]===137&&p[1]===80&&p[2]===78&&p[3]===71;(c??=new Map).set(ne(u.name),{name:u.name,bytes:p,...h?{mime:"image/png"}:{}}),u=null},m=!0,g=(p)=>{if(l(),o={name:ne(p),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],a=null,m=!0},d=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=""},A=(p,h)=>{if(a){p.tex=a,a=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!h)p.fallback=!0}else p.tex=M.map};for(let p of e.split(`\n`)){let h=p.trim();if(!h)continue;if(r&&h.charCodeAt(0)>=50&&h.charCodeAt(0)<=53&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){if(u||d)continue;if(!o)g(t);let L=h.slice(2).trimStart(),R=L.search(/\\s/),T={t:h.charCodeAt(0)-48,color:Oe(R<0?L:L.slice(0,R)),p:[],src:h};A(T,!1),o.cmds.push(T),m=!1;continue}if(h.charCodeAt(0)===48&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){let L=2;while(h.charCodeAt(L)===32||h.charCodeAt(L)===9)L++;let R=L;while(R<h.length&&h.charCodeAt(R)!==32&&h.charCodeAt(R)!==9)R++;let T=h.slice(L,R),x=/[^\\x21-\\x7e]/.test(T)?h.slice(L).trim().split(/\\s+/)[0]:T;if(!Xt.has(x)&&!(x.length>=4&&x.length<=6&&Zt.has(x.toUpperCase()))){if(d||u)continue;if(!o)g(t);let w=h.slice(L),E={t:0,text:w};if(T.charCodeAt(0)===33)E.meta=T;if(a=null,m&&!o.org){let k=rt(w);if(k)o.org=k}let z=w.match(nt);if(z&&!o.movedTo){let k=z[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(k))k+=".dat";o.movedTo=ne(k)}o.cmds.push(E);continue}}if(h.charCodeAt(0)===49&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)&&!u&&!d){let L=tn(h);if(L){if(!o)g(t);A(L,!1),o.cmds.push(L),m=!1;continue}}let M=h.split(/\\s+/);if(+M[0]===0){let L=h.slice(1).trim(),R=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(R==="FILE"){let w=L.slice(5).trimStart().split("\\r")[0].trim();if(w){C(),d=!1,g(w);continue}}if(R==="NOFILE"){l(),o=null,d=!0;continue}if(R==="!DATA"){C(),l(),o=null,d=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(d)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let T={t:0,text:L};if(M[1]==="STEP")T.step=!0,f=[],a=null;else if(M[1]==="BFC")T.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,f=[],a=null,(M[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let w=(M[5]??"REL").toUpperCase(),E=(z)=>{let k=Number(z);return Number.isFinite(k)?k:0};T.rotstep={x:E(M[2]),y:E(M[3]),z:E(M[4]),mode:["REL","ABS","ADD"].includes(w)?w:"REL"}}else if(M[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let w=(M[2]??"").toUpperCase();T.bufexchg={op:w==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))T.meta=M[1];if(m&&!o.org){let w=rt(L);if(w)o.org=w}if(M[1]==="!TEXMAP"){let w=(M[2]??"").toUpperCase();if(a=null,w==="START"||w==="NEXT"){let E=qt(L.replace(/^!TEXMAP\\s+\\S+/i,""),w==="NEXT");if(T.texmap={op:w,...E?{map:E}:{}},E)if((o.texmaps??=[]).push(E),w==="START")f.push({map:E,fallback:!1});else a=E}else if(w==="FALLBACK"){T.texmap={op:w};let E=f[f.length-1];if(E)E.fallback=!0}else if(w==="END")T.texmap={op:w},f.pop()}else if(M[1]==="!:"){a=null;let w=st(M.slice(2));if(w)A(w,!0),T.geom=w}else a=null;let x=L.match(nt);if(x&&!o.movedTo){let w=x[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(w))w+=".dat";o.movedTo=ne(w)}o.cmds.push(T);continue}if(u||d)continue;if(!o)g(t);let v=st(M);if(!v){if(/^[2-5][ \\t]/.test(h))m=!1;continue}A(v,!1),o.cmds.push(v),m=!1}return l(),c?{main:i,files:s,data:c}:{main:i,files:s}}var Pn=Math.PI/180;function mt(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 ht(e,t){let[n,r,s,o,i,c,u,f,a,l,m,g]=e,[d,b,C,A,p,h,M,D,v,L,R,T]=t;return[o*d+i*b+c*C+n,u*d+f*b+a*C+r,l*d+m*b+g*C+s,o*A+i*M+c*L,o*p+i*D+c*R,o*h+i*v+c*T,u*A+f*M+a*L,u*p+f*D+a*R,u*h+f*v+a*T,l*A+m*M+g*L,l*p+m*D+g*R,l*h+m*v+g*T]}var Ne=[0,0,0,1,0,0,0,1,0,0,0,1];var ot=new WeakMap,rn=/^(s|8|48)\\//;function ze(e,t){let n=e.files.get(ne(t));if(!n)return"part";let r=ot.get(n);if(r)return r;if(n.org)r=ft.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&&rn.test(s.file))?"part":"model";return ot.set(n,r),r}var it=new WeakMap;function gt(e){let t=it.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 it.set(e,t),t}var at=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Be.get(e)??String(e):String(e),sn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${at(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${at(e.color)} ${e.p.join(" ")}`,$e=(e,t)=>`${ne(e)}#${t}`;function on(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:$e(e.name,t),cmds:n}}function dt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...on(e,t).cmds.map(sn)].join(`\n`)+`\n`}function je(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 bt(e){let[t,n,r,s,o,i,c,u,f,a,l,m]=e,g=u*m-f*l,d=-(c*m-f*a),b=c*l-u*a,C=s*g+o*d+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let A=1/C,p=[g*A,-(o*m-i*l)*A,(o*f-i*u)*A,d*A,(s*m-i*a)*A,-(s*f-i*c)*A,b*A,-(s*l-o*a)*A,(s*u-o*c)*A];return[-(p[0]*t+p[1]*n+p[2]*r),-(p[3]*t+p[4]*n+p[5]*r),-(p[6]*t+p[7]*n+p[8]*r),...p]}var an=(e)=>String(+e.toFixed(6)||0),lt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function yt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(an).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${lt(t.texture)}${t.glossmap?" GLOSSMAP "+lt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${ne(e)}\n0 !TEXMAP END\n`;return{name:`${ne(e)}#tex-${je(r)}`,source:r}}var ln=(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 cn(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),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var ct=new WeakMap;function xt(e){let t=ct.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=cn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:ln(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),ct.set(e,n),n}class Ve 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])<=ut))return!1;return!0},wt=999999,vt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ct=new WeakMap,Mt=new WeakMap;function fn(e,t){let n=Mt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ct.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Mt.set(t,n);let r=n.parts.get(e);if(!r){let s=ne(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-${je(o)}`,source:o},n.parts.set(e,r)}return r}function pn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,a=t.maxInstances??2000000,l=0,m=(d,b)=>{let C=d.name+"#"+b,A=c.get(C);if(!A){let p;A=Object.assign(()=>p??=dt(d,b),{file:d,step:b}),c.set(C,A)}return A},g=(d,b,C,A,p,h,M,D,v=null,L=[],R=[],T=void 0,x=null)=>{let w=d.files.get(b);if(!w||M>r||f.has(w))return;if(++l>a)throw new Ve("model",a);f.add(w);let E=x,z=0,k=M>0?++u:0,P=i&&k?[...L,k]:L,Y=i&&k?[...R,C]:R,I=i&&!v?new Map:null,j=-1,H=0,Z=(S,y,B,_,W,X,N)=>{if(j!==z)j=z,H=0;let q=I?.get(z+"|"+y);if(q)return q.n++,g(S,S===d?y:S.main,B,_,p+"/"+y,[...W,wt],M+1,X,[...W,wt],P,Y,N,E);let U=[...W,H++],F=n.length;g(S,S===d?y:S.main,B,_,p+"/"+y,U,M+1,X,v,P,Y,N,E),I?.set(z+"|"+y,{n:1,from:F,to:n.length})},O=xt(w),G=s?gt(w):[],K=0,J=(S,y,B,_,W,X,N,q,U)=>{if(v)_=v;if(++l>a)throw new Ve("model",a);let F={part:S,color:y,m:B,step:_[0],steps:_,localStep:W,path:p};if(q)F.colour=q;if(k){if(F.sub=k,i)F.subPath=P,F.subMats=Y}if(X)F.embedded=!0;if(N){let re=yt(S,N);F.texPart=re.name,F.texSource=re.source}else if(U){let re=fn(S,U);F.colPart=re.name,F.colSource=re.source}let V=O[W];if(V)F.view=V;return n.push(F),F},Q=(S)=>{while(K<G.length&&G[K]<=S){let y=G[K++];J($e(w.name,y),A,C,[...h,y],y,!1,null,T,x).source=m(w,y)}};for(let S of w.cmds){if(S.t===0&&S.step){z++;continue}let y=S;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){Q(z);continue}if(y.t===0){if(y.meta==="!COLOUR"){let V=hn(y.text);if(V&&V.code!==16&&V.code!==24)Ct.set(V,y.text),(E=new Map(E??[])).set(V.code,V);continue}if(o&&y.geom?.t===1)y=y.geom;else continue}if(y.t!==1)continue;if(o&&y.fallback)continue;let B=ht(C,y.m);if(!un(B))continue;let _=y.color===16?A:y.color,W=y.color===16?T:E?.get(y.color),X=[...h,z],N=o?y.tex??D:null,q=N?bt(y.m):null,U=N&&q?mt(N,q):null;if(d.files.has(y.file)){if(ze(d,y.file)==="model"){Z(d,y.file,B,_,X,U,W);continue}J(y.file,_,B,X,z,!0,U,W,E);continue}let F=t.resolveModel?.(y.file);if(F){Z(F,y.file,B,_,X,U,W);continue}J(y.file,_,B,X,z,!1,U,W,E)}if(Q(1/0),f.delete(w),I){for(let S of I.values())if(S.n>1)for(let y=S.from;y<S.to;y++)n[y].mult??=S.n}};if(ze(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ne],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ne,16,e.main,[],0,null),n}function Tt(e,t="main.ldr",n){return pn(pt(e,t,{geometryText:!0}),n)}var mn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function _e(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 At(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=_e(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 hn(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,u=0,f={type:"default"},a=1;while(a<n.length){let l=n[a].toUpperCase(),m=n[a+1];if(l==="CODE")s=m!==void 0&&De.test(m)?Ue(m):m!==void 0&&/^\\d+$/.test(m)?+m:NaN,a+=2;else if(l==="VALUE"){let g=_e(m);if(g)o=g;a+=2}else if(l==="EDGE")i=_e(m)??m,a+=2;else if(l==="ALPHA")c=+m,a+=2;else if(l==="LUMINANCE")u=+m,a+=2;else if(l==="CHROME")f={type:"chrome"},a+=1;else if(l==="PEARLESCENT")f={type:"pearlescent"},a+=1;else if(l==="RUBBER")f={type:"rubber"},a+=1;else if(l==="MATTE_METALLIC")f={type:"matte_metallic"},a+=1;else if(l==="METAL")f={type:"metal"},a+=1;else if(l==="MATERIAL"){let g=(n[a+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:d,next:b}=At(n,a+2);f={type:"glitter",material:d},a=b}else if(g==="SPECKLE"){let{grain:d,next:b}=At(n,a+2);f={type:"speckle",material:d},a=b}else if(g==="FABRIC"){let d=(n[a+2]||"").toUpperCase(),b=["VELVET","CANVAS","STRING","FUR"].includes(d)?d.toLowerCase():void 0;f={type:"fabric",kind:b},a+=b?3:2}else a=n.length}else if(mn.has(l))a+=1;else a+=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(u)?u:0,finish:f}}function gn(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 He(e){let t=gn(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 dn(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(ne(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(ne(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var bn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?ne(t.slice(14).join(" ")):null};function yn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Lt(e,t,n="main.ldr"){let r=dn(e,n),s=new Map;for(let o of t){let i=ne(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let a of r.get(u.pop())){let l=bn(a);if(l&&r.has(l)&&!c.has(l))c.add(l),u.push(l)}let f=[i,...[...c].filter((a)=>a!==i).sort()].map((a)=>"0 FILE "+(a===i?"":a)+`\n`+r.get(a).join(`\n`)).join(`\n`);s.set(i,`emb/${yn(f)}.dat`)}return s}var St=(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,Et=new WeakMap;function Ge(e,t){let n=Et.get(e);if(!n)Et.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],u=[];s.studs.forEach((m,g)=>{c.push(m[0]),u.push(m[1]);for(let d=0;d<12;d++)i[g*12+d]=m[2+d]});let f=null,a=0,l=0;if(s.mask){a=s.mask[0],l=s.mask[1];let m=s.mask[2];f=new Uint8Array(m.length);for(let g=0;g<m.length;g++)f[g]=m.charCodeAt(g)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:a,nz:l}),r}var fe=1073741824;class We{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,c=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&c[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,c=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,c[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&c[s]===t&&u[s]===n){let f=this.vals[s];return this.vals[s]=r,f}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var pe=(e,t,n)=>e>-fe&&e<fe&&t>-fe&&t<fe&&n>-fe&&n<fe,de=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 wn(e,t,n){let s=new Map,o=(I)=>{let j=s.get(I);if(j===void 0)s.set(I,j=xn(t,I));return j},i=[],c=[],u=[],f=[],a=[],l=[],m=[],g=[],d=[],b=new We(e.length*2),C=[],A=[];for(let I=0;I<e.length;I++){let j=e[I],H=j.m,Z=t.parts[j.part];if(!Z||!Z.mask||!St(H)||o(j.color))continue;let O=Z.bbox,G=1/0,K=-1/0,J=1/0,Q=-1/0;for(let U=0;U<2;U++)for(let F=0;F<2;F++){let V=U?O[3]:O[0],re=F?O[5]:O[2],oe=H[0]+H[3]*V+H[5]*re,se=H[2]+H[9]*V+H[11]*re;if(oe<G)G=oe;if(oe>K)K=oe;if(se<J)J=se;if(se>Q)Q=se}let S=Math.round((H[1]+O[4])*2),y=Ge(t,j.part),B=Math.floor(G/40),_=Math.floor(K/40),W=Math.floor(J/40),X=Math.floor(Q/40);if(!((_-B+1)*(X-W+1)<=65536)||!pe(S,B,W)||!pe(S,_,X))continue;let N=-1;for(let U=b.get(S,B,W),F=0;U>=0&&F<8;U=C[U],F++){let V=A[U];if(i[V]!==G||c[V]!==K||u[V]!==J||f[V]!==Q||m[V]!==y)continue;let re=e[a[V]].m,oe=!0;for(let se=0;se<12;se++)if(re[se]!==H[se]){oe=!1;break}if(oe){N=V;break}}if(N>=0){let U=n?n[I]:0;if(n&&U<n[a[N]])l[N]=a[N],a[N]=I;else if(l[N]<0||n&&U<n[l[N]])l[N]=I;continue}let q=a.length;i.push(G),c.push(K),u.push(J),f.push(Q),a.push(I),l.push(-1),m.push(y),g.push(O[0]),d.push(O[2]);for(let U=B;U<=_;U++)for(let F=W;F<=X;F++){if(!pe(S,U,F))continue;let V=A.length;A.push(q),C.push(b.put(S,U,F,V))}}let p=[0,5,-5,5,-5],h=[0,5,5,-5,-5],M=NaN,D=NaN,v=NaN,L=-1,R=(I,j,H,Z)=>{let O=Math.round(j*2),G=Math.floor(I/40),K=Math.floor(H/40);if(!pe(O,G,K))return de;let J=de;if(O!==M||G!==D||K!==v)M=O,D=G,v=K,L=b.get(O,G,K);for(let Q=L;Q>=0;Q=C[Q]){let S=A[Q],y=a[S];if(y===Z&&(y=l[S])<0)continue;if(!(I-6>=i[S]-0.5&&I+6<=c[S]+0.5&&H-6>=u[S]-0.5&&H+6<=f[S]+0.5))continue;let B=e[a[S]].m,_=m[S],W=g[S],X=d[S],N=I-B[0],q=j-B[1],U=H-B[2],F=B[3]*N+B[6]*q+B[9]*U,V=B[5]*N+B[8]*q+B[11]*U,{nx:re,nz:oe,mask:se}=_,ce=!0;for(let ie=0;ie<5;ie++){let ae=Math.floor((F+p[ie]-W)/20),ue=Math.floor((V+h[ie]-X)/20);if(ae<0||ue<0||ae>=re||ue>=oe||se[ae*oe+ue]!==1){ce=!1;break}}if(ce){if(!n)return 0;let ie=n[y];if(ie<J)J=ie}}return J},T=0;for(let I of e){let j=Ge(t,I.part);if(j)T+=j.nStuds}let x=new Uint8Array(T),w=new Uint8Array(T),E=new We(T),z=0,k=n?new Int32Array(T).fill(de):void 0;for(let I=0,j=0;I<e.length;I++){let H=e[I],Z=Ge(t,H.part);if(!Z)continue;let O=H.m,G=Z.studM,K=O[0],J=O[1],Q=O[2],S=O[3],y=O[4],B=O[5],_=O[6],W=O[7],X=O[8],N=O[9],q=O[10],U=O[11];for(let F=0;F<Z.nStuds;F++,j++){let V=F*12,re=G[V+4],oe=G[V+7],se=G[V+10];if(!(Math.abs(_*re+W*oe+X*se-1)<0.001&&Math.abs(S*re+y*oe+B*se)<0.001&&Math.abs(N*re+q*oe+U*se)<0.001))continue;w[j]=1;let ce=G[V],ie=G[V+1],ae=G[V+2],ue=K+S*ce+y*ie+B*ae,Ke=J+_*ce+W*ie+X*ae,Xe=Q+N*ce+q*ie+U*ae,Ze=R(ue,Ke,Xe,I);if(Ze!==de){if(x[j]=1,z++,k)k[j]=Ze}let be=Math.round(ue),ye=Math.round(Ke),xe=Math.round(Xe);if(!pe(be,ye,xe))continue;if(!n){E.put(be,ye,xe,1);continue}let Ye=n[I],Je=E.get(be,ye,xe);if(Je<0||Ye<Je)E.put(be,ye,xe,Ye)}}let P=new Uint8Array(e.length),Y=n?new Int32Array(e.length).fill(de):void 0;for(let I=0;I<e.length;I++){let j=e[I],H=t.parts[j.part];if(!H||!H.under||!St(j.m)||o(j.color))continue;let Z=H.bbox,O=Math.round((Z[3]-Z[0])/20),G=Math.round((Z[5]-Z[2])/20);if(!O||!G||O*G>4096)continue;let K=j.m,J=!0,Q=0;for(let S=0;S<O&&J;S++)for(let y=0;y<G;y++){let B=Z[0]+10+20*S,_=Z[2]+10+20*y,W=K[0]+K[3]*B+K[5]*_,X=K[2]+K[9]*B+K[11]*_,N=Math.round(W),q=Math.round(K[1]+Z[4]),U=Math.round(X),F=pe(N,q,U)?E.get(N,q,U):-1;if(F<0){J=!1;break}if(F>Q)Q=F}if(J){if(P[I]=1,Y)Y[I]=Q}}return{nStuds:T,studHidden:x,studUp:w,underHidden:P,studsHidden:z,studHideStep:k,underHideStep:Y}}function Mn(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 m=l.colour;if(!m)return String(l.color);let g=o.get(m);if(g!==void 0)return g;let d=t.colorTable?.[l.color],b=d?.hex??t.colors?.[l.color],C=d?He({alpha:d.alpha??255,luminance:d.luminance??0,finish:d.finish??{type:"default"}}):"default:op",A=He(m);if(g=b&&b.toUpperCase()===m.hex.toUpperCase()&&C===A?String(l.color):m.hex.toUpperCase()+"/"+A,g!==String(l.color))s.set(g,m);return o.set(m,g),g},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=c.map((l)=>vt(l.steps)),f=[...new Set(u)].sort(),a=new Map(f.map((l,m)=>[l,m]));return{all:c,stepOf:u.map((l)=>a.get(l)),nSteps:f.length,localColours:s}}function Ce(e,t,n=!0){let r=Mn(e,t,n);return wn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var ke="https://ldr-demo.vercel.app/cdn/v1/",Le=new Map,Te=new Map;function Se(e=ke,t=fetch){let n=Le.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(()=>Le.delete(e)),Le.set(e,n);return n}var An=(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"),Ee=(e,t)=>An(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ee(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ee(r,t)])):e;function vn(e,t={}){let n=[],r=0,s={},o={};for(let m of e){let g=m.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let d=new DataView(g).getUint32(0,!0),b=new Uint8Array(g,4+d),C=r;n.push(b),r+=b.byteLength;let A=(4-r%4)%4;if(A)n.push(new Uint8Array(A)),r+=A;for(let[p,h]of Object.entries(m.header.parts??{}))if(!(p in s))s[p]=Ee(h,C);for(let[p,h]of Object.entries(m.header.studKinds??{}))if(!(p in o))o[p]=Ee(h,C)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,a=new Uint8Array(f+r);new DataView(a.buffer).setUint32(0,c.length+u,!0),a.set(c,4),a.fill(32,4+c.length,f);let l=f;for(let m of n)a.set(m,l),l+=m.byteLength;return ve(a.buffer)}async function Cn(e,t={}){e=[...e];try{return await kt(e,t)}catch(n){let r=t.cdn??ke,s=t.fetch??fetch;Le.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await kt(e,{...t,fetch:o})}catch{throw n}}}async function kt(e,t){let n=t.cdn??ke,r=t.fetch??fetch,s=t.gap??16384,o=await Se(n,r),i=[...new Set([...e].map(ne))],c=[],u=[];for(let p of i){if(Te.has(n+p))continue;let h=o.parts[p];if(h)u.push({name:p,off:h[0],len:h[1],file:h[2]??0});else c.push(p)}u.sort((p,h)=>p.file-h.file||p.off-h.off);let f=[];for(let p of u){let h=f[f.length-1];if(h&&h.file===p.file&&p.off-h.end<=s)h.end=Math.max(h.end,p.off+p.len),h.items.push(p);else f.push({file:p.file,start:p.off,end:p.off+p.len,items:[p]})}let a=0,l=0,m=0,g=new Map,d=async()=>{while(m<f.length){let p=f[m++],h=g.get(p.file);if(h)h=h.subarray(p.start,p.end);else{let M=await r(new URL(o.archives[p.file],n).href,{headers:{Range:`bytes=${p.start}-${p.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(l++,h=new Uint8Array(await M.arrayBuffer()),a+=h.byteLength,M.status===200)g.set(p.file,h),h=h.subarray(p.start,p.end)}for(let M of p.items){let D=Ae(h.subarray(M.off-p.start,M.off-p.start+M.len)),v=D.buffer.slice(D.byteOffset,D.byteOffset+D.byteLength);Te.set(n+M.name,ve(v))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},d));let b=i.filter((p)=>Te.has(n+p)).map((p)=>Te.get(n+p)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?vn(b,C):ve(Tn(C)),missing:c,requests:l,bytes:a}}function Tn(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 Ln(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 Pt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):ne(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[1]}return{bodyTris:r,packBytes:s,known:o}}class Pe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function It(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Se(t.cdn??ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(x)=>{if(!x.ok)throw Error(`ldr: ${x.status} fetching ${e}`);return et(await x.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":tt(e)),u=Tt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let a=Lt(o,new Set(u.filter((x)=>x.embedded).map((x)=>x.part)),c),l=(x,w)=>t.maxBodyTris!=null&&x>t.maxBodyTris||t.maxPackBytes!=null&&w>t.maxPackBytes,m=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(x)=>new Pe({...x,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),d="full";if(m){let x=Pt(u,a,await s);if(l(x.known?x.bodyTris:0,x.packBytes)){if(!t.lowCdn)throw g(x);let w=await Se(t.lowCdn,r).catch(()=>null);if(!w)throw g(x);let E=Pt(u,a,w);if(l(E.known?E.bodyTris:0,E.packBytes))throw g(E);d="low"}}let b=[...u.filter((x)=>!x.embedded).map((x)=>x.part),...a.values()],C=async()=>{let x=await Cn(b,d==="low"?{...t,cdn:t.lowCdn}:t);for(let[w,E]of a){let z=x.pack.header.parts[E];if(z)x.pack.header.parts[w]=z}return{...x,packBytes:x.pack.buffer?.byteLength??x.pack.bytes??0,bodyTris:Ln(u,x.pack)}},A=await C();if(m&&l(A.bodyTris,A.packBytes)&&d==="full"&&t.lowCdn&&await Se(t.lowCdn,r).then(()=>!0,()=>!1)){d="low";let x=A;A=await C(),A.requests+=x.requests,A.bytes+=x.bytes}if(m&&l(A.bodyTris,A.packBytes))throw g(A);let{pack:p,missing:h,requests:M,bytes:D}=A,v=new Map([...a].map(([x,w])=>[w,x])),L=h.map((x)=>v.get(x)??x),R=performance.now(),T=t.cull?Ce(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,tier:d,missing:L,requests:M,bytes:D,cull:T,timings:{fetchModel:i-n,parse:f-i,parts:R-f,...T?{cull:performance.now()-R}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await It(n,{...r,cull:!1,onParsed:(a)=>self.postMessage({id:t,insts:a})}),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=Ce(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let a of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(a)f.push(a.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Pe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
5078
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/load-worker.gen.ts
|
|
5079
|
+
var load_worker_gen_default = 'var zt=ArrayBuffer,Q=Uint8Array,Me=Uint16Array,$t=Int16Array;var Ae=Int32Array,De=function(e,t,n){if(Q.prototype.slice)return Q.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Q(n-t);return r.set(e.subarray(t,n)),r},he=function(e,t,n,r){if(Q.prototype.fill)return Q.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},jt=function(e,t,n,r){if(Q.prototype.copyWithin)return Q.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Vt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Vt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},ot=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},_t=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gt=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)q(0);var u=6-s,f=i==3?4:i,a=ot(e,u,f);u+=f;var l=c?1<<c:s,m=ot(e,u,l)+(c==1&&256),g=m;if(!s){var b=1<<10+(e[5]>>3);g=b+(b>>3)*(e[5]&7)}if(g>2145386496)q(1);var y=new Q((t==1?m||g:t?0:g)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+l,y:0,l:0,d:a,w:t&&t!=1?t:y.subarray(12),e:g,o:new Ae(y.buffer,0,3),u:m,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return _t(e,4)+8;q(0)},ue=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ge=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,a=o,l=new zt(512+(o<<2)),m=new $t(l,0,256),g=new Me(l,0,256),b=new Me(l,512,o),y=512+(o<<1),A=new Q(l,y,o),v=new Q(l,y+o);while(c<255&&i>0){var p=ue(i+1),h=r>>3,M=(1<<p+1)-1,z=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(r&7)&M,C=(1<<p)-1,L=M-i-1,I=z&C;if(I<L)r+=p,z=I;else if(r+=p+1,z>C)z-=L;if(m[++c]=--z,z==-1)i+=z,A[--a]=c;else i-=z;if(!z)do{var S=r>>3;u=(e[S]|e[S+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)q(0);var w=0,x=(o>>1)+(o>>3)+3,P=o-1;for(var O=0;O<=c;++O){var E=m[O];if(E<1){g[O]=-E;continue}for(f=0;f<E;++f){A[w]=O;do w=w+x&P;while(w>=a)}}if(w)q(0);for(f=0;f<o;++f){var F=g[A[f]]++,X=v[f]=s-ue(F);b[f]=(F<<X)-o}return[r+7>>3,{b:s,s:A,n:v,t:b}]},Ht=function(e,t){var n=0,r=-1,s=new Q(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new Me(s.buffer,268);if(o<128){var f=ge(e,t+1,6),a=f[0],l=f[1];t+=o;var m=a<<3,g=e[t];if(!g)q(0);var b=0,y=0,A=l.b,v=A,p=(++t<<3)-8+ue(g);for(;;){if(p-=A,p<m)break;var h=p>>3;if(b+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<A)-1,i[++r]=l.s[b],p-=v,p<m)break;h=p>>3,y+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<v)-1,i[++r]=l.s[y],A=l.n[b],b=l.t[b],v=l.n[y],y=l.t[y]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var z=0;for(n=0;n<r;++n){var C=i[n];if(C>11)q(0);z+=C&&1<<C-1}var L=ue(z)+1,I=1<<L,S=I-z;if(S&S-1)q(0);i[r++]=ue(S)+1;for(n=0;n<r;++n){var C=i[n];++c[i[n]=C&&L+1-C]}var w=new Q(I<<1),x=w.subarray(0,I),P=w.subarray(I);u[L]=0;for(n=L;n>0;--n){var O=u[n];he(P,n,O,u[n-1]=O+c[n]*(1<<L-n))}if(u[0]!=I)q(0);for(n=0;n<r;++n){var E=i[n];if(E){var F=u[E];he(x,n,F,u[E]=F+(1<<L-E))}}return[t,{n:P,b:L,s:x}]},Wt=ge(new Q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Kt=ge(new Q([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Xt=ge(new Q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],it=function(e,t){var n=e.length,r=new Ae(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ue=new Q(new Ae([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Zt=it(Ue,0),Oe=new Q(new Ae([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Yt=it(Oe,3),me=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)q(0);var u=0,f=n.b,a=(r<<3)-8+ue(o)-f,l=-1;for(;a>c&&l<s;){var m=a>>3,g=(e[m]|e[m+1]<<8|e[m+2]<<16)>>(a&7);u=(u<<f|g)&i,t[++l]=n.s[u],a-=f=n.n[u]}if(a!=c||l+1!=s)q(0)},Jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;me(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),me(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),me(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),me(e.subarray(r),t.subarray(c),n)},Qt=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,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return he(n,e[s],t.y,t.y+=c),n;return he(new Q(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return De(e,s,u)}if(i==2){var f=e[s],a=f&3,l=f>>2&3,m=f>>4,g=0,b=0;if(a<2)if(l&1)m|=e[++s]<<4|(l&2&&e[++s]<<12);else m=f>>3;else if(b=l,l<2)m|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(l==2)m|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else m|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Q(t.m),A=y.length-m;if(a==0)y.set(e.subarray(s,s+=m),A);else if(a==1)he(y,e[s++],A);else{var v=t.h;if(a==2){var p=Ht(e,s);g+=s-(s=p[0]),t.h=v=p[1]}else if(!v)q(0);(b?Jt:me)(e.subarray(s,s+=g),y.subarray(A),v)}var h=e[s++];if(h){if(h==255)h=(e[s++]|e[s++]<<8)+32512;else if(h>127)h=h-128<<8|e[s++];var M=e[s++];if(M&3)q(0);var z=[Kt,Xt,Wt];for(var C=2;C>-1;--C){var L=M>>(C<<1)+2&3;if(L==1){var I=new Q([0,0,e[s++]]);z[C]={s:I.subarray(2,3),n:I.subarray(0,1),t:new Me(I.buffer,0,1),b:0}}else if(L==2)r=ge(e,s,9-(C&1)),s=r[0],z[C]=r[1];else if(L==3){if(!t.t)q(0);z[C]=t.t[C]}}var S=t.t=z,w=S[0],x=S[1],P=S[2],O=e[u-1];if(!O)q(0);var E=(u<<3)-8+ue(O)-P.b,F=E>>3,X=0,se=(e[F]|e[F+1]<<8)>>(E&7)&(1<<P.b)-1;F=(E-=x.b)>>3;var oe=(e[F]|e[F+1]<<8)>>(E&7)&(1<<x.b)-1;F=(E-=w.b)>>3;var ae=(e[F]|e[F+1]<<8)>>(E&7)&(1<<w.b)-1;for(++h;--h;){var le=P.s[se],R=P.n[se],U=w.s[ae],B=w.n[ae],G=x.s[oe],k=x.n[oe];F=(E-=G)>>3;var T=1<<G,d=T+((e[F]|e[F+1]<<8|e[F+2]<<16|e[F+3]<<24)>>>(E&7)&T-1);F=(E-=Oe[U])>>3;var j=Yt[U]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Oe[U])-1);F=(E-=Ue[le])>>3;var N=Zt[le]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Ue[le])-1);if(F=(E-=R)>>3,se=P.t[se]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<R)-1),F=(E-=B)>>3,ae=w.t[ae]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<B)-1),F=(E-=k)>>3,oe=x.t[oe]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<k)-1),d>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=d-=3;else{var D=d-(N!=0);if(D){if(d=D==3?t.o[0]-1:t.o[D],D>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=d}else d=t.o[0]}for(var C=0;C<N;++C)y[X+C]=y[A+C];X+=N,A+=N;var V=X-d;if(V<0){var _=-V,Y=t.e+V;if(_>j)_=j;for(var C=0;C<_;++C)y[X+C]=t.w[Y+C];X+=_,j-=_,V=0}for(var C=0;C<j;++C)y[X+C]=y[V+C];X+=j}if(X!=A)while(A<y.length)y[X++]=y[A++];else X=y.length;if(n)t.y+=X;else y=De(y,0,X)}else if(n){if(t.y+=m,A)for(var C=0;C<m;++C)y[C]=y[A+C]}else if(A)y=De(y,A);return t.b=u,y}q(2)},qt=function(e,t){if(e.length==1)return e[0];var n=new Q(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Gt(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=Qt(e,i,t);if(!c)q(5);if(t)i.e=i.y;else n.push(c),o+=c.length,jt(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 qt(n,o)}async function en(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 at(e){return new TextDecoder().decode(await en(e))}var lt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function Ce(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 ee=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),ze=/^[A-Za-z][A-Za-z0-9_]*$/,Ne=new Map;function $e(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(!Ne.has(r))Ne.set(r,t);return r}function je(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&ze.test(e))return $e(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var ct=/^~?\\s*moved\\s+to\\s+(.+)$/i,tn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),nn=new Set(["FILE","NOFILE","!DATA"]),bt=1000000000000000,yt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),rn=new Set(["model","submodel","configuration"]),sn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function ut(e){let t=sn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return yt.has(n)||rn.has(n)?n:void 0}function on(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 an(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((l)=>Number.isFinite(l)&&Math.abs(l)<=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 l=0;l<s;l++)c=c.replace(/^\\S+\\s*/,"");let u=on(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let a=u.findIndex((l,m)=>m>0&&l.toUpperCase()==="GLOSSMAP");if(a>0&&u[a+1])f.glossmap=u[a+1];if(t)f.next=!0;return f}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 cn(e){let t=e.length,n=1,r=(a)=>a===32||a===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let a=n;while(n<t&&!r(e.charCodeAt(n)))n++;return a<n?e.slice(a,n):null},o=s();if(o===null)return null;let i=Array(12);for(let a=0;a<12;a++){let l=s();if(l===null)return null;let m=+l;if(!Number.isFinite(m))return null;i[a]=m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=je(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:ee(u)}}var un=[0,12,6,9,12,12];function ft(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=je(e[1]),r=un[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=ee(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 xt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],a=null,l=()=>{if(!u)return;let p=ln(u.chunks.join("")),h=p[0]===137&&p[1]===80&&p[2]===78&&p[3]===71;(c??=new Map).set(ee(u.name),{name:u.name,bytes:p,...h?{mime:"image/png"}:{}}),u=null},m=!0,g=(p)=>{if(l(),o={name:ee(p),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],a=null,m=!0},b=!1,y=!1,A=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},v=(p,h)=>{if(a){p.tex=a,a=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!h)p.fallback=!0}else p.tex=M.map};for(let p of e.split(`\n`)){let h=p.trim();if(!h)continue;if(r&&h.charCodeAt(0)>=50&&h.charCodeAt(0)<=53&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){if(u||b)continue;if(!o)g(t);let L=h.slice(2).trimStart(),I=L.search(/\\s/),S={t:h.charCodeAt(0)-48,color:je(I<0?L:L.slice(0,I)),p:[],src:h};v(S,!1),o.cmds.push(S),m=!1;continue}if(h.charCodeAt(0)===48&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){let L=2;while(h.charCodeAt(L)===32||h.charCodeAt(L)===9)L++;let I=L;while(I<h.length&&h.charCodeAt(I)!==32&&h.charCodeAt(I)!==9)I++;let S=h.slice(L,I),w=/[^\\x21-\\x7e]/.test(S)?h.slice(L).trim().split(/\\s+/)[0]:S;if(!tn.has(w)&&!(w.length>=4&&w.length<=6&&nn.has(w.toUpperCase()))){if(b||u)continue;if(!o)g(t);let x=h.slice(L),P={t:0,text:x};if(S.charCodeAt(0)===33)P.meta=S;if(a=null,m&&!o.org){let E=ut(x);if(E)o.org=E}let O=x.match(ct);if(O&&!o.movedTo){let E=O[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=ee(E)}o.cmds.push(P);continue}}if(h.charCodeAt(0)===49&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)&&!u&&!b){let L=cn(h);if(L){if(!o)g(t);v(L,!1),o.cmds.push(L),m=!1;continue}}let M=h.split(/\\s+/);if(+M[0]===0){let L=h.slice(1).trim(),I=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(I==="FILE"){let x=L.slice(5).trimStart().split("\\r")[0].trim();if(x){A(),b=!1,g(x);continue}}if(I==="NOFILE"){l(),o=null,b=!0;continue}if(I==="!DATA"){A(),l(),o=null,b=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(b)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let S={t:0,text:L};if(M[1]==="STEP")S.step=!0,f=[],a=null;else if(M[1]==="BFC")S.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(S.meta="ROTSTEP",S.step=!0,f=[],a=null,(M[2]??"").toUpperCase()==="END")S.rotstep={x:0,y:0,z:0,mode:"END"};else{let x=(M[5]??"REL").toUpperCase(),P=(O)=>{let E=Number(O);return Number.isFinite(E)?E:0};S.rotstep={x:P(M[2]),y:P(M[3]),z:P(M[4]),mode:["REL","ABS","ADD"].includes(x)?x:"REL"}}else if(M[1]==="BUFEXCHG"){S.meta="BUFEXCHG";let x=(M[2]??"").toUpperCase();S.bufexchg={op:x==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))S.meta=M[1];if(m&&!o.org){let x=ut(L);if(x)o.org=x}if(M[1]==="!TEXMAP"){let x=(M[2]??"").toUpperCase();if(a=null,x==="START"||x==="NEXT"){let P=an(L.replace(/^!TEXMAP\\s+\\S+/i,""),x==="NEXT");if(S.texmap={op:x,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),x==="START")f.push({map:P,fallback:!1});else a=P}else if(x==="FALLBACK"){S.texmap={op:x};let P=f[f.length-1];if(P)P.fallback=!0}else if(x==="END")S.texmap={op:x},f.pop()}else if(M[1]==="!:"){a=null;let x=ft(M.slice(2));if(x)v(x,!0),S.geom=x}else a=null;let w=L.match(ct);if(w&&!o.movedTo){let x=w[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(x))x+=".dat";o.movedTo=ee(x)}o.cmds.push(S);continue}if(u||b)continue;if(!o)g(t);let C=ft(M);if(!C){if(/^[2-5][ \\t]/.test(h))m=!1;continue}v(C,!1),o.cmds.push(C),m=!1}return l(),c?{main:i,files:s,data:c}:{main:i,files:s}}var On=Math.PI/180;function wt(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 Mt(e,t){let[n,r,s,o,i,c,u,f,a,l,m,g]=e,[b,y,A,v,p,h,M,z,C,L,I,S]=t;return[o*b+i*y+c*A+n,u*b+f*y+a*A+r,l*b+m*y+g*A+s,o*v+i*M+c*L,o*p+i*z+c*I,o*h+i*C+c*S,u*v+f*M+a*L,u*p+f*z+a*I,u*h+f*C+a*S,l*v+m*M+g*L,l*p+m*z+g*I,l*h+m*C+g*S]}var Ve=[0,0,0,1,0,0,0,1,0,0,0,1];var pt=new WeakMap,fn=/^(s|8|48)\\//;function _e(e,t){let n=e.files.get(ee(t));if(!n)return"part";let r=pt.get(n);if(r)return r;if(n.org)r=yt.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&&fn.test(s.file))?"part":"model";return pt.set(n,r),r}var mt=new WeakMap;function At(e){let t=mt.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 mt.set(e,t),t}var ht=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Ne.get(e)??String(e):String(e),pn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ht(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ht(e.color)} ${e.p.join(" ")}`,Ge=(e,t)=>`${ee(e)}#${t}`;function mn(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:Ge(e.name,t),cmds:n}}function vt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...mn(e,t).cmds.map(pn)].join(`\n`)+`\n`}function He(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 Ct(e){let[t,n,r,s,o,i,c,u,f,a,l,m]=e,g=u*m-f*l,b=-(c*m-f*a),y=c*l-u*a,A=s*g+o*b+i*y;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let v=1/A,p=[g*v,-(o*m-i*l)*v,(o*f-i*u)*v,b*v,(s*m-i*a)*v,-(s*f-i*c)*v,y*v,-(s*l-o*a)*v,(s*u-o*c)*v];return[-(p[0]*t+p[1]*n+p[2]*r),-(p[3]*t+p[4]*n+p[5]*r),-(p[6]*t+p[7]*n+p[8]*r),...p]}var hn=(e)=>String(+e.toFixed(6)||0),gt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Tt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(hn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${gt(t.texture)}${t.glossmap?" GLOSSMAP "+gt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${ee(e)}\n0 !TEXMAP END\n`;return{name:`${ee(e)}#tex-${He(r)}`,source:r}}var gn=(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),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var dt=new WeakMap;function Lt(e){let t=dt.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:gn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),dt.set(e,n),n}class We 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 bn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=bt))return!1;return!0},St=999999,Pt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ft=new WeakMap,Et=new WeakMap;function yn(e,t){let n=Et.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ft.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Et.set(t,n);let r=n.parts.get(e);if(!r){let s=ee(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-${He(o)}`,source:o},n.parts.set(e,r)}return r}function xn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,a=t.maxInstances??2000000,l=0,m=(b,y)=>{let A=b.name+"#"+y,v=c.get(A);if(!v){let p;v=Object.assign(()=>p??=vt(b,y),{file:b,step:y}),c.set(A,v)}return v},g=(b,y,A,v,p,h,M,z,C=null,L=[],I=[],S=void 0,w=null)=>{let x=b.files.get(y);if(!x||M>r||f.has(x))return;if(++l>a)throw new We("model",a);f.add(x);let P=w,O=0,E=M>0?++u:0,F=i&&E?[...L,E]:L,X=i&&E?[...I,A]:I,se=i&&!C?new Map:null,oe=-1,ae=0,le=(T,d,j,N,D,V,_)=>{if(oe!==O)oe=O,ae=0;let Y=se?.get(O+"|"+d);if(Y)return Y.n++,g(T,T===b?d:T.main,j,N,p+"/"+d,[...D,St],M+1,V,[...D,St],F,X,_,P);let J=[...D,ae++],H=n.length;g(T,T===b?d:T.main,j,N,p+"/"+d,J,M+1,V,C,F,X,_,P),se?.set(O+"|"+d,{n:1,from:H,to:n.length})},R=Lt(x),U=s?At(x):[],B=0,G=(T,d,j,N,D,V,_,Y,J)=>{if(C)N=C;if(++l>a)throw new We("model",a);let H={part:T,color:d,m:j,step:N[0],steps:N,localStep:D,path:p};if(Y)H.colour=Y;if(E){if(H.sub=E,i)H.subPath=F,H.subMats=X}if(V)H.embedded=!0;if(_){let ne=Tt(T,_);H.texPart=ne.name,H.texSource=ne.source}else if(J){let ne=yn(T,J);H.colPart=ne.name,H.colSource=ne.source}let W=R[D];if(W)H.view=W;return n.push(H),H},k=(T)=>{while(B<U.length&&U[B]<=T){let d=U[B++];G(Ge(x.name,d),v,A,[...h,d],d,!1,null,S,w).source=m(x,d)}};for(let T of x.cmds){if(T.t===0&&T.step){O++;continue}let d=T;if(d.t>=2||d.t===0&&d.geom&&d.geom.t>=2){k(O);continue}if(d.t===0){if(d.meta==="!COLOUR"){let W=Mn(d.text);if(W&&W.code!==16&&W.code!==24)Ft.set(W,d.text),(P=new Map(P??[])).set(W.code,W);continue}if(o&&d.geom?.t===1)d=d.geom;else continue}if(d.t!==1)continue;if(o&&d.fallback)continue;let j=Mt(A,d.m);if(!bn(j))continue;let N=d.color===16?v:d.color,D=d.color===16?S:P?.get(d.color),V=[...h,O],_=o?d.tex??z:null,Y=_?Ct(d.m):null,J=_&&Y?wt(_,Y):null;if(b.files.has(d.file)){if(_e(b,d.file)==="model"){le(b,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!0,J,D,P);continue}let H=t.resolveModel?.(d.file);if(H){le(H,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!1,J,D,P)}if(k(1/0),f.delete(x),se){for(let T of se.values())if(T.n>1)for(let d=T.from;d<T.to;d++)n[d].mult??=T.n}};if(_e(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ve],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ve,16,e.main,[],0,null),n}function Rt(e,t="main.ldr",n){return xn(xt(e,t,{geometryText:!0}),n)}var wn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ke(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 kt(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=Ke(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 Mn(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,u=0,f={type:"default"},a=1;while(a<n.length){let l=n[a].toUpperCase(),m=n[a+1];if(l==="CODE")s=m!==void 0&&ze.test(m)?$e(m):m!==void 0&&/^\\d+$/.test(m)?+m:NaN,a+=2;else if(l==="VALUE"){let g=Ke(m);if(g)o=g;a+=2}else if(l==="EDGE")i=Ke(m)??m,a+=2;else if(l==="ALPHA")c=+m,a+=2;else if(l==="LUMINANCE")u=+m,a+=2;else if(l==="CHROME")f={type:"chrome"},a+=1;else if(l==="PEARLESCENT")f={type:"pearlescent"},a+=1;else if(l==="RUBBER")f={type:"rubber"},a+=1;else if(l==="MATTE_METALLIC")f={type:"matte_metallic"},a+=1;else if(l==="METAL")f={type:"metal"},a+=1;else if(l==="MATERIAL"){let g=(n[a+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:b,next:y}=kt(n,a+2);f={type:"glitter",material:b},a=y}else if(g==="SPECKLE"){let{grain:b,next:y}=kt(n,a+2);f={type:"speckle",material:b},a=y}else if(g==="FABRIC"){let b=(n[a+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(b)?b.toLowerCase():void 0;f={type:"fabric",kind:y},a+=y?3:2}else a=n.length}else if(wn.has(l))a+=1;else a+=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(u)?u:0,finish:f}}function An(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 Xe(e){let t=An(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(ee(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(ee(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var Cn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?ee(t.slice(14).join(" ")):null};function Tn(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 It(e,t,n="main.ldr"){let r=vn(e,n),s=new Map;for(let o of t){let i=ee(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let a of r.get(u.pop())){let l=Cn(a);if(l&&r.has(l)&&!c.has(l))c.add(l),u.push(l)}let f=[i,...[...c].filter((a)=>a!==i).sort()].map((a)=>"0 FILE "+(a===i?"":a)+`\n`+r.get(a).join(`\n`)).join(`\n`);s.set(i,`emb/${Tn(f)}.dat`)}return s}var Bt=(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,Dt=new WeakMap,Ze=null,Ye="",Je=null;function Qe(e,t){if(e===Ze&&t===Ye)return Je;let n=Dt.get(e);if(!n)Dt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return Ze=e,Ye=t,Je=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=[],u=[];s.studs.forEach((m,g)=>{c.push(m[0]),u.push(m[1]);for(let b=0;b<12;b++)i[g*12+b]=m[2+b]});let f=null,a=0,l=0;if(s.mask){a=s.mask[0],l=s.mask[1];let m=s.mask[2];f=new Uint8Array(m.length);for(let g=0;g<m.length;g++)f[g]=m.charCodeAt(g)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:a,nz:l}),Ze=e,Ye=t,Je=r,r}var fe=1073741824;class be{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=be.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let u=s[c];if(u===0)return-1;if(u===r){let f=c<<2;if(o[f]===e&&o[f+1]===t&&o[f+2]===n)return o[f+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=be.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,u=this.slot(e,t,n);for(;;){let f=o[u],a=u<<2;if(f===0)return o[u]=s,i[a]=e,i[a+1]=t,i[a+2]=n,i[a+3]=r,this.size++,-1;if(f===s&&i[a]===e&&i[a+1]===t&&i[a+2]===n){let l=i[a+3];return i[a+3]=r,l}u=u+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])}}}var pe=(e,t,n)=>e>-fe&&e<fe&&t>-fe&&t<fe&&n>-fe&&n<fe,de=2147483647;function Ln(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function Sn(e,t,n){let s=new Map,o=(R)=>{let U=s.get(R);if(U===void 0)s.set(R,U=Ln(t,R));return U},i=[],c=[],u=[],f=[],a=[],l=[],m=[],g=[],b=[],y=[],A=[],v=new be(e.length*2),p=[],h=[];for(let R=0;R<e.length;R++){let U=e[R],B=U.m,G=t.parts[U.part];if(!G||!G.mask||!Bt(B)||o(U.color))continue;let k=G.bbox,T=1/0,d=-1/0,j=1/0,N=-1/0;for(let K=0;K<2;K++)for(let Z=0;Z<2;Z++){let te=K?k[3]:k[0],ce=Z?k[5]:k[2],ie=B[0]+B[3]*te+B[5]*ce,re=B[2]+B[9]*te+B[11]*ce;if(ie<T)T=ie;if(ie>d)d=ie;if(re<j)j=re;if(re>N)N=re}let D=Math.round((B[1]+k[4])*2),V=Qe(t,U.part),_=Math.floor(T/40),Y=Math.floor(d/40),J=Math.floor(j/40),H=Math.floor(N/40);if(!((Y-_+1)*(H-J+1)<=65536)||!pe(D,_,J)||!pe(D,Y,H))continue;let W=-1;for(let K=v.get(D,_,J),Z=0;K>=0&&Z<8;K=p[K],Z++){let te=h[K];if(i[te]!==T||c[te]!==d||u[te]!==j||f[te]!==N||m[te]!==V)continue;let ce=e[a[te]].m,ie=!0;for(let re=0;re<12;re++)if(ce[re]!==B[re]){ie=!1;break}if(ie){W=te;break}}if(W>=0){let K=n?n[R]:0;if(n&&K<n[a[W]])l[W]=a[W],a[W]=R;else if(l[W]<0||n&&K<n[l[W]])l[W]=R;continue}let ne=a.length;i.push(T),c.push(d),u.push(j),f.push(N),a.push(R),l.push(-1),m.push(V),g.push(k[0]),b.push(k[2]),y.push(D),A.push(B[0],B[1],B[2],B[3],B[6],B[9],B[5],B[8],B[11]);for(let K=_;K<=Y;K++)for(let Z=J;Z<=H;Z++){if(!pe(D,K,Z))continue;let te=h.length;h.push(ne),p.push(v.put(D,K,Z,te))}}let M=[0,5,-5,5,-5],z=[0,5,5,-5,-5],C=(R,U,B,G)=>{if(!(U-6>=i[R]-0.5&&U+6<=c[R]+0.5&&G-6>=u[R]-0.5&&G+6<=f[R]+0.5))return!1;let k=R*9,T=m[R],d=g[R],j=b[R],N=U-A[k],D=B-A[k+1],V=G-A[k+2],_=A[k+3]*N+A[k+4]*D+A[k+5]*V,Y=A[k+6]*N+A[k+7]*D+A[k+8]*V,{nx:J,nz:H,mask:W}=T;for(let ne=0;ne<5;ne++){let K=Math.floor((_+M[ne]-d)/20),Z=Math.floor((Y+z[ne]-j)/20);if(K<0||Z<0||K>=J||Z>=H||W[K*H+Z]!==1)return!1}return!0},L=NaN,I=NaN,S=NaN,w=-1,x=-1,P=(R,U,B,G)=>{let k=Math.round(U*2),T=Math.floor(R/40),d=Math.floor(B/40);if(!pe(k,T,d))return de;let j=de;if(!n&&x>=0&&y[x]===k&&(a[x]!==G||l[x]>=0)&&C(x,R,U,B))return 0;if(k!==L||T!==I||d!==S)L=k,I=T,S=d,w=v.get(k,T,d);for(let N=w;N>=0;N=p[N]){let D=h[N],V=a[D];if(V===G&&(V=l[D])<0)continue;if(!C(D,R,U,B))continue;if(!n)return x=D,0;let _=n[V];if(_<j)j=_}return j},O=0;for(let R of e){let U=Qe(t,R.part);if(U)O+=U.nStuds}let E=new Uint8Array(O),F=new Uint8Array(O),X=new be(O,4),se=0,oe=n?new Int32Array(O).fill(de):void 0;for(let R=0,U=0;R<e.length;R++){let B=e[R],G=Qe(t,B.part);if(!G)continue;let k=B.m,T=G.studM,d=k[0],j=k[1],N=k[2],D=k[3],V=k[4],_=k[5],Y=k[6],J=k[7],H=k[8],W=k[9],ne=k[10],K=k[11];for(let Z=0;Z<G.nStuds;Z++,U++){let te=Z*12,ce=T[te+4],ie=T[te+7],re=T[te+10];if(!(Math.abs(Y*ce+J*ie+H*re-1)<0.001&&Math.abs(D*ce+V*ie+_*re)<0.001&&Math.abs(W*ce+ne*ie+K*re)<0.001))continue;F[U]=1;let Re=T[te],Ie=T[te+1],Be=T[te+2],qe=d+D*Re+V*Ie+_*Be,et=j+Y*Re+J*Ie+H*Be,tt=N+W*Re+ne*Ie+K*Be,nt=P(qe,et,tt,R);if(nt!==de){if(E[U]=1,se++,oe)oe[U]=nt}let ye=Math.round(qe),xe=Math.round(et),we=Math.round(tt);if(!pe(ye,xe,we))continue;if(!n){X.put(ye,xe,we,1);continue}let rt=n[R],st=X.get(ye,xe,we);if(st<0||rt<st)X.put(ye,xe,we,rt)}}let ae=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(de):void 0;for(let R=0;R<e.length;R++){let U=e[R],B=t.parts[U.part];if(!B||!B.under||!Bt(U.m)||o(U.color))continue;let G=B.bbox,k=Math.round((G[3]-G[0])/20),T=Math.round((G[5]-G[2])/20);if(!k||!T||k*T>4096)continue;let d=U.m,j=Math.round(d[1]+G[4]),N=!0,D=0;for(let V=0;V<k&&N;V++)for(let _=0;_<T;_++){let Y=G[0]+10+20*V,J=G[2]+10+20*_,H=d[0]+d[3]*Y+d[5]*J,W=d[2]+d[9]*Y+d[11]*J,ne=Math.round(H),K=Math.round(W),Z=pe(ne,j,K)?X.get(ne,j,K):-1;if(Z<0){N=!1;break}if(Z>D)D=Z}if(N){if(ae[R]=1,le)le[R]=D}}return{nStuds:O,studHidden:E,studUp:F,underHidden:ae,studsHidden:se,studHideStep:oe,underHideStep:le}}function En(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 m=l.colour;if(!m)return String(l.color);let g=o.get(m);if(g!==void 0)return g;let b=t.colorTable?.[l.color],y=b?.hex??t.colors?.[l.color],A=b?Xe({alpha:b.alpha??255,luminance:b.luminance??0,finish:b.finish??{type:"default"}}):"default:op",v=Xe(m);if(g=y&&y.toUpperCase()===m.hex.toUpperCase()&&A===v?String(l.color):m.hex.toUpperCase()+"/"+v,g!==String(l.color))s.set(g,m);return o.set(m,g),g},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=c.map((l)=>Pt(l.steps)),f=[...new Set(u)].sort(),a=new Map(f.map((l,m)=>[l,m]));return{all:c,stepOf:u.map((l)=>a.get(l)),nSteps:f.length,localColours:s}}function Te(e,t,n=!0){let r=En(e,t,n);return Sn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Pe="https://ldr-demo.vercel.app/cdn/v1/",Se=new Map,Le=new Map;function Ee(e=Pe,t=fetch){let n=Se.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(()=>Se.delete(e)),Se.set(e,n);return n}var kn=(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"),ke=(e,t)=>kn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ke(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ke(r,t)])):e;function Pn(e,t={}){let n=[],r=0,s={},o={};for(let m of e){let g=m.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let b=new DataView(g).getUint32(0,!0),y=new Uint8Array(g,4+b),A=r;n.push(y),r+=y.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[p,h]of Object.entries(m.header.parts??{}))if(!(p in s))s[p]=ke(h,A);for(let[p,h]of Object.entries(m.header.studKinds??{}))if(!(p in o))o[p]=ke(h,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,a=new Uint8Array(f+r);new DataView(a.buffer).setUint32(0,c.length+u,!0),a.set(c,4),a.fill(32,4+c.length,f);let l=f;for(let m of n)a.set(m,l),l+=m.byteLength;return Ce(a.buffer)}async function Fn(e,t={}){e=[...e];try{return await Ut(e,t)}catch(n){let r=t.cdn??Pe,s=t.fetch??fetch;Se.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await Ut(e,{...t,fetch:o})}catch{throw n}}}async function Ut(e,t){let n=t.cdn??Pe,r=t.fetch??fetch,s=t.gap??16384,o=await Ee(n,r),i=[...new Set([...e].map(ee))],c=[],u=[];for(let p of i){if(Le.has(n+p))continue;let h=o.parts[p];if(h)u.push({name:p,off:h[0],len:h[1],file:h[2]??0});else c.push(p)}u.sort((p,h)=>p.file-h.file||p.off-h.off);let f=[];for(let p of u){let h=f[f.length-1];if(h&&h.file===p.file&&p.off-h.end<=s)h.end=Math.max(h.end,p.off+p.len),h.items.push(p);else f.push({file:p.file,start:p.off,end:p.off+p.len,items:[p]})}let a=0,l=0,m=0,g=new Map,b=async()=>{while(m<f.length){let p=f[m++],h=g.get(p.file);if(h)h=h.subarray(p.start,p.end);else{let M=await r(new URL(o.archives[p.file],n).href,{headers:{Range:`bytes=${p.start}-${p.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(l++,h=new Uint8Array(await M.arrayBuffer()),a+=h.byteLength,M.status===200)g.set(p.file,h),h=h.subarray(p.start,p.end)}for(let M of p.items){let z=ve(h.subarray(M.off-p.start,M.off-p.start+M.len)),C=z.buffer.slice(z.byteOffset,z.byteOffset+z.byteLength);Le.set(n+M.name,Ce(C))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},b));let y=i.filter((p)=>Le.has(n+p)).map((p)=>Le.get(n+p)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:y.length?Pn(y,A):Ce(Rn(A)),missing:c,requests:l,bytes:a}}function Rn(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 In(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 Ot(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):ee(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[1]}return{bodyTris:r,packBytes:s,known:o}}class Fe 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 Nt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Ee(t.cdn??Pe,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(w)=>{if(!w.ok)throw Error(`ldr: ${w.status} fetching ${e}`);return at(await w.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":lt(e)),u=Rt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let a=It(o,new Set(u.filter((w)=>w.embedded).map((w)=>w.part)),c),l=(w,x)=>t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&x>t.maxPackBytes,m=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(w)=>new Fe({...w,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),b="full";if(m){let w=Ot(u,a,await s);if(l(w.known?w.bodyTris:0,w.packBytes)){if(!t.lowCdn)throw g(w);let x=await Ee(t.lowCdn,r).catch(()=>null);if(!x)throw g(w);let P=Ot(u,a,x);if(l(P.known?P.bodyTris:0,P.packBytes))throw g(P);b="low"}}let y=[...u.filter((w)=>!w.embedded).map((w)=>w.part),...a.values()],A=async()=>{let w=await Fn(y,b==="low"?{...t,cdn:t.lowCdn}:t);for(let[x,P]of a){let O=w.pack.header.parts[P];if(O)w.pack.header.parts[x]=O}return{...w,packBytes:w.pack.buffer?.byteLength??w.pack.bytes??0,bodyTris:In(u,w.pack)}},v=await A();if(m&&l(v.bodyTris,v.packBytes)&&b==="full"&&t.lowCdn&&await Ee(t.lowCdn,r).then(()=>!0,()=>!1)){b="low";let w=v;v=await A(),v.requests+=w.requests,v.bytes+=w.bytes}if(m&&l(v.bodyTris,v.packBytes))throw g(v);let{pack:p,missing:h,requests:M,bytes:z}=v,C=new Map([...a].map(([w,x])=>[x,w])),L=h.map((w)=>C.get(w)??w),I=performance.now(),S=t.cull?Te(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,tier:b,missing:L,requests:M,bytes:z,cull:S,timings:{fetchModel:i-n,parse:f-i,parts:I-f,...S?{cull:performance.now()-I}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Nt(n,{...r,cull:!1,onParsed:(a)=>self.postMessage({id:t,insts:a})}),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=Te(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let a of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(a)f.push(a.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Fe||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';
|
|
5015
5080
|
|
|
5016
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5081
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/cdn.ts
|
|
5017
5082
|
var worker;
|
|
5018
5083
|
var seq = 0;
|
|
5019
5084
|
var pending = new Map;
|
|
@@ -5127,7 +5192,7 @@ async function loadModel(source, o = {}) {
|
|
|
5127
5192
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
5128
5193
|
});
|
|
5129
5194
|
}
|
|
5130
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5195
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/library.ts
|
|
5131
5196
|
import { existsSync, readFileSync, statSync } from "fs";
|
|
5132
5197
|
import { join } from "path";
|
|
5133
5198
|
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]];
|
|
@@ -5477,11 +5542,11 @@ class Library {
|
|
|
5477
5542
|
return insts;
|
|
5478
5543
|
}
|
|
5479
5544
|
}
|
|
5480
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5545
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
|
|
5481
5546
|
import fs3 from "node:fs";
|
|
5482
5547
|
import path3 from "node:path";
|
|
5483
5548
|
|
|
5484
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5549
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/resolver.ts
|
|
5485
5550
|
import fs from "node:fs";
|
|
5486
5551
|
import path from "node:path";
|
|
5487
5552
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -5810,11 +5875,11 @@ function collectDeps(lib, refs) {
|
|
|
5810
5875
|
return out;
|
|
5811
5876
|
}
|
|
5812
5877
|
|
|
5813
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5878
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
|
|
5814
5879
|
import fs2 from "node:fs";
|
|
5815
5880
|
import path2 from "node:path";
|
|
5816
5881
|
|
|
5817
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5882
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/lod.ts
|
|
5818
5883
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
5819
5884
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
5820
5885
|
function reorderMesh(P, N, C, I) {
|
|
@@ -6120,7 +6185,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
|
|
|
6120
6185
|
return out;
|
|
6121
6186
|
}
|
|
6122
6187
|
|
|
6123
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6188
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
|
|
6124
6189
|
class BfcState {
|
|
6125
6190
|
accum;
|
|
6126
6191
|
ccw = true;
|
|
@@ -7064,7 +7129,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
7064
7129
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
7065
7130
|
}
|
|
7066
7131
|
|
|
7067
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7132
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
|
|
7068
7133
|
function packCompilerOpts(o) {
|
|
7069
7134
|
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 } : {} };
|
|
7070
7135
|
}
|
|
@@ -7136,7 +7201,7 @@ function buildPack(o) {
|
|
|
7136
7201
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
7137
7202
|
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 } : {} };
|
|
7138
7203
|
}
|
|
7139
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7204
|
+
// ../../../../../../../tmp/ldr-build-HYKc29/src/node/promote.ts
|
|
7140
7205
|
var GEOM = /^\s*[2-5]\s/;
|
|
7141
7206
|
var REF = /^\s*1\s/;
|
|
7142
7207
|
var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;
|