ldr 0.11.0 → 0.12.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/README.md +4 -2
- package/dist/cli.js +212 -16
- package/dist/index.d.ts +3 -3
- package/dist/index.js +394 -51
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/model.d.ts +58 -1
- package/dist/node/index.js +408 -68
- package/dist/node/library.d.ts +2 -7
- package/dist/render.d.ts +4 -1
- package/package.json +1 -1
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/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))
|
|
@@ -690,7 +690,7 @@ function fileStepViews(f) {
|
|
|
690
690
|
viewMemo.set(f, out);
|
|
691
691
|
return out;
|
|
692
692
|
}
|
|
693
|
-
// ../../../../../../../tmp/ldr-build-
|
|
693
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/model.ts
|
|
694
694
|
var CALLOUT_END = 999999;
|
|
695
695
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
696
696
|
function flatten(doc, opts = {}) {
|
|
@@ -839,16 +839,207 @@ function sequenceSteps(insts) {
|
|
|
839
839
|
});
|
|
840
840
|
return { count: uniq.length, stepOf, views };
|
|
841
841
|
}
|
|
842
|
+
var FINISH_WORDS = new Set(["CHROME", "PEARLESCENT", "RUBBER", "MATTE_METALLIC", "METAL", "MATERIAL"]);
|
|
843
|
+
function parseHexColor(tok) {
|
|
844
|
+
if (!tok)
|
|
845
|
+
return null;
|
|
846
|
+
if (tok.startsWith("#") && /^#[0-9A-Fa-f]{6}$/.test(tok))
|
|
847
|
+
return tok.toUpperCase();
|
|
848
|
+
if (/^0x[0-9A-Fa-f]{6}$/i.test(tok))
|
|
849
|
+
return ("#" + tok.slice(2)).toUpperCase();
|
|
850
|
+
return null;
|
|
851
|
+
}
|
|
852
|
+
function parseGrain(tokens, i) {
|
|
853
|
+
const grain = { value: "#FFFFFF", fraction: 0.5 };
|
|
854
|
+
while (i < tokens.length) {
|
|
855
|
+
const t = tokens[i].toUpperCase();
|
|
856
|
+
const n = tokens[i + 1];
|
|
857
|
+
if (t === "VALUE") {
|
|
858
|
+
const h = parseHexColor(n);
|
|
859
|
+
if (h)
|
|
860
|
+
grain.value = h;
|
|
861
|
+
i += 2;
|
|
862
|
+
} else if (t === "ALPHA") {
|
|
863
|
+
grain.alpha = +n;
|
|
864
|
+
i += 2;
|
|
865
|
+
} else if (t === "LUMINANCE") {
|
|
866
|
+
grain.luminance = +n;
|
|
867
|
+
i += 2;
|
|
868
|
+
} else if (t === "FRACTION") {
|
|
869
|
+
grain.fraction = +n;
|
|
870
|
+
i += 2;
|
|
871
|
+
} else if (t === "VFRACTION") {
|
|
872
|
+
grain.vfraction = +n;
|
|
873
|
+
i += 2;
|
|
874
|
+
} else if (t === "SIZE") {
|
|
875
|
+
grain.size = +n;
|
|
876
|
+
i += 2;
|
|
877
|
+
} else if (t === "MINSIZE") {
|
|
878
|
+
grain.minsize = +n;
|
|
879
|
+
i += 2;
|
|
880
|
+
} else if (t === "MAXSIZE") {
|
|
881
|
+
grain.maxsize = +n;
|
|
882
|
+
i += 2;
|
|
883
|
+
} else
|
|
884
|
+
break;
|
|
885
|
+
}
|
|
886
|
+
return { grain, next: i };
|
|
887
|
+
}
|
|
888
|
+
function parseColourLine(line) {
|
|
889
|
+
const idx = line.indexOf("!COLOUR");
|
|
890
|
+
if (idx < 0)
|
|
891
|
+
return null;
|
|
892
|
+
const tokens = line.slice(idx + "!COLOUR".length).trim().split(/\s+/).filter(Boolean);
|
|
893
|
+
if (tokens.length < 2)
|
|
894
|
+
return null;
|
|
895
|
+
const name = tokens[0];
|
|
896
|
+
let code = -1, hex = "#FF00FF", edge = "#333333", alpha = 255, luminance = 0;
|
|
897
|
+
let finish = { type: "default" };
|
|
898
|
+
let i = 1;
|
|
899
|
+
while (i < tokens.length) {
|
|
900
|
+
const t = tokens[i].toUpperCase();
|
|
901
|
+
const n = tokens[i + 1];
|
|
902
|
+
if (t === "CODE") {
|
|
903
|
+
code = +n;
|
|
904
|
+
i += 2;
|
|
905
|
+
} else if (t === "VALUE") {
|
|
906
|
+
const h = parseHexColor(n);
|
|
907
|
+
if (h)
|
|
908
|
+
hex = h;
|
|
909
|
+
i += 2;
|
|
910
|
+
} else if (t === "EDGE") {
|
|
911
|
+
const h = parseHexColor(n);
|
|
912
|
+
edge = h ?? n;
|
|
913
|
+
i += 2;
|
|
914
|
+
} else if (t === "ALPHA") {
|
|
915
|
+
alpha = +n;
|
|
916
|
+
i += 2;
|
|
917
|
+
} else if (t === "LUMINANCE") {
|
|
918
|
+
luminance = +n;
|
|
919
|
+
i += 2;
|
|
920
|
+
} else if (t === "CHROME") {
|
|
921
|
+
finish = { type: "chrome" };
|
|
922
|
+
i += 1;
|
|
923
|
+
} else if (t === "PEARLESCENT") {
|
|
924
|
+
finish = { type: "pearlescent" };
|
|
925
|
+
i += 1;
|
|
926
|
+
} else if (t === "RUBBER") {
|
|
927
|
+
finish = { type: "rubber" };
|
|
928
|
+
i += 1;
|
|
929
|
+
} else if (t === "MATTE_METALLIC") {
|
|
930
|
+
finish = { type: "matte_metallic" };
|
|
931
|
+
i += 1;
|
|
932
|
+
} else if (t === "METAL") {
|
|
933
|
+
finish = { type: "metal" };
|
|
934
|
+
i += 1;
|
|
935
|
+
} else if (t === "MATERIAL") {
|
|
936
|
+
const kind = (tokens[i + 1] || "").toUpperCase();
|
|
937
|
+
if (kind === "GLITTER") {
|
|
938
|
+
const { grain, next } = parseGrain(tokens, i + 2);
|
|
939
|
+
finish = { type: "glitter", material: grain };
|
|
940
|
+
i = next;
|
|
941
|
+
} else if (kind === "SPECKLE") {
|
|
942
|
+
const { grain, next } = parseGrain(tokens, i + 2);
|
|
943
|
+
finish = { type: "speckle", material: grain };
|
|
944
|
+
i = next;
|
|
945
|
+
} else if (kind === "FABRIC") {
|
|
946
|
+
const sub = (tokens[i + 2] || "").toUpperCase();
|
|
947
|
+
const fab = ["VELVET", "CANVAS", "STRING", "FUR"].includes(sub) ? sub.toLowerCase() : undefined;
|
|
948
|
+
finish = { type: "fabric", kind: fab };
|
|
949
|
+
i += fab ? 3 : 2;
|
|
950
|
+
} else {
|
|
951
|
+
i = tokens.length;
|
|
952
|
+
}
|
|
953
|
+
} else if (FINISH_WORDS.has(t)) {
|
|
954
|
+
i += 1;
|
|
955
|
+
} else
|
|
956
|
+
i += 1;
|
|
957
|
+
}
|
|
958
|
+
if (code < 0 || !hex)
|
|
959
|
+
return null;
|
|
960
|
+
return { code, name, hex, edge, alpha: Number.isFinite(alpha) ? alpha : 255, luminance: Number.isFinite(luminance) ? luminance : 0, finish };
|
|
961
|
+
}
|
|
962
|
+
function colourSurface(c) {
|
|
963
|
+
const opacity = Math.max(0, Math.min(1, (c.alpha ?? 255) / 255));
|
|
964
|
+
const transparent = opacity < 1;
|
|
965
|
+
const emissive = Math.max(0, Math.min(1, (c.luminance ?? 0) / 255));
|
|
966
|
+
const base = {
|
|
967
|
+
opacity,
|
|
968
|
+
transparent,
|
|
969
|
+
depthWrite: !transparent,
|
|
970
|
+
emissive,
|
|
971
|
+
clearcoat: 0,
|
|
972
|
+
clearcoatRoughness: 0,
|
|
973
|
+
sheen: 0,
|
|
974
|
+
sheenRoughness: 0
|
|
975
|
+
};
|
|
976
|
+
const fin = c.finish?.type ?? "default";
|
|
977
|
+
switch (fin) {
|
|
978
|
+
case "chrome":
|
|
979
|
+
return { ...base, metalness: 1, roughness: 0, finish: "chrome" };
|
|
980
|
+
case "pearlescent":
|
|
981
|
+
return { ...base, metalness: 0.25, roughness: 0.3, clearcoat: 0.5, clearcoatRoughness: 0.25, sheen: 0.4, sheenRoughness: 0.35, finish: "pearlescent" };
|
|
982
|
+
case "rubber":
|
|
983
|
+
return { ...base, metalness: 0, roughness: 0.9, finish: "rubber" };
|
|
984
|
+
case "matte_metallic":
|
|
985
|
+
return { ...base, metalness: 0.4, roughness: 0.8, finish: "matte_metallic" };
|
|
986
|
+
case "metal":
|
|
987
|
+
return { ...base, metalness: 0.85, roughness: 0.2, finish: "metal" };
|
|
988
|
+
case "glitter": {
|
|
989
|
+
const m = c.finish.material;
|
|
990
|
+
const size = m.size ?? (m.minsize != null && m.maxsize != null ? (m.minsize + m.maxsize) / 2 : 1);
|
|
991
|
+
return {
|
|
992
|
+
...base,
|
|
993
|
+
metalness: 0.35,
|
|
994
|
+
roughness: 0.25,
|
|
995
|
+
clearcoat: 1,
|
|
996
|
+
clearcoatRoughness: 0.08,
|
|
997
|
+
particleHex: m.value,
|
|
998
|
+
particleFraction: m.fraction,
|
|
999
|
+
particleSize: size,
|
|
1000
|
+
finish: "glitter"
|
|
1001
|
+
};
|
|
1002
|
+
}
|
|
1003
|
+
case "speckle": {
|
|
1004
|
+
const m = c.finish.material;
|
|
1005
|
+
const size = m.size ?? (m.minsize != null && m.maxsize != null ? (m.minsize + m.maxsize) / 2 : 1);
|
|
1006
|
+
return {
|
|
1007
|
+
...base,
|
|
1008
|
+
metalness: 0.2,
|
|
1009
|
+
roughness: 0.55,
|
|
1010
|
+
particleHex: m.value,
|
|
1011
|
+
particleFraction: m.fraction,
|
|
1012
|
+
particleSize: size,
|
|
1013
|
+
finish: "speckle"
|
|
1014
|
+
};
|
|
1015
|
+
}
|
|
1016
|
+
case "fabric":
|
|
1017
|
+
return { ...base, metalness: 0, roughness: 0.85, sheen: 0.65, sheenRoughness: 0.75, finish: "fabric" };
|
|
1018
|
+
default:
|
|
1019
|
+
return { ...base, metalness: 0, roughness: 0.45, finish: "default" };
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
function colourMaterialKey(c) {
|
|
1023
|
+
const s = colourSurface(c);
|
|
1024
|
+
const opac = !s.transparent ? "op" : s.opacity >= 0.75 ? "a200" : s.opacity >= 0.4 ? "a128" : `a${Math.round(s.opacity * 255)}`;
|
|
1025
|
+
const lum = s.emissive > 0 ? `L${Math.round(s.emissive * 16)}` : "";
|
|
1026
|
+
let k = `${s.finish}:${opac}${lum}`;
|
|
1027
|
+
if (s.particleHex)
|
|
1028
|
+
k += `:${s.particleHex}:${(s.particleFraction ?? 0).toFixed(2)}`;
|
|
1029
|
+
return k;
|
|
1030
|
+
}
|
|
842
1031
|
function parseLDConfig(text) {
|
|
843
1032
|
const out = new Map;
|
|
844
1033
|
for (const l of text.split(/\r?\n/)) {
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
1034
|
+
if (!l.includes("!COLOUR"))
|
|
1035
|
+
continue;
|
|
1036
|
+
const c = parseColourLine(l);
|
|
1037
|
+
if (c)
|
|
1038
|
+
out.set(c.code, c);
|
|
848
1039
|
}
|
|
849
1040
|
return out;
|
|
850
1041
|
}
|
|
851
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1042
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/instructions.ts
|
|
852
1043
|
var MIN_VIS = 0.5;
|
|
853
1044
|
var REORIENT = 0.35;
|
|
854
1045
|
var deg = Math.PI / 180;
|
|
@@ -1216,10 +1407,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1216
1407
|
}
|
|
1217
1408
|
};
|
|
1218
1409
|
}
|
|
1219
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1410
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/render.ts
|
|
1220
1411
|
import * as THREE from "three";
|
|
1221
1412
|
|
|
1222
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1413
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/pack-io.ts
|
|
1223
1414
|
import { decompress } from "fzstd";
|
|
1224
1415
|
async function decompressPack(data) {
|
|
1225
1416
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1238,7 +1429,7 @@ function decodePack(buf) {
|
|
|
1238
1429
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1239
1430
|
}
|
|
1240
1431
|
|
|
1241
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1432
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/cull.ts
|
|
1242
1433
|
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;
|
|
1243
1434
|
var prepCache = new WeakMap;
|
|
1244
1435
|
function prepPart(H, part) {
|
|
@@ -1555,7 +1746,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1555
1746
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1556
1747
|
}
|
|
1557
1748
|
|
|
1558
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1749
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/render.ts
|
|
1559
1750
|
async function loadPack(url) {
|
|
1560
1751
|
const res = await fetch(url);
|
|
1561
1752
|
if (!res.ok)
|
|
@@ -1580,6 +1771,11 @@ var toF16 = (a) => {
|
|
|
1580
1771
|
o[i] = THREE.DataUtils.toHalfFloat(a[i]);
|
|
1581
1772
|
return o;
|
|
1582
1773
|
};
|
|
1774
|
+
function keepHalf(bm) {
|
|
1775
|
+
const p = bm.geometry.getAttribute("position");
|
|
1776
|
+
if (p && !p.isFloat16BufferAttribute && p.array instanceof Uint16Array)
|
|
1777
|
+
bm.geometry.setAttribute("position", new THREE.Float16BufferAttribute(p.array, p.itemSize));
|
|
1778
|
+
}
|
|
1583
1779
|
function flatNormals(pos, idx) {
|
|
1584
1780
|
const n = new Float32Array(pos.length);
|
|
1585
1781
|
for (let t = 0;t < idx.length; t += 3) {
|
|
@@ -1624,11 +1820,9 @@ function geom(b, arr) {
|
|
|
1624
1820
|
c.set(b, g);
|
|
1625
1821
|
return g;
|
|
1626
1822
|
}
|
|
1627
|
-
function
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
s.vertexShader = `attribute vec4 ldrColor;
|
|
1631
|
-
` + s.vertexShader.replace("#include <color_vertex>", `#include <color_vertex>
|
|
1823
|
+
function patchLdrColorVertex(shader) {
|
|
1824
|
+
shader.vertexShader = `attribute vec4 ldrColor;
|
|
1825
|
+
` + shader.vertexShader.replace("#include <color_vertex>", `#include <color_vertex>
|
|
1632
1826
|
#ifdef USE_BATCHING_COLOR
|
|
1633
1827
|
vColor.rgb = ldrColor.a > 0.5 ? pow(ldrColor.rgb, vec3(2.2)) : getBatchingColor(getIndirectIndex(gl_DrawID)).rgb;
|
|
1634
1828
|
#elif defined(USE_INSTANCING_COLOR)
|
|
@@ -1636,15 +1830,80 @@ function makeMaterial(side) {
|
|
|
1636
1830
|
#else
|
|
1637
1831
|
vColor.rgb = pow(ldrColor.rgb, vec3(2.2));
|
|
1638
1832
|
#endif`);
|
|
1833
|
+
}
|
|
1834
|
+
function patchParticleFragment(shader, surface) {
|
|
1835
|
+
if (!surface.particleHex)
|
|
1836
|
+
return;
|
|
1837
|
+
const hex = parseInt(surface.particleHex.slice(1), 16);
|
|
1838
|
+
const pr = (hex >> 16 & 255) / 255, pg = (hex >> 8 & 255) / 255, pb = (hex & 255) / 255;
|
|
1839
|
+
const frac = Math.max(0.01, Math.min(0.95, surface.particleFraction ?? 0.3));
|
|
1840
|
+
const size = Math.max(0.02, surface.particleSize ?? 1);
|
|
1841
|
+
const sparkle = surface.finish === "glitter" ? 1 : 0;
|
|
1842
|
+
shader.uniforms.ldrParticle = { value: new THREE.Vector4(pr, pg, pb, frac) };
|
|
1843
|
+
shader.uniforms.ldrParticleSize = { value: size };
|
|
1844
|
+
shader.uniforms.ldrSparkle = { value: sparkle };
|
|
1845
|
+
shader.vertexShader = `varying vec3 ldrGrainP;
|
|
1846
|
+
` + shader.vertexShader.replace("#include <begin_vertex>", `#include <begin_vertex>
|
|
1847
|
+
ldrGrainP = position;`);
|
|
1848
|
+
shader.fragmentShader = `varying vec3 ldrGrainP; uniform vec4 ldrParticle; uniform float ldrParticleSize; uniform float ldrSparkle;
|
|
1849
|
+
` + shader.fragmentShader.replace("#include <color_fragment>", `#include <color_fragment>
|
|
1850
|
+
{
|
|
1851
|
+
vec3 gp = floor(ldrGrainP * (4.0 / max(ldrParticleSize, 0.02)));
|
|
1852
|
+
float n = fract(sin(dot(gp, vec3(12.9898, 78.233, 37.719))) * 43758.5453);
|
|
1853
|
+
float f = ldrParticle.a;
|
|
1854
|
+
if (ldrSparkle > 0.5) {
|
|
1855
|
+
float spark = step(1.0 - f * 0.85, n) * smoothstep(1.0 - f, 1.0, n);
|
|
1856
|
+
diffuseColor.rgb = mix(diffuseColor.rgb, pow(ldrParticle.rgb, vec3(2.2)), spark);
|
|
1857
|
+
} else {
|
|
1858
|
+
diffuseColor.rgb = mix(diffuseColor.rgb, pow(ldrParticle.rgb, vec3(2.2)), step(1.0 - f, n));
|
|
1859
|
+
}
|
|
1860
|
+
}`);
|
|
1861
|
+
}
|
|
1862
|
+
function makeMaterial(side) {
|
|
1863
|
+
return makeFinishMaterial(side, colourSurface({ alpha: 255, luminance: 0, finish: { type: "default" } }));
|
|
1864
|
+
}
|
|
1865
|
+
function makeFinishMaterial(side, surface) {
|
|
1866
|
+
const needPhysical = surface.clearcoat > 0 || surface.sheen > 0 || surface.finish === "glitter" || surface.finish === "pearlescent" || surface.finish === "fabric";
|
|
1867
|
+
const common = {
|
|
1868
|
+
vertexColors: true,
|
|
1869
|
+
roughness: surface.roughness,
|
|
1870
|
+
metalness: surface.metalness,
|
|
1871
|
+
side,
|
|
1872
|
+
transparent: surface.transparent,
|
|
1873
|
+
opacity: surface.opacity,
|
|
1874
|
+
depthWrite: surface.depthWrite,
|
|
1875
|
+
...surface.emissive > 0 ? { emissive: new THREE.Color(1, 1, 1), emissiveIntensity: surface.emissive } : {}
|
|
1876
|
+
};
|
|
1877
|
+
const m = needPhysical ? new THREE.MeshPhysicalMaterial({
|
|
1878
|
+
...common,
|
|
1879
|
+
clearcoat: surface.clearcoat,
|
|
1880
|
+
clearcoatRoughness: surface.clearcoatRoughness,
|
|
1881
|
+
sheen: surface.sheen,
|
|
1882
|
+
sheenRoughness: surface.sheenRoughness,
|
|
1883
|
+
sheenColor: new THREE.Color(1, 1, 1)
|
|
1884
|
+
}) : new THREE.MeshStandardMaterial(common);
|
|
1885
|
+
const particle = !!surface.particleHex;
|
|
1886
|
+
m.onBeforeCompile = (s) => {
|
|
1887
|
+
patchLdrColorVertex(s);
|
|
1888
|
+
if (surface.emissive > 0) {
|
|
1889
|
+
s.fragmentShader = s.fragmentShader.replace("#include <emissivemap_fragment>", `#include <emissivemap_fragment>
|
|
1890
|
+
totalEmissiveRadiance *= vColor.rgb;`);
|
|
1891
|
+
}
|
|
1892
|
+
if (particle)
|
|
1893
|
+
patchParticleFragment(s, surface);
|
|
1639
1894
|
};
|
|
1640
|
-
m.customProgramCacheKey = () => "ldrColor";
|
|
1895
|
+
m.customProgramCacheKey = () => "ldrColor|" + surface.finish + "|" + (surface.transparent ? "t" : "o") + (particle ? "|p" : "") + (surface.emissive > 0 ? "|e" : "");
|
|
1896
|
+
m.userData.ldrFinish = surface.finish;
|
|
1897
|
+
m.userData.ldrSurface = surface;
|
|
1641
1898
|
return m;
|
|
1642
1899
|
}
|
|
1643
|
-
function makeTexturedMaterial(side, map, wrapU = false) {
|
|
1644
|
-
const
|
|
1645
|
-
const
|
|
1900
|
+
function makeTexturedMaterial(side, map, wrapU = false, baseMat) {
|
|
1901
|
+
const surface = baseMat?.userData?.ldrSurface ?? colourSurface({ alpha: 255, luminance: 0, finish: { type: "default" } });
|
|
1902
|
+
const m = makeFinishMaterial(side, surface);
|
|
1903
|
+
const prev = m.onBeforeCompile;
|
|
1904
|
+
const baseKey = m.customProgramCacheKey?.() ?? "ldrColor";
|
|
1646
1905
|
m.onBeforeCompile = (sh, r) => {
|
|
1647
|
-
|
|
1906
|
+
prev.call(m, sh, r);
|
|
1648
1907
|
sh.uniforms.ldrMap = { value: map };
|
|
1649
1908
|
sh.uniforms.ldrWrapU = { value: wrapU ? 1 : 0 };
|
|
1650
1909
|
sh.vertexShader = `attribute vec2 ldrUV; varying vec2 vLdrUV;
|
|
@@ -1656,7 +1915,7 @@ function makeTexturedMaterial(side, map, wrapU = false) {
|
|
|
1656
1915
|
float inside = step(0.0, uv.x) * step(uv.x, 1.0) * step(0.0, uv.y) * step(uv.y, 1.0);
|
|
1657
1916
|
diffuseColor.rgb = mix(diffuseColor.rgb, t.rgb, t.a * inside); }`);
|
|
1658
1917
|
};
|
|
1659
|
-
m.customProgramCacheKey = () => "ldrColorTex";
|
|
1918
|
+
m.customProgramCacheKey = () => "ldrColorTex|" + baseKey;
|
|
1660
1919
|
m.userData.ldrMap = map;
|
|
1661
1920
|
return m;
|
|
1662
1921
|
}
|
|
@@ -2244,15 +2503,67 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2244
2503
|
if (h)
|
|
2245
2504
|
root.vpH = h;
|
|
2246
2505
|
};
|
|
2506
|
+
const trackVpBatched = (bm) => {
|
|
2507
|
+
const base = bm.onBeforeRender;
|
|
2508
|
+
bm.onBeforeRender = function(...a) {
|
|
2509
|
+
trackVp(a[0]);
|
|
2510
|
+
base.apply(this, a);
|
|
2511
|
+
};
|
|
2512
|
+
};
|
|
2247
2513
|
const matF = makeMaterial(P.side === "front" ? THREE.FrontSide : THREE.DoubleSide), matB = makeMaterial(P.side === "front" ? THREE.BackSide : THREE.DoubleSide);
|
|
2248
2514
|
const matD = makeMaterial(THREE.DoubleSide);
|
|
2249
2515
|
let nUncert = 0;
|
|
2516
|
+
matF.userData.ldrSideRole = "F";
|
|
2517
|
+
matB.userData.ldrSideRole = "B";
|
|
2518
|
+
matD.userData.ldrSideRole = "D";
|
|
2519
|
+
const colorTable = H.colorTable ?? {};
|
|
2520
|
+
const defaultLC = { code: -1, name: "", hex: "#A0A5A9", edge: "#333333", alpha: 255, luminance: 0, finish: { type: "default" } };
|
|
2521
|
+
const lookupLC = (code) => {
|
|
2522
|
+
const e = colorTable[code] ?? colorTable[String(+code)];
|
|
2523
|
+
if (e && typeof e === "object" && e.hex) {
|
|
2524
|
+
return { code: +code || -1, name: e.name ?? "", hex: e.hex, edge: e.edge ?? "#333333", alpha: e.alpha ?? 255, luminance: e.luminance ?? 0, finish: e.finish ?? { type: "default" } };
|
|
2525
|
+
}
|
|
2526
|
+
const n = +code;
|
|
2527
|
+
if (n > 16777215 && n >>> 24 === 2) {
|
|
2528
|
+
const hex = "#" + (n & 16777215).toString(16).padStart(6, "0").toUpperCase();
|
|
2529
|
+
return { code: n, name: "Direct", hex, edge: hex, alpha: 255, luminance: 0, finish: { type: "default" } };
|
|
2530
|
+
}
|
|
2531
|
+
return defaultLC;
|
|
2532
|
+
};
|
|
2533
|
+
const matCache = new Map;
|
|
2534
|
+
const materialFor = (code, mirror, uncert) => {
|
|
2535
|
+
const lc = lookupLC(code);
|
|
2536
|
+
const fk = colourMaterialKey(lc);
|
|
2537
|
+
const role = uncert ? "D" : mirror ? "B" : "F";
|
|
2538
|
+
const key = fk + "|" + role;
|
|
2539
|
+
let m = matCache.get(key);
|
|
2540
|
+
if (!m) {
|
|
2541
|
+
const side = uncert ? THREE.DoubleSide : P.side === "front" ? mirror ? THREE.BackSide : THREE.FrontSide : THREE.DoubleSide;
|
|
2542
|
+
if (fk === "default:op" && lc.luminance === 0) {
|
|
2543
|
+
m = role === "D" ? matD : role === "B" ? matB : matF;
|
|
2544
|
+
} else {
|
|
2545
|
+
m = makeFinishMaterial(side, colourSurface(lc));
|
|
2546
|
+
m.userData.ldrSideRole = role;
|
|
2547
|
+
}
|
|
2548
|
+
matCache.set(key, m);
|
|
2549
|
+
}
|
|
2550
|
+
return m;
|
|
2551
|
+
};
|
|
2250
2552
|
const byPart = new Map;
|
|
2251
2553
|
insts.forEach((it, i) => {
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2554
|
+
const p = H.parts[it.part];
|
|
2555
|
+
if (!p)
|
|
2556
|
+
return;
|
|
2557
|
+
const mirror = det12(it.m) < 0;
|
|
2558
|
+
const mat = materialFor(String(it.color), mirror, !!p.uncert);
|
|
2559
|
+
const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
|
|
2560
|
+
let b = byPart.get(k);
|
|
2561
|
+
if (!b) {
|
|
2562
|
+
if (p.uncert)
|
|
2563
|
+
nUncert++;
|
|
2564
|
+
byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
|
|
2255
2565
|
}
|
|
2566
|
+
b.ids.push(i);
|
|
2256
2567
|
});
|
|
2257
2568
|
const steps = P.steps;
|
|
2258
2569
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
@@ -2346,8 +2657,9 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2346
2657
|
const texMats = new Map;
|
|
2347
2658
|
const pending = [];
|
|
2348
2659
|
const texMat = (t, base, wrapU) => {
|
|
2349
|
-
const role = base ===
|
|
2350
|
-
const
|
|
2660
|
+
const role = base.userData?.ldrSideRole ?? (base.side === THREE.BackSide ? "B" : base.side === THREE.DoubleSide ? "D" : "F");
|
|
2661
|
+
const fin = base.userData?.ldrFinish ?? "default";
|
|
2662
|
+
const k = t + ":" + role + ":" + fin + ":" + (wrapU ? 1 : 0);
|
|
2351
2663
|
let m = texMats.get(k);
|
|
2352
2664
|
if (!m) {
|
|
2353
2665
|
let tx = texCache.get(t);
|
|
@@ -2357,7 +2669,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2357
2669
|
pending.push(r.ready);
|
|
2358
2670
|
texCache.set(t, tx);
|
|
2359
2671
|
}
|
|
2360
|
-
texMats.set(k, m = makeTexturedMaterial(base.side, tx, wrapU));
|
|
2672
|
+
texMats.set(k, m = makeTexturedMaterial(base.side, tx, wrapU, base));
|
|
2361
2673
|
}
|
|
2362
2674
|
return m;
|
|
2363
2675
|
};
|
|
@@ -2397,10 +2709,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2397
2709
|
return arr(b.idx).length;
|
|
2398
2710
|
};
|
|
2399
2711
|
const coldByMat = new Map;
|
|
2400
|
-
for (const [
|
|
2401
|
-
const part =
|
|
2712
|
+
for (const [, bucket] of byPart) {
|
|
2713
|
+
const part = bucket.part;
|
|
2402
2714
|
const p = H.parts[part];
|
|
2403
|
-
const
|
|
2715
|
+
const idsAll = bucket.ids;
|
|
2716
|
+
const mat = bucket.mat;
|
|
2404
2717
|
const textured = wantTex && !!p.tex;
|
|
2405
2718
|
if (textured || idsAll.length > MERGE_MAX) {
|
|
2406
2719
|
const bodyB = textured ? p.tbody : p.body;
|
|
@@ -2529,7 +2842,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2529
2842
|
bm.sortObjects = false;
|
|
2530
2843
|
bm.frustumCulled = true;
|
|
2531
2844
|
bm.userData.ldrMerged = true;
|
|
2532
|
-
bm
|
|
2845
|
+
trackVpBatched(bm);
|
|
2533
2846
|
root.add(bm);
|
|
2534
2847
|
const gidsByPart = new Map;
|
|
2535
2848
|
for (const [part, p] of partSet) {
|
|
@@ -2544,6 +2857,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2544
2857
|
ids.push(bm.addGeometry(geom(l, arr)));
|
|
2545
2858
|
gidsByPart.set(part, ids);
|
|
2546
2859
|
}
|
|
2860
|
+
keepHalf(bm);
|
|
2547
2861
|
const live = members.filter((m) => (gidsByPart.get(m.part)?.length ?? 0) > 0);
|
|
2548
2862
|
const instGids = new Array(live.length);
|
|
2549
2863
|
const ownArr = steps ? new Int32Array(live.length) : null;
|
|
@@ -2628,7 +2942,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2628
2942
|
ubm.frustumCulled = true;
|
|
2629
2943
|
ubm.userData.ldrMerged = true;
|
|
2630
2944
|
ubm.userData.ldrUnder = true;
|
|
2631
|
-
ubm
|
|
2945
|
+
trackVpBatched(ubm);
|
|
2632
2946
|
root.add(ubm);
|
|
2633
2947
|
const uGidsByPart = new Map;
|
|
2634
2948
|
for (const [part, p] of uPartSet) {
|
|
@@ -2643,6 +2957,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2643
2957
|
ids.push(ubm.addGeometry(geom(l, arr)));
|
|
2644
2958
|
uGidsByPart.set(part, ids);
|
|
2645
2959
|
}
|
|
2960
|
+
keepHalf(ubm);
|
|
2646
2961
|
const uLive = umembers.filter((m) => (uGidsByPart.get(m.part)?.length ?? 0) > 0);
|
|
2647
2962
|
const uInstGids = new Array(uLive.length);
|
|
2648
2963
|
const uOwn = steps ? new Int32Array(uLive.length) : null;
|
|
@@ -2916,12 +3231,15 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2916
3231
|
box.max.z = m[2];
|
|
2917
3232
|
}
|
|
2918
3233
|
const setSide = (front) => {
|
|
2919
|
-
matF
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
3234
|
+
for (const m of new Set([matF, matB, matD, ...matCache.values(), ...texMats.values()])) {
|
|
3235
|
+
const role = m.userData?.ldrSideRole;
|
|
3236
|
+
if (role === "D") {
|
|
3237
|
+
m.side = THREE.DoubleSide;
|
|
3238
|
+
} else if (role === "B") {
|
|
3239
|
+
m.side = front ? THREE.BackSide : THREE.DoubleSide;
|
|
3240
|
+
} else {
|
|
3241
|
+
m.side = front ? THREE.FrontSide : THREE.DoubleSide;
|
|
3242
|
+
}
|
|
2925
3243
|
m.needsUpdate = true;
|
|
2926
3244
|
}
|
|
2927
3245
|
};
|
|
@@ -2970,7 +3288,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
2970
3288
|
await new Promise((r) => setTimeout(r, 0));
|
|
2971
3289
|
}
|
|
2972
3290
|
}
|
|
2973
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3291
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/scene.ts
|
|
2974
3292
|
import * as THREE2 from "three";
|
|
2975
3293
|
function colorFn(src, pack, fallback) {
|
|
2976
3294
|
const table = new Map;
|
|
@@ -3001,9 +3319,27 @@ var direct = (c) => {
|
|
|
3001
3319
|
};
|
|
3002
3320
|
var plasticCache = new WeakMap;
|
|
3003
3321
|
function toPlastic(old) {
|
|
3322
|
+
const fin = old.userData?.ldrFinish;
|
|
3323
|
+
if (fin && fin !== "default")
|
|
3324
|
+
return old;
|
|
3325
|
+
if (old.isMeshPhysicalMaterial)
|
|
3326
|
+
return old;
|
|
3004
3327
|
let m = plasticCache.get(old);
|
|
3005
3328
|
if (!m) {
|
|
3006
|
-
const p = new THREE2.MeshPhysicalMaterial({
|
|
3329
|
+
const p = new THREE2.MeshPhysicalMaterial({
|
|
3330
|
+
vertexColors: true,
|
|
3331
|
+
roughness: 0.3,
|
|
3332
|
+
clearcoat: 0.3,
|
|
3333
|
+
clearcoatRoughness: 0.2,
|
|
3334
|
+
specularIntensity: 0.6,
|
|
3335
|
+
side: old.side,
|
|
3336
|
+
transparent: old.transparent,
|
|
3337
|
+
opacity: old.opacity,
|
|
3338
|
+
depthWrite: old.depthWrite,
|
|
3339
|
+
metalness: old.metalness,
|
|
3340
|
+
emissive: old.emissive?.clone?.() ?? new THREE2.Color(0),
|
|
3341
|
+
emissiveIntensity: old.emissiveIntensity ?? 0
|
|
3342
|
+
});
|
|
3007
3343
|
p.onBeforeCompile = old.onBeforeCompile;
|
|
3008
3344
|
p.customProgramCacheKey = () => "Phys" + old.customProgramCacheKey() + old.side;
|
|
3009
3345
|
p.userData = old.userData;
|
|
@@ -3059,10 +3395,13 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3059
3395
|
pairs.clear();
|
|
3060
3396
|
if (o.material === "plastic")
|
|
3061
3397
|
cur.root.traverse((x) => {
|
|
3062
|
-
if (x.isMesh
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3398
|
+
if (!x.isMesh || !x.material?.isMeshStandardMaterial)
|
|
3399
|
+
return;
|
|
3400
|
+
const old = x.material;
|
|
3401
|
+
const next = toPlastic(old);
|
|
3402
|
+
if (next !== old) {
|
|
3403
|
+
x.material = next;
|
|
3404
|
+
pairs.set(next, old);
|
|
3066
3405
|
}
|
|
3067
3406
|
});
|
|
3068
3407
|
if (!edges)
|
|
@@ -3126,10 +3465,10 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3126
3465
|
dispose: disposeCur
|
|
3127
3466
|
});
|
|
3128
3467
|
}
|
|
3129
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3468
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/parts-cdn.ts
|
|
3130
3469
|
import { decompress as decompress2 } from "fzstd";
|
|
3131
3470
|
|
|
3132
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3471
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/embedded.ts
|
|
3133
3472
|
function splitFiles(text, fallback) {
|
|
3134
3473
|
const files = new Map;
|
|
3135
3474
|
let cur = null, saw = false;
|
|
@@ -3201,7 +3540,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3201
3540
|
return out;
|
|
3202
3541
|
}
|
|
3203
3542
|
|
|
3204
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3543
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/parts-cdn.ts
|
|
3205
3544
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3206
3545
|
var indexCache = new Map;
|
|
3207
3546
|
var shardCache = new Map;
|
|
@@ -3361,10 +3700,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3361
3700
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3362
3701
|
}
|
|
3363
3702
|
|
|
3364
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3365
|
-
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';
|
|
3703
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/load-worker.gen.ts
|
|
3704
|
+
var load_worker_gen_default = 'var ht=ArrayBuffer,W=Uint8Array,ge=Uint16Array,gt=Int16Array;var be=Int32Array,Ce=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},ce=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},bt=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 dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);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},xt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},yt=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)K(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 C=1<<10+(e[5]>>3);d=C+(C>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((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 xt(e,4)+8;K(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)K(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),C=new ge(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,A=(1<<g+1)-1,z=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&A,x=(1<<g)-1,M=A-i-1,L=z&x;if(L<M)r+=g,z=L;else if(r+=g+1,z>x)z-=M;if(h[++l]=--z,z==-1)i+=z,b[--p]=l;else i-=z;if(!z)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)K(0);var E=0,U=(o>>1)+(o>>3)+3,X=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[E]=H;do E=E+U&X;while(E>=p)}}if(E)K(0);for(c=0;c<o;++c){var w=d[b[c]]++,P=S[c]=s-re(w);C[c]=(w<<P)-o}return[r+7>>3,{b:s,s:b,n:S,t:C}]},wt=function(e,t){var n=0,r=-1,s=new W(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)K(0);var C=0,u=0,b=m.b,S=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(C+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=m.s[C],g-=S,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[C],C=m.t[C],S=m.n[u],u=m.t[u]}if(++r>255)K(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 z=0;for(n=0;n<r;++n){var x=i[n];if(x>11)K(0);z+=x&&1<<x-1}var M=re(z)+1,L=1<<M,D=L-z;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var x=i[n];++l[i[n]=x&&M+1-x]}var E=new W(L<<1),U=E.subarray(0,L),X=E.subarray(L);a[M]=0;for(n=M;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<M-n))}if(a[0]!=L)K(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:X,b:M,s:U}]},At=ue(new W([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 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],Mt=ue(new W([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},Ee=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ct=$e(Ee,0),Se=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Et=$e(Se,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)K(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)K(0)},St=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)},Lt=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 W(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 Ce(e,s,a)}if(i==2){var c=e[s],p=c&3,m=c>>2&3,h=c>>4,d=0,C=0;if(p<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(C=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 W(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 S=t.h;if(p==2){var g=wt(e,s);d+=s-(s=g[0]),t.h=S=g[1]}else if(!S)K(0);(C?St:le)(e.subarray(s,s+=d),u.subarray(b),S)}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)K(0);var z=[vt,Mt,At];for(var x=2;x>-1;--x){var M=A>>(x<<1)+2&3;if(M==1){var L=new W([0,0,e[s++]]);z[x]={s:L.subarray(2,3),n:L.subarray(0,1),t:new ge(L.buffer,0,1),b:0}}else if(M==2)r=ue(e,s,9-(x&1)),s=r[0],z[x]=r[1];else if(M==3){if(!t.t)K(0);z[x]=t.t[x]}}var D=t.t=z,E=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var v=(a<<3)-8+re(H)-X.b,w=v>>3,P=0,V=(e[w]|e[w+1]<<8)>>(v&7)&(1<<X.b)-1;w=(v-=U.b)>>3;var I=(e[w]|e[w+1]<<8)>>(v&7)&(1<<U.b)-1;w=(v-=E.b)>>3;var B=(e[w]|e[w+1]<<8)>>(v&7)&(1<<E.b)-1;for(++f;--f;){var T=X.s[V],y=X.n[V],N=E.s[B],R=E.n[B],k=U.s[I],O=U.n[I];w=(v-=k)>>3;var j=1<<k,F=j+((e[w]|e[w+1]<<8|e[w+2]<<16|e[w+3]<<24)>>>(v&7)&j-1);w=(v-=Se[N])>>3;var G=Et[N]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Se[N])-1);w=(v-=Ee[T])>>3;var _=Ct[T]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(v&7)&(1<<Ee[T])-1);if(w=(v-=y)>>3,V=X.t[V]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<y)-1),w=(v-=R)>>3,B=E.t[B]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<R)-1),w=(v-=O)>>3,I=U.t[I]+((e[w]|e[w+1]<<8)>>(v&7)&(1<<O)-1),F>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=F-=3;else{var Z=F-(_!=0);if(Z){if(F=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=F}else F=t.o[0]}for(var x=0;x<_;++x)u[P+x]=u[b+x];P+=_,b+=_;var q=P-F;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var x=0;x<J;++x)u[P+x]=t.w[ee+x];P+=J,G-=J,q=0}for(var x=0;x<G;++x)u[P+x]=u[q+x];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ce(u,0,P)}else if(n){if(t.y+=h,b)for(var x=0;x<h;++x)u[x]=u[b+x]}else if(b)u=Ce(u,b);return t.b=a,u}K(2)},Tt=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=yt(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=Lt(e,i,t);if(!l)K(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 Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ve=/^~?\\s*moved\\s+to\\s+(.+)$/i,Pt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Ye=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),It=new Set(["model","submodel","configuration"]),Ft=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function He(e){let t=Ft.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ye.has(n)||It.has(n)?n:void 0}function Rt(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 kt(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=Rt(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:Le(o),m:i,file:Y(a)}}function Ge(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(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 Je(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(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(m(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],p=null,h=!0},C=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(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||C)continue;if(!o)d(t);let M=f.slice(2).trimStart(),L=M.search(/\\s/),D={t:f.charCodeAt(0)-48,color:Le(L<0?M:M.slice(0,L)),p:[],src:f};S(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 L=M;while(L<f.length&&f.charCodeAt(L)!==32&&f.charCodeAt(L)!==9)L++;let D=f.slice(M,L);if(!Pt.has(D)){if(C||a)continue;if(!o)d(t);let E=f.slice(M),U={t:0,text:E};if(D.charCodeAt(0)===33)U.meta=D;if(p=null,h&&!o.org){let H=He(E);if(H)o.org=H}let X=E.match(Ve);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(U);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!C){let M=Ut(f);if(M){if(!o)d(t);S(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(),C=!1,d(M.slice(5));continue}if(A[1]==="NOFILE"){m(),o=null,C=!0;continue}if(A[1]==="!DATA"){b(),m(),o=null,C=!1,a={name:M.slice(5).trim(),chunks:[]};continue}if(C)continue;if(a){if(A[1]==="!:")a.chunks.push(A.slice(2).join(""));continue}if(!o)d(t);let L={t:0,text:M};if(A[1]==="STEP")L.step=!0,c=[],p=null;else if(A[1]==="BFC")L.bfc=A.slice(2).join(" ");else if(A[1]==="ROTSTEP")if(L.meta="ROTSTEP",L.step=!0,c=[],p=null,(A[2]??"").toUpperCase()==="END")L.rotstep={x:0,y:0,z:0,mode:"END"};else{let E=(A[5]??"REL").toUpperCase();L.rotstep={x:+A[2]||0,y:+A[3]||0,z:+A[4]||0,mode:["REL","ABS","ADD"].includes(E)?E:"REL"}}else if(A[1]==="BUFEXCHG"){L.meta="BUFEXCHG";let E=(A[2]??"").toUpperCase();L.bufexchg={op:E==="RETRIEVE"?"RETRIEVE":"STORE",buf:A[3]??"A"}}else if(A[1]?.startsWith("!"))L.meta=A[1];if(h&&!o.org){let E=He(M);if(E)o.org=E}if(A[1]==="!TEXMAP"){let E=(A[2]??"").toUpperCase();if(p=null,E==="START"||E==="NEXT"){let U=kt(M.replace(/^!TEXMAP\\s+\\S+/i,""),E==="NEXT");if(L.texmap={op:E,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),E==="START")c.push({map:U,fallback:!1});else p=U}else if(E==="FALLBACK"){L.texmap={op:E};let U=c[c.length-1];if(U)U.fallback=!0}else if(E==="END")L.texmap={op:E},c.pop()}else if(A[1]==="!:"){p=null;let E=Ge(A.slice(2));if(E)S(E,!0),L.geom=E}else p=null;let D=M.match(Ve);if(D&&!o.movedTo){let E=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=Y(E)}o.cmds.push(L);continue}if(a||C)continue;if(!o)d(t);let x=Ge(A);if(!x)continue;S(x,!1),o.cmds.push(x),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,[C,u,b,S,g,f,A,z,x,M,L,D]=t;return[o*C+i*u+l*b+n,a*C+c*u+p*b+r,m*C+h*u+d*b+s,o*S+i*A+l*M,o*g+i*z+l*L,o*f+i*x+l*D,a*S+c*A+p*M,a*g+c*z+p*L,a*f+c*x+p*D,m*S+h*A+d*M,m*g+h*z+d*L,m*f+h*x+d*D]}var Te=[0,0,0,1,0,0,0,1,0,0,0,1];var _e=new WeakMap,zt=/^(s|8|48)\\//;function Pe(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=_e.get(n);if(r)return r;if(n.org)r=Ye.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&&zt.test(s.file))?"part":"model";return _e.set(n,r),r}var We=new WeakMap;function et(e){let t=We.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 We.set(e,t),t}var Ke=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),Ot=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ke(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ke(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Y(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(Ot)].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,C=-(l*h-c*p),u=l*m-a*p,b=s*d+o*C+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,g=[d*S,-(o*h-i*m)*S,(o*c-i*a)*S,C*S,(s*h-i*p)*S,-(s*c-i*l)*S,u*S,-(s*m-o*p)*S,(s*a-o*l)*S];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),Xe=(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} ${Xe(t.texture)}${t.glossmap?" GLOSSMAP "+Xe(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-${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 Ze=new WeakMap;function st(e){let t=Ze.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),Ze.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,C=l.get(d);if(!C){let u;C=Object.assign(()=>u??=tt(m,h),{file:m,step:h}),l.set(d,C)}return C},p=(m,h,d,C,u,b,S,g,f=null,A=[],z=[])=>{let x=m.files.get(h);if(!x||S>r)return;let M=0,L=S>0?++a:0,D=i&&L?[...A,L]:A,E=i&&L?[...z,d]:z,U=i&&!f?new Map:null,X=-1,H=0,v=(T,y,N,R,k,O)=>{if(X!==M)X=M,H=0;let j=U?.get(M+"|"+y);if(j)return j.n++,p(T,T===m?y:T.main,N,R,u+"/"+y,[...k,ot],S+1,O,[...k,ot],D,E);let F=[...k,H++],G=n.length;p(T,T===m?y:T.main,N,R,u+"/"+y,F,S+1,O,f,D,E),U?.set(M+"|"+y,{n:1,from:G,to:n.length})},w=st(x),P=s?et(x):[],V=0,I=(T,y,N,R,k,O,j)=>{if(f)R=f;let F={part:T,color:y,m:N,step:R[0],steps:R,localStep:k,path:u};if(L){if(F.sub=L,i)F.subPath=D,F.subMats=E}if(O)F.embedded=!0;if(j){let _=rt(T,j);F.texPart=_.name,F.texSource=_.source}let G=w[k];if(G)F.view=G;return n.push(F),F},B=(T)=>{while(V<P.length&&P[V]<=T){let y=P[V++];I(Ie(x.name,y),C,d,[...b,y],y,!1,null).source=c(x,y)}};for(let T of x.cmds){if(T.t===0&&T.step){M++;continue}let y=T;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){B(M);continue}if(y.t===0)if(o&&y.geom?.t===1)y=y.geom;else continue;if(y.t!==1)continue;if(o&&y.fallback)continue;let N=y.color===16?C:y.color,R=Qe(d,y.m),k=[...b,M],O=o?y.tex??g:null,j=O?nt(y.m):null,F=O&&j?qe(O,j):null;if(m.files.has(y.file)){if(Pe(m,y.file)==="model"){v(m,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!0,F);continue}let G=t.resolveModel?.(y.file);if(G){v(G,y.file,R,N,k,F);continue}I(y.file,N,R,k,M,!1,F)}if(B(1/0),U){for(let T of U.values())if(T.n>1)for(let y=T.from;y<T.to;y++)n[y].mult??=T.n}};if(Pe(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(Je(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(Y(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(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var _t=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Wt(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=Y(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=_t(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/${Wt(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 Fe(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 C=0;C<12;C++)i[d*12+C]=h[2+C]});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 Re{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 xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Kt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],p=[],m=[],h=new Re(e.length*2),d=[],C=[];for(let v=0;v<e.length;v++){let w=e[v],P=w.m,V=t.parts[w.part];if(!V||!V.mask||!ct(P))continue;let I=V.bbox,B=1/0,T=-1/0,y=1/0,N=-1/0;for(let O=0;O<2;O++)for(let j=0;j<2;j++){let F=O?I[3]:I[0],G=j?I[5]:I[2],_=P[0]+P[3]*F+P[5]*G,Z=P[2]+P[9]*F+P[11]*G;if(_<B)B=_;if(_>T)T=_;if(Z<y)y=Z;if(Z>N)N=Z}let R=a.length;s.push(B),o.push(T),i.push(y),l.push(N),a.push(v),c.push(Fe(t,w.part)),p.push(I[0]),m.push(I[2]);let k=Math.round((P[1]+I[4])*2);for(let O=Math.floor(B/40);O<=Math.floor(T/40);O++)for(let j=Math.floor(y/40);j<=Math.floor(N/40);j++){if(!xe(k,O,j))continue;let F=C.length;C.push(R),d.push(h.put(k,O,j,F))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,g=NaN,f=NaN,A=-1,z=(v,w,P,V)=>{let I=Math.round(w*2),B=Math.floor(v/40),T=Math.floor(P/40);if(!xe(I,B,T))return fe;let y=fe;if(I!==S||B!==g||T!==f)S=I,g=B,f=T,A=h.get(I,B,T);for(let N=A;N>=0;N=d[N]){let R=C[N];if(a[R]===V||!(v-6>=s[R]-0.5&&v+6<=o[R]+0.5&&P-6>=i[R]-0.5&&P+6<=l[R]+0.5))continue;let k=e[a[R]].m,O=c[R],j=p[R],F=m[R],G=v-k[0],_=w-k[1],Z=P-k[2],q=k[3]*G+k[6]*_+k[9]*Z,J=k[5]*G+k[8]*_+k[11]*Z,{nx:ee,nz:se,mask:ae}=O,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-F)/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[R]];if(Q<y)y=Q}}return y},x=0;for(let v of e){let w=Fe(t,v.part);if(w)x+=w.nStuds}let M=new Uint8Array(x),L=new Uint8Array(x),D=new Re(x),E=0,U=n?new Int32Array(x).fill(fe):void 0;for(let v=0,w=0;v<e.length;v++){let P=e[v],V=Fe(t,P.part);if(!V)continue;let I=P.m,B=V.studM,T=I[0],y=I[1],N=I[2],R=I[3],k=I[4],O=I[5],j=I[6],F=I[7],G=I[8],_=I[9],Z=I[10],q=I[11];for(let J=0;J<V.nStuds;J++,w++){let ee=J*12,se=B[ee+4],ae=B[ee+7],oe=B[ee+10];if(!(Math.abs(j*se+F*ae+G*oe-1)<0.001&&Math.abs(R*se+k*ae+O*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;L[w]=1;let Q=B[ee],te=B[ee+1],ne=B[ee+2],ke=T+R*Q+k*te+O*ne,De=y+j*Q+F*te+G*ne,Ue=N+_*Q+Z*te+q*ne,ze=z(ke,De,Ue,v);if(ze!==fe){if(M[w]=1,E++,U)U[w]=ze}let pe=Math.round(ke),me=Math.round(De),he=Math.round(Ue);if(!xe(pe,me,he))continue;if(!n){D.put(pe,me,he,1);continue}let Oe=n[v],Ne=D.get(pe,me,he);if(Ne<0||Oe<Ne)D.put(pe,me,he,Oe)}}let X=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],P=t.parts[w.part];if(!P||!P.under||!ct(w.m))continue;let V=P.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,y=!0,N=0;for(let R=0;R<I&&y;R++)for(let k=0;k<B;k++){let O=V[0]+10+20*R,j=V[2]+10+20*k,F=T[0]+T[3]*O+T[5]*j,G=T[2]+T[9]*O+T[11]*j,_=Math.round(F),Z=Math.round(T[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?D.get(_,Z,q):-1;if(J<0){y=!1;break}if(J>N)N=J}if(y){if(X[v]=1,H)H[v]=N}}return{nStuds:x,studHidden:M,studUp:L,underHidden:X,studsHidden:E,studHideStep:U,underHideStep:H}}function Xt(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 ye(e,t,n=!0){let r=Xt(e,t,n);return Kt(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 Zt=(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)=>Zt(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 Yt(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 C=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+C),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;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 Jt(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(Y))],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 S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);p+=S.byteLength;for(let g of u.items){let f=je(S.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?Yt(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:C}=await Jt([...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 z=m.header.parts[A];if(z)m.header.parts[f]=z}let S=performance.now(),g=t.cull?ye(a,m.header,t.textures!==!1):void 0;return{insts:a,pack:m,missing:b,requests:d,bytes:C,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:S-c,...g?{cull:performance.now()-S}:{}}}}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=ye(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';
|
|
3366
3705
|
|
|
3367
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3706
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/cdn.ts
|
|
3368
3707
|
var worker;
|
|
3369
3708
|
var seq = 0;
|
|
3370
3709
|
var pending = new Map;
|
|
@@ -3473,7 +3812,7 @@ async function loadModel(source, o = {}) {
|
|
|
3473
3812
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
3474
3813
|
});
|
|
3475
3814
|
}
|
|
3476
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3815
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/library.ts
|
|
3477
3816
|
import { existsSync, readFileSync } from "fs";
|
|
3478
3817
|
import { join } from "path";
|
|
3479
3818
|
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]];
|
|
@@ -3555,15 +3894,7 @@ class Library {
|
|
|
3555
3894
|
return null;
|
|
3556
3895
|
}
|
|
3557
3896
|
colors() {
|
|
3558
|
-
|
|
3559
|
-
const d = parse(readFileSync(join(this.root, "LDConfig.ldr"), "latin1"));
|
|
3560
|
-
for (const c of d.files.get(d.main).cmds)
|
|
3561
|
-
if (c.t === 0 && c.meta === "!COLOUR") {
|
|
3562
|
-
const t = c.text.split(/\s+/);
|
|
3563
|
-
const g = (k) => t[t.indexOf(k) + 1];
|
|
3564
|
-
out.set(+g("CODE"), { name: t[1], hex: g("VALUE"), edge: g("EDGE"), alpha: t.includes("ALPHA") ? +g("ALPHA") : 255 });
|
|
3565
|
-
}
|
|
3566
|
-
return out;
|
|
3897
|
+
return parseLDConfig(readFileSync(join(this.root, "LDConfig.ldr"), "latin1"));
|
|
3567
3898
|
}
|
|
3568
3899
|
mesh(name, opts = {}) {
|
|
3569
3900
|
name = norm(name);
|
|
@@ -3732,11 +4063,11 @@ class Library {
|
|
|
3732
4063
|
return insts;
|
|
3733
4064
|
}
|
|
3734
4065
|
}
|
|
3735
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4066
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/build-pack.ts
|
|
3736
4067
|
import fs3 from "node:fs";
|
|
3737
4068
|
import path3 from "node:path";
|
|
3738
4069
|
|
|
3739
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4070
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/resolver.ts
|
|
3740
4071
|
import fs from "node:fs";
|
|
3741
4072
|
import path from "node:path";
|
|
3742
4073
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4008,11 +4339,11 @@ function collectDeps(lib, refs) {
|
|
|
4008
4339
|
return out;
|
|
4009
4340
|
}
|
|
4010
4341
|
|
|
4011
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4342
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/compile.ts
|
|
4012
4343
|
import fs2 from "node:fs";
|
|
4013
4344
|
import path2 from "node:path";
|
|
4014
4345
|
|
|
4015
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4346
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/lod.ts
|
|
4016
4347
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4017
4348
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4018
4349
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4204,7 +4535,7 @@ function lodChain(P, C, I) {
|
|
|
4204
4535
|
return out;
|
|
4205
4536
|
}
|
|
4206
4537
|
|
|
4207
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4538
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/compile.ts
|
|
4208
4539
|
function loadColors(root) {
|
|
4209
4540
|
const map = new Map;
|
|
4210
4541
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -4787,7 +5118,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
4787
5118
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
4788
5119
|
}
|
|
4789
5120
|
|
|
4790
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5121
|
+
// ../../../../../../../tmp/ldr-build-nyOADZ/src/node/build-pack.ts
|
|
4791
5122
|
function buildPack(o) {
|
|
4792
5123
|
const lib = new Library2(o.ldrawRoot);
|
|
4793
5124
|
const refs = new Map;
|
|
@@ -4839,8 +5170,13 @@ function buildPack(o) {
|
|
|
4839
5170
|
let extra;
|
|
4840
5171
|
if (o.colors !== false) {
|
|
4841
5172
|
const cfg = path3.join(o.ldrawRoot, "LDConfig.ldr");
|
|
4842
|
-
if (fs3.existsSync(cfg))
|
|
4843
|
-
|
|
5173
|
+
if (fs3.existsSync(cfg)) {
|
|
5174
|
+
const table = [...parseLDConfig(fs3.readFileSync(cfg, "latin1"))];
|
|
5175
|
+
extra = {
|
|
5176
|
+
colors: Object.fromEntries(table.map(([k, v]) => [k, v.hex])),
|
|
5177
|
+
colorTable: Object.fromEntries(table.map(([k, v]) => [k, { name: v.name, hex: v.hex, edge: v.edge, alpha: v.alpha, luminance: v.luminance, finish: v.finish }]))
|
|
5178
|
+
};
|
|
5179
|
+
}
|
|
4844
5180
|
}
|
|
4845
5181
|
const texture = (n) => {
|
|
4846
5182
|
const k = norm2(n), b = data.get(k) ?? data.get(k.replace(/^textures\//, "")) ?? data.get("textures/" + k);
|
|
@@ -4862,6 +5198,8 @@ export {
|
|
|
4862
5198
|
buildPack,
|
|
4863
5199
|
collectDeps,
|
|
4864
5200
|
colorToken,
|
|
5201
|
+
colourMaterialKey,
|
|
5202
|
+
colourSurface,
|
|
4865
5203
|
computeCulling,
|
|
4866
5204
|
conditionalLineVisible,
|
|
4867
5205
|
conditionalLines,
|
|
@@ -4892,12 +5230,14 @@ export {
|
|
|
4892
5230
|
loosePartName,
|
|
4893
5231
|
looseSource,
|
|
4894
5232
|
looseSteps,
|
|
5233
|
+
makeFinishMaterial,
|
|
4895
5234
|
makeMaterial,
|
|
4896
5235
|
mergePacks,
|
|
4897
5236
|
mul,
|
|
4898
5237
|
norm,
|
|
4899
5238
|
parse,
|
|
4900
5239
|
parseColor,
|
|
5240
|
+
parseColourLine,
|
|
4901
5241
|
parseLDConfig,
|
|
4902
5242
|
parseModel,
|
|
4903
5243
|
parseTexMap,
|