ldr 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +11 -11
- package/dist/index.js +352 -98
- package/dist/node/index.js +358 -104
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
function parseColor(tok) {
|
|
4
4
|
if (/^0x/i.test(tok))
|
|
@@ -689,7 +689,7 @@ function fileStepViews(f) {
|
|
|
689
689
|
viewMemo.set(f, out);
|
|
690
690
|
return out;
|
|
691
691
|
}
|
|
692
|
-
// ../../../../../../../tmp/ldr-build-
|
|
692
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/model.ts
|
|
693
693
|
var CALLOUT_END = 999999;
|
|
694
694
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
695
695
|
function flatten(doc, opts = {}) {
|
|
@@ -847,7 +847,7 @@ function parseLDConfig(text) {
|
|
|
847
847
|
}
|
|
848
848
|
return out;
|
|
849
849
|
}
|
|
850
|
-
// ../../../../../../../tmp/ldr-build-
|
|
850
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/instructions.ts
|
|
851
851
|
var MIN_VIS = 0.5;
|
|
852
852
|
var REORIENT = 0.35;
|
|
853
853
|
var deg = Math.PI / 180;
|
|
@@ -1215,10 +1215,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1215
1215
|
}
|
|
1216
1216
|
};
|
|
1217
1217
|
}
|
|
1218
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1218
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/render.ts
|
|
1219
1219
|
import * as THREE from "three";
|
|
1220
1220
|
|
|
1221
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1221
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/pack-io.ts
|
|
1222
1222
|
import { decompress } from "fzstd";
|
|
1223
1223
|
async function decompressPack(data) {
|
|
1224
1224
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1237,7 +1237,7 @@ function decodePack(buf) {
|
|
|
1237
1237
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1238
1238
|
}
|
|
1239
1239
|
|
|
1240
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1240
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/cull.ts
|
|
1241
1241
|
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;
|
|
1242
1242
|
var prepCache = new WeakMap;
|
|
1243
1243
|
function prepPart(H, part) {
|
|
@@ -1554,7 +1554,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1554
1554
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1555
1555
|
}
|
|
1556
1556
|
|
|
1557
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1557
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/render.ts
|
|
1558
1558
|
async function loadPack(url) {
|
|
1559
1559
|
const res = await fetch(url);
|
|
1560
1560
|
if (!res.ok)
|
|
@@ -1619,7 +1619,9 @@ function makeMaterial(side) {
|
|
|
1619
1619
|
m.onBeforeCompile = (s) => {
|
|
1620
1620
|
s.vertexShader = `attribute vec4 ldrColor;
|
|
1621
1621
|
` + s.vertexShader.replace("#include <color_vertex>", `#include <color_vertex>
|
|
1622
|
-
#ifdef
|
|
1622
|
+
#ifdef USE_BATCHING_COLOR
|
|
1623
|
+
vColor.rgb = ldrColor.a > 0.5 ? pow(ldrColor.rgb, vec3(2.2)) : getBatchingColor(getIndirectIndex(gl_DrawID)).rgb;
|
|
1624
|
+
#elif defined(USE_INSTANCING_COLOR)
|
|
1623
1625
|
vColor.rgb = ldrColor.a > 0.5 ? pow(ldrColor.rgb, vec3(2.2)) : instanceColor.rgb; // baked LDConfig colours are sRGB
|
|
1624
1626
|
#else
|
|
1625
1627
|
vColor.rgb = pow(ldrColor.rgb, vec3(2.2));
|
|
@@ -1995,6 +1997,24 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
1995
1997
|
L = -1;
|
|
1996
1998
|
if (c.boxErr !== undefined && c.boxErr * ppl <= tau)
|
|
1997
1999
|
L = -1;
|
|
2000
|
+
if (c.mergedLod && L >= 0) {
|
|
2001
|
+
const { bm, gids, errs, underHid, cullUnder } = c.mergedLod;
|
|
2002
|
+
for (let i = 0;i < gids.length; i++) {
|
|
2003
|
+
let Li = 0;
|
|
2004
|
+
const er = errs[i];
|
|
2005
|
+
for (let j = er.length - 1;j > 0; j--)
|
|
2006
|
+
if (er[j] * ppl <= tau) {
|
|
2007
|
+
Li = j;
|
|
2008
|
+
break;
|
|
2009
|
+
}
|
|
2010
|
+
const gd = gids[i];
|
|
2011
|
+
if (gd?.length)
|
|
2012
|
+
bm.setGeometryIdAt(i, gd[Math.min(Li, gd.length - 1)]);
|
|
2013
|
+
if (underHid && !bm.userData._stepMode)
|
|
2014
|
+
bm.setVisibleAt(i, !(cullUnder && underHid[i]));
|
|
2015
|
+
}
|
|
2016
|
+
L = 0;
|
|
2017
|
+
}
|
|
1998
2018
|
const e = ppl >= eppl;
|
|
1999
2019
|
if (L !== c.cur || e !== c.edgeOk) {
|
|
2000
2020
|
c.cur = L;
|
|
@@ -2192,6 +2212,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2192
2212
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
2193
2213
|
mark("culling");
|
|
2194
2214
|
const stepBatches = [];
|
|
2215
|
+
const stepBatched = [];
|
|
2195
2216
|
const instM = steps ? new Float64Array(insts.length * 12) : null;
|
|
2196
2217
|
const instPP = [];
|
|
2197
2218
|
const palette = [];
|
|
@@ -2314,96 +2335,306 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2314
2335
|
});
|
|
2315
2336
|
const tris = (b) => b ? b.tris ?? 0 : 0;
|
|
2316
2337
|
const kFor = (t) => LOD ? Math.max(256, Math.min(16384, Math.round(262144 / Math.max(1, t)))) : Infinity;
|
|
2338
|
+
const MERGE_MAX = 16;
|
|
2339
|
+
const geomVerts = (b) => {
|
|
2340
|
+
if (!b)
|
|
2341
|
+
return 0;
|
|
2342
|
+
const p = arr(b.pos);
|
|
2343
|
+
return p.length / 3;
|
|
2344
|
+
};
|
|
2345
|
+
const geomIdx = (b) => {
|
|
2346
|
+
if (!b)
|
|
2347
|
+
return 0;
|
|
2348
|
+
if (!b.idx)
|
|
2349
|
+
return geomVerts(b);
|
|
2350
|
+
return arr(b.idx).length;
|
|
2351
|
+
};
|
|
2352
|
+
const coldByMat = new Map;
|
|
2317
2353
|
for (const [pk, idsAll] of byPart) {
|
|
2318
2354
|
const part = pk.replace(/#m$/, "");
|
|
2319
2355
|
const p = H.parts[part];
|
|
2320
2356
|
const mat = p.uncert ? (nUncert++, matD) : pk.endsWith("#m") ? matB : matF;
|
|
2321
2357
|
const textured = wantTex && !!p.tex;
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
const
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
}
|
|
2340
|
-
if (textured)
|
|
2341
|
-
for (const tb of p.tex) {
|
|
2342
|
-
const gg = geom(tb, arr);
|
|
2343
|
-
const im = newIM(gg, texMat(tb.t, mat, !!tb.wrapU), ids.length);
|
|
2344
|
-
texBatches++;
|
|
2358
|
+
if (textured || idsAll.length > MERGE_MAX || EDGES) {
|
|
2359
|
+
const bodyB = textured ? p.tbody : p.body;
|
|
2360
|
+
const body = geom(bodyB, arr);
|
|
2361
|
+
const groups = gridClusters(idsAll.length, (i) => insts[idsAll[i]].m[0], (i) => insts[idsAll[i]].m[2], textured ? Infinity : kFor(tris(p.body) + tris(p.under)));
|
|
2362
|
+
for (const g of groups) {
|
|
2363
|
+
const ids = Array.from(g, (i) => idsAll[i]);
|
|
2364
|
+
let bodyIm = null;
|
|
2365
|
+
const lv0 = [];
|
|
2366
|
+
const place = (im) => {
|
|
2367
|
+
fillInstances(im, ids, insts, color);
|
|
2368
|
+
instancedBoundingSphere(im);
|
|
2369
|
+
im.userData.ldrPart = part;
|
|
2370
|
+
root.add(im);
|
|
2371
|
+
};
|
|
2372
|
+
if (body) {
|
|
2373
|
+
const im = bodyIm = newIM(body, mat, ids.length);
|
|
2374
|
+
place(im);
|
|
2345
2375
|
lv0.push(im);
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
bodyIm
|
|
2376
|
+
}
|
|
2377
|
+
if (textured)
|
|
2378
|
+
for (const tb of p.tex) {
|
|
2379
|
+
const gg = geom(tb, arr);
|
|
2380
|
+
const im = newIM(gg, texMat(tb.t, mat, !!tb.wrapU), ids.length);
|
|
2381
|
+
texBatches++;
|
|
2382
|
+
lv0.push(im);
|
|
2383
|
+
if (bodyIm) {
|
|
2384
|
+
im.instanceMatrix = bodyIm.instanceMatrix;
|
|
2385
|
+
im.instanceColor = bodyIm.instanceColor;
|
|
2386
|
+
im.boundingSphere = bodyIm.boundingSphere;
|
|
2387
|
+
root.add(im);
|
|
2388
|
+
} else {
|
|
2389
|
+
place(im);
|
|
2390
|
+
bodyIm = im;
|
|
2391
|
+
}
|
|
2354
2392
|
}
|
|
2393
|
+
if (bodyIm) {
|
|
2394
|
+
const cl = newCluster(bodyIm.boundingSphere);
|
|
2395
|
+
lv0.forEach((o) => o.onBeforeRender = trackVp);
|
|
2396
|
+
cl.lv.push({ objs: lv0, err: 0 }, ...textured ? [] : lodLevels(p.body, bodyIm, mat));
|
|
2397
|
+
if (EDGES && p.edges)
|
|
2398
|
+
addLines(p.edges, bodyIm, cl);
|
|
2399
|
+
addCond(p, bodyIm, cl);
|
|
2400
|
+
if (steps)
|
|
2401
|
+
stepBatches.push({ im: bodyIm, objs: [...cl.lv.flatMap((l) => l.objs), ...cl.lines, ...cl.cond], own: Int32Array.from(ids, (id) => steps[id]), hide: null, flag: "body", inst: Int32Array.from(ids), stud: null, col: Uint16Array.from(ids, (id) => instCol[id]) });
|
|
2402
|
+
}
|
|
2403
|
+
const under = geom(p.under, arr);
|
|
2404
|
+
const uGroups = !under ? [] : LOD && P.lodUnder !== false ? undersideGroups(ids, insts) : [{ ids, ax: null }];
|
|
2405
|
+
for (const { ids: uids, ax } of uGroups) {
|
|
2406
|
+
const ord = [...uids.filter((i) => !cull.underHidden[i]), ...uids.filter((i) => cull.underHidden[i])];
|
|
2407
|
+
const vis = uids.length - uids.reduce((a, i) => a + cull.underHidden[i], 0);
|
|
2408
|
+
stats.undersTotal += uids.length;
|
|
2409
|
+
stats.undersHidden += uids.length - vis;
|
|
2410
|
+
const im = newIM(under, mat, uids.length);
|
|
2411
|
+
fillInstances(im, ord, insts, color);
|
|
2412
|
+
im.onBeforeRender = trackVp;
|
|
2413
|
+
im.userData.ldrUnder = true;
|
|
2414
|
+
im.userData.ldrPart = part;
|
|
2415
|
+
instancedBoundingSphere(im);
|
|
2416
|
+
im.count = P.cullUnder ? vis : uids.length;
|
|
2417
|
+
root.add(im);
|
|
2418
|
+
const cl = newCluster(im.boundingSphere);
|
|
2419
|
+
cl.lv.push({ objs: [im], err: 0 }, ...lodLevels(p.under, im, mat));
|
|
2420
|
+
{
|
|
2421
|
+
const bl = p.body?.lod;
|
|
2422
|
+
const last = bl?.[bl.length - 1];
|
|
2423
|
+
if (LOD && P.lodUnder !== false && last && last.tris === 12)
|
|
2424
|
+
cl.boxErr = last.err;
|
|
2425
|
+
}
|
|
2426
|
+
if (ax) {
|
|
2427
|
+
let below = Infinity;
|
|
2428
|
+
for (const id of uids) {
|
|
2429
|
+
const m = insts[id].m;
|
|
2430
|
+
below = Math.min(below, m[0] * ax[0] + m[1] * ax[1] + m[2] * ax[2] + p.bbox[4] * ax[3]);
|
|
2431
|
+
}
|
|
2432
|
+
cl.below = below;
|
|
2433
|
+
cl.ax = ax.slice(0, 3);
|
|
2434
|
+
}
|
|
2435
|
+
addCond(p, im, cl, "under");
|
|
2436
|
+
const objs = [...cl.lv.flatMap((l) => l.objs), ...cl.cond];
|
|
2437
|
+
objs.forEach((o) => {
|
|
2438
|
+
if (!o.isInstancedMesh)
|
|
2439
|
+
o.geometry.instanceCount = im.count;
|
|
2440
|
+
});
|
|
2441
|
+
toggles.push({ mesh: countTo(() => objs), all: uids.length, visible: vis, flag: "under" });
|
|
2442
|
+
if (steps)
|
|
2443
|
+
stepBatches.push({ im, objs, own: Int32Array.from(ord, (id) => steps[id]), hide: Int32Array.from(ord, (id) => cull.underHideStep[id]), flag: "under", inst: Int32Array.from(ord), stud: null, col: Uint16Array.from(ord, (id) => instCol[id]) });
|
|
2444
|
+
}
|
|
2445
|
+
}
|
|
2446
|
+
} else {
|
|
2447
|
+
const list = coldByMat.get(mat) || coldByMat.set(mat, []).get(mat);
|
|
2448
|
+
list.push({ part, p, mat, ids: idsAll });
|
|
2449
|
+
}
|
|
2450
|
+
}
|
|
2451
|
+
const tmpM = new THREE.Matrix4;
|
|
2452
|
+
const tmpC = new THREE.Color;
|
|
2453
|
+
for (const [mat, items] of coldByMat) {
|
|
2454
|
+
const entries = [];
|
|
2455
|
+
for (const it of items)
|
|
2456
|
+
for (const id of it.ids)
|
|
2457
|
+
entries.push({ id, part: it.part, p: it.p });
|
|
2458
|
+
if (!entries.length)
|
|
2459
|
+
continue;
|
|
2460
|
+
const groups = gridClusters(entries.length, (i) => insts[entries[i].id].m[0], (i) => insts[entries[i].id].m[2], LOD ? 256 : Infinity);
|
|
2461
|
+
for (const g of groups) {
|
|
2462
|
+
const members = Array.from(g, (i) => entries[i]);
|
|
2463
|
+
const partSet = new Map;
|
|
2464
|
+
for (const m of members)
|
|
2465
|
+
partSet.set(m.part, m.p);
|
|
2466
|
+
let maxV = 0, maxI = 0;
|
|
2467
|
+
for (const p of partSet.values()) {
|
|
2468
|
+
for (const b of [p.body, ...p.body?.lod ?? []]) {
|
|
2469
|
+
maxV += geomVerts(b);
|
|
2470
|
+
maxI += geomIdx(b);
|
|
2471
|
+
}
|
|
2472
|
+
}
|
|
2473
|
+
if (maxV === 0)
|
|
2474
|
+
continue;
|
|
2475
|
+
const bm = new THREE.BatchedMesh(members.length, Math.max(1, maxV), Math.max(1, maxI), mat);
|
|
2476
|
+
bm.perObjectFrustumCulled = true;
|
|
2477
|
+
bm.sortObjects = false;
|
|
2478
|
+
bm.frustumCulled = true;
|
|
2479
|
+
bm.userData.ldrMerged = true;
|
|
2480
|
+
bm.onBeforeRender = trackVp;
|
|
2481
|
+
root.add(bm);
|
|
2482
|
+
const gidsByPart = new Map;
|
|
2483
|
+
for (const [part, p] of partSet) {
|
|
2484
|
+
const body = geom(p.body, arr);
|
|
2485
|
+
if (!body) {
|
|
2486
|
+
gidsByPart.set(part, []);
|
|
2487
|
+
continue;
|
|
2355
2488
|
}
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
const
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
const
|
|
2370
|
-
const
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
root.add(im);
|
|
2381
|
-
const cl = newCluster(im.boundingSphere);
|
|
2382
|
-
cl.lv.push({ objs: [im], err: 0 }, ...lodLevels(p.under, im, mat));
|
|
2383
|
-
{
|
|
2384
|
-
const bl = p.body?.lod;
|
|
2385
|
-
const last = bl?.[bl.length - 1];
|
|
2386
|
-
if (LOD && P.lodUnder !== false && last && last.tris === 12)
|
|
2387
|
-
cl.boxErr = last.err;
|
|
2489
|
+
const ids = [bm.addGeometry(body)];
|
|
2490
|
+
if (LOD && p.body?.lod)
|
|
2491
|
+
for (const l of p.body.lod)
|
|
2492
|
+
ids.push(bm.addGeometry(geom(l, arr)));
|
|
2493
|
+
gidsByPart.set(part, ids);
|
|
2494
|
+
}
|
|
2495
|
+
const live = members.filter((m) => (gidsByPart.get(m.part)?.length ?? 0) > 0);
|
|
2496
|
+
const instGids = new Array(live.length);
|
|
2497
|
+
const ownArr = steps ? new Int32Array(live.length) : null;
|
|
2498
|
+
const instArr = steps ? new Int32Array(live.length) : null;
|
|
2499
|
+
const m16 = new Float32Array(16);
|
|
2500
|
+
for (let i = 0;i < live.length; i++) {
|
|
2501
|
+
const { id, part, p } = live[i];
|
|
2502
|
+
const gids = gidsByPart.get(part);
|
|
2503
|
+
const iid = bm.addInstance(gids[0]);
|
|
2504
|
+
writeM4(m16, 0, insts[id].m);
|
|
2505
|
+
tmpM.fromArray(m16);
|
|
2506
|
+
bm.setMatrixAt(iid, tmpM);
|
|
2507
|
+
tmpC.copy(color(insts[id].color));
|
|
2508
|
+
bm.setColorAt(iid, tmpC);
|
|
2509
|
+
instGids[iid] = gids;
|
|
2510
|
+
if (ownArr) {
|
|
2511
|
+
ownArr[iid] = steps[id];
|
|
2512
|
+
instArr[iid] = id;
|
|
2388
2513
|
}
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2514
|
+
}
|
|
2515
|
+
members.length = 0;
|
|
2516
|
+
members.push(...live);
|
|
2517
|
+
bm.computeBoundingSphere();
|
|
2518
|
+
const cl = newCluster(bm.boundingSphere ?? new THREE.Sphere);
|
|
2519
|
+
const bodyErrs = live.map(({ p }) => [0, ...(p.body?.lod ?? []).map((l) => l.err)]);
|
|
2520
|
+
bm.userData.ldrMergeGids = instGids;
|
|
2521
|
+
cl.mergedLod = { bm, gids: instGids, errs: bodyErrs };
|
|
2522
|
+
cl.setMergedLevel = (L) => {
|
|
2523
|
+
bm.visible = L >= 0;
|
|
2524
|
+
};
|
|
2525
|
+
cl.lv.push({ objs: [bm], err: 0 });
|
|
2526
|
+
if (steps && ownArr)
|
|
2527
|
+
stepBatched.push({ bm, own: ownArr, hide: null, flag: "body", inst: instArr });
|
|
2528
|
+
const withUnder = members.filter((m) => m.p.under);
|
|
2529
|
+
if (withUnder.length) {
|
|
2530
|
+
const uEntries = withUnder.map((m) => m.id);
|
|
2531
|
+
const uGroups = LOD && P.lodUnder !== false ? undersideGroups(uEntries, insts) : [{ ids: uEntries, ax: null }];
|
|
2532
|
+
for (const { ids: uids, ax } of uGroups) {
|
|
2533
|
+
const byId = new Map(members.map((m) => [m.id, m]));
|
|
2534
|
+
const umembers = uids.map((id) => {
|
|
2535
|
+
const m = byId.get(id);
|
|
2536
|
+
return { ...m, hid: !!cull.underHidden[id] };
|
|
2537
|
+
});
|
|
2538
|
+
stats.undersTotal += umembers.length;
|
|
2539
|
+
stats.undersHidden += umembers.filter((m) => m.hid).length;
|
|
2540
|
+
const uPartSet = new Map;
|
|
2541
|
+
for (const m of umembers)
|
|
2542
|
+
uPartSet.set(m.part, m.p);
|
|
2543
|
+
let uV = 0, uI = 0;
|
|
2544
|
+
for (const p of uPartSet.values())
|
|
2545
|
+
for (const b of [p.under, ...p.under?.lod ?? []]) {
|
|
2546
|
+
uV += geomVerts(b);
|
|
2547
|
+
uI += geomIdx(b);
|
|
2548
|
+
}
|
|
2549
|
+
if (!uV)
|
|
2550
|
+
continue;
|
|
2551
|
+
const ubm = new THREE.BatchedMesh(umembers.length, Math.max(1, uV), Math.max(1, uI), mat);
|
|
2552
|
+
ubm.perObjectFrustumCulled = true;
|
|
2553
|
+
ubm.sortObjects = false;
|
|
2554
|
+
ubm.frustumCulled = true;
|
|
2555
|
+
ubm.userData.ldrMerged = true;
|
|
2556
|
+
ubm.userData.ldrUnder = true;
|
|
2557
|
+
ubm.onBeforeRender = trackVp;
|
|
2558
|
+
root.add(ubm);
|
|
2559
|
+
const uGidsByPart = new Map;
|
|
2560
|
+
for (const [part, p] of uPartSet) {
|
|
2561
|
+
const u = geom(p.under, arr);
|
|
2562
|
+
if (!u) {
|
|
2563
|
+
uGidsByPart.set(part, []);
|
|
2564
|
+
continue;
|
|
2565
|
+
}
|
|
2566
|
+
const ids = [ubm.addGeometry(u)];
|
|
2567
|
+
if (LOD && p.under?.lod)
|
|
2568
|
+
for (const l of p.under.lod)
|
|
2569
|
+
ids.push(ubm.addGeometry(geom(l, arr)));
|
|
2570
|
+
uGidsByPart.set(part, ids);
|
|
2571
|
+
}
|
|
2572
|
+
const uLive = umembers.filter((m) => (uGidsByPart.get(m.part)?.length ?? 0) > 0);
|
|
2573
|
+
const uInstGids = new Array(uLive.length);
|
|
2574
|
+
const uOwn = steps ? new Int32Array(uLive.length) : null;
|
|
2575
|
+
const uInst = steps ? new Int32Array(uLive.length) : null;
|
|
2576
|
+
const uHide = steps ? new Int32Array(uLive.length) : null;
|
|
2577
|
+
const uHid = new Uint8Array(uLive.length);
|
|
2578
|
+
for (let i = 0;i < uLive.length; i++) {
|
|
2579
|
+
const { id, part, p, hid } = uLive[i];
|
|
2580
|
+
const gids = uGidsByPart.get(part);
|
|
2581
|
+
const iid = ubm.addInstance(gids[0]);
|
|
2582
|
+
writeM4(m16, 0, insts[id].m);
|
|
2583
|
+
tmpM.fromArray(m16);
|
|
2584
|
+
ubm.setMatrixAt(iid, tmpM);
|
|
2585
|
+
tmpC.copy(color(insts[id].color));
|
|
2586
|
+
ubm.setColorAt(iid, tmpC);
|
|
2587
|
+
uInstGids[iid] = gids;
|
|
2588
|
+
uHid[iid] = hid ? 1 : 0;
|
|
2589
|
+
if (P.cullUnder && hid)
|
|
2590
|
+
ubm.setVisibleAt(iid, false);
|
|
2591
|
+
if (uOwn) {
|
|
2592
|
+
uOwn[iid] = steps[id];
|
|
2593
|
+
uInst[iid] = id;
|
|
2594
|
+
uHide[iid] = cull.underHideStep[id];
|
|
2595
|
+
}
|
|
2596
|
+
}
|
|
2597
|
+
umembers.length = 0;
|
|
2598
|
+
umembers.push(...uLive);
|
|
2599
|
+
ubm.computeBoundingSphere();
|
|
2600
|
+
const ucl = newCluster(ubm.boundingSphere ?? new THREE.Sphere);
|
|
2601
|
+
const uErrs = uLive.map(({ p }) => [0, ...(p.under?.lod ?? []).map((l) => l.err)]);
|
|
2602
|
+
ubm.userData._stepMode = !!steps;
|
|
2603
|
+
ubm.userData.ldrMergeGids = uInstGids;
|
|
2604
|
+
ucl.mergedLod = { bm: ubm, gids: uInstGids, errs: uErrs, underHid: uHid, cullUnder: !!P.cullUnder };
|
|
2605
|
+
ucl.setMergedLevel = (L) => {
|
|
2606
|
+
ubm.visible = L >= 0;
|
|
2607
|
+
};
|
|
2608
|
+
ucl.lv.push({ objs: [ubm], err: 0 });
|
|
2609
|
+
{
|
|
2610
|
+
const sample = umembers[0]?.p;
|
|
2611
|
+
const bl = sample?.body?.lod;
|
|
2612
|
+
const last = bl?.[bl.length - 1];
|
|
2613
|
+
if (LOD && P.lodUnder !== false && last && last.tris === 12)
|
|
2614
|
+
ucl.boxErr = last.err;
|
|
2615
|
+
}
|
|
2616
|
+
if (ax) {
|
|
2617
|
+
let below = Infinity;
|
|
2618
|
+
for (const { id, p } of umembers) {
|
|
2619
|
+
const m = insts[id].m;
|
|
2620
|
+
below = Math.min(below, m[0] * ax[0] + m[1] * ax[1] + m[2] * ax[2] + p.bbox[4] * ax[3]);
|
|
2621
|
+
}
|
|
2622
|
+
ucl.below = below;
|
|
2623
|
+
ucl.ax = ax.slice(0, 3);
|
|
2394
2624
|
}
|
|
2395
|
-
|
|
2396
|
-
|
|
2625
|
+
toggles.push({
|
|
2626
|
+
mesh: { set count(n) {
|
|
2627
|
+
const showAll = n >= umembers.length;
|
|
2628
|
+
for (let i = 0;i < uHid.length; i++)
|
|
2629
|
+
ubm.setVisibleAt(i, showAll || !uHid[i]);
|
|
2630
|
+
} },
|
|
2631
|
+
all: umembers.length,
|
|
2632
|
+
visible: umembers.length - umembers.filter((m) => m.hid).length,
|
|
2633
|
+
flag: "under"
|
|
2634
|
+
});
|
|
2635
|
+
if (steps && uOwn)
|
|
2636
|
+
stepBatched.push({ bm: ubm, own: uOwn, hide: uHide, flag: "under", inst: uInst, underHidden: uHid });
|
|
2397
2637
|
}
|
|
2398
|
-
addCond(p, im, cl, "under");
|
|
2399
|
-
const objs = [...cl.lv.flatMap((l) => l.objs), ...cl.cond];
|
|
2400
|
-
objs.forEach((o) => {
|
|
2401
|
-
if (!o.isInstancedMesh)
|
|
2402
|
-
o.geometry.instanceCount = im.count;
|
|
2403
|
-
});
|
|
2404
|
-
toggles.push({ mesh: countTo(() => objs), all: uids.length, visible: vis, flag: "under" });
|
|
2405
|
-
if (steps)
|
|
2406
|
-
stepBatches.push({ im, objs, own: Int32Array.from(ord, (id) => steps[id]), hide: Int32Array.from(ord, (id) => cull.underHideStep[id]), flag: "under", inst: Int32Array.from(ord), stud: null, col: Uint16Array.from(ord, (id) => instCol[id]) });
|
|
2407
2638
|
}
|
|
2408
2639
|
}
|
|
2409
2640
|
}
|
|
@@ -2444,11 +2675,14 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2444
2675
|
stats.uncertBatches = nUncert;
|
|
2445
2676
|
let condOn = true, edgesOn = true;
|
|
2446
2677
|
root.apply = (c) => {
|
|
2447
|
-
c.
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2678
|
+
if (c.setMergedLevel)
|
|
2679
|
+
c.setMergedLevel(c.cur);
|
|
2680
|
+
else
|
|
2681
|
+
c.lv.forEach((l, i) => {
|
|
2682
|
+
for (const o of l.objs)
|
|
2683
|
+
o.visible = i === c.cur;
|
|
2684
|
+
});
|
|
2685
|
+
const lineVis = edgesOn && c.edgeOk && c.cur >= 0 && (c.cur === 0 || !LOD || (c.setMergedLevel ? true : c.lv[c.cur].objs.length > 0));
|
|
2452
2686
|
for (const o of c.lines)
|
|
2453
2687
|
o.visible = lineVis;
|
|
2454
2688
|
for (const o of c.cond)
|
|
@@ -2515,6 +2749,20 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2515
2749
|
o.geometry.instanceCount = w;
|
|
2516
2750
|
}
|
|
2517
2751
|
}
|
|
2752
|
+
for (const b of stepBatched) {
|
|
2753
|
+
const useHide = b.flag === "under" ? cullU : false;
|
|
2754
|
+
const { own, hide, inst, bm } = b;
|
|
2755
|
+
for (let i = 0;i < own.length; i++) {
|
|
2756
|
+
const hid = !!hide && hide[i] <= S;
|
|
2757
|
+
if (b.flag === "under") {
|
|
2758
|
+
st.undersTotal++;
|
|
2759
|
+
if (hid)
|
|
2760
|
+
st.undersHidden++;
|
|
2761
|
+
}
|
|
2762
|
+
const on = own[i] <= S && !(useHide && hid) && !(O && !O[inst[i]]);
|
|
2763
|
+
bm.setVisibleAt(i, on);
|
|
2764
|
+
}
|
|
2765
|
+
}
|
|
2518
2766
|
return st;
|
|
2519
2767
|
};
|
|
2520
2768
|
const setCull = (studs, under) => {
|
|
@@ -2570,6 +2818,12 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2570
2818
|
c.edgeOk = true;
|
|
2571
2819
|
for (const l of c.lines)
|
|
2572
2820
|
l.geometry.drawRange.count = Infinity;
|
|
2821
|
+
if (c.mergedLod) {
|
|
2822
|
+
const { bm, gids } = c.mergedLod;
|
|
2823
|
+
for (let i = 0;i < gids.length; i++)
|
|
2824
|
+
if (gids[i]?.length)
|
|
2825
|
+
bm.setGeometryIdAt(i, gids[i][0]);
|
|
2826
|
+
}
|
|
2573
2827
|
}
|
|
2574
2828
|
refresh();
|
|
2575
2829
|
}
|
|
@@ -2601,7 +2855,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
2601
2855
|
await new Promise((r) => setTimeout(r, 0));
|
|
2602
2856
|
}
|
|
2603
2857
|
}
|
|
2604
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2858
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/scene.ts
|
|
2605
2859
|
import * as THREE2 from "three";
|
|
2606
2860
|
function colorFn(src, pack, fallback) {
|
|
2607
2861
|
const table = new Map;
|
|
@@ -2757,10 +3011,10 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
2757
3011
|
dispose: disposeCur
|
|
2758
3012
|
});
|
|
2759
3013
|
}
|
|
2760
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3014
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/parts-cdn.ts
|
|
2761
3015
|
import { decompress as decompress2 } from "fzstd";
|
|
2762
3016
|
|
|
2763
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3017
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/embedded.ts
|
|
2764
3018
|
function splitFiles(text, fallback) {
|
|
2765
3019
|
const files = new Map;
|
|
2766
3020
|
let cur = null, saw = false;
|
|
@@ -2832,7 +3086,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
2832
3086
|
return out;
|
|
2833
3087
|
}
|
|
2834
3088
|
|
|
2835
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3089
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/parts-cdn.ts
|
|
2836
3090
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
2837
3091
|
var indexCache = new Map;
|
|
2838
3092
|
var shardCache = new Map;
|
|
@@ -2992,10 +3246,10 @@ async function prepareModel(source, o = {}) {
|
|
|
2992
3246
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
2993
3247
|
}
|
|
2994
3248
|
|
|
2995
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3249
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/load-worker.gen.ts
|
|
2996
3250
|
var load_worker_gen_default = 'var ht=ArrayBuffer,X=Uint8Array,ge=Uint16Array,gt=Int16Array;var be=Int32Array,Se=function(e,t,n){if(X.prototype.slice)return X.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 X(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(X.prototype.fill)return X.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},bt=function(e,t,n,r){if(X.prototype.copyWithin)return X.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],W=function(e,t,n){var r=Error(t||dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,W);if(!n)throw r;return r},Be=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},xt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)W(0);var a=6-s,c=i==3?4:i,p=Be(e,a,c);a+=c;var m=l?1<<l:s,h=Be(e,a,m)+(l==1&&256),d=h;if(!s){var S=1<<10+(e[5]>>3);d=S+(S>>3)*(e[5]&7)}if(d>2145386496)W(1);var u=new X((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:p,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return yt(e,4)+8;W(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)W(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,p=o,m=new ht(512+(o<<2)),h=new gt(m,0,256),d=new ge(m,0,256),S=new ge(m,512,o),u=512+(o<<1),b=new X(m,u,o),P=new X(m,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,A=(1<<g+1)-1,O=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&A,y=(1<<g)-1,M=A-i-1,E=O&y;if(E<M)r+=g,O=E;else if(r+=g+1,O>y)O-=M;if(h[++l]=--O,O==-1)i+=O,b[--p]=l;else i-=O;if(!O)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)W(0);var C=0,U=(o>>1)+(o>>3)+3,_=o-1;for(var H=0;H<=l;++H){var v=h[H];if(v<1){d[H]=-v;continue}for(c=0;c<v;++c){b[C]=H;do C=C+U&_;while(C>=p)}}if(C)W(0);for(c=0;c<o;++c){var w=d[b[c]]++,L=P[c]=s-re(w);S[c]=(w<<L)-o}return[r+7>>3,{b:s,s:b,n:P,t:S}]},wt=function(e,t){var n=0,r=-1,s=new X(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),p=c[0],m=c[1];t+=o;var h=p<<3,d=e[t];if(!d)W(0);var S=0,u=0,b=m.b,P=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(S+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=m.s[S],g-=P,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<P)-1,i[++r]=m.s[u],b=m.n[S],S=m.t[S],P=m.n[u],u=m.t[u]}if(++r>255)W(0)}else{r=o-127;for(;n<r;n+=2){var A=e[++t];i[n]=A>>4,i[n+1]=A&15}++t}var O=0;for(n=0;n<r;++n){var y=i[n];if(y>11)W(0);O+=y&&1<<y-1}var M=re(O)+1,E=1<<M,D=E-O;if(D&D-1)W(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&M+1-y]}var C=new X(E<<1),U=C.subarray(0,E),_=C.subarray(E);a[M]=0;for(n=M;n>0;--n){var H=a[n];ce(_,n,H,a[n-1]=H+l[n]*(1<<M-n))}if(a[0]!=E)W(0);for(n=0;n<r;++n){var v=i[n];if(v){var w=a[v];ce(U,n,w,a[v]=w+(1<<M-v))}}return[t,{n:_,b:M,s:U}]},At=ue(new X([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],vt=ue(new X([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],Mt=ue(new X([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],$e=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ce=new X(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=$e(Ce,0),Pe=new X(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Ct=$e(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)W(0);var a=0,c=n.b,p=(r<<3)-8+re(o)-c,m=-1;for(;p>l&&m<s;){var h=p>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(p&7);a=(a<<c|d)&i,t[++m]=n.s[a],p-=c=n.n[a]}if(p!=l||m+1!=s)W(0)},Pt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},Et=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new X(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Se(e,s,a)}if(i==2){var c=e[s],p=c&3,m=c>>2&3,h=c>>4,d=0,S=0;if(p<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(S=m,m<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new X(t.m),b=u.length-h;if(p==0)u.set(e.subarray(s,s+=h),b);else if(p==1)ce(u,e[s++],b);else{var P=t.h;if(p==2){var g=wt(e,s);d+=s-(s=g[0]),t.h=P=g[1]}else if(!P)W(0);(S?Pt:le)(e.subarray(s,s+=d),u.subarray(b),P)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var A=e[s++];if(A&3)W(0);var O=[vt,Mt,At];for(var y=2;y>-1;--y){var M=A>>(y<<1)+2&3;if(M==1){var E=new X([0,0,e[s++]]);O[y]={s:E.subarray(2,3),n:E.subarray(0,1),t:new ge(E.buffer,0,1),b:0}}else if(M==2)r=ue(e,s,9-(y&1)),s=r[0],O[y]=r[1];else if(M==3){if(!t.t)W(0);O[y]=t.t[y]}}var D=t.t=O,C=D[0],U=D[1],_=D[2],H=e[a-1];if(!H)W(0);var v=(a<<3)-8+re(H)-_.b,w=v>>3,L=0,V=(e[w]|e[w+1]<<8)>>(v&7)&(1<<_.b)-1;w=(v-=U.b)>>3;var I=(e[w]|e[w+1]<<8)>>(v&7)&(1<<U.b)-1;w=(v-=C.b)>>3;var B=(e[w]|e[w+1]<<8)>>(v&7)&(1<<C.b)-1;for(++f;--f;){var T=_.s[V],x=_.n[V],N=C.s[B],F=C.n[B],R=U.s[I],z=U.n[I];w=(v-=R)>>3;var j=1<<R,k=j+((e[w]|e[w+1]<<8|e[w+2]<<16|e[w+3]<<24)>>>(v&7)&j-1);w=(v-=Pe[N])>>3;var G=Ct[N]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Pe[N])-1);w=(v-=Ce[T])>>3;var K=St[T]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Ce[T])-1);if(w=(v-=x)>>3,V=_.t[V]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<x)-1),w=(v-=F)>>3,B=C.t[B]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<F)-1),w=(v-=z)>>3,I=U.t[I]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<z)-1),k>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=k-=3;else{var Y=k-(K!=0);if(Y){if(k=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=k}else k=t.o[0]}for(var y=0;y<K;++y)u[L+y]=u[b+y];L+=K,b+=K;var q=L-k;if(q<0){var Z=-q,ee=t.e+q;if(Z>G)Z=G;for(var y=0;y<Z;++y)u[L+y]=t.w[ee+y];L+=Z,G-=Z,q=0}for(var y=0;y<G;++y)u[L+y]=u[q+y];L+=G}if(L!=b)while(b<u.length)u[L++]=u[b++];else L=u.length;if(n)t.y+=L;else u=Se(u,0,L)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Se(u,b);return t.b=a,u}W(2)},Tt=function(e,t){if(e.length==1)return e[0];var n=new X(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=xt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Et(e,i,t);if(!l)W(5);if(t)i.e=i.y;else n.push(l),o+=l.length,bt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Tt(n,o)}function de(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 J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Ee(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ve=/^~?\\s*moved\\s+to\\s+(.+)$/i,Lt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Je=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),It=new Set(["model","submodel","configuration"]),kt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function He(e){let t=kt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Je.has(n)||It.has(n)?n:void 0}function Ft(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 Rt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Ft(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let p=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(p>0&&a[p+1])c.glossmap=a[p+1];if(t)c.next=!0;return c}var Dt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Ut(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let p=s();if(p===null)return null;i[c]=+p}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Ee(o),m:i,file:J(a)}}function Ge(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Ee(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:J(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function Ze(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],p=null,m=()=>{if(!a)return;let g=Dt(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(J(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(m(),o={name:J(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],p=null,h=!0},S=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},P=(g,f)=>{if(p){g.tex=p,p=null;return}let A=c[c.length-1];if(!A)return;if(A.fallback){if(!f)g.fallback=!0}else g.tex=A.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||S)continue;if(!o)d(t);let M=f.slice(2).trimStart(),E=M.search(/\\s/),D={t:f.charCodeAt(0)-48,color:Ee(E<0?M:M.slice(0,E)),p:[],src:f};P(D,!1),o.cmds.push(D),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let M=2;while(f.charCodeAt(M)===32||f.charCodeAt(M)===9)M++;let E=M;while(E<f.length&&f.charCodeAt(E)!==32&&f.charCodeAt(E)!==9)E++;let D=f.slice(M,E);if(!Lt.has(D)){if(S||a)continue;if(!o)d(t);let C=f.slice(M),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(p=null,h&&!o.org){let H=He(C);if(H)o.org=H}let _=C.match(Ve);if(_&&!o.movedTo){let H=_[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=J(H)}o.cmds.push(U);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!S){let M=Ut(f);if(M){if(!o)d(t);P(M,!1),o.cmds.push(M),h=!1;continue}}let A=f.split(/\\s+/);if(+A[0]===0){let M=f.slice(1).trim();if(A[1]==="FILE"){b(),S=!1,d(M.slice(5));continue}if(A[1]==="NOFILE"){m(),o=null,S=!0;continue}if(A[1]==="!DATA"){b(),m(),o=null,S=!1,a={name:M.slice(5).trim(),chunks:[]};continue}if(S)continue;if(a){if(A[1]==="!:")a.chunks.push(A.slice(2).join(""));continue}if(!o)d(t);let E={t:0,text:M};if(A[1]==="STEP")E.step=!0,c=[],p=null;else if(A[1]==="BFC")E.bfc=A.slice(2).join(" ");else if(A[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],p=null,(A[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(A[5]??"REL").toUpperCase();E.rotstep={x:+A[2]||0,y:+A[3]||0,z:+A[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(A[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(A[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:A[3]??"A"}}else if(A[1]?.startsWith("!"))E.meta=A[1];if(h&&!o.org){let C=He(M);if(C)o.org=C}if(A[1]==="!TEXMAP"){let C=(A[2]??"").toUpperCase();if(p=null,C==="START"||C==="NEXT"){let U=Rt(M.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else p=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(A[1]==="!:"){p=null;let C=Ge(A.slice(2));if(C)P(C,!0),E.geom=C}else p=null;let D=M.match(Ve);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=J(C)}o.cmds.push(E);continue}if(a||S)continue;if(!o)d(t);let y=Ge(A);if(!y)continue;P(y,!1),o.cmds.push(y),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var tn=Math.PI/180;function qe(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 Qe(e,t){let[n,r,s,o,i,l,a,c,p,m,h,d]=e,[S,u,b,P,g,f,A,O,y,M,E,D]=t;return[o*S+i*u+l*b+n,a*S+c*u+p*b+r,m*S+h*u+d*b+s,o*P+i*A+l*M,o*g+i*O+l*E,o*f+i*y+l*D,a*P+c*A+p*M,a*g+c*O+p*E,a*f+c*y+p*D,m*P+h*A+d*M,m*g+h*O+d*E,m*f+h*y+d*D]}var Te=[0,0,0,1,0,0,0,1,0,0,0,1];var Ke=new WeakMap,Ot=/^(s|8|48)\\//;function Le(e,t){let n=e.files.get(J(t));if(!n)return"part";let r=Ke.get(n);if(r)return r;if(n.org)r=Je.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&&Ot.test(s.file))?"part":"model";return Ke.set(n,r),r}var Xe=new WeakMap;function et(e){let t=Xe.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 Xe.set(e,t),t}var We=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),zt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${We(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${We(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${J(e)}#${t}`;function Nt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function tt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Nt(e,t).cmds.map(zt)].join(`\n`)+`\n`}function Bt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function nt(e){let[t,n,r,s,o,i,l,a,c,p,m,h]=e,d=a*h-c*m,S=-(l*h-c*p),u=l*m-a*p,b=s*d+o*S+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let P=1/b,g=[d*P,-(o*h-i*m)*P,(o*c-i*a)*P,S*P,(s*h-i*p)*P,-(s*c-i*l)*P,u*P,-(s*m-o*p)*P,(s*a-o*l)*P];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var $t=(e)=>String(+e.toFixed(6)||0),_e=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function rt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map($t).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${_e(t.texture)}${t.glossmap?" GLOSSMAP "+_e(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${Bt(r)}`,source:r}}var jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Vt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var Ye=new WeakMap;function st(e){let t=Ye.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=Vt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),Ye.set(e,n),n}var ot=999999,it=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Ht(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let d=m.name+"#"+h,S=l.get(d);if(!S){let u;S=Object.assign(()=>u??=tt(m,h),{file:m,step:h}),l.set(d,S)}return S},p=(m,h,d,S,u,b,P,g,f=null,A=[],O=[])=>{let y=m.files.get(h);if(!y||P>r)return;let M=0,E=P>0?++a:0,D=i&&E?[...A,E]:A,C=i&&E?[...O,d]:O,U=i&&!f?new Map:null,_=-1,H=0,v=(T,x,N,F,R,z)=>{if(_!==M)_=M,H=0;let j=U?.get(M+"|"+x);if(j)return j.n++,p(T,T===m?x:T.main,N,F,u+"/"+x,[...R,ot],P+1,z,[...R,ot],D,C);let k=[...R,H++],G=n.length;p(T,T===m?x:T.main,N,F,u+"/"+x,k,P+1,z,f,D,C),U?.set(M+"|"+x,{n:1,from:G,to:n.length})},w=st(y),L=s?et(y):[],V=0,I=(T,x,N,F,R,z,j)=>{if(f)F=f;let k={part:T,color:x,m:N,step:F[0],steps:F,localStep:R,path:u};if(E){if(k.sub=E,i)k.subPath=D,k.subMats=C}if(z)k.embedded=!0;if(j){let K=rt(T,j);k.texPart=K.name,k.texSource=K.source}let G=w[R];if(G)k.view=G;return n.push(k),k},B=(T)=>{while(V<L.length&&L[V]<=T){let x=L[V++];I(Ie(y.name,x),S,d,[...b,x],x,!1,null).source=c(y,x)}};for(let T of y.cmds){if(T.t===0&&T.step){M++;continue}let x=T;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){B(M);continue}if(x.t===0)if(o&&x.geom?.t===1)x=x.geom;else continue;if(x.t!==1)continue;if(o&&x.fallback)continue;let N=x.color===16?S:x.color,F=Qe(d,x.m),R=[...b,M],z=o?x.tex??g:null,j=z?nt(x.m):null,k=z&&j?qe(z,j):null;if(m.files.has(x.file)){if(Le(m,x.file)==="model"){v(m,x.file,F,N,R,k);continue}I(x.file,N,F,R,M,!0,k);continue}let G=t.resolveModel?.(x.file);if(G){v(G,x.file,F,N,R,k);continue}I(x.file,N,F,R,M,!1,k)}if(B(1/0),U){for(let T of U.values())if(T.n>1)for(let x=T.from;x<T.to;x++)n[x].mult??=T.n}};if(Le(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Te],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return p(e,e.main,Te,16,e.main,[],0,null),n}function at(e,t="main.ldr",n){return Ht(Ze(e,t,{geometryText:!0}),n)}function Gt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(J(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(J(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Kt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?J(t.slice(14).join(" ")):null};function Xt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function lt(e,t,n="main.ldr"){let r=Gt(e,n),s=new Map;for(let o of t){let i=J(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let p of r.get(a.pop())){let m=Kt(p);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((p)=>p!==i).sort()].map((p)=>"0 FILE "+(p===i?"":p)+`\n`+r.get(p).join(`\n`)).join(`\n`);s.set(i,`emb/${Xt(c)}.dat`)}return s}var ct=(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,ut=new WeakMap;function ke(e,t){let n=ut.get(e);if(!n)ut.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let S=0;S<12;S++)i[d*12+S]=h[2+S]});let c=null,p=0,m=0;if(s.mask){p=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:p,nz:m}),r}var ie=1073741824;class Fe{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var ye=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Wt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],p=[],m=[],h=new Fe(e.length*2),d=[],S=[];for(let v=0;v<e.length;v++){let w=e[v],L=w.m,V=t.parts[w.part];if(!V||!V.mask||!ct(L))continue;let I=V.bbox,B=1/0,T=-1/0,x=1/0,N=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let k=z?I[3]:I[0],G=j?I[5]:I[2],K=L[0]+L[3]*k+L[5]*G,Y=L[2]+L[9]*k+L[11]*G;if(K<B)B=K;if(K>T)T=K;if(Y<x)x=Y;if(Y>N)N=Y}let F=a.length;s.push(B),o.push(T),i.push(x),l.push(N),a.push(v),c.push(ke(t,w.part)),p.push(I[0]),m.push(I[2]);let R=Math.round((L[1]+I[4])*2);for(let z=Math.floor(B/40);z<=Math.floor(T/40);z++)for(let j=Math.floor(x/40);j<=Math.floor(N/40);j++){if(!ye(R,z,j))continue;let k=S.length;S.push(F),d.push(h.put(R,z,j,k))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],P=NaN,g=NaN,f=NaN,A=-1,O=(v,w,L,V)=>{let I=Math.round(w*2),B=Math.floor(v/40),T=Math.floor(L/40);if(!ye(I,B,T))return fe;let x=fe;if(I!==P||B!==g||T!==f)P=I,g=B,f=T,A=h.get(I,B,T);for(let N=A;N>=0;N=d[N]){let F=S[N];if(a[F]===V||!(v-6>=s[F]-0.5&&v+6<=o[F]+0.5&&L-6>=i[F]-0.5&&L+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=p[F],k=m[F],G=v-R[0],K=w-R[1],Y=L-R[2],q=R[3]*G+R[6]*K+R[9]*Y,Z=R[5]*G+R[8]*K+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((Z+b[Q]-k)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<x)x=Q}}return x},y=0;for(let v of e){let w=ke(t,v.part);if(w)y+=w.nStuds}let M=new Uint8Array(y),E=new Uint8Array(y),D=new Fe(y),C=0,U=n?new Int32Array(y).fill(fe):void 0;for(let v=0,w=0;v<e.length;v++){let L=e[v],V=ke(t,L.part);if(!V)continue;let I=L.m,B=V.studM,T=I[0],x=I[1],N=I[2],F=I[3],R=I[4],z=I[5],j=I[6],k=I[7],G=I[8],K=I[9],Y=I[10],q=I[11];for(let Z=0;Z<V.nStuds;Z++,w++){let ee=Z*12,se=B[ee+4],ae=B[ee+7],oe=B[ee+10];if(!(Math.abs(j*se+k*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(K*se+Y*ae+q*oe)<0.001))continue;E[w]=1;let Q=B[ee],te=B[ee+1],ne=B[ee+2],Re=T+F*Q+R*te+z*ne,De=x+j*Q+k*te+G*ne,Ue=N+K*Q+Y*te+q*ne,Oe=O(Re,De,Ue,v);if(Oe!==fe){if(M[w]=1,C++,U)U[w]=Oe}let pe=Math.round(Re),me=Math.round(De),he=Math.round(Ue);if(!ye(pe,me,he))continue;if(!n){D.put(pe,me,he,1);continue}let ze=n[v],Ne=D.get(pe,me,he);if(Ne<0||ze<Ne)D.put(pe,me,he,ze)}}let _=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let w=e[v],L=t.parts[w.part];if(!L||!L.under||!ct(w.m))continue;let V=L.bbox,I=Math.round((V[3]-V[0])/20),B=Math.round((V[5]-V[2])/20);if(!I||!B||I*B>4096)continue;let T=w.m,x=!0,N=0;for(let F=0;F<I&&x;F++)for(let R=0;R<B;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,k=T[0]+T[3]*z+T[5]*j,G=T[2]+T[9]*z+T[11]*j,K=Math.round(k),Y=Math.round(T[1]+V[4]),q=Math.round(G),Z=ye(K,Y,q)?D.get(K,Y,q):-1;if(Z<0){x=!1;break}if(Z>N)N=Z}if(x){if(_[v]=1,H)H[v]=N}}return{nStuds:y,studHidden:M,studUp:E,underHidden:_,studsHidden:C,studHideStep:U,underHideStep:H}}function _t(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>it(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function xe(e,t,n=!0){let r=_t(e,t,n);return Wt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Me="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,we=new Map;function pt(e=Me,t=fetch){let n=Ae.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(()=>Ae.delete(e)),Ae.set(e,n);return n}var Yt=(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"),ve=(e,t)=>Yt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function Jt(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let S=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+S),b=r;n.push(u),r+=u.byteLength;let P=(4-r%4)%4;if(P)n.push(new Uint8Array(P)),r+=P;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,p=new Uint8Array(c+r);new DataView(p.buffer).setUint32(0,l.length+a,!0),p.set(l,4),p.fill(32,4+l.length,c);let m=c;for(let h of n)p.set(h,m),m+=h.byteLength;return de(p.buffer)}async function Zt(e,t={}){e=[...e];try{return await ft(e,t)}catch(n){let r=t.cdn??Me,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ft(e,{...t,fetch:o})}catch{throw n}}}async function ft(e,t){let n=t.cdn??Me,r=t.fetch??fetch,s=t.gap??16384,o=await pt(n,r),i=[...new Set([...e].map(J))],l=[],a=[];for(let u of i){if(we.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let p=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let P=new Uint8Array(await b.arrayBuffer());if(b.status===200)P=P.subarray(u.start,u.end);p+=P.byteLength;for(let g of u.items){let f=je(P.subarray(g.off-u.start,g.off-u.start+g.len)),A=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);we.set(n+g.name,de(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>we.has(n+u)).map((u)=>we.get(n+u));return{pack:d.length?Jt(d,{colors:o.colors}):de(qt(o.colors)),missing:l,requests:c.length,bytes:p}}function qt(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}async function mt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=pt(t.cdn??Me,r);s.catch(()=>{});let o=t.text?e:await r(e).then((f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return f.text()}),i=performance.now(),l=t.name??(t.text?"main.ldr":decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr")),a=at(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let p=lt(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:m,missing:h,requests:d,bytes:S}=await Zt([...a.filter((f)=>!f.embedded).map((f)=>f.part),...p.values()],t),u=new Map([...p].map(([f,A])=>[A,f])),b=h.map((f)=>u.get(f)??f);for(let[f,A]of p){let O=m.header.parts[A];if(O)m.header.parts[f]=O}let P=performance.now(),g=t.cull?xe(a,m.header,t.textures!==!1):void 0;return{insts:a,pack:m,missing:b,requests:d,bytes:S,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:P-c,...g?{cull:performance.now()-P}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await mt(n,{...r,cull:!1,onParsed:(p)=>self.postMessage({id:t,insts:p})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=xe(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let p of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(p)c.push(p.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
2997
3251
|
|
|
2998
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3252
|
+
// ../../../../../../../tmp/ldr-build-E7gTbS/src/cdn.ts
|
|
2999
3253
|
var worker;
|
|
3000
3254
|
var seq = 0;
|
|
3001
3255
|
var pending = new Map;
|