ldr 0.33.13 → 0.33.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +55 -24
- package/dist/index.js +297 -133
- package/dist/inst-io.d.ts +17 -0
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/index.js +306 -142
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/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;
|
|
@@ -110,27 +110,54 @@ var b64 = (s) => {
|
|
|
110
110
|
out[i] = bin.charCodeAt(i);
|
|
111
111
|
return out;
|
|
112
112
|
};
|
|
113
|
-
function type1Fast(line) {
|
|
113
|
+
function type1Fast(line, files) {
|
|
114
114
|
const n = line.length;
|
|
115
115
|
let i = 1;
|
|
116
116
|
const ws = (c) => c === 32 || c === 9;
|
|
117
|
-
const
|
|
117
|
+
const num = () => {
|
|
118
118
|
while (i < n && ws(line.charCodeAt(i)))
|
|
119
119
|
i++;
|
|
120
120
|
const a = i;
|
|
121
|
+
let c = line.charCodeAt(i);
|
|
122
|
+
const neg = c === 45;
|
|
123
|
+
if (neg)
|
|
124
|
+
c = line.charCodeAt(++i);
|
|
125
|
+
let v = 0, d = 0;
|
|
126
|
+
while (c >= 48 && c <= 57) {
|
|
127
|
+
v = v * 10 + (c - 48);
|
|
128
|
+
d++;
|
|
129
|
+
c = line.charCodeAt(++i);
|
|
130
|
+
}
|
|
131
|
+
if (d > 0 && d <= 15 && (i >= n || ws(c)))
|
|
132
|
+
return neg ? -v : v;
|
|
121
133
|
while (i < n && !ws(line.charCodeAt(i)))
|
|
122
134
|
i++;
|
|
123
|
-
return a < i ? line.slice(a, i) :
|
|
135
|
+
return a < i ? +line.slice(a, i) : NaN;
|
|
124
136
|
};
|
|
125
|
-
|
|
126
|
-
|
|
137
|
+
while (i < n && ws(line.charCodeAt(i)))
|
|
138
|
+
i++;
|
|
139
|
+
const a0 = i;
|
|
140
|
+
if (i >= n)
|
|
127
141
|
return null;
|
|
142
|
+
let c = line.charCodeAt(i), neg = c === 45, color = 0, d = 0;
|
|
143
|
+
if (neg)
|
|
144
|
+
c = line.charCodeAt(++i);
|
|
145
|
+
while (c >= 48 && c <= 57) {
|
|
146
|
+
color = color * 10 + (c - 48);
|
|
147
|
+
d++;
|
|
148
|
+
c = line.charCodeAt(++i);
|
|
149
|
+
}
|
|
150
|
+
if (d > 0 && d <= 15 && (i >= n || ws(c))) {
|
|
151
|
+
if (neg)
|
|
152
|
+
color = -color;
|
|
153
|
+
} else {
|
|
154
|
+
while (i < n && !ws(line.charCodeAt(i)))
|
|
155
|
+
i++;
|
|
156
|
+
color = parseColor(line.slice(a0, i));
|
|
157
|
+
}
|
|
128
158
|
const m = new Array(12);
|
|
129
159
|
for (let k = 0;k < 12; k++) {
|
|
130
|
-
const
|
|
131
|
-
if (t === null)
|
|
132
|
-
return null;
|
|
133
|
-
const v = +t;
|
|
160
|
+
const v = num();
|
|
134
161
|
if (!Number.isFinite(v))
|
|
135
162
|
return null;
|
|
136
163
|
m[k] = v;
|
|
@@ -140,11 +167,14 @@ function type1Fast(line) {
|
|
|
140
167
|
if (i >= n)
|
|
141
168
|
return null;
|
|
142
169
|
const rest = line.slice(i);
|
|
143
|
-
|
|
144
|
-
|
|
170
|
+
let file = files.get(rest);
|
|
171
|
+
if (file === undefined) {
|
|
172
|
+
file = norm(/[ \t]{2,}|\t/.test(rest) ? rest.split(/\s+/).join(" ") : rest);
|
|
173
|
+
files.set(rest, file);
|
|
174
|
+
}
|
|
145
175
|
if (!Number.isFinite(color))
|
|
146
176
|
return null;
|
|
147
|
-
return { t: 1, color, m, file
|
|
177
|
+
return { t: 1, color, m, file };
|
|
148
178
|
}
|
|
149
179
|
var NUMS = [0, 12, 6, 9, 12, 12];
|
|
150
180
|
function geomLine(tk) {
|
|
@@ -190,6 +220,7 @@ function parse(src, name = "main.ldr", popts = {}) {
|
|
|
190
220
|
(data ??= new Map).set(norm(dataCur.name), { name: dataCur.name, bytes, ...png ? { mime: "image/png" } : {} });
|
|
191
221
|
dataCur = null;
|
|
192
222
|
};
|
|
223
|
+
const t1Files = new Map;
|
|
193
224
|
let inHeader = true;
|
|
194
225
|
const start = (n) => {
|
|
195
226
|
closeData();
|
|
@@ -279,7 +310,7 @@ function parse(src, name = "main.ldr", popts = {}) {
|
|
|
279
310
|
}
|
|
280
311
|
}
|
|
281
312
|
if (line.charCodeAt(0) === 49 && (line.charCodeAt(1) === 32 || line.charCodeAt(1) === 9) && !dataCur && !skip) {
|
|
282
|
-
const g = type1Fast(line);
|
|
313
|
+
const g = type1Fast(line, t1Files);
|
|
283
314
|
if (g) {
|
|
284
315
|
if (!cur)
|
|
285
316
|
start(name);
|
|
@@ -802,7 +833,7 @@ function fileStepViews(f) {
|
|
|
802
833
|
viewMemo.set(f, out);
|
|
803
834
|
return out;
|
|
804
835
|
}
|
|
805
|
-
// ../../../../../../../tmp/ldr-build-
|
|
836
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/model.ts
|
|
806
837
|
class ModelLimitError extends Error {
|
|
807
838
|
limit;
|
|
808
839
|
code = "ldr-model-limit";
|
|
@@ -1243,7 +1274,7 @@ function blendedColourHex(code) {
|
|
|
1243
1274
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1244
1275
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1245
1276
|
}
|
|
1246
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1277
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/instructions.ts
|
|
1247
1278
|
var MIN_VIS = 0.5;
|
|
1248
1279
|
var REORIENT = 0.35;
|
|
1249
1280
|
var deg = Math.PI / 180;
|
|
@@ -1611,10 +1642,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1611
1642
|
}
|
|
1612
1643
|
};
|
|
1613
1644
|
}
|
|
1614
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1645
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/render.ts
|
|
1615
1646
|
import * as THREE from "three";
|
|
1616
1647
|
|
|
1617
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1648
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/pack-io.ts
|
|
1618
1649
|
import { decompress } from "fzstd";
|
|
1619
1650
|
async function decompressPack(data) {
|
|
1620
1651
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1637,7 +1668,7 @@ function decodePack(buf) {
|
|
|
1637
1668
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1638
1669
|
}
|
|
1639
1670
|
|
|
1640
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1671
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/cull.ts
|
|
1641
1672
|
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
1673
|
var prepCache = new WeakMap;
|
|
1643
1674
|
var lastH = null;
|
|
@@ -1910,6 +1941,10 @@ function seeThrough(H, c) {
|
|
|
1910
1941
|
return c.charCodeAt(0) === 35 && /\/[^:/]*:a\d/.test(c);
|
|
1911
1942
|
}
|
|
1912
1943
|
function cullCore(insts, H, steps) {
|
|
1944
|
+
return cullPass(insts, H, steps, -1) ?? cullPass(insts, H, steps, needE);
|
|
1945
|
+
}
|
|
1946
|
+
var needE = 0;
|
|
1947
|
+
function cullPass(insts, H, steps, eCap) {
|
|
1913
1948
|
const CELL = 40;
|
|
1914
1949
|
const clear = new Map;
|
|
1915
1950
|
const isClear = (c) => {
|
|
@@ -1918,11 +1953,30 @@ function cullCore(insts, H, steps) {
|
|
|
1918
1953
|
clear.set(c, v = seeThrough(H, c));
|
|
1919
1954
|
return v;
|
|
1920
1955
|
};
|
|
1921
|
-
const
|
|
1922
|
-
|
|
1923
|
-
|
|
1956
|
+
const nI = insts.length;
|
|
1957
|
+
let cap = 0, nR = 0;
|
|
1958
|
+
for (let idx = 0, lp = "";idx < nI; idx++) {
|
|
1959
|
+
const part = insts[idx].part;
|
|
1960
|
+
if (part === lp) {
|
|
1961
|
+
cap++;
|
|
1962
|
+
continue;
|
|
1963
|
+
}
|
|
1964
|
+
const p = H.parts[part];
|
|
1965
|
+
if (p && p.mask) {
|
|
1966
|
+
cap++;
|
|
1967
|
+
lp = part;
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1970
|
+
const rx0 = new Float64Array(cap), rx1 = new Float64Array(cap), rz0 = new Float64Array(cap), rz1 = new Float64Array(cap);
|
|
1971
|
+
const rInst = new Int32Array(cap), rInst2 = new Int32Array(cap), rBx = new Float64Array(cap), rBz = new Float64Array(cap);
|
|
1972
|
+
const rPrep = [];
|
|
1973
|
+
const rLv = new Int32Array(cap), rM = new Float64Array(cap * 9);
|
|
1974
|
+
const rFast = new Uint8Array(cap);
|
|
1975
|
+
if (eCap < 0)
|
|
1976
|
+
eCap = cap * 4 + 64;
|
|
1924
1977
|
const cells = new Int3Table(insts.length * 2);
|
|
1925
|
-
const nextE =
|
|
1978
|
+
const nextE = new Int32Array(eCap), rectE = new Int32Array(eCap);
|
|
1979
|
+
let nE = 0, need = 0;
|
|
1926
1980
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
1927
1981
|
const it = insts[idx];
|
|
1928
1982
|
const m = it.m;
|
|
@@ -1949,8 +2003,11 @@ function cullCore(insts, H, steps) {
|
|
|
1949
2003
|
const cx0 = Math.floor(x0 / CELL), cx1 = Math.floor(x1 / CELL), cz0 = Math.floor(z0 / CELL), cz1 = Math.floor(z1 / CELL);
|
|
1950
2004
|
if (!((cx1 - cx0 + 1) * (cz1 - cz0 + 1) <= 65536) || !inRange(lv2, cx0, cz0) || !inRange(lv2, cx1, cz1))
|
|
1951
2005
|
continue;
|
|
2006
|
+
const ux0 = Math.floor((x0 + 5) / CELL), ux1 = Math.floor((x1 - 5) / CELL), uz0 = Math.floor((z0 + 5) / CELL), uz1 = Math.floor((z1 - 5) / CELL);
|
|
2007
|
+
const nc = ux0 <= ux1 && uz0 <= uz1 ? (ux1 - ux0 + 1) * (uz1 - uz0 + 1) : 0;
|
|
2008
|
+
need += nc;
|
|
1952
2009
|
let dup = -1;
|
|
1953
|
-
for (let e = cells.get(lv2,
|
|
2010
|
+
for (let e = ux0 <= ux1 && uz0 <= uz1 ? cells.get(lv2, ux0, uz0) : -1, k = 0;e >= 0 && k < 8; e = nextE[e], k++) {
|
|
1954
2011
|
const q = rectE[e];
|
|
1955
2012
|
if (rx0[q] !== x0 || rx1[q] !== x1 || rz0[q] !== z0 || rz1[q] !== z1 || rPrep[q] !== pp)
|
|
1956
2013
|
continue;
|
|
@@ -1975,28 +2032,45 @@ function cullCore(insts, H, steps) {
|
|
|
1975
2032
|
rInst2[dup] = idx;
|
|
1976
2033
|
continue;
|
|
1977
2034
|
}
|
|
1978
|
-
const ri =
|
|
1979
|
-
rx0
|
|
1980
|
-
rx1
|
|
1981
|
-
rz0
|
|
1982
|
-
rz1
|
|
1983
|
-
rInst
|
|
1984
|
-
rInst2
|
|
2035
|
+
const ri = nR++;
|
|
2036
|
+
rx0[ri] = x0;
|
|
2037
|
+
rx1[ri] = x1;
|
|
2038
|
+
rz0[ri] = z0;
|
|
2039
|
+
rz1[ri] = z1;
|
|
2040
|
+
rInst[ri] = idx;
|
|
2041
|
+
rInst2[ri] = -1;
|
|
1985
2042
|
rPrep.push(pp);
|
|
1986
|
-
rBx
|
|
1987
|
-
rBz
|
|
1988
|
-
rLv
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
2043
|
+
rBx[ri] = b[0];
|
|
2044
|
+
rBz[ri] = b[2];
|
|
2045
|
+
rLv[ri] = lv2;
|
|
2046
|
+
const o = ri * 9;
|
|
2047
|
+
rM[o] = m[0];
|
|
2048
|
+
rM[o + 1] = m[1];
|
|
2049
|
+
rM[o + 2] = m[2];
|
|
2050
|
+
rM[o + 3] = m[3];
|
|
2051
|
+
rM[o + 4] = m[6];
|
|
2052
|
+
rM[o + 5] = m[9];
|
|
2053
|
+
rM[o + 6] = m[5];
|
|
2054
|
+
rM[o + 7] = m[8];
|
|
2055
|
+
rM[o + 8] = m[11];
|
|
2056
|
+
rFast[ri] = pp.full && b[3] - b[0] <= 20 * pp.nx && b[5] - b[2] <= 20 * pp.nz && m[4] === 0 && m[6] === 0 && m[8] === 0 && m[10] === 0 && quarterTurn(m[3], m[5], m[9], m[11]) ? 1 : 0;
|
|
2057
|
+
if (nE + nc > eCap) {
|
|
2058
|
+
nE = eCap + 1;
|
|
2059
|
+
continue;
|
|
2060
|
+
}
|
|
2061
|
+
for (let cx = ux0;cx <= ux1; cx++)
|
|
2062
|
+
for (let cz = uz0;cz <= uz1; cz++) {
|
|
1993
2063
|
if (!inRange(lv2, cx, cz))
|
|
1994
2064
|
continue;
|
|
1995
|
-
const e =
|
|
1996
|
-
rectE
|
|
1997
|
-
nextE
|
|
2065
|
+
const e = nE++;
|
|
2066
|
+
rectE[e] = ri;
|
|
2067
|
+
nextE[e] = cells.put(lv2, cx, cz, e);
|
|
1998
2068
|
}
|
|
1999
2069
|
}
|
|
2070
|
+
if (nE > eCap) {
|
|
2071
|
+
needE = need;
|
|
2072
|
+
return null;
|
|
2073
|
+
}
|
|
2000
2074
|
const SX = [0, 5, -5, 5, -5], SZ = [0, 5, 5, -5, -5];
|
|
2001
2075
|
const covers = (ri, x, y, z) => {
|
|
2002
2076
|
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))
|
|
@@ -2150,17 +2224,42 @@ function sceneInstances(instances, H, useTex) {
|
|
|
2150
2224
|
return k;
|
|
2151
2225
|
};
|
|
2152
2226
|
const all = instances.map((i) => ({ part: pick(i), color: keyOf(i), m: i.m, steps: i.steps }));
|
|
2227
|
+
const { stepOf, nSteps } = stepRanks(all);
|
|
2228
|
+
return { all, stepOf, nSteps, localColours };
|
|
2229
|
+
}
|
|
2230
|
+
function stepRanks(all) {
|
|
2231
|
+
let flat = true;
|
|
2232
|
+
for (let k = 0;k < all.length; k++) {
|
|
2233
|
+
const s = all[k].steps;
|
|
2234
|
+
if (s.length !== 1) {
|
|
2235
|
+
flat = false;
|
|
2236
|
+
break;
|
|
2237
|
+
}
|
|
2238
|
+
const v = s[0];
|
|
2239
|
+
if (!(Number.isInteger(v) && v >= 0 && v < 1e6)) {
|
|
2240
|
+
flat = false;
|
|
2241
|
+
break;
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
if (flat) {
|
|
2245
|
+
const seen = new Set;
|
|
2246
|
+
for (let k = 0;k < all.length; k++)
|
|
2247
|
+
seen.add(all[k].steps[0]);
|
|
2248
|
+
const u = [...seen].sort((a, b) => a - b);
|
|
2249
|
+
const rank = new Map(u.map((v, j) => [v, j]));
|
|
2250
|
+
return { stepOf: all.map((i) => rank.get(i.steps[0])), nSteps: u.length };
|
|
2251
|
+
}
|
|
2153
2252
|
const keys = all.map((i) => stepKey(i.steps));
|
|
2154
2253
|
const uniq = [...new Set(keys)].sort();
|
|
2155
2254
|
const rank = new Map(uniq.map((k, j) => [k, j]));
|
|
2156
|
-
return {
|
|
2255
|
+
return { stepOf: keys.map((k) => rank.get(k)), nSteps: uniq.length };
|
|
2157
2256
|
}
|
|
2158
2257
|
function precomputeCull(instances, H, useTex = true) {
|
|
2159
2258
|
const s = sceneInstances(instances, H, useTex);
|
|
2160
2259
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
2161
2260
|
}
|
|
2162
2261
|
|
|
2163
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2262
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/render.ts
|
|
2164
2263
|
async function loadPack(url) {
|
|
2165
2264
|
const res = await fetch(url);
|
|
2166
2265
|
if (!res.ok)
|
|
@@ -3258,53 +3357,63 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3258
3357
|
};
|
|
3259
3358
|
const matIdFor = (c, e, k) => e[k] >= 0 ? e[k] : e[k] = matIdOf(matOf(c, k === 1));
|
|
3260
3359
|
const partStud = new Map;
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
const
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3360
|
+
let jAt = 0;
|
|
3361
|
+
const pass1 = (idx) => {
|
|
3362
|
+
let j = jAt;
|
|
3363
|
+
const jEnd = j + 32768;
|
|
3364
|
+
for (;idx < insts.length && j < jEnd; idx++) {
|
|
3365
|
+
const it = insts[idx];
|
|
3366
|
+
const pp = prepPart(H, it.part);
|
|
3367
|
+
if (!pp || !pp.nStuds)
|
|
3368
|
+
continue;
|
|
3369
|
+
const a = it.m;
|
|
3370
|
+
const instE = colEntry(it.color);
|
|
3371
|
+
let ps = partStud.get(pp);
|
|
3372
|
+
if (!ps) {
|
|
3373
|
+
const kid = new Int32Array(pp.nStuds), neg = new Uint8Array(pp.nStuds);
|
|
3374
|
+
for (let si = 0;si < pp.nStuds; si++) {
|
|
3375
|
+
const kn = pp.kind[si];
|
|
3376
|
+
let id = kindIds.get(kn);
|
|
3377
|
+
if (id === undefined) {
|
|
3378
|
+
id = kindNames.length;
|
|
3379
|
+
kindIds.set(kn, id);
|
|
3380
|
+
kindNames.push(kn);
|
|
3381
|
+
}
|
|
3382
|
+
kid[si] = id;
|
|
3383
|
+
neg[si] = det12(pp.studM.subarray(si * 12, si * 12 + 12)) < 0 ? 1 : 0;
|
|
3278
3384
|
}
|
|
3279
|
-
|
|
3280
|
-
|
|
3385
|
+
partStud.set(pp, ps = { kid, neg });
|
|
3386
|
+
}
|
|
3387
|
+
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
3388
|
+
const B = pp.studM;
|
|
3389
|
+
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
3390
|
+
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
3391
|
+
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
3392
|
+
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
3393
|
+
const sc = pp.color[si];
|
|
3394
|
+
const mid = sc === "16" ? matIdFor(it.color, instE, neg ? 1 : 0) : matIdFor(sc, colEntry(sc), neg ? 1 : 0);
|
|
3395
|
+
const row = bucketOfKM[mid];
|
|
3396
|
+
let b = row[km];
|
|
3397
|
+
if (b === undefined) {
|
|
3398
|
+
b = bKind.length;
|
|
3399
|
+
row[km] = b;
|
|
3400
|
+
bKind.push(kindNames[ps.kid[si]]);
|
|
3401
|
+
bMat.push(matList[mid]);
|
|
3402
|
+
bAll.push(0);
|
|
3403
|
+
}
|
|
3404
|
+
studBucket[j] = b;
|
|
3405
|
+
bAll[b]++;
|
|
3406
|
+
sx[j] = a[0] + a[3] * b0 + a[4] * b1 + a[5] * b2;
|
|
3407
|
+
sz[j] = a[2] + a[9] * b0 + a[10] * b1 + a[11] * b2;
|
|
3281
3408
|
}
|
|
3282
|
-
partStud.set(pp, ps = { kid, neg });
|
|
3283
|
-
}
|
|
3284
|
-
const instNeg = det12(a) < 0 ? 1 : 0;
|
|
3285
|
-
const B = pp.studM;
|
|
3286
|
-
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
3287
|
-
if ((j & 32767) === 0 && j)
|
|
3288
|
-
yield;
|
|
3289
|
-
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
3290
|
-
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
3291
|
-
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
3292
|
-
const sc = pp.color[si];
|
|
3293
|
-
const mid = sc === "16" ? matIdFor(it.color, instE, neg ? 1 : 0) : matIdFor(sc, colEntry(sc), neg ? 1 : 0);
|
|
3294
|
-
const row = bucketOfKM[mid];
|
|
3295
|
-
let b = row[km];
|
|
3296
|
-
if (b === undefined) {
|
|
3297
|
-
b = bKind.length;
|
|
3298
|
-
row[km] = b;
|
|
3299
|
-
bKind.push(kindNames[ps.kid[si]]);
|
|
3300
|
-
bMat.push(matList[mid]);
|
|
3301
|
-
bAll.push(0);
|
|
3302
|
-
}
|
|
3303
|
-
studBucket[j] = b;
|
|
3304
|
-
bAll[b]++;
|
|
3305
|
-
sx[j] = a[0] + a[3] * b0 + a[4] * b1 + a[5] * b2;
|
|
3306
|
-
sz[j] = a[2] + a[9] * b0 + a[10] * b1 + a[11] * b2;
|
|
3307
3409
|
}
|
|
3410
|
+
jAt = j;
|
|
3411
|
+
return idx;
|
|
3412
|
+
};
|
|
3413
|
+
for (let idx = 0;idx < insts.length; ) {
|
|
3414
|
+
if (idx)
|
|
3415
|
+
yield;
|
|
3416
|
+
idx = pass1(idx);
|
|
3308
3417
|
}
|
|
3309
3418
|
yield;
|
|
3310
3419
|
const bIds = bAll.map((n) => new Int32Array(n));
|
|
@@ -3372,42 +3481,51 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
|
|
|
3372
3481
|
let nHid = 0;
|
|
3373
3482
|
{
|
|
3374
3483
|
const w = new Float64Array(12);
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
const
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
if (
|
|
3383
|
-
yield;
|
|
3384
|
-
if (trim && cull.studHidden[j]) {
|
|
3385
|
-
if (sMesh[studCl[j]]) {
|
|
3386
|
-
hidI[nHid] = idx;
|
|
3387
|
-
hidS[nHid] = si;
|
|
3388
|
-
hidC[nHid++] = studCl[j];
|
|
3389
|
-
}
|
|
3390
|
-
continue;
|
|
3391
|
-
}
|
|
3392
|
-
mul12To(it.m, pp.studM, si * 12, w);
|
|
3393
|
-
const sm = sMesh[studCl[j]];
|
|
3394
|
-
if (!sm)
|
|
3484
|
+
jAt = 0;
|
|
3485
|
+
const pass3 = (idx) => {
|
|
3486
|
+
let j = jAt;
|
|
3487
|
+
const jEnd = j + 32768;
|
|
3488
|
+
for (;idx < insts.length && j < jEnd; idx++) {
|
|
3489
|
+
const it = insts[idx];
|
|
3490
|
+
const pp = prepPart(H, it.part);
|
|
3491
|
+
if (!pp || !pp.nStuds)
|
|
3395
3492
|
continue;
|
|
3396
|
-
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
|
|
3406
|
-
|
|
3493
|
+
for (let si = 0;si < pp.nStuds; si++, j++) {
|
|
3494
|
+
if (trim && cull.studHidden[j]) {
|
|
3495
|
+
if (sMesh[studCl[j]]) {
|
|
3496
|
+
hidI[nHid] = idx;
|
|
3497
|
+
hidS[nHid] = si;
|
|
3498
|
+
hidC[nHid++] = studCl[j];
|
|
3499
|
+
}
|
|
3500
|
+
continue;
|
|
3501
|
+
}
|
|
3502
|
+
mul12To(it.m, pp.studM, si * 12, w);
|
|
3503
|
+
const sm = sMesh[studCl[j]];
|
|
3504
|
+
if (!sm)
|
|
3505
|
+
continue;
|
|
3506
|
+
const im = sm.im;
|
|
3507
|
+
const slot = studSlot[j];
|
|
3508
|
+
const sc = pp.color[si];
|
|
3509
|
+
const col = sc === "16" ? it.color : sc;
|
|
3510
|
+
if (sm.slots) {
|
|
3511
|
+
const t = sm.slots;
|
|
3512
|
+
t.own[slot] = steps[idx];
|
|
3513
|
+
t.hide[slot] = cull.studHideStep[j];
|
|
3514
|
+
t.inst[slot] = idx;
|
|
3515
|
+
t.stud[slot] = si;
|
|
3516
|
+
t.col[slot] = colorIndex(col);
|
|
3517
|
+
}
|
|
3518
|
+
writeM4(im.instanceMatrix.array, slot * 16, w);
|
|
3519
|
+
colorOf(col).toArray(im.instanceColor.array, slot * 3);
|
|
3407
3520
|
}
|
|
3408
|
-
writeM4(im.instanceMatrix.array, slot * 16, w);
|
|
3409
|
-
colorOf(col).toArray(im.instanceColor.array, slot * 3);
|
|
3410
3521
|
}
|
|
3522
|
+
jAt = j;
|
|
3523
|
+
return idx;
|
|
3524
|
+
};
|
|
3525
|
+
for (let idx = 0;idx < insts.length; ) {
|
|
3526
|
+
if (idx)
|
|
3527
|
+
yield;
|
|
3528
|
+
idx = pass3(idx);
|
|
3411
3529
|
}
|
|
3412
3530
|
}
|
|
3413
3531
|
if (trim) {
|
|
@@ -3448,11 +3566,20 @@ function hiddenStudSpheres(insts, H, hidI, hidS, hidC, sMesh, k0, k1) {
|
|
|
3448
3566
|
function undersideGroups(ids, insts) {
|
|
3449
3567
|
const by = new Map;
|
|
3450
3568
|
const rest = [];
|
|
3569
|
+
let p4 = NaN, p7 = NaN, p10 = NaN, prev = rest;
|
|
3451
3570
|
for (const id of ids) {
|
|
3452
3571
|
const m = insts[id].m;
|
|
3572
|
+
if (m[4] === p4 && m[7] === p7 && m[10] === p10) {
|
|
3573
|
+
prev.push(id);
|
|
3574
|
+
continue;
|
|
3575
|
+
}
|
|
3576
|
+
p4 = m[4];
|
|
3577
|
+
p7 = m[7];
|
|
3578
|
+
p10 = m[10];
|
|
3453
3579
|
const l = Math.hypot(m[4], m[7], m[10]);
|
|
3454
3580
|
if (!(l > 0.000001)) {
|
|
3455
3581
|
rest.push(id);
|
|
3582
|
+
prev = rest;
|
|
3456
3583
|
continue;
|
|
3457
3584
|
}
|
|
3458
3585
|
const ax = [m[4] / l, m[7] / l, m[10] / l, l];
|
|
@@ -3461,11 +3588,13 @@ function undersideGroups(ids, insts) {
|
|
|
3461
3588
|
if (!g) {
|
|
3462
3589
|
if (by.size >= 12) {
|
|
3463
3590
|
rest.push(id);
|
|
3591
|
+
prev = rest;
|
|
3464
3592
|
continue;
|
|
3465
3593
|
}
|
|
3466
3594
|
by.set(k, g = { ids: [], ax });
|
|
3467
3595
|
}
|
|
3468
3596
|
g.ids.push(id);
|
|
3597
|
+
prev = g.ids;
|
|
3469
3598
|
}
|
|
3470
3599
|
const out = [...by.values()];
|
|
3471
3600
|
if (rest.length)
|
|
@@ -4573,7 +4702,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
4573
4702
|
await new Promise((r) => setTimeout(r, 0));
|
|
4574
4703
|
}
|
|
4575
4704
|
}
|
|
4576
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4705
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/scene.ts
|
|
4577
4706
|
import * as THREE2 from "three";
|
|
4578
4707
|
var _box = new THREE2.Box3;
|
|
4579
4708
|
var _m4 = new THREE2.Matrix4;
|
|
@@ -4928,10 +5057,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4928
5057
|
return finish();
|
|
4929
5058
|
})();
|
|
4930
5059
|
}
|
|
4931
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5060
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/parts-cdn.ts
|
|
4932
5061
|
import { decompress as decompress2 } from "fzstd";
|
|
4933
5062
|
|
|
4934
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5063
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/embedded.ts
|
|
4935
5064
|
function splitFiles(text, fallback) {
|
|
4936
5065
|
const files = new Map;
|
|
4937
5066
|
let cur = null, saw = false, skip = false;
|
|
@@ -4983,8 +5112,11 @@ function hash(s) {
|
|
|
4983
5112
|
return (a >>> 0).toString(16).padStart(8, "0") + (b >>> 0).toString(16).padStart(8, "0");
|
|
4984
5113
|
}
|
|
4985
5114
|
function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
4986
|
-
const
|
|
4987
|
-
|
|
5115
|
+
const list = [...names], out = new Map;
|
|
5116
|
+
if (!list.length)
|
|
5117
|
+
return out;
|
|
5118
|
+
const files = splitFiles(text, fallback);
|
|
5119
|
+
for (const n0 of list) {
|
|
4988
5120
|
const n = norm(n0);
|
|
4989
5121
|
if (!files.has(n) || out.has(n))
|
|
4990
5122
|
continue;
|
|
@@ -5006,7 +5138,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
5006
5138
|
return out;
|
|
5007
5139
|
}
|
|
5008
5140
|
|
|
5009
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5141
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/parts-cdn.ts
|
|
5010
5142
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
5011
5143
|
var indexCache = new Map;
|
|
5012
5144
|
var shardCache = new Map;
|
|
@@ -5083,7 +5215,7 @@ async function loadParts(names, o = {}) {
|
|
|
5083
5215
|
async function loadPartsOnce(names, o) {
|
|
5084
5216
|
const cdn = o.cdn ?? DEFAULT_PARTS_CDN, f = o.fetch ?? fetch, gap = o.gap ?? 16384;
|
|
5085
5217
|
const idx = await loadPartsIndex(cdn, f);
|
|
5086
|
-
const want = [...new Set([...names].map(norm))];
|
|
5218
|
+
const want = [...new Set([...new Set(names)].map(norm))];
|
|
5087
5219
|
const missing = [];
|
|
5088
5220
|
const todo = [];
|
|
5089
5221
|
for (const n of want) {
|
|
@@ -5161,9 +5293,16 @@ function bodyTriangles(insts, pack) {
|
|
|
5161
5293
|
}
|
|
5162
5294
|
function estimateBudgetFromIndex(insts, emb, idx) {
|
|
5163
5295
|
let bodyTris = 0, packBytes = 0, known = false;
|
|
5164
|
-
const seen = new Set;
|
|
5296
|
+
const seen = new Set, normed = new Map;
|
|
5165
5297
|
for (const i of insts) {
|
|
5166
|
-
|
|
5298
|
+
let k;
|
|
5299
|
+
if (i.embedded)
|
|
5300
|
+
k = emb.get(i.part);
|
|
5301
|
+
else {
|
|
5302
|
+
k = normed.get(i.part);
|
|
5303
|
+
if (k === undefined)
|
|
5304
|
+
normed.set(i.part, k = norm(i.part));
|
|
5305
|
+
}
|
|
5167
5306
|
const e = k ? idx.parts[k] : undefined;
|
|
5168
5307
|
if (!e)
|
|
5169
5308
|
continue;
|
|
@@ -5260,10 +5399,35 @@ async function prepareModel(source, o = {}) {
|
|
|
5260
5399
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
5261
5400
|
}
|
|
5262
5401
|
|
|
5263
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5264
|
-
var load_worker_gen_default = 'var Wt=ArrayBuffer,K=Uint8Array,Se=Uint16Array,Xt=Int16Array;var ke=Int32Array,je=function(e,t,n){if(K.prototype.slice)return K.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 K(n-t);return r.set(e.subarray(t,n)),r},Me=function(e,t,n,r){if(K.prototype.fill)return K.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},Kt=function(e,t,n,r){if(K.prototype.copyWithin)return K.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 Zt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||Zt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},ft=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Yt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Jt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)Z(0);var u=6-s,f=i==3?4:i,l=ft(e,u,f);u+=f;var a=c?1<<c:s,p=ft(e,u,a)+(c==1&&256),g=p;if(!s){var b=1<<10+(e[5]>>3);g=b+(b>>3)*(e[5]&7)}if(g>2145386496)Z(1);var y=new K((t==1?p||g:t?0:g)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:l,w:t&&t!=1?t:y.subarray(12),e:g,o:new ke(y.buffer,0,3),u:p,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return Yt(e,4)+8;Z(0)},be=function(e){var t=0;for(;1<<t<=e;++t);return t-1},Ae=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,l=o,a=new Wt(512+(o<<2)),p=new Xt(a,0,256),g=new Se(a,0,256),b=new Se(a,512,o),y=512+(o<<1),w=new K(a,y,o),x=new K(a,y+o);while(c<255&&i>0){var m=be(i+1),d=r>>3,M=(1<<m+1)-1,U=(e[d]|e[d+1]<<8|e[d+2]<<16)>>(r&7)&M,T=(1<<m)-1,k=M-i-1,D=U&T;if(D<k)r+=m,U=D;else if(r+=m+1,U>T)U-=k;if(p[++c]=--U,U==-1)i+=U,w[--l]=c;else i-=U;if(!U)do{var P=r>>3;u=(e[P]|e[P+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)Z(0);var A=0,v=(o>>1)+(o>>3)+3,E=o-1;for(var z=0;z<=c;++z){var S=p[z];if(S<1){g[z]=-S;continue}for(f=0;f<S;++f){w[A]=z;do A=A+v&E;while(A>=l)}}if(A)Z(0);for(f=0;f<o;++f){var I=g[w[f]]++,X=x[f]=s-be(I);b[f]=(I<<X)-o}return[r+7>>3,{b:s,s:w,n:x,t:b}]},Qt=function(e,t){var n=0,r=-1,s=new K(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new Se(s.buffer,268);if(o<128){var f=Ae(e,t+1,6),l=f[0],a=f[1];t+=o;var p=l<<3,g=e[t];if(!g)Z(0);var b=0,y=0,w=a.b,x=w,m=(++t<<3)-8+be(g);for(;;){if(m-=w,m<p)break;var d=m>>3;if(b+=(e[d]|e[d+1]<<8)>>(m&7)&(1<<w)-1,i[++r]=a.s[b],m-=x,m<p)break;d=m>>3,y+=(e[d]|e[d+1]<<8)>>(m&7)&(1<<x)-1,i[++r]=a.s[y],w=a.n[b],b=a.t[b],x=a.n[y],y=a.t[y]}if(++r>255)Z(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 U=0;for(n=0;n<r;++n){var T=i[n];if(T>11)Z(0);U+=T&&1<<T-1}var k=be(U)+1,D=1<<k,P=D-U;if(P&P-1)Z(0);i[r++]=be(P)+1;for(n=0;n<r;++n){var T=i[n];++c[i[n]=T&&k+1-T]}var A=new K(D<<1),v=A.subarray(0,D),E=A.subarray(D);u[k]=0;for(n=k;n>0;--n){var z=u[n];Me(E,n,z,u[n-1]=z+c[n]*(1<<k-n))}if(u[0]!=D)Z(0);for(n=0;n<r;++n){var S=i[n];if(S){var I=u[S];Me(v,n,I,u[S]=I+(1<<k-S))}}return[t,{n:E,b:k,s:v}]},qt=Ae(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],en=Ae(new K([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],tn=Ae(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],pt=function(e,t){var n=e.length,r=new ke(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ve=new K(new ke([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),nn=pt(Ve,0),_e=new K(new ke([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),rn=pt(_e,3),we=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var u=0,f=n.b,l=(r<<3)-8+be(o)-f,a=-1;for(;l>c&&a<s;){var p=l>>3,g=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(l&7);u=(u<<f|g)&i,t[++a]=n.s[u],l-=f=n.n[u]}if(l!=c||a+1!=s)Z(0)},sn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;we(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),we(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),we(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),we(e.subarray(r),t.subarray(c),n)},on=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 Me(n,e[s],t.y,t.y+=c),n;return Me(new K(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 je(e,s,u)}if(i==2){var f=e[s],l=f&3,a=f>>2&3,p=f>>4,g=0,b=0;if(l<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=f>>3;else if(b=a,a<2)p|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else p|=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 K(t.m),w=y.length-p;if(l==0)y.set(e.subarray(s,s+=p),w);else if(l==1)Me(y,e[s++],w);else{var x=t.h;if(l==2){var m=Qt(e,s);g+=s-(s=m[0]),t.h=x=m[1]}else if(!x)Z(0);(b?sn:we)(e.subarray(s,s+=g),y.subarray(w),x)}var d=e[s++];if(d){if(d==255)d=(e[s++]|e[s++]<<8)+32512;else if(d>127)d=d-128<<8|e[s++];var M=e[s++];if(M&3)Z(0);var U=[en,tn,qt];for(var T=2;T>-1;--T){var k=M>>(T<<1)+2&3;if(k==1){var D=new K([0,0,e[s++]]);U[T]={s:D.subarray(2,3),n:D.subarray(0,1),t:new Se(D.buffer,0,1),b:0}}else if(k==2)r=Ae(e,s,9-(T&1)),s=r[0],U[T]=r[1];else if(k==3){if(!t.t)Z(0);U[T]=t.t[T]}}var P=t.t=U,A=P[0],v=P[1],E=P[2],z=e[u-1];if(!z)Z(0);var S=(u<<3)-8+be(z)-E.b,I=S>>3,X=0,re=(e[I]|e[I+1]<<8)>>(S&7)&(1<<E.b)-1;I=(S-=v.b)>>3;var ee=(e[I]|e[I+1]<<8)>>(S&7)&(1<<v.b)-1;I=(S-=A.b)>>3;var ce=(e[I]|e[I+1]<<8)>>(S&7)&(1<<A.b)-1;for(++d;--d;){var fe=E.s[re],ge=E.n[re],se=A.s[ce],ue=A.n[ce],pe=v.s[ee],me=v.n[ee];I=(S-=pe)>>3;var V=1<<pe,h=V+((e[I]|e[I+1]<<8|e[I+2]<<16|e[I+3]<<24)>>>(S&7)&V-1);I=(S-=_e[se])>>3;var F=rn[se]+((e[I]|e[I+1]<<8|e[I+2]<<16)>>(S&7)&(1<<_e[se])-1);I=(S-=Ve[fe])>>3;var L=nn[fe]+((e[I]|e[I+1]<<8|e[I+2]<<16)>>(S&7)&(1<<Ve[fe])-1);if(I=(S-=ge)>>3,re=E.t[re]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<ge)-1),I=(S-=ue)>>3,ce=A.t[ce]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<ue)-1),I=(S-=me)>>3,ee=v.t[ee]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<me)-1),h>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=h-=3;else{var B=h-(L!=0);if(B){if(h=B==3?t.o[0]-1:t.o[B],B>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=h}else h=t.o[0]}for(var T=0;T<L;++T)y[X+T]=y[w+T];X+=L,w+=L;var C=X-h;if(C<0){var R=-C,O=t.e+C;if(R>F)R=F;for(var T=0;T<R;++T)y[X+T]=t.w[O+T];X+=R,F-=R,C=0}for(var T=0;T<F;++T)y[X+T]=y[C+T];X+=F}if(X!=w)while(w<y.length)y[X++]=y[w++];else X=y.length;if(n)t.y+=X;else y=je(y,0,X)}else if(n){if(t.y+=p,w)for(var T=0;T<p;++T)y[T]=y[w+T]}else if(w)y=je(y,w);return t.b=u,y}Z(2)},an=function(e,t){if(e.length==1)return e[0];var n=new K(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 Ee(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Jt(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=on(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,Kt(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 an(n,o)}async function ln(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(Ee(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 mt(e){return new TextDecoder().decode(await ln(e))}var ht=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function Pe(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),He=/^[A-Za-z][A-Za-z0-9_]*$/,Ge=new Map;function We(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(!Ge.has(r))Ge.set(r,t);return r}function Xe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&He.test(e))return We(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var gt=/^~?\\s*moved\\s+to\\s+(.+)$/i,cn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),un=new Set(["FILE","NOFILE","!DATA"]),vt=1000000000000000,Ct=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),fn=new Set(["model","submodel","configuration"]),pn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function bt(e){let t=pn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ct.has(n)||fn.has(n)?n:void 0}function mn(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 hn(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((a)=>Number.isFinite(a)&&Math.abs(a)<=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 a=0;a<s;a++)c=c.replace(/^\\S+\\s*/,"");let u=mn(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 l=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(l>0&&u[l+1])f.glossmap=u[l+1];if(t)f.next=!0;return f}var gn=(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 bn(e){let t=e.length,n=1,r=(l)=>l===32||l===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let l=n;while(n<t&&!r(e.charCodeAt(n)))n++;return l<n?e.slice(l,n):null},o=s();if(o===null)return null;let i=Array(12);for(let l=0;l<12;l++){let a=s();if(a===null)return null;let p=+a;if(!Number.isFinite(p))return null;i[l]=p}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=Xe(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:Y(u)}}var dn=[0,12,6,9,12,12];function dt(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=Xe(e[1]),r=dn[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Tt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],l=null,a=()=>{if(!u)return;let m=gn(u.chunks.join("")),d=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(c??=new Map).set(Y(u.name),{name:u.name,bytes:m,...d?{mime:"image/png"}:{}}),u=null},p=!0,g=(m)=>{if(a(),o={name:Y(m),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],l=null,p=!0},b=!1,y=!1,w=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},x=(m,d)=>{if(l){m.tex=l,l=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!d)m.fallback=!0}else m.tex=M.map};for(let m of e.split(`\n`)){let d=m.trim();if(!d)continue;if(r&&d.charCodeAt(0)>=50&&d.charCodeAt(0)<=53&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){if(u||b)continue;if(!o)g(t);let k=d.slice(2).trimStart(),D=k.search(/\\s/),P={t:d.charCodeAt(0)-48,color:Xe(D<0?k:k.slice(0,D)),p:[],src:d};x(P,!1),o.cmds.push(P),p=!1;continue}if(d.charCodeAt(0)===48&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){let k=2;while(d.charCodeAt(k)===32||d.charCodeAt(k)===9)k++;let D=k;while(D<d.length&&d.charCodeAt(D)!==32&&d.charCodeAt(D)!==9)D++;let P=d.slice(k,D),A=/[^\\x21-\\x7e]/.test(P)?d.slice(k).trim().split(/\\s+/)[0]:P;if(!cn.has(A)&&!(A.length>=4&&A.length<=6&&un.has(A.toUpperCase()))){if(b||u)continue;if(!o)g(t);let v=d.slice(k),E={t:0,text:v};if(P.charCodeAt(0)===33)E.meta=P;if(l=null,p&&!o.org){let S=bt(v);if(S)o.org=S}let z=v.match(gt);if(z&&!o.movedTo){let S=z[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(S))S+=".dat";o.movedTo=Y(S)}o.cmds.push(E);continue}}if(d.charCodeAt(0)===49&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)&&!u&&!b){let k=bn(d);if(k){if(!o)g(t);x(k,!1),o.cmds.push(k),p=!1;continue}}let M=d.split(/\\s+/);if(+M[0]===0){let k=d.slice(1).trim(),D=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(D==="FILE"){let v=k.slice(5).trimStart().split("\\r")[0].trim();if(v){w(),b=!1,g(v);continue}}if(D==="NOFILE"){a(),o=null,b=!0;continue}if(D==="!DATA"){w(),a(),o=null,b=!1,u={name:k.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 P={t:0,text:k};if(M[1]==="STEP")P.step=!0,f=[],l=null;else if(M[1]==="BFC")P.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(P.meta="ROTSTEP",P.step=!0,f=[],l=null,(M[2]??"").toUpperCase()==="END")P.rotstep={x:0,y:0,z:0,mode:"END"};else{let v=(M[5]??"REL").toUpperCase(),E=(z)=>{let S=Number(z);return Number.isFinite(S)?S:0};P.rotstep={x:E(M[2]),y:E(M[3]),z:E(M[4]),mode:["REL","ABS","ADD"].includes(v)?v:"REL"}}else if(M[1]==="BUFEXCHG"){P.meta="BUFEXCHG";let v=(M[2]??"").toUpperCase();P.bufexchg={op:v==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))P.meta=M[1];if(p&&!o.org){let v=bt(k);if(v)o.org=v}if(M[1]==="!TEXMAP"){let v=(M[2]??"").toUpperCase();if(l=null,v==="START"||v==="NEXT"){let E=hn(k.replace(/^!TEXMAP\\s+\\S+/i,""),v==="NEXT");if(P.texmap={op:v,...E?{map:E}:{}},E)if((o.texmaps??=[]).push(E),v==="START")f.push({map:E,fallback:!1});else l=E}else if(v==="FALLBACK"){P.texmap={op:v};let E=f[f.length-1];if(E)E.fallback=!0}else if(v==="END")P.texmap={op:v},f.pop()}else if(M[1]==="!:"){l=null;let v=dt(M.slice(2));if(v)x(v,!0),P.geom=v}else l=null;let A=k.match(gt);if(A&&!o.movedTo){let v=A[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(v))v+=".dat";o.movedTo=Y(v)}o.cmds.push(P);continue}if(u||b)continue;if(!o)g(t);let T=dt(M);if(!T){if(/^[2-5][ \\t]/.test(d))p=!1;continue}x(T,!1),o.cmds.push(T),p=!1}return a(),c?{main:i,files:s,data:c}:{main:i,files:s}}var Hn=Math.PI/180;function Lt(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 St(e,t){let[n,r,s,o,i,c,u,f,l,a,p,g]=e,[b,y,w,x,m,d,M,U,T,k,D,P]=t;return[o*b+i*y+c*w+n,u*b+f*y+l*w+r,a*b+p*y+g*w+s,o*x+i*M+c*k,o*m+i*U+c*D,o*d+i*T+c*P,u*x+f*M+l*k,u*m+f*U+l*D,u*d+f*T+l*P,a*x+p*M+g*k,a*m+p*U+g*D,a*d+p*T+g*P]}var Ke=[0,0,0,1,0,0,0,1,0,0,0,1];var yt=new WeakMap,yn=/^(s|8|48)\\//;function Ze(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=yt.get(n);if(r)return r;if(n.org)r=Ct.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&&yn.test(s.file))?"part":"model";return yt.set(n,r),r}var xt=new WeakMap;function kt(e){let t=xt.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 xt.set(e,t),t}var wt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Ge.get(e)??String(e):String(e),xn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${wt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${wt(e.color)} ${e.p.join(" ")}`,Ye=(e,t)=>`${Y(e)}#${t}`;function wn(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:Ye(e.name,t),cmds:n}}function Et(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...wn(e,t).cmds.map(xn)].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 Pt(e){let[t,n,r,s,o,i,c,u,f,l,a,p]=e,g=u*p-f*a,b=-(c*p-f*l),y=c*a-u*l,w=s*g+o*b+i*y;if(!Number.isFinite(w)||Math.abs(w)<0.000000000001)return null;let x=1/w,m=[g*x,-(o*p-i*a)*x,(o*f-i*u)*x,b*x,(s*p-i*l)*x,-(s*f-i*c)*x,y*x,-(s*a-o*l)*x,(s*u-o*c)*x];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var Mn=(e)=>String(+e.toFixed(6)||0),Mt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Ft(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Mn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Mt(t.texture)}${t.glossmap?" GLOSSMAP "+Mt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Je(r)}`,source:r}}var An=(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 vn(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 At=new WeakMap;function It(e){let t=At.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=vn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:An(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),At.set(e,n),n}class Qe 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 Cn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=vt))return!1;return!0},Rt=999999,Nt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ut=new WeakMap,Bt=new WeakMap;function Tn(e,t){let n=Bt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ut.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Bt.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${Je(o)}`,source:o},n.parts.set(e,r)}return r}function Ln(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,l=t.maxInstances??2000000,a=0,p=(b,y)=>{let w=b.name+"#"+y,x=c.get(w);if(!x){let m;x=Object.assign(()=>m??=Et(b,y),{file:b,step:y}),c.set(w,x)}return x},g=(b,y,w,x,m,d,M,U,T=null,k=[],D=[],P=void 0,A=null)=>{let v=b.files.get(y);if(!v||M>r||f.has(v))return;if(++a>l)throw new Qe("model",l);f.add(v);let E=A,z=0,S=M>0?++u:0,I=i&&S?[...k,S]:k,X=i&&S?[...D,w]:D,re=i&&!T?new Map:null,ee=-1,ce=0,fe=(V,h,F,L,B,C,R)=>{if(ee!==z)ee=z,ce=0;let O=re?.get(z+"|"+h);if(O)return O.n++,g(V,V===b?h:V.main,F,L,m+"/"+h,[...B,Rt],M+1,C,[...B,Rt],I,X,R,E);let _=[...B,ce++],N=n.length;g(V,V===b?h:V.main,F,L,m+"/"+h,_,M+1,C,T,I,X,R,E),re?.set(z+"|"+h,{n:1,from:N,to:n.length})},ge=It(v),se=s?kt(v):[],ue=0,pe=(V,h,F,L,B,C,R,O,_)=>{if(T)L=T;if(++a>l)throw new Qe("model",l);let N={part:V,color:h,m:F,step:L[0],steps:L,localStep:B,path:m};if(O)N.colour=O;if(S){if(N.sub=S,i)N.subPath=I,N.subMats=X}if(C)N.embedded=!0;if(R){let H=Ft(V,R);N.texPart=H.name,N.texSource=H.source}else if(_){let H=Tn(V,_);N.colPart=H.name,N.colSource=H.source}let j=ge[B];if(j)N.view=j;return n.push(N),N},me=(V)=>{while(ue<se.length&&se[ue]<=V){let h=se[ue++];pe(Ye(v.name,h),x,w,[...d,h],h,!1,null,P,A).source=p(v,h)}};for(let V of v.cmds){if(V.t===0&&V.step){z++;continue}let h=V;if(h.t>=2||h.t===0&&h.geom&&h.geom.t>=2){me(z);continue}if(h.t===0){if(h.meta==="!COLOUR"){let j=kn(h.text);if(j&&j.code!==16&&j.code!==24)Ut.set(j,h.text),(E=new Map(E??[])).set(j.code,j);continue}if(o&&h.geom?.t===1)h=h.geom;else continue}if(h.t!==1)continue;if(o&&h.fallback)continue;let F=St(w,h.m);if(!Cn(F))continue;let L=h.color===16?x:h.color,B=h.color===16?P:E?.get(h.color),C=[...d,z],R=o?h.tex??U:null,O=R?Pt(h.m):null,_=R&&O?Lt(R,O):null;if(b.files.has(h.file)){if(Ze(b,h.file)==="model"){fe(b,h.file,F,L,C,_,B);continue}pe(h.file,L,F,C,z,!0,_,B,E);continue}let N=t.resolveModel?.(h.file);if(N){fe(N,h.file,F,L,C,_,B);continue}pe(h.file,L,F,C,z,!1,_,B,E)}if(me(1/0),f.delete(v),re){for(let V of re.values())if(V.n>1)for(let h=V.from;h<V.to;h++)n[h].mult??=V.n}};if(Ze(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ke,16,e.main,[],0,null),n}function Ot(e,t="main.ldr",n){return Ln(Tt(e,t,{geometryText:!0}),n)}var Sn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function qe(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 Dt(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=qe(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 kn(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"},l=1;while(l<n.length){let a=n[l].toUpperCase(),p=n[l+1];if(a==="CODE")s=p!==void 0&&He.test(p)?We(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,l+=2;else if(a==="VALUE"){let g=qe(p);if(g)o=g;l+=2}else if(a==="EDGE")i=qe(p)??p,l+=2;else if(a==="ALPHA")c=+p,l+=2;else if(a==="LUMINANCE")u=+p,l+=2;else if(a==="CHROME")f={type:"chrome"},l+=1;else if(a==="PEARLESCENT")f={type:"pearlescent"},l+=1;else if(a==="RUBBER")f={type:"rubber"},l+=1;else if(a==="MATTE_METALLIC")f={type:"matte_metallic"},l+=1;else if(a==="METAL")f={type:"metal"},l+=1;else if(a==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:b,next:y}=Dt(n,l+2);f={type:"glitter",material:b},l=y}else if(g==="SPECKLE"){let{grain:b,next:y}=Dt(n,l+2);f={type:"speckle",material:b},l=y}else if(g==="FABRIC"){let b=(n[l+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(b)?b.toLowerCase():void 0;f={type:"fabric",kind:y},l+=y?3:2}else l=n.length}else if(Sn.has(a))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(u)?u:0,finish:f}}function En(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 et(e){let t=En(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 Pn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var Fn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function In(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 zt(e,t,n="main.ldr"){let r=Pn(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let l of r.get(u.pop())){let a=Fn(l);if(a&&r.has(a)&&!c.has(a))c.add(a),u.push(a)}let f=[i,...[...c].filter((l)=>l!==i).sort()].map((l)=>"0 FILE "+(l===i?"":l)+`\n`+r.get(l).join(`\n`)).join(`\n`);s.set(i,`emb/${In(f)}.dat`)}return s}var $t=(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,jt=new WeakMap,tt=null,nt="",rt=null;function st(e,t){if(e===tt&&t===nt)return rt;let n=jt.get(e);if(!n)jt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return tt=e,nt=t,rt=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((g,b)=>{c.push(g[0]),u.push(g[1]);for(let y=0;y<12;y++)i[b*12+y]=g[2+y]});let f=null,l=0,a=0;if(s.mask){l=s.mask[0],a=s.mask[1];let g=s.mask[2];f=new Uint8Array(g.length);for(let b=0;b<g.length;b++)f[b]=g.charCodeAt(b)===49?1:0}let p=!!f;if(f){for(let g=0;g<f.length;g++)if(f[g]!==1){p=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:l,nz:a,full:p}),tt=e,nt=t,rt=r,r}var ye=1073741824;class de{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=de.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=de.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,u=this.slot(e,t,n);for(;;){let f=o[u],l=u<<2;if(f===0)return o[u]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(f===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let a=i[l+3];return i[l+3]=r,a}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])}}}class Vt{grp=new de(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],u=[];for(let a=0;a<r;a++){let p=e[a],g=t[a],b=n[a],y=(p%20+20)%20,w=(b%20+20)%20,x=this.group(g,y,w);if(x<0)x=s.length,this.grp.put(g,y,w,x),this.lg=x,s.push(0),o.push(p),i.push(p),c.push(b),u.push(b);if(s[x]++,p<o[x])o[x]=p;else if(p>i[x])i[x]=p;if(b<c[x])c[x]=b;else if(b>u[x])u[x]=b}let f=0,l=0;for(let a=0;a<s.length;a++){let p=(i[a]-o[a])/20+1,g=(u[a]-c[a])/20+1,b=p*g;if(this.gX0.push(o[a]),this.gZ0.push(c[a]),this.gNx.push(p),this.gNz.push(g),b<=64*s[a]+1024&&f+b<2147483648)this.gBits.push(f),f+=b;else this.gBits.push(-1),l+=s[a]}this.bits=new Uint8Array(Math.ceil(f/8)),this.rest=new de(l);for(let a=0;a<r;a++){let p=e[a],g=t[a],b=n[a],y=this.group(g,(p%20+20)%20,(b%20+20)%20),w=this.gBits[y];if(w<0){this.rest.put(p,g,b,1);continue}let x=w+(p-this.gX0[y])/20*this.gNz[y]+(b-this.gZ0[y])/20;this.bits[x>>>3]|=1<<(x&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Rn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),xe=(e,t,n)=>e>-ye&&e<ye&&t>-ye&&t<ye&&n>-ye&&n<ye,ve=2147483647;function Bn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function Dn(e,t,n){let s=new Map,o=(h)=>{let F=s.get(h);if(F===void 0)s.set(h,F=Bn(t,h));return F},i=[],c=[],u=[],f=[],l=[],a=[],p=[],g=[],b=[],y=[],w=[],x=[],m=new de(e.length*2),d=[],M=[];for(let h=0;h<e.length;h++){let F=e[h],L=F.m,B=t.parts[F.part];if(!B||!B.mask||!$t(L)||o(F.color))continue;let C=B.bbox,R=1/0,O=-1/0,_=1/0,N=-1/0;for(let G=0;G<2;G++)for(let W=0;W<2;W++){let J=G?C[3]:C[0],he=W?C[5]:C[2],le=L[0]+L[3]*J+L[5]*he,ne=L[2]+L[9]*J+L[11]*he;if(le<R)R=le;if(le>O)O=le;if(ne<_)_=ne;if(ne>N)N=ne}let j=Math.round((L[1]+C[4])*2),H=st(t,F.part),Q=Math.floor(R/40),ie=Math.floor(O/40),oe=Math.floor(_/40),ae=Math.floor(N/40);if(!((ie-Q+1)*(ae-oe+1)<=65536)||!xe(j,Q,oe)||!xe(j,ie,ae))continue;let q=-1;for(let G=m.get(j,Q,oe),W=0;G>=0&&W<8;G=d[G],W++){let J=M[G];if(i[J]!==R||c[J]!==O||u[J]!==_||f[J]!==N||p[J]!==H)continue;let he=e[l[J]].m,le=!0;for(let ne=0;ne<12;ne++)if(he[ne]!==L[ne]){le=!1;break}if(le){q=J;break}}if(q>=0){let G=n?n[h]:0;if(n&&G<n[l[q]])a[q]=l[q],l[q]=h;else if(a[q]<0||n&&G<n[a[q]])a[q]=h;continue}let te=l.length;i.push(R),c.push(O),u.push(_),f.push(N),l.push(h),a.push(-1),p.push(H),g.push(C[0]),b.push(C[2]),y.push(j),w.push(L[0],L[1],L[2],L[3],L[6],L[9],L[5],L[8],L[11]),x.push(H.full&&C[3]-C[0]<=20*H.nx&&C[5]-C[2]<=20*H.nz&&L[4]===0&&L[6]===0&&L[8]===0&&L[10]===0&&Rn(L[3],L[5],L[9],L[11])?1:0);for(let G=Q;G<=ie;G++)for(let W=oe;W<=ae;W++){if(!xe(j,G,W))continue;let J=M.length;M.push(te),d.push(m.put(j,G,W,J))}}let U=[0,5,-5,5,-5],T=[0,5,5,-5,-5],k=(h,F,L,B)=>{if(!(F-6>=i[h]-0.5&&F+6<=c[h]+0.5&&B-6>=u[h]-0.5&&B+6<=f[h]+0.5))return!1;if(x[h]===1)return!0;let C=h*9,R=p[h],O=g[h],_=b[h],N=F-w[C],j=L-w[C+1],H=B-w[C+2],Q=w[C+3]*N+w[C+4]*j+w[C+5]*H,ie=w[C+6]*N+w[C+7]*j+w[C+8]*H,{nx:oe,nz:ae,mask:q}=R;for(let te=0;te<5;te++){let G=Math.floor((Q+U[te]-O)/20),W=Math.floor((ie+T[te]-_)/20);if(G<0||W<0||G>=oe||W>=ae||q[G*ae+W]!==1)return!1}return!0},D=NaN,P=NaN,A=NaN,v=-1,E=-1,z=(h,F,L,B)=>{let C=Math.round(F*2),R=Math.floor(h/40),O=Math.floor(L/40);if(!xe(C,R,O))return ve;let _=ve;if(!n&&E>=0&&y[E]===C&&(l[E]!==B||a[E]>=0)&&k(E,h,F,L))return 0;if(C!==D||R!==P||O!==A)D=C,P=R,A=O,v=m.get(C,R,O);for(let N=v;N>=0;N=d[N]){let j=M[N],H=l[j];if(H===B&&(H=a[j])<0)continue;if(!k(j,h,F,L))continue;if(!n)return E=j,0;let Q=n[H];if(Q<_)_=Q}return _},S=0;for(let h of e){let F=st(t,h.part);if(F)S+=F.nStuds}let I=new Uint8Array(S),X=new Uint8Array(S),re=0,ee=n?new de(S,4):null,ce=n?null:new Int32Array(S),fe=n?null:new Int32Array(S),ge=n?null:new Int32Array(S),se=0,ue=n?new Int32Array(S).fill(ve):void 0;for(let h=0,F=0;h<e.length;h++){let L=e[h],B=st(t,L.part);if(!B)continue;let C=L.m,R=B.studM,O=C[0],_=C[1],N=C[2],j=C[3],H=C[4],Q=C[5],ie=C[6],oe=C[7],ae=C[8],q=C[9],te=C[10],G=C[11];for(let W=0;W<B.nStuds;W++,F++){let J=W*12,he=R[J+4],le=R[J+7],ne=R[J+10];if(!(Math.abs(ie*he+oe*le+ae*ne-1)<0.001&&Math.abs(j*he+H*le+Q*ne)<0.001&&Math.abs(q*he+te*le+G*ne)<0.001))continue;X[F]=1;let Oe=R[J],ze=R[J+1],$e=R[J+2],ot=O+j*Oe+H*ze+Q*$e,it=_+ie*Oe+oe*ze+ae*$e,at=N+q*Oe+te*ze+G*$e,lt=z(ot,it,at,h);if(lt!==ve){if(I[F]=1,re++,ue)ue[F]=lt}let Ce=Math.round(ot),Te=Math.round(it),Le=Math.round(at);if(!xe(Ce,Te,Le))continue;if(!ee){ce[se]=Ce,fe[se]=Te,ge[se++]=Le;continue}let ct=n[h],ut=ee.get(Ce,Te,Le);if(ut<0||ct<ut)ee.put(Ce,Te,Le,ct)}}let pe=ee?null:new Vt(ce,fe,ge,se),me=new Uint8Array(e.length),V=n?new Int32Array(e.length).fill(ve):void 0;for(let h=0;h<e.length;h++){let F=e[h],L=t.parts[F.part];if(!L||!L.under||!$t(F.m)||o(F.color))continue;let B=L.bbox,C=Math.round((B[3]-B[0])/20),R=Math.round((B[5]-B[2])/20);if(!C||!R||C*R>4096)continue;let O=F.m,_=Math.round(O[1]+B[4]),N=!0,j=0;for(let H=0;H<C&&N;H++)for(let Q=0;Q<R;Q++){let ie=B[0]+10+20*H,oe=B[2]+10+20*Q,ae=O[0]+O[3]*ie+O[5]*oe,q=O[2]+O[9]*ie+O[11]*oe,te=Math.round(ae),G=Math.round(q),W=!xe(te,_,G)?-1:ee?ee.get(te,_,G):pe.has(te,_,G)?1:-1;if(W<0){N=!1;break}if(W>j)j=W}if(N){if(me[h]=1,V)V[h]=j}}return{nStuds:S,studHidden:I,studUp:X,underHidden:me,studsHidden:re,studHideStep:ue,underHideStep:V}}function Nn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let g=o.get(p);if(g!==void 0)return g;let b=t.colorTable?.[a.color],y=b?.hex??t.colors?.[a.color],w=b?et({alpha:b.alpha??255,luminance:b.luminance??0,finish:b.finish??{type:"default"}}):"default:op",x=et(p);if(g=y&&y.toUpperCase()===p.hex.toUpperCase()&&w===x?String(a.color):p.hex.toUpperCase()+"/"+x,g!==String(a.color))s.set(g,p);return o.set(p,g),g},c=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=c.map((a)=>Nt(a.steps)),f=[...new Set(u)].sort(),l=new Map(f.map((a,p)=>[a,p]));return{all:c,stepOf:u.map((a)=>l.get(a)),nSteps:f.length,localColours:s}}function Fe(e,t,n=!0){let r=Nn(e,t,n);return Dn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ne="https://ldr-demo.vercel.app/cdn/v1/",Re=new Map,Ie=new Map;function Be(e=Ne,t=fetch){let n=Re.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(()=>Re.delete(e)),Re.set(e,n);return n}var Un=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),De=(e,t)=>Un(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>De(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,De(r,t)])):e;function On(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let g=p.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),w=r;n.push(y),r+=y.byteLength;let x=(4-r%4)%4;if(x)n.push(new Uint8Array(x)),r+=x;for(let[m,d]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=De(d,w);for(let[m,d]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=De(d,w)}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,l=new Uint8Array(f+r);new DataView(l.buffer).setUint32(0,c.length+u,!0),l.set(c,4),l.fill(32,4+c.length,f);let a=f;for(let p of n)l.set(p,a),a+=p.byteLength;return Pe(l.buffer)}async function zn(e,t={}){e=[...e];try{return await _t(e,t)}catch(n){let r=t.cdn??Ne,s=t.fetch??fetch;Re.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await _t(e,{...t,fetch:o})}catch{throw n}}}async function _t(e,t){let n=t.cdn??Ne,r=t.fetch??fetch,s=t.gap??16384,o=await Be(n,r),i=[...new Set([...e].map(Y))],c=[],u=[];for(let m of i){if(Ie.has(n+m))continue;let d=o.parts[m];if(d)u.push({name:m,off:d[0],len:d[1],file:d[2]??0});else c.push(m)}u.sort((m,d)=>m.file-d.file||m.off-d.off);let f=[];for(let m of u){let d=f[f.length-1];if(d&&d.file===m.file&&m.off-d.end<=s)d.end=Math.max(d.end,m.off+m.len),d.items.push(m);else f.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let l=0,a=0,p=0,g=new Map,b=async()=>{while(p<f.length){let m=f[p++],d=g.get(m.file);if(d)d=d.subarray(m.start,m.end);else{let M=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(a++,d=new Uint8Array(await M.arrayBuffer()),l+=d.byteLength,M.status===200)g.set(m.file,d),d=d.subarray(m.start,m.end)}for(let M of m.items){let U=Ee(d.subarray(M.off-m.start,M.off-m.start+M.len)),T=U.buffer.slice(U.byteOffset,U.byteOffset+U.byteLength);Ie.set(n+M.name,Pe(T))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},b));let y=i.filter((m)=>Ie.has(n+m)).map((m)=>Ie.get(n+m)),w={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:y.length?On(y,w):Pe($n(w)),missing:c,requests:a,bytes:l}}function $n(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 jn(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 Gt(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):Y(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 Ue 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 Ht(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Be(t.cdn??Ne,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(A)=>{if(!A.ok)throw Error(`ldr: ${A.status} fetching ${e}`);return mt(await A.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":ht(e)),u=Ot(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let l=zt(o,new Set(u.filter((A)=>A.embedded).map((A)=>A.part)),c),a=(A,v)=>t.maxBodyTris!=null&&A>t.maxBodyTris||t.maxPackBytes!=null&&v>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(A)=>new Ue({...A,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),b="full";if(p){let A=Gt(u,l,await s);if(a(A.known?A.bodyTris:0,A.packBytes)){if(!t.lowCdn)throw g(A);let v=await Be(t.lowCdn,r).catch(()=>null);if(!v)throw g(A);let E=Gt(u,l,v);if(a(E.known?E.bodyTris:0,E.packBytes))throw g(E);b="low"}}let y=[...u.filter((A)=>!A.embedded).map((A)=>A.part),...l.values()],w=async()=>{let A=await zn(y,b==="low"?{...t,cdn:t.lowCdn}:t);for(let[v,E]of l){let z=A.pack.header.parts[E];if(z)A.pack.header.parts[v]=z}return{...A,packBytes:A.pack.buffer?.byteLength??A.pack.bytes??0,bodyTris:jn(u,A.pack)}},x=await w();if(p&&a(x.bodyTris,x.packBytes)&&b==="full"&&t.lowCdn&&await Be(t.lowCdn,r).then(()=>!0,()=>!1)){b="low";let A=x;x=await w(),x.requests+=A.requests,x.bytes+=A.bytes}if(p&&a(x.bodyTris,x.packBytes))throw g(x);let{pack:m,missing:d,requests:M,bytes:U}=x,T=new Map([...l].map(([A,v])=>[v,A])),k=d.map((A)=>T.get(A)??A),D=performance.now(),P=t.cull?Fe(u,m.header,t.textures!==!1):void 0;return{insts:u,pack:m,tier:b,missing:k,requests:M,bytes:U,cull:P,timings:{fetchModel:i-n,parse:f-i,parts:D-f,...P?{cull:performance.now()-D}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Ht(n,{...r,cull:!1,onParsed:(l)=>self.postMessage({id:t,insts:l})}),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=Fe(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let l of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(l)f.push(l.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Ue||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';
|
|
5402
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/load-worker.gen.ts
|
|
5403
|
+
var load_worker_gen_default = 'var nn=ArrayBuffer,W=Uint8Array,ze=Uint16Array,rn=Int16Array;var $e=Int32Array,Ye=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},Re=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},sn=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var on=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||on[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},bt=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},an=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},ln=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)Z(0);var a=6-s,u=i==3?4:i,l=bt(e,a,u);a+=u;var f=c?1<<c:s,h=bt(e,a,f)+(c==1&&256),g=h;if(!s){var p=1<<10+(e[5]>>3);g=p+(p>>3)*(e[5]&7)}if(g>2145386496)Z(1);var m=new W((t==1?h||g:t?0:g)+12);return m[0]=1,m[4]=4,m[8]=8,{b:a+f,y:0,l:0,d:l,w:t&&t!=1?t:m.subarray(12),e:g,o:new $e(m.buffer,0,3),u:h,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return an(e,4)+8;Z(0)},Se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},Be=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,a=-1,u=-1,l=o,f=new nn(512+(o<<2)),h=new rn(f,0,256),g=new ze(f,0,256),p=new ze(f,512,o),m=512+(o<<1),A=new W(f,m,o),x=new W(f,m+o);while(c<255&&i>0){var d=Se(i+1),w=r>>3,b=(1<<d+1)-1,M=(e[w]|e[w+1]<<8|e[w+2]<<16)>>(r&7)&b,k=(1<<d)-1,N=b-i-1,P=M&k;if(P<N)r+=d,M=P;else if(r+=d+1,M>k)M-=N;if(h[++c]=--M,M==-1)i+=M,A[--l]=c;else i-=M;if(!M)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,c+=a}while(a==3)}if(c>255||i)Z(0);var y=0,B=(o>>1)+(o>>3)+3,C=o-1;for(var I=0;I<=c;++I){var R=h[I];if(R<1){g[I]=-R;continue}for(u=0;u<R;++u){A[y]=I;do y=y+B&C;while(y>=l)}}if(y)Z(0);for(u=0;u<o;++u){var S=g[A[u]]++,V=x[u]=s-Se(S);p[u]=(S<<V)-o}return[r+7>>3,{b:s,s:A,n:x,t:p}]},cn=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),a=new ze(s.buffer,268);if(o<128){var u=Be(e,t+1,6),l=u[0],f=u[1];t+=o;var h=l<<3,g=e[t];if(!g)Z(0);var p=0,m=0,A=f.b,x=A,d=(++t<<3)-8+Se(g);for(;;){if(d-=A,d<h)break;var w=d>>3;if(p+=(e[w]|e[w+1]<<8)>>(d&7)&(1<<A)-1,i[++r]=f.s[p],d-=x,d<h)break;w=d>>3,m+=(e[w]|e[w+1]<<8)>>(d&7)&(1<<x)-1,i[++r]=f.s[m],A=f.n[p],p=f.t[p],x=f.n[m],m=f.t[m]}if(++r>255)Z(0)}else{r=o-127;for(;n<r;n+=2){var b=e[++t];i[n]=b>>4,i[n+1]=b&15}++t}var M=0;for(n=0;n<r;++n){var k=i[n];if(k>11)Z(0);M+=k&&1<<k-1}var N=Se(M)+1,P=1<<N,D=P-M;if(D&D-1)Z(0);i[r++]=Se(D)+1;for(n=0;n<r;++n){var k=i[n];++c[i[n]=k&&N+1-k]}var y=new W(P<<1),B=y.subarray(0,P),C=y.subarray(P);a[N]=0;for(n=N;n>0;--n){var I=a[n];Re(C,n,I,a[n-1]=I+c[n]*(1<<N-n))}if(a[0]!=P)Z(0);for(n=0;n<r;++n){var R=i[n];if(R){var S=a[R];Re(B,n,S,a[R]=S+(1<<N-R))}}return[t,{n:C,b:N,s:B}]},un=Be(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],fn=Be(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],pn=Be(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],yt=function(e,t){var n=e.length,r=new $e(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Je=new W(new $e([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),mn=yt(Je,0),Qe=new W(new $e([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),hn=yt(Qe,3),Fe=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var a=0,u=n.b,l=(r<<3)-8+Se(o)-u,f=-1;for(;l>c&&f<s;){var h=l>>3,g=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(l&7);a=(a<<u|g)&i,t[++f]=n.s[a],l-=u=n.n[a]}if(l!=c||f+1!=s)Z(0)},gn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;Fe(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),Fe(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),Fe(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),Fe(e.subarray(r),t.subarray(c),n)},dn=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Re(n,e[s],t.y,t.y+=c),n;return Re(new W(c),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=c,n;return Ye(e,s,a)}if(i==2){var u=e[s],l=u&3,f=u>>2&3,h=u>>4,g=0,p=0;if(l<2)if(f&1)h|=e[++s]<<4|(f&2&&e[++s]<<12);else h=u>>3;else if(p=f,f<2)h|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(f==2)h|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var m=n?n.subarray(t.y,t.y+t.m):new W(t.m),A=m.length-h;if(l==0)m.set(e.subarray(s,s+=h),A);else if(l==1)Re(m,e[s++],A);else{var x=t.h;if(l==2){var d=cn(e,s);g+=s-(s=d[0]),t.h=x=d[1]}else if(!x)Z(0);(p?gn:Fe)(e.subarray(s,s+=g),m.subarray(A),x)}var w=e[s++];if(w){if(w==255)w=(e[s++]|e[s++]<<8)+32512;else if(w>127)w=w-128<<8|e[s++];var b=e[s++];if(b&3)Z(0);var M=[fn,pn,un];for(var k=2;k>-1;--k){var N=b>>(k<<1)+2&3;if(N==1){var P=new W([0,0,e[s++]]);M[k]={s:P.subarray(2,3),n:P.subarray(0,1),t:new ze(P.buffer,0,1),b:0}}else if(N==2)r=Be(e,s,9-(k&1)),s=r[0],M[k]=r[1];else if(N==3){if(!t.t)Z(0);M[k]=t.t[k]}}var D=t.t=M,y=D[0],B=D[1],C=D[2],I=e[a-1];if(!I)Z(0);var R=(a<<3)-8+Se(I)-C.b,S=R>>3,V=0,he=(e[S]|e[S+1]<<8)>>(R&7)&(1<<C.b)-1;S=(R-=B.b)>>3;var ce=(e[S]|e[S+1]<<8)>>(R&7)&(1<<B.b)-1;S=(R-=y.b)>>3;var Me=(e[S]|e[S+1]<<8)>>(R&7)&(1<<y.b)-1;for(++w;--w;){var re=C.s[he],Te=C.n[he],be=y.s[Me],ve=y.n[Me],fe=B.s[ce],ke=B.n[ce];S=(R-=fe)>>3;var O=1<<fe,T=O+((e[S]|e[S+1]<<8|e[S+2]<<16|e[S+3]<<24)>>>(R&7)&O-1);S=(R-=Qe[be])>>3;var _=hn[be]+((e[S]|e[S+1]<<8|e[S+2]<<16)>>(R&7)&(1<<Qe[be])-1);S=(R-=Je[re])>>3;var X=mn[re]+((e[S]|e[S+1]<<8|e[S+2]<<16)>>(R&7)&(1<<Je[re])-1);if(S=(R-=Te)>>3,he=C.t[he]+((e[S]|e[S+1]<<8)>>(R&7)&(1<<Te)-1),S=(R-=ve)>>3,Me=y.t[Me]+((e[S]|e[S+1]<<8)>>(R&7)&(1<<ve)-1),S=(R-=ke)>>3,ce=B.t[ce]+((e[S]|e[S+1]<<8)>>(R&7)&(1<<ke)-1),T>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=T-=3;else{var q=T-(X!=0);if(q){if(T=q==3?t.o[0]-1:t.o[q],q>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=T}else T=t.o[0]}for(var k=0;k<X;++k)m[V+k]=m[A+k];V+=X,A+=X;var ee=V-T;if(ee<0){var J=-ee,L=t.e+ee;if(J>_)J=_;for(var k=0;k<J;++k)m[V+k]=t.w[L+k];V+=J,_-=J,ee=0}for(var k=0;k<_;++k)m[V+k]=m[ee+k];V+=_}if(V!=A)while(A<m.length)m[V++]=m[A++];else V=m.length;if(n)t.y+=V;else m=Ye(m,0,V)}else if(n){if(t.y+=h,A)for(var k=0;k<h;++k)m[k]=m[A+k]}else if(A)m=Ye(m,A);return t.b=a,m}Z(2)},bn=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function je(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=ln(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=dn(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,sn(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 bn(n,o)}async function yn(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(je(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 xt(e){return new TextDecoder().decode(await yn(e))}var wt=(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 Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),et=/^[A-Za-z][A-Za-z0-9_]*$/,qe=new Map;function tt(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!qe.has(r))qe.set(r,t);return r}function nt(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&et.test(e))return tt(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var At=/^~?\\s*moved\\s+to\\s+(.+)$/i,xn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),wn=new Set(["FILE","NOFILE","!DATA"]),Et=1000000000000000,Pt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),An=new Set(["model","submodel","configuration"]),Mn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Mt(e){let t=Mn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Pt.has(n)||An.has(n)?n:void 0}function vn(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 Cn(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every((f)=>Number.isFinite(f)&&Math.abs(f)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let f=0;f<s;f++)c=c.replace(/^\\S+\\s*/,"");let a=vn(c);if(!a.length)return null;let u={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)u.a=i[9];if(s===11)u.b=i[10];let l=a.findIndex((f,h)=>h>0&&f.toUpperCase()==="GLOSSMAP");if(l>0&&a[l+1])u.glossmap=a[l+1];if(t)u.next=!0;return u}var kn=(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,t){let n=e.length,r=1,s=(p)=>p===32||p===9,o=()=>{while(r<n&&s(e.charCodeAt(r)))r++;let p=r,m=e.charCodeAt(r),A=m===45;if(A)m=e.charCodeAt(++r);let x=0,d=0;while(m>=48&&m<=57)x=x*10+(m-48),d++,m=e.charCodeAt(++r);if(d>0&&d<=15&&(r>=n||s(m)))return A?-x:x;while(r<n&&!s(e.charCodeAt(r)))r++;return p<r?+e.slice(p,r):NaN};while(r<n&&s(e.charCodeAt(r)))r++;let i=r;if(r>=n)return null;let c=e.charCodeAt(r),a=c===45,u=0,l=0;if(a)c=e.charCodeAt(++r);while(c>=48&&c<=57)u=u*10+(c-48),l++,c=e.charCodeAt(++r);if(l>0&&l<=15&&(r>=n||s(c))){if(a)u=-u}else{while(r<n&&!s(e.charCodeAt(r)))r++;u=nt(e.slice(i,r))}let f=Array(12);for(let p=0;p<12;p++){let m=o();if(!Number.isFinite(m))return null;f[p]=m}while(r<n&&s(e.charCodeAt(r)))r++;if(r>=n)return null;let h=e.slice(r),g=t.get(h);if(g===void 0)g=Y(/[ \\t]{2,}|\\t/.test(h)?h.split(/\\s+/).join(" "):h),t.set(h,g);if(!Number.isFinite(u))return null;return{t:1,color:u,m:f,file:g}}var Ln=[0,12,6,9,12,12];function vt(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=nt(e[1]),r=Ln[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function It(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,a=null,u=[],l=null,f=()=>{if(!a)return;let w=kn(a.chunks.join("")),b=w[0]===137&&w[1]===80&&w[2]===78&&w[3]===71;(c??=new Map).set(Y(a.name),{name:a.name,bytes:w,...b?{mime:"image/png"}:{}}),a=null},h=new Map,g=!0,p=(w)=>{if(f(),o={name:Y(w),cmds:[]},s.set(o.name,o),!i)i=o.name;u=[],l=null,g=!0},m=!1,A=!1,x=()=>{if(A)return;A=!0,s.clear(),o=null,i=""},d=(w,b)=>{if(l){w.tex=l,l=null;return}let M=u[u.length-1];if(!M)return;if(M.fallback){if(!b)w.fallback=!0}else w.tex=M.map};for(let w of e.split(`\n`)){let b=w.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(a||m)continue;if(!o)p(t);let P=b.slice(2).trimStart(),D=P.search(/\\s/),y={t:b.charCodeAt(0)-48,color:nt(D<0?P:P.slice(0,D)),p:[],src:b};d(y,!1),o.cmds.push(y),g=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let P=2;while(b.charCodeAt(P)===32||b.charCodeAt(P)===9)P++;let D=P;while(D<b.length&&b.charCodeAt(D)!==32&&b.charCodeAt(D)!==9)D++;let y=b.slice(P,D),B=/[^\\x21-\\x7e]/.test(y)?b.slice(P).trim().split(/\\s+/)[0]:y;if(!xn.has(B)&&!(B.length>=4&&B.length<=6&&wn.has(B.toUpperCase()))){if(m||a)continue;if(!o)p(t);let C=b.slice(P),I={t:0,text:C};if(y.charCodeAt(0)===33)I.meta=y;if(l=null,g&&!o.org){let S=Mt(C);if(S)o.org=S}let R=C.match(At);if(R&&!o.movedTo){let S=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(S))S+=".dat";o.movedTo=Y(S)}o.cmds.push(I);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!a&&!m){let P=Tn(b,h);if(P){if(!o)p(t);d(P,!1),o.cmds.push(P),g=!1;continue}}let M=b.split(/\\s+/);if(+M[0]===0){let P=b.slice(1).trim(),D=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(D==="FILE"){let C=P.slice(5).trimStart().split("\\r")[0].trim();if(C){x(),m=!1,p(C);continue}}if(D==="NOFILE"){f(),o=null,m=!0;continue}if(D==="!DATA"){x(),f(),o=null,m=!1,a={name:P.slice(5).trim(),chunks:[]};continue}if(m)continue;if(a){if(M[1]==="!:")a.chunks.push(M.slice(2).join(""));continue}if(!o)p(t);let y={t:0,text:P};if(M[1]==="STEP")y.step=!0,u=[],l=null;else if(M[1]==="BFC")y.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(y.meta="ROTSTEP",y.step=!0,u=[],l=null,(M[2]??"").toUpperCase()==="END")y.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(M[5]??"REL").toUpperCase(),I=(R)=>{let S=Number(R);return Number.isFinite(S)?S:0};y.rotstep={x:I(M[2]),y:I(M[3]),z:I(M[4]),mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(M[1]==="BUFEXCHG"){y.meta="BUFEXCHG";let C=(M[2]??"").toUpperCase();y.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))y.meta=M[1];if(g&&!o.org){let C=Mt(P);if(C)o.org=C}if(M[1]==="!TEXMAP"){let C=(M[2]??"").toUpperCase();if(l=null,C==="START"||C==="NEXT"){let I=Cn(P.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(y.texmap={op:C,...I?{map:I}:{}},I)if((o.texmaps??=[]).push(I),C==="START")u.push({map:I,fallback:!1});else l=I}else if(C==="FALLBACK"){y.texmap={op:C};let I=u[u.length-1];if(I)I.fallback=!0}else if(C==="END")y.texmap={op:C},u.pop()}else if(M[1]==="!:"){l=null;let C=vt(M.slice(2));if(C)d(C,!0),y.geom=C}else l=null;let B=P.match(At);if(B&&!o.movedTo){let C=B[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(y);continue}if(a||m)continue;if(!o)p(t);let N=vt(M);if(!N){if(/^[2-5][ \\t]/.test(b))g=!1;continue}d(N,!1),o.cmds.push(N),g=!1}return f(),c?{main:i,files:s,data:c}:{main:i,files:s}}var rr=Math.PI/180;function Ft(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 Rt(e,t){let[n,r,s,o,i,c,a,u,l,f,h,g]=e,[p,m,A,x,d,w,b,M,k,N,P,D]=t;return[o*p+i*m+c*A+n,a*p+u*m+l*A+r,f*p+h*m+g*A+s,o*x+i*b+c*N,o*d+i*M+c*P,o*w+i*k+c*D,a*x+u*b+l*N,a*d+u*M+l*P,a*w+u*k+l*D,f*x+h*b+g*N,f*d+h*M+g*P,f*w+h*k+g*D]}var rt=[0,0,0,1,0,0,0,1,0,0,0,1];var Ct=new WeakMap,Sn=/^(s|8|48)\\//;function st(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=Ct.get(n);if(r)return r;if(n.org)r=Pt.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&&Sn.test(s.file))?"part":"model";return Ct.set(n,r),r}var kt=new WeakMap;function Bt(e){let t=kt.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 kt.set(e,t),t}var Tt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?qe.get(e)??String(e):String(e),En=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Tt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Tt(e.color)} ${e.p.join(" ")}`,ot=(e,t)=>`${Y(e)}#${t}`;function Pn(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:ot(e.name,t),cmds:n}}function Dt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Pn(e,t).cmds.map(En)].join(`\n`)+`\n`}function it(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Ut(e){let[t,n,r,s,o,i,c,a,u,l,f,h]=e,g=a*h-u*f,p=-(c*h-u*l),m=c*f-a*l,A=s*g+o*p+i*m;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let x=1/A,d=[g*x,-(o*h-i*f)*x,(o*u-i*a)*x,p*x,(s*h-i*l)*x,-(s*u-i*c)*x,m*x,-(s*f-o*l)*x,(s*a-o*c)*x];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var In=(e)=>String(+e.toFixed(6)||0),Lt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Nt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(In).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 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${it(r)}`,source:r}}var Fn=(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 Rn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),a=Math.sin(n*r),u=Math.cos(n*r);return[c*u,-c*a,i,o*a+s*i*u,o*u-s*i*a,-s*c,s*a-o*i*u,s*u+o*i*a,o*c]}var St=new WeakMap;function Ot(e){let t=St.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Rn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Fn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),St.set(e,n),n}class at extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var Bn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=Et))return!1;return!0},zt=999999,Vt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",_t=new WeakMap,$t=new WeakMap;function Dn(e,t){let n=$t.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=_t.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},$t.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${it(o)}`,source:o},n.parts.set(e,r)}return r}function Un(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,a=0,u=new Set,l=t.maxInstances??2000000,f=0,h=(p,m)=>{let A=p.name+"#"+m,x=c.get(A);if(!x){let d;x=Object.assign(()=>d??=Dt(p,m),{file:p,step:m}),c.set(A,x)}return x},g=(p,m,A,x,d,w,b,M,k=null,N=[],P=[],D=void 0,y=null)=>{let B=p.files.get(m);if(!B||b>r||u.has(B))return;if(++f>l)throw new at("model",l);u.add(B);let C=y,I=0,R=b>0?++a:0,S=i&&R?[...N,R]:N,V=i&&R?[...P,A]:P,he=i&&!k?new Map:null,ce=-1,Me=0,re=(O,T,_,X,q,ee,J)=>{if(ce!==I)ce=I,Me=0;let L=he?.get(I+"|"+T);if(L)return L.n++,g(O,O===p?T:O.main,_,X,d+"/"+T,[...q,zt],b+1,ee,[...q,zt],S,V,J,C);let F=[...q,Me++],v=n.length;g(O,O===p?T:O.main,_,X,d+"/"+T,F,b+1,ee,k,S,V,J,C),he?.set(I+"|"+T,{n:1,from:v,to:n.length})},Te=Ot(B),be=s?Bt(B):[],ve=0,fe=(O,T,_,X,q,ee,J,L,F)=>{if(k)X=k;if(++f>l)throw new at("model",l);let v={part:O,color:T,m:_,step:X[0],steps:X,localStep:q,path:d};if(L)v.colour=L;if(R){if(v.sub=R,i)v.subPath=S,v.subMats=V}if(ee)v.embedded=!0;if(J){let E=Nt(O,J);v.texPart=E.name,v.texSource=E.source}else if(F){let E=Dn(O,F);v.colPart=E.name,v.colSource=E.source}let U=Te[q];if(U)v.view=U;return n.push(v),v},ke=(O)=>{while(ve<be.length&&be[ve]<=O){let T=be[ve++];fe(ot(B.name,T),x,A,[...w,T],T,!1,null,D,y).source=h(B,T)}};for(let O of B.cmds){if(O.t===0&&O.step){I++;continue}let T=O;if(T.t>=2||T.t===0&&T.geom&&T.geom.t>=2){ke(I);continue}if(T.t===0){if(T.meta==="!COLOUR"){let U=On(T.text);if(U&&U.code!==16&&U.code!==24)_t.set(U,T.text),(C=new Map(C??[])).set(U.code,U);continue}if(o&&T.geom?.t===1)T=T.geom;else continue}if(T.t!==1)continue;if(o&&T.fallback)continue;let _=Rt(A,T.m);if(!Bn(_))continue;let X=T.color===16?x:T.color,q=T.color===16?D:C?.get(T.color),ee=[...w,I],J=o?T.tex??M:null,L=J?Ut(T.m):null,F=J&&L?Ft(J,L):null;if(p.files.has(T.file)){if(st(p,T.file)==="model"){re(p,T.file,_,X,ee,F,q);continue}fe(T.file,X,_,ee,I,!0,F,q,C);continue}let v=t.resolveModel?.(T.file);if(v){re(v,T.file,_,X,ee,F,q);continue}fe(T.file,X,_,ee,I,!1,F,q,C)}if(ke(1/0),u.delete(B),he){for(let O of he.values())if(O.n>1)for(let T=O.from;T<O.to;T++)n[T].mult??=O.n}};if(st(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...rt],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,rt,16,e.main,[],0,null),n}function Gt(e,t="main.ldr",n){return Un(It(e,t,{geometryText:!0}),n)}var Nn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function lt(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function jt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=lt(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function On(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,a=0,u={type:"default"},l=1;while(l<n.length){let f=n[l].toUpperCase(),h=n[l+1];if(f==="CODE")s=h!==void 0&&et.test(h)?tt(h):h!==void 0&&/^\\d+$/.test(h)?+h:NaN,l+=2;else if(f==="VALUE"){let g=lt(h);if(g)o=g;l+=2}else if(f==="EDGE")i=lt(h)??h,l+=2;else if(f==="ALPHA")c=+h,l+=2;else if(f==="LUMINANCE")a=+h,l+=2;else if(f==="CHROME")u={type:"chrome"},l+=1;else if(f==="PEARLESCENT")u={type:"pearlescent"},l+=1;else if(f==="RUBBER")u={type:"rubber"},l+=1;else if(f==="MATTE_METALLIC")u={type:"matte_metallic"},l+=1;else if(f==="METAL")u={type:"metal"},l+=1;else if(f==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:p,next:m}=jt(n,l+2);u={type:"glitter",material:p},l=m}else if(g==="SPECKLE"){let{grain:p,next:m}=jt(n,l+2);u={type:"speckle",material:p},l=m}else if(g==="FABRIC"){let p=(n[l+2]||"").toUpperCase(),m=["VELVET","CANVAS","STRING","FUR"].includes(p)?p.toLowerCase():void 0;u={type:"fabric",kind:m},l+=m?3:2}else l=n.length}else if(Nn.has(f))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(a)?a:0,finish:u}}function zn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function ct(e){let t=zn(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 $n(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let a=i.trim().replace(/\\s+/g," ");if(a)r.push(a)}return n}var jn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Vn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Wt(e,t,n="main.ldr"){let r=[...t],s=new Map;if(!r.length)return s;let o=$n(e,n);for(let i of r){let c=Y(i);if(!o.has(c)||s.has(c))continue;let a=new Set([c]),u=[c];while(u.length)for(let f of o.get(u.pop())){let h=jn(f);if(h&&o.has(h)&&!a.has(h))a.add(h),u.push(h)}let l=[c,...[...a].filter((f)=>f!==c).sort()].map((f)=>"0 FILE "+(f===c?"":f)+`\n`+o.get(f).join(`\n`)).join(`\n`);s.set(c,`emb/${Vn(l)}.dat`)}return s}var Xt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Ht=new WeakMap,ut=null,ft="",pt=null;function mt(e,t){if(e===ut&&t===ft)return pt;let n=Ht.get(e);if(!n)Ht.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return ut=e,ft=t,pt=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],a=[];s.studs.forEach((g,p)=>{c.push(g[0]),a.push(g[1]);for(let m=0;m<12;m++)i[p*12+m]=g[2+m]});let u=null,l=0,f=0;if(s.mask){l=s.mask[0],f=s.mask[1];let g=s.mask[2];u=new Uint8Array(g.length);for(let p=0;p<g.length;p++)u[p]=g.charCodeAt(p)===49?1:0}let h=!!u;if(u){for(let g=0;g<u.length;g++)if(u[g]!==1){h=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:a,mask:u,nx:l,nz:f,full:h}),ut=e,ft=t,pt=r,r}var Pe=1073741824;class Ee{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=Ee.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let a=s[c];if(a===0)return-1;if(a===r){let u=c<<2;if(o[u]===e&&o[u+1]===t&&o[u+2]===n)return o[u+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=Ee.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,a=this.slot(e,t,n);for(;;){let u=o[a],l=a<<2;if(u===0)return o[a]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(u===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let f=i[l+3];return i[l+3]=r,f}a=a+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Zt{grp=new Ee(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],a=[];for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=(h%20+20)%20,A=(p%20+20)%20,x=this.group(g,m,A);if(x<0)x=s.length,this.grp.put(g,m,A,x),this.lg=x,s.push(0),o.push(h),i.push(h),c.push(p),a.push(p);if(s[x]++,h<o[x])o[x]=h;else if(h>i[x])i[x]=h;if(p<c[x])c[x]=p;else if(p>a[x])a[x]=p}let u=0,l=0;for(let f=0;f<s.length;f++){let h=(i[f]-o[f])/20+1,g=(a[f]-c[f])/20+1,p=h*g;if(this.gX0.push(o[f]),this.gZ0.push(c[f]),this.gNx.push(h),this.gNz.push(g),p<=64*s[f]+1024&&u+p<2147483648)this.gBits.push(u),u+=p;else this.gBits.push(-1),l+=s[f]}this.bits=new Uint8Array(Math.ceil(u/8)),this.rest=new Ee(l);for(let f=0;f<r;f++){let h=e[f],g=t[f],p=n[f],m=this.group(g,(h%20+20)%20,(p%20+20)%20),A=this.gBits[m];if(A<0){this.rest.put(h,g,p,1);continue}let x=A+(h-this.gX0[m])/20*this.gNz[m]+(p-this.gZ0[m])/20;this.bits[x>>>3]|=1<<(x&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var _n=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),Ie=(e,t,n)=>e>-Pe&&e<Pe&&t>-Pe&&t<Pe&&n>-Pe&&n<Pe,De=2147483647;function Gn(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){return Kt(e,t,n,-1)??Kt(e,t,n,Yt)}var Yt=0;function Kt(e,t,n,r){let o=new Map,i=(L)=>{let F=o.get(L);if(F===void 0)o.set(L,F=Gn(t,L));return F},c=e.length,a=0,u=0;for(let L=0,F="";L<c;L++){let v=e[L].part;if(v===F){a++;continue}let U=t.parts[v];if(U&&U.mask)a++,F=v}let l=new Float64Array(a),f=new Float64Array(a),h=new Float64Array(a),g=new Float64Array(a),p=new Int32Array(a),m=new Int32Array(a),A=new Float64Array(a),x=new Float64Array(a),d=[],w=new Int32Array(a),b=new Float64Array(a*9),M=new Uint8Array(a);if(r<0)r=a*4+64;let k=new Ee(e.length*2),N=new Int32Array(r),P=new Int32Array(r),D=0,y=0;for(let L=0;L<e.length;L++){let F=e[L],v=F.m,U=t.parts[F.part];if(!U||!U.mask||!Xt(v)||i(F.color))continue;let E=U.bbox,z=1/0,j=-1/0,te=1/0,H=-1/0;for(let K=0;K<2;K++)for(let le=0;le<2;le++){let ne=K?E[3]:E[0],Le=le?E[5]:E[2],Ae=v[0]+v[3]*ne+v[5]*Le,de=v[2]+v[9]*ne+v[11]*Le;if(Ae<z)z=Ae;if(Ae>j)j=Ae;if(de<te)te=de;if(de>H)H=de}let G=Math.round((v[1]+E[4])*2),Q=mt(t,F.part),ue=Math.floor(z/40),ye=Math.floor(j/40),xe=Math.floor(te/40),we=Math.floor(H/40);if(!((ye-ue+1)*(we-xe+1)<=65536)||!Ie(G,ue,xe)||!Ie(G,ye,we))continue;let ge=Math.floor((z+5)/40),se=Math.floor((j-5)/40),oe=Math.floor((te+5)/40),ie=Math.floor((H-5)/40),Ce=ge<=se&&oe<=ie?(se-ge+1)*(ie-oe+1):0;y+=Ce;let pe=-1;for(let K=ge<=se&&oe<=ie?k.get(G,ge,oe):-1,le=0;K>=0&&le<8;K=N[K],le++){let ne=P[K];if(l[ne]!==z||f[ne]!==j||h[ne]!==te||g[ne]!==H||d[ne]!==Q)continue;let Le=e[p[ne]].m,Ae=!0;for(let de=0;de<12;de++)if(Le[de]!==v[de]){Ae=!1;break}if(Ae){pe=ne;break}}if(pe>=0){let K=n?n[L]:0;if(n&&K<n[p[pe]])m[pe]=p[pe],p[pe]=L;else if(m[pe]<0||n&&K<n[m[pe]])m[pe]=L;continue}let ae=u++;l[ae]=z,f[ae]=j,h[ae]=te,g[ae]=H,p[ae]=L,m[ae]=-1,d.push(Q),A[ae]=E[0],x[ae]=E[2],w[ae]=G;let me=ae*9;if(b[me]=v[0],b[me+1]=v[1],b[me+2]=v[2],b[me+3]=v[3],b[me+4]=v[6],b[me+5]=v[9],b[me+6]=v[5],b[me+7]=v[8],b[me+8]=v[11],M[ae]=Q.full&&E[3]-E[0]<=20*Q.nx&&E[5]-E[2]<=20*Q.nz&&v[4]===0&&v[6]===0&&v[8]===0&&v[10]===0&&_n(v[3],v[5],v[9],v[11])?1:0,D+Ce>r){D=r+1;continue}for(let K=ge;K<=se;K++)for(let le=oe;le<=ie;le++){if(!Ie(G,K,le))continue;let ne=D++;P[ne]=ae,N[ne]=k.put(G,K,le,ne)}}if(D>r)return Yt=y,null;let B=[0,5,-5,5,-5],C=[0,5,5,-5,-5],I=(L,F,v,U)=>{if(!(F-6>=l[L]-0.5&&F+6<=f[L]+0.5&&U-6>=h[L]-0.5&&U+6<=g[L]+0.5))return!1;if(M[L]===1)return!0;let E=L*9,z=d[L],j=A[L],te=x[L],H=F-b[E],G=v-b[E+1],Q=U-b[E+2],ue=b[E+3]*H+b[E+4]*G+b[E+5]*Q,ye=b[E+6]*H+b[E+7]*G+b[E+8]*Q,{nx:xe,nz:we,mask:ge}=z;for(let se=0;se<5;se++){let oe=Math.floor((ue+B[se]-j)/20),ie=Math.floor((ye+C[se]-te)/20);if(oe<0||ie<0||oe>=xe||ie>=we||ge[oe*we+ie]!==1)return!1}return!0},R=NaN,S=NaN,V=NaN,he=-1,ce=-1,Me=(L,F,v,U)=>{let E=Math.round(F*2),z=Math.floor(L/40),j=Math.floor(v/40);if(!Ie(E,z,j))return De;let te=De;if(!n&&ce>=0&&w[ce]===E&&(p[ce]!==U||m[ce]>=0)&&I(ce,L,F,v))return 0;if(E!==R||z!==S||j!==V)R=E,S=z,V=j,he=k.get(E,z,j);for(let H=he;H>=0;H=N[H]){let G=P[H],Q=p[G];if(Q===U&&(Q=m[G])<0)continue;if(!I(G,L,F,v))continue;if(!n)return ce=G,0;let ue=n[Q];if(ue<te)te=ue}return te},re=0;for(let L of e){let F=mt(t,L.part);if(F)re+=F.nStuds}let Te=new Uint8Array(re),be=new Uint8Array(re),ve=0,fe=n?new Ee(re,4):null,ke=n?null:new Int32Array(re),O=n?null:new Int32Array(re),T=n?null:new Int32Array(re),_=0,X=n?new Int32Array(re).fill(De):void 0;for(let L=0,F=0;L<e.length;L++){let v=e[L],U=mt(t,v.part);if(!U)continue;let E=v.m,z=U.studM,j=E[0],te=E[1],H=E[2],G=E[3],Q=E[4],ue=E[5],ye=E[6],xe=E[7],we=E[8],ge=E[9],se=E[10],oe=E[11];for(let ie=0;ie<U.nStuds;ie++,F++){let Ce=ie*12,pe=z[Ce+4],ae=z[Ce+7],me=z[Ce+10];if(!(Math.abs(ye*pe+xe*ae+we*me-1)<0.001&&Math.abs(G*pe+Q*ae+ue*me)<0.001&&Math.abs(ge*pe+se*ae+oe*me)<0.001))continue;be[F]=1;let K=z[Ce],le=z[Ce+1],ne=z[Ce+2],Le=j+G*K+Q*le+ue*ne,Ae=te+ye*K+xe*le+we*ne,de=H+ge*K+se*le+oe*ne,ht=Me(Le,Ae,de,L);if(ht!==De){if(Te[F]=1,ve++,X)X[F]=ht}let Ue=Math.round(Le),Ne=Math.round(Ae),Oe=Math.round(de);if(!Ie(Ue,Ne,Oe))continue;if(!fe){ke[_]=Ue,O[_]=Ne,T[_++]=Oe;continue}let gt=n[L],dt=fe.get(Ue,Ne,Oe);if(dt<0||gt<dt)fe.put(Ue,Ne,Oe,gt)}}let q=fe?null:new Zt(ke,O,T,_),ee=new Uint8Array(e.length),J=n?new Int32Array(e.length).fill(De):void 0;for(let L=0;L<e.length;L++){let F=e[L],v=t.parts[F.part];if(!v||!v.under||!Xt(F.m)||i(F.color))continue;let U=v.bbox,E=Math.round((U[3]-U[0])/20),z=Math.round((U[5]-U[2])/20);if(!E||!z||E*z>4096)continue;let j=F.m,te=Math.round(j[1]+U[4]),H=!0,G=0;for(let Q=0;Q<E&&H;Q++)for(let ue=0;ue<z;ue++){let ye=U[0]+10+20*Q,xe=U[2]+10+20*ue,we=j[0]+j[3]*ye+j[5]*xe,ge=j[2]+j[9]*ye+j[11]*xe,se=Math.round(we),oe=Math.round(ge),ie=!Ie(se,te,oe)?-1:fe?fe.get(se,te,oe):q.has(se,te,oe)?1:-1;if(ie<0){H=!1;break}if(ie>G)G=ie}if(H){if(ee[L]=1,J)J[L]=G}}return{nStuds:re,studHidden:Te,studUp:be,underHidden:ee,studsHidden:ve,studHideStep:X,underHideStep:J}}function Xn(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let f=l.colour;if(!f)return String(l.color);let h=o.get(f);if(h!==void 0)return h;let g=t.colorTable?.[l.color],p=g?.hex??t.colors?.[l.color],m=g?ct({alpha:g.alpha??255,luminance:g.luminance??0,finish:g.finish??{type:"default"}}):"default:op",A=ct(f);if(h=p&&p.toUpperCase()===f.hex.toUpperCase()&&m===A?String(l.color):f.hex.toUpperCase()+"/"+A,h!==String(l.color))s.set(h,f);return o.set(f,h),h},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),{stepOf:a,nSteps:u}=Hn(c);return{all:c,stepOf:a,nSteps:u,localColours:s}}function Hn(e){let t=!0;for(let o=0;o<e.length;o++){let i=e[o].steps;if(i.length!==1){t=!1;break}let c=i[0];if(!(Number.isInteger(c)&&c>=0&&c<1e6)){t=!1;break}}if(t){let o=new Set;for(let a=0;a<e.length;a++)o.add(e[a].steps[0]);let i=[...o].sort((a,u)=>a-u),c=new Map(i.map((a,u)=>[a,u]));return{stepOf:e.map((a)=>c.get(a.steps[0])),nSteps:i.length}}let n=e.map((o)=>Vt(o.steps)),r=[...new Set(n)].sort(),s=new Map(r.map((o,i)=>[o,i]));return{stepOf:n.map((o)=>s.get(o)),nSteps:r.length}}function _e(e,t,n=!0){let r=Xn(e,t,n);return Wn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ke="https://ldr-demo.vercel.app/cdn/v1/",We=new Map,Ge=new Map;function Xe(e=Ke,t=fetch){let n=We.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(()=>We.delete(e)),We.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"),He=(e,t)=>Kn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>He(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,He(r,t)])):e;function Zn(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let g=h.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let p=new DataView(g).getUint32(0,!0),m=new Uint8Array(g,4+p),A=r;n.push(m),r+=m.byteLength;let x=(4-r%4)%4;if(x)n.push(new Uint8Array(x)),r+=x;for(let[d,w]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=He(w,A);for(let[d,w]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=He(w,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+c.length)%4)%4,u=4+c.length+a,l=new Uint8Array(u+r);new DataView(l.buffer).setUint32(0,c.length+a,!0),l.set(c,4),l.fill(32,4+c.length,u);let f=u;for(let h of n)l.set(h,f),f+=h.byteLength;return Ve(l.buffer)}async function Yn(e,t={}){e=[...e];try{return await Jt(e,t)}catch(n){let r=t.cdn??Ke,s=t.fetch??fetch;We.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await Jt(e,{...t,fetch:o})}catch{throw n}}}async function Jt(e,t){let n=t.cdn??Ke,r=t.fetch??fetch,s=t.gap??16384,o=await Xe(n,r),i=[...new Set([...new Set(e)].map(Y))],c=[],a=[];for(let d of i){if(Ge.has(n+d))continue;let w=o.parts[d];if(w)a.push({name:d,off:w[0],len:w[1],file:w[2]??0});else c.push(d)}a.sort((d,w)=>d.file-w.file||d.off-w.off);let u=[];for(let d of a){let w=u[u.length-1];if(w&&w.file===d.file&&d.off-w.end<=s)w.end=Math.max(w.end,d.off+d.len),w.items.push(d);else u.push({file:d.file,start:d.off,end:d.off+d.len,items:[d]})}let l=0,f=0,h=0,g=new Map,p=async()=>{while(h<u.length){let d=u[h++],w=g.get(d.file);if(w)w=w.subarray(d.start,d.end);else{let b=await r(new URL(o.archives[d.file],n).href,{headers:{Range:`bytes=${d.start}-${d.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(f++,w=new Uint8Array(await b.arrayBuffer()),l+=w.byteLength,b.status===200)g.set(d.file,w),w=w.subarray(d.start,d.end)}for(let b of d.items){let M=je(w.subarray(b.off-d.start,b.off-d.start+b.len)),k=M.buffer.slice(M.byteOffset,M.byteOffset+M.byteLength);Ge.set(n+b.name,Ve(k))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,u.length)},p));let m=i.filter((d)=>Ge.has(n+d)).map((d)=>Ge.get(n+d)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:m.length?Zn(m,A):Ve(Jn(A)),missing:c,requests:f,bytes:l}}function Jn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function Qn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Qt(e,t,n){let r=0,s=0,o=!1,i=new Set,c=new Map;for(let a of e){let u;if(a.embedded)u=t.get(a.part);else if(u=c.get(a.part),u===void 0)c.set(a.part,u=Y(a.part));let l=u?n.parts[u]:void 0;if(!l)continue;if(l[3]!=null)o=!0,r+=l[3];if(!i.has(u))i.add(u),s+=l[1]}return{bodyTris:r,packBytes:s,known:o}}class Ze extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function qt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Xe(t.cdn??Ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(y)=>{if(!y.ok)throw Error(`ldr: ${y.status} fetching ${e}`);return xt(await y.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":wt(e)),a=Gt(o,c,{looseGeometry:!1,callouts:t.callouts}),u=performance.now();t.onParsed?.(a),await s;let l=Wt(o,new Set(a.filter((y)=>y.embedded).map((y)=>y.part)),c),f=(y,B)=>t.maxBodyTris!=null&&y>t.maxBodyTris||t.maxPackBytes!=null&&B>t.maxPackBytes,h=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(y)=>new Ze({...y,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),p="full";if(h){let y=Qt(a,l,await s);if(f(y.known?y.bodyTris:0,y.packBytes)){if(!t.lowCdn)throw g(y);let B=await Xe(t.lowCdn,r).catch(()=>null);if(!B)throw g(y);let C=Qt(a,l,B);if(f(C.known?C.bodyTris:0,C.packBytes))throw g(C);p="low"}}let m=[...a.filter((y)=>!y.embedded).map((y)=>y.part),...l.values()],A=async()=>{let y=await Yn(m,p==="low"?{...t,cdn:t.lowCdn}:t);for(let[B,C]of l){let I=y.pack.header.parts[C];if(I)y.pack.header.parts[B]=I}return{...y,packBytes:y.pack.buffer?.byteLength??y.pack.bytes??0,bodyTris:Qn(a,y.pack)}},x=await A();if(h&&f(x.bodyTris,x.packBytes)&&p==="full"&&t.lowCdn&&await Xe(t.lowCdn,r).then(()=>!0,()=>!1)){p="low";let y=x;x=await A(),x.requests+=y.requests,x.bytes+=y.bytes}if(h&&f(x.bodyTris,x.packBytes))throw g(x);let{pack:d,missing:w,requests:b,bytes:M}=x,k=new Map([...l].map(([y,B])=>[B,y])),N=w.map((y)=>k.get(y)??y),P=performance.now(),D=t.cull?_e(a,d.header,t.textures!==!1):void 0;return{insts:a,pack:d,tier:p,missing:N,requests:b,bytes:M,cull:D,timings:{fetchModel:i-n,parse:u-i,parts:P-u,...D?{cull:performance.now()-P}:{}}}}var qn=new Set(["part","color","m","step","steps","localStep","path"]);function en(e){let t=e.length,n=0;for(let p of e){if(typeof p.part!=="string"||typeof p.path!=="string"||typeof p.color!=="number"||typeof p.step!=="number"||typeof p.localStep!=="number"||!Array.isArray(p.m)||p.m.length!==12||!Array.isArray(p.steps))return null;n+=p.steps.length}let r=[],s=new Map,o=(p)=>{let m=s.get(p);if(m===void 0)s.set(p,m=r.length),r.push(p);return m},i=new Uint32Array(t),c=new Uint32Array(t),a=new Float64Array(t*3),u=new Float64Array(t*12),l=new Uint32Array(t+1),f=new Float64Array(n),h=[],g=0;for(let p=0;p<t;p++){let m=e[p];i[p]=o(m.part),c[p]=o(m.path),a[p*3]=m.color,a[p*3+1]=m.step,a[p*3+2]=m.localStep;let A=m.m,x=p*12;for(let b=0;b<12;b++)u[x+b]=A[b];let d=m.steps;for(let b=0;b<d.length;b++)f[g++]=d[b];l[p+1]=g;let w=null;for(let b in m)if(!qn.has(b))(w??={})[b]=m[b];if(w)h.push([p,w])}return{n:t,strs:r,part:i,path:c,num:a,m:u,so:l,steps:f,extra:h}}var tn=(e)=>[e.part.buffer,e.path.buffer,e.num.buffer,e.m.buffer,e.so.buffer,e.steps.buffer];self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await qt(n,{...r,cull:!1,onParsed:(l)=>{let f=en(l);if(f)self.postMessage({id:t,packed:f},tn(f));else self.postMessage({id:t,insts:l})}}),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=_e(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,u=[];for(let l of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(l)u.push(l.buffer);self.postMessage({id:t,cull:c,ms:a},u)}catch(s){if(s instanceof Ze||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
5404
|
+
|
|
5405
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/inst-io.ts
|
|
5406
|
+
var CORE = new Set(["part", "color", "m", "step", "steps", "localStep", "path"]);
|
|
5407
|
+
function unpackInstances(p) {
|
|
5408
|
+
const { n, strs, part, path, num, m, so, steps, extra } = p;
|
|
5409
|
+
const out = new Array(n);
|
|
5410
|
+
for (let k = 0;k < n; k++) {
|
|
5411
|
+
const b = k * 12, s0 = so[k], s1 = so[k + 1];
|
|
5412
|
+
const sp = [];
|
|
5413
|
+
for (let j = s0;j < s1; j++)
|
|
5414
|
+
sp.push(steps[j]);
|
|
5415
|
+
out[k] = {
|
|
5416
|
+
part: strs[part[k]],
|
|
5417
|
+
color: num[k * 3],
|
|
5418
|
+
m: [m[b], m[b + 1], m[b + 2], m[b + 3], m[b + 4], m[b + 5], m[b + 6], m[b + 7], m[b + 8], m[b + 9], m[b + 10], m[b + 11]],
|
|
5419
|
+
step: num[k * 3 + 1],
|
|
5420
|
+
steps: sp,
|
|
5421
|
+
localStep: num[k * 3 + 2],
|
|
5422
|
+
path: strs[path[k]]
|
|
5423
|
+
};
|
|
5424
|
+
}
|
|
5425
|
+
for (const [k, x] of extra)
|
|
5426
|
+
Object.assign(out[k], x);
|
|
5427
|
+
return out;
|
|
5428
|
+
}
|
|
5265
5429
|
|
|
5266
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5430
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/cdn.ts
|
|
5267
5431
|
var worker;
|
|
5268
5432
|
var seq = 0;
|
|
5269
5433
|
var pending = new Map;
|
|
@@ -5279,8 +5443,8 @@ function getWorker() {
|
|
|
5279
5443
|
const w = new Worker(url, { type: "module", name: "ldr-load" });
|
|
5280
5444
|
w.onmessage = (e) => {
|
|
5281
5445
|
const d = e.data;
|
|
5282
|
-
if (d.insts) {
|
|
5283
|
-
pendingInsts.get(d.id)?.(d.insts);
|
|
5446
|
+
if (d.insts || d.packed) {
|
|
5447
|
+
pendingInsts.get(d.id)?.(d.insts ?? unpackInstances(d.packed));
|
|
5284
5448
|
pendingInsts.delete(d.id);
|
|
5285
5449
|
return;
|
|
5286
5450
|
}
|
|
@@ -5377,7 +5541,7 @@ async function loadModel(source, o = {}) {
|
|
|
5377
5541
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
5378
5542
|
});
|
|
5379
5543
|
}
|
|
5380
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5544
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/library.ts
|
|
5381
5545
|
import { existsSync, readFileSync, statSync } from "fs";
|
|
5382
5546
|
import { join } from "path";
|
|
5383
5547
|
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]];
|
|
@@ -5727,11 +5891,11 @@ class Library {
|
|
|
5727
5891
|
return insts;
|
|
5728
5892
|
}
|
|
5729
5893
|
}
|
|
5730
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5894
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/build-pack.ts
|
|
5731
5895
|
import fs3 from "node:fs";
|
|
5732
5896
|
import path3 from "node:path";
|
|
5733
5897
|
|
|
5734
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5898
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/resolver.ts
|
|
5735
5899
|
import fs from "node:fs";
|
|
5736
5900
|
import path from "node:path";
|
|
5737
5901
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -6060,11 +6224,11 @@ function collectDeps(lib, refs) {
|
|
|
6060
6224
|
return out;
|
|
6061
6225
|
}
|
|
6062
6226
|
|
|
6063
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6227
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/compile.ts
|
|
6064
6228
|
import fs2 from "node:fs";
|
|
6065
6229
|
import path2 from "node:path";
|
|
6066
6230
|
|
|
6067
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6231
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/lod.ts
|
|
6068
6232
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
6069
6233
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
6070
6234
|
function reorderMesh(P, N, C, I) {
|
|
@@ -6370,7 +6534,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
|
|
|
6370
6534
|
return out;
|
|
6371
6535
|
}
|
|
6372
6536
|
|
|
6373
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6537
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/compile.ts
|
|
6374
6538
|
class BfcState {
|
|
6375
6539
|
accum;
|
|
6376
6540
|
ccw = true;
|
|
@@ -7314,7 +7478,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
7314
7478
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
7315
7479
|
}
|
|
7316
7480
|
|
|
7317
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7481
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/build-pack.ts
|
|
7318
7482
|
function packCompilerOpts(o) {
|
|
7319
7483
|
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 } : {} };
|
|
7320
7484
|
}
|
|
@@ -7386,7 +7550,7 @@ function buildPack(o) {
|
|
|
7386
7550
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
7387
7551
|
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 } : {} };
|
|
7388
7552
|
}
|
|
7389
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7553
|
+
// ../../../../../../../tmp/ldr-build-uD3Q4M/src/node/promote.ts
|
|
7390
7554
|
var GEOM = /^\s*[2-5]\s/;
|
|
7391
7555
|
var REF = /^\s*1\s/;
|
|
7392
7556
|
var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;
|