ldr 0.11.1 → 0.13.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 +410 -60
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/model.d.ts +58 -1
- package/dist/node/index.js +424 -77
- 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-TjmzYL/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-TjmzYL/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-TjmzYL/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-TjmzYL/src/render.ts
|
|
1220
1411
|
import * as THREE from "three";
|
|
1221
1412
|
|
|
1222
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1413
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/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-TjmzYL/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-TjmzYL/src/render.ts
|
|
1559
1750
|
async function loadPack(url) {
|
|
1560
1751
|
const res = await fetch(url);
|
|
1561
1752
|
if (!res.ok)
|
|
@@ -1629,11 +1820,9 @@ function geom(b, arr) {
|
|
|
1629
1820
|
c.set(b, g);
|
|
1630
1821
|
return g;
|
|
1631
1822
|
}
|
|
1632
|
-
function
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
s.vertexShader = `attribute vec4 ldrColor;
|
|
1636
|
-
` + 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>
|
|
1637
1826
|
#ifdef USE_BATCHING_COLOR
|
|
1638
1827
|
vColor.rgb = ldrColor.a > 0.5 ? pow(ldrColor.rgb, vec3(2.2)) : getBatchingColor(getIndirectIndex(gl_DrawID)).rgb;
|
|
1639
1828
|
#elif defined(USE_INSTANCING_COLOR)
|
|
@@ -1641,15 +1830,80 @@ function makeMaterial(side) {
|
|
|
1641
1830
|
#else
|
|
1642
1831
|
vColor.rgb = pow(ldrColor.rgb, vec3(2.2));
|
|
1643
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 } : {}
|
|
1644
1876
|
};
|
|
1645
|
-
m
|
|
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);
|
|
1894
|
+
};
|
|
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;
|
|
1646
1898
|
return m;
|
|
1647
1899
|
}
|
|
1648
|
-
function makeTexturedMaterial(side, map, wrapU = false) {
|
|
1649
|
-
const
|
|
1650
|
-
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";
|
|
1651
1905
|
m.onBeforeCompile = (sh, r) => {
|
|
1652
|
-
|
|
1906
|
+
prev.call(m, sh, r);
|
|
1653
1907
|
sh.uniforms.ldrMap = { value: map };
|
|
1654
1908
|
sh.uniforms.ldrWrapU = { value: wrapU ? 1 : 0 };
|
|
1655
1909
|
sh.vertexShader = `attribute vec2 ldrUV; varying vec2 vLdrUV;
|
|
@@ -1661,7 +1915,7 @@ function makeTexturedMaterial(side, map, wrapU = false) {
|
|
|
1661
1915
|
float inside = step(0.0, uv.x) * step(uv.x, 1.0) * step(0.0, uv.y) * step(uv.y, 1.0);
|
|
1662
1916
|
diffuseColor.rgb = mix(diffuseColor.rgb, t.rgb, t.a * inside); }`);
|
|
1663
1917
|
};
|
|
1664
|
-
m.customProgramCacheKey = () => "ldrColorTex";
|
|
1918
|
+
m.customProgramCacheKey = () => "ldrColorTex|" + baseKey;
|
|
1665
1919
|
m.userData.ldrMap = map;
|
|
1666
1920
|
return m;
|
|
1667
1921
|
}
|
|
@@ -2092,15 +2346,34 @@ class LdrLodRoot extends THREE.LOD {
|
|
|
2092
2346
|
}
|
|
2093
2347
|
}
|
|
2094
2348
|
}
|
|
2095
|
-
function buildStudMeshes(insts, H, cull, arr, LOD, color,
|
|
2096
|
-
const
|
|
2097
|
-
const bKind = [], bMirror = [];
|
|
2349
|
+
function buildStudMeshes(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
|
|
2350
|
+
const bKind = [], bMat = [];
|
|
2098
2351
|
const bAll = [];
|
|
2099
2352
|
const studBucket = new Uint16Array(cull.nStuds);
|
|
2100
2353
|
const sx = new Float32Array(cull.nStuds), sz = new Float32Array(cull.nStuds);
|
|
2101
2354
|
const kindIds = new Map;
|
|
2102
2355
|
const kindNames = [];
|
|
2356
|
+
const matIds = new Map;
|
|
2357
|
+
const matList = [];
|
|
2358
|
+
const colMat = new Map;
|
|
2103
2359
|
const bucketOfKM = [];
|
|
2360
|
+
const matIdOf = (m) => {
|
|
2361
|
+
let i = matIds.get(m);
|
|
2362
|
+
if (i === undefined) {
|
|
2363
|
+
i = matList.length;
|
|
2364
|
+
matIds.set(m, i);
|
|
2365
|
+
matList.push(m);
|
|
2366
|
+
bucketOfKM.push([]);
|
|
2367
|
+
}
|
|
2368
|
+
return i;
|
|
2369
|
+
};
|
|
2370
|
+
const colEntry = (c) => {
|
|
2371
|
+
let e = colMat.get(c);
|
|
2372
|
+
if (!e)
|
|
2373
|
+
colMat.set(c, e = Int32Array.of(-1, -1));
|
|
2374
|
+
return e;
|
|
2375
|
+
};
|
|
2376
|
+
const matIdFor = (c, e, k) => e[k] >= 0 ? e[k] : e[k] = matIdOf(matOf(c, k === 1));
|
|
2104
2377
|
const partStud = new Map;
|
|
2105
2378
|
for (let idx = 0, j = 0;idx < insts.length; idx++) {
|
|
2106
2379
|
const it = insts[idx];
|
|
@@ -2108,6 +2381,7 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matF, matB, steps, col
|
|
|
2108
2381
|
if (!pp || !pp.nStuds)
|
|
2109
2382
|
continue;
|
|
2110
2383
|
const a = it.m;
|
|
2384
|
+
const instE = colEntry(it.color);
|
|
2111
2385
|
let ps = partStud.get(pp);
|
|
2112
2386
|
if (!ps) {
|
|
2113
2387
|
const kid = new Int32Array(pp.nStuds), neg = new Uint8Array(pp.nStuds);
|
|
@@ -2130,14 +2404,15 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matF, matB, steps, col
|
|
|
2130
2404
|
const o = si * 12, b0 = B[o], b1 = B[o + 1], b2 = B[o + 2];
|
|
2131
2405
|
const neg = (instNeg ^ ps.neg[si]) === 1;
|
|
2132
2406
|
const km = ps.kid[si] * 2 + (neg ? 1 : 0);
|
|
2133
|
-
|
|
2407
|
+
const sc = pp.color[si];
|
|
2408
|
+
const mid = sc === "16" ? matIdFor(it.color, instE, neg ? 1 : 0) : matIdFor(sc, colEntry(sc), neg ? 1 : 0);
|
|
2409
|
+
const row = bucketOfKM[mid];
|
|
2410
|
+
let b = row[km];
|
|
2134
2411
|
if (b === undefined) {
|
|
2135
|
-
const kn = kindNames[ps.kid[si]];
|
|
2136
2412
|
b = bKind.length;
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
bMirror.push(neg);
|
|
2413
|
+
row[km] = b;
|
|
2414
|
+
bKind.push(kindNames[ps.kid[si]]);
|
|
2415
|
+
bMat.push(matList[mid]);
|
|
2141
2416
|
bAll.push(0);
|
|
2142
2417
|
}
|
|
2143
2418
|
studBucket[j] = b;
|
|
@@ -2175,7 +2450,7 @@ function buildStudMeshes(insts, H, cull, arr, LOD, color, matF, matB, steps, col
|
|
|
2175
2450
|
sMesh.push(null);
|
|
2176
2451
|
continue;
|
|
2177
2452
|
}
|
|
2178
|
-
const im = newIM(g,
|
|
2453
|
+
const im = newIM(g, bMat[b], c.length);
|
|
2179
2454
|
im.instanceColor = new THREE.InstancedBufferAttribute(new Float32Array(c.length * 3), 3);
|
|
2180
2455
|
const n = c.length;
|
|
2181
2456
|
sMesh.push({ im, kind, vis: v, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
|
|
@@ -2259,12 +2534,57 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2259
2534
|
const matF = makeMaterial(P.side === "front" ? THREE.FrontSide : THREE.DoubleSide), matB = makeMaterial(P.side === "front" ? THREE.BackSide : THREE.DoubleSide);
|
|
2260
2535
|
const matD = makeMaterial(THREE.DoubleSide);
|
|
2261
2536
|
let nUncert = 0;
|
|
2537
|
+
matF.userData.ldrSideRole = "F";
|
|
2538
|
+
matB.userData.ldrSideRole = "B";
|
|
2539
|
+
matD.userData.ldrSideRole = "D";
|
|
2540
|
+
const colorTable = H.colorTable ?? {};
|
|
2541
|
+
const defaultLC = { code: -1, name: "", hex: "#A0A5A9", edge: "#333333", alpha: 255, luminance: 0, finish: { type: "default" } };
|
|
2542
|
+
const lookupLC = (code) => {
|
|
2543
|
+
const e = colorTable[code] ?? colorTable[String(+code)];
|
|
2544
|
+
if (e && typeof e === "object" && e.hex) {
|
|
2545
|
+
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" } };
|
|
2546
|
+
}
|
|
2547
|
+
const n = +code;
|
|
2548
|
+
if (n > 16777215 && n >>> 24 === 2) {
|
|
2549
|
+
const hex = "#" + (n & 16777215).toString(16).padStart(6, "0").toUpperCase();
|
|
2550
|
+
return { code: n, name: "Direct", hex, edge: hex, alpha: 255, luminance: 0, finish: { type: "default" } };
|
|
2551
|
+
}
|
|
2552
|
+
return defaultLC;
|
|
2553
|
+
};
|
|
2554
|
+
const matCache = new Map;
|
|
2555
|
+
const materialFor = (code, mirror, uncert) => {
|
|
2556
|
+
const lc = lookupLC(code);
|
|
2557
|
+
const fk = colourMaterialKey(lc);
|
|
2558
|
+
const role = uncert ? "D" : mirror ? "B" : "F";
|
|
2559
|
+
const key = fk + "|" + role;
|
|
2560
|
+
let m = matCache.get(key);
|
|
2561
|
+
if (!m) {
|
|
2562
|
+
const side = uncert ? THREE.DoubleSide : P.side === "front" ? mirror ? THREE.BackSide : THREE.FrontSide : THREE.DoubleSide;
|
|
2563
|
+
if (fk === "default:op" && lc.luminance === 0) {
|
|
2564
|
+
m = role === "D" ? matD : role === "B" ? matB : matF;
|
|
2565
|
+
} else {
|
|
2566
|
+
m = makeFinishMaterial(side, colourSurface(lc));
|
|
2567
|
+
m.userData.ldrSideRole = role;
|
|
2568
|
+
}
|
|
2569
|
+
matCache.set(key, m);
|
|
2570
|
+
}
|
|
2571
|
+
return m;
|
|
2572
|
+
};
|
|
2262
2573
|
const byPart = new Map;
|
|
2263
2574
|
insts.forEach((it, i) => {
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2575
|
+
const p = H.parts[it.part];
|
|
2576
|
+
if (!p)
|
|
2577
|
+
return;
|
|
2578
|
+
const mirror = det12(it.m) < 0;
|
|
2579
|
+
const mat = materialFor(String(it.color), mirror, !!p.uncert);
|
|
2580
|
+
const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
|
|
2581
|
+
let b = byPart.get(k);
|
|
2582
|
+
if (!b) {
|
|
2583
|
+
if (p.uncert)
|
|
2584
|
+
nUncert++;
|
|
2585
|
+
byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
|
|
2267
2586
|
}
|
|
2587
|
+
b.ids.push(i);
|
|
2268
2588
|
});
|
|
2269
2589
|
const steps = P.steps;
|
|
2270
2590
|
let cull = P.cull ?? cullCore(insts, H, steps);
|
|
@@ -2358,8 +2678,9 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2358
2678
|
const texMats = new Map;
|
|
2359
2679
|
const pending = [];
|
|
2360
2680
|
const texMat = (t, base, wrapU) => {
|
|
2361
|
-
const role = base ===
|
|
2362
|
-
const
|
|
2681
|
+
const role = base.userData?.ldrSideRole ?? (base.side === THREE.BackSide ? "B" : base.side === THREE.DoubleSide ? "D" : "F");
|
|
2682
|
+
const fin = base.userData?.ldrFinish ?? "default";
|
|
2683
|
+
const k = t + ":" + role + ":" + fin + ":" + (wrapU ? 1 : 0);
|
|
2363
2684
|
let m = texMats.get(k);
|
|
2364
2685
|
if (!m) {
|
|
2365
2686
|
let tx = texCache.get(t);
|
|
@@ -2369,7 +2690,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2369
2690
|
pending.push(r.ready);
|
|
2370
2691
|
texCache.set(t, tx);
|
|
2371
2692
|
}
|
|
2372
|
-
texMats.set(k, m = makeTexturedMaterial(base.side, tx, wrapU));
|
|
2693
|
+
texMats.set(k, m = makeTexturedMaterial(base.side, tx, wrapU, base));
|
|
2373
2694
|
}
|
|
2374
2695
|
return m;
|
|
2375
2696
|
};
|
|
@@ -2409,10 +2730,11 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2409
2730
|
return arr(b.idx).length;
|
|
2410
2731
|
};
|
|
2411
2732
|
const coldByMat = new Map;
|
|
2412
|
-
for (const [
|
|
2413
|
-
const part =
|
|
2733
|
+
for (const [, bucket] of byPart) {
|
|
2734
|
+
const part = bucket.part;
|
|
2414
2735
|
const p = H.parts[part];
|
|
2415
|
-
const
|
|
2736
|
+
const idsAll = bucket.ids;
|
|
2737
|
+
const mat = bucket.mat;
|
|
2416
2738
|
const textured = wantTex && !!p.tex;
|
|
2417
2739
|
if (textured || idsAll.length > MERGE_MAX) {
|
|
2418
2740
|
const bodyB = textured ? p.tbody : p.body;
|
|
@@ -2757,7 +3079,7 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2757
3079
|
}
|
|
2758
3080
|
}
|
|
2759
3081
|
}
|
|
2760
|
-
const sMesh = buildStudMeshes(insts, H, cull, arr, LOD, color,
|
|
3082
|
+
const sMesh = buildStudMeshes(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
|
|
2761
3083
|
const sKind = sMesh.map((x) => x?.kind ?? "");
|
|
2762
3084
|
const sVis = sMesh.map((x) => x?.vis ?? 0);
|
|
2763
3085
|
const STUD_ERR = 12;
|
|
@@ -2930,12 +3252,15 @@ function buildLdrScene(insts, pack, P, color, mark) {
|
|
|
2930
3252
|
box.max.z = m[2];
|
|
2931
3253
|
}
|
|
2932
3254
|
const setSide = (front) => {
|
|
2933
|
-
matF
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
3255
|
+
for (const m of new Set([matF, matB, matD, ...matCache.values(), ...texMats.values()])) {
|
|
3256
|
+
const role = m.userData?.ldrSideRole;
|
|
3257
|
+
if (role === "D") {
|
|
3258
|
+
m.side = THREE.DoubleSide;
|
|
3259
|
+
} else if (role === "B") {
|
|
3260
|
+
m.side = front ? THREE.BackSide : THREE.DoubleSide;
|
|
3261
|
+
} else {
|
|
3262
|
+
m.side = front ? THREE.FrontSide : THREE.DoubleSide;
|
|
3263
|
+
}
|
|
2939
3264
|
m.needsUpdate = true;
|
|
2940
3265
|
}
|
|
2941
3266
|
};
|
|
@@ -2984,7 +3309,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
2984
3309
|
await new Promise((r) => setTimeout(r, 0));
|
|
2985
3310
|
}
|
|
2986
3311
|
}
|
|
2987
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3312
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/scene.ts
|
|
2988
3313
|
import * as THREE2 from "three";
|
|
2989
3314
|
function colorFn(src, pack, fallback) {
|
|
2990
3315
|
const table = new Map;
|
|
@@ -3015,9 +3340,27 @@ var direct = (c) => {
|
|
|
3015
3340
|
};
|
|
3016
3341
|
var plasticCache = new WeakMap;
|
|
3017
3342
|
function toPlastic(old) {
|
|
3343
|
+
const fin = old.userData?.ldrFinish;
|
|
3344
|
+
if (fin && fin !== "default")
|
|
3345
|
+
return old;
|
|
3346
|
+
if (old.isMeshPhysicalMaterial)
|
|
3347
|
+
return old;
|
|
3018
3348
|
let m = plasticCache.get(old);
|
|
3019
3349
|
if (!m) {
|
|
3020
|
-
const p = new THREE2.MeshPhysicalMaterial({
|
|
3350
|
+
const p = new THREE2.MeshPhysicalMaterial({
|
|
3351
|
+
vertexColors: true,
|
|
3352
|
+
roughness: 0.3,
|
|
3353
|
+
clearcoat: 0.3,
|
|
3354
|
+
clearcoatRoughness: 0.2,
|
|
3355
|
+
specularIntensity: 0.6,
|
|
3356
|
+
side: old.side,
|
|
3357
|
+
transparent: old.transparent,
|
|
3358
|
+
opacity: old.opacity,
|
|
3359
|
+
depthWrite: old.depthWrite,
|
|
3360
|
+
metalness: old.metalness,
|
|
3361
|
+
emissive: old.emissive?.clone?.() ?? new THREE2.Color(0),
|
|
3362
|
+
emissiveIntensity: old.emissiveIntensity ?? 0
|
|
3363
|
+
});
|
|
3021
3364
|
p.onBeforeCompile = old.onBeforeCompile;
|
|
3022
3365
|
p.customProgramCacheKey = () => "Phys" + old.customProgramCacheKey() + old.side;
|
|
3023
3366
|
p.userData = old.userData;
|
|
@@ -3073,10 +3416,13 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3073
3416
|
pairs.clear();
|
|
3074
3417
|
if (o.material === "plastic")
|
|
3075
3418
|
cur.root.traverse((x) => {
|
|
3076
|
-
if (x.isMesh
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3419
|
+
if (!x.isMesh || !x.material?.isMeshStandardMaterial)
|
|
3420
|
+
return;
|
|
3421
|
+
const old = x.material;
|
|
3422
|
+
const next = toPlastic(old);
|
|
3423
|
+
if (next !== old) {
|
|
3424
|
+
x.material = next;
|
|
3425
|
+
pairs.set(next, old);
|
|
3080
3426
|
}
|
|
3081
3427
|
});
|
|
3082
3428
|
if (!edges)
|
|
@@ -3140,10 +3486,10 @@ function createLdrObject(instances, pack, options = {}) {
|
|
|
3140
3486
|
dispose: disposeCur
|
|
3141
3487
|
});
|
|
3142
3488
|
}
|
|
3143
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3489
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
|
|
3144
3490
|
import { decompress as decompress2 } from "fzstd";
|
|
3145
3491
|
|
|
3146
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3492
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/embedded.ts
|
|
3147
3493
|
function splitFiles(text, fallback) {
|
|
3148
3494
|
const files = new Map;
|
|
3149
3495
|
let cur = null, saw = false;
|
|
@@ -3215,7 +3561,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
3215
3561
|
return out;
|
|
3216
3562
|
}
|
|
3217
3563
|
|
|
3218
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3564
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/parts-cdn.ts
|
|
3219
3565
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
3220
3566
|
var indexCache = new Map;
|
|
3221
3567
|
var shardCache = new Map;
|
|
@@ -3375,10 +3721,10 @@ async function prepareModel(source, o = {}) {
|
|
|
3375
3721
|
return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
3376
3722
|
}
|
|
3377
3723
|
|
|
3378
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3379
|
-
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';
|
|
3724
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/load-worker.gen.ts
|
|
3725
|
+
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';
|
|
3380
3726
|
|
|
3381
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3727
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/cdn.ts
|
|
3382
3728
|
var worker;
|
|
3383
3729
|
var seq = 0;
|
|
3384
3730
|
var pending = new Map;
|
|
@@ -3487,7 +3833,7 @@ async function loadModel(source, o = {}) {
|
|
|
3487
3833
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
3488
3834
|
});
|
|
3489
3835
|
}
|
|
3490
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3836
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/library.ts
|
|
3491
3837
|
import { existsSync, readFileSync } from "fs";
|
|
3492
3838
|
import { join } from "path";
|
|
3493
3839
|
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]];
|
|
@@ -3569,15 +3915,7 @@ class Library {
|
|
|
3569
3915
|
return null;
|
|
3570
3916
|
}
|
|
3571
3917
|
colors() {
|
|
3572
|
-
|
|
3573
|
-
const d = parse(readFileSync(join(this.root, "LDConfig.ldr"), "latin1"));
|
|
3574
|
-
for (const c of d.files.get(d.main).cmds)
|
|
3575
|
-
if (c.t === 0 && c.meta === "!COLOUR") {
|
|
3576
|
-
const t = c.text.split(/\s+/);
|
|
3577
|
-
const g = (k) => t[t.indexOf(k) + 1];
|
|
3578
|
-
out.set(+g("CODE"), { name: t[1], hex: g("VALUE"), edge: g("EDGE"), alpha: t.includes("ALPHA") ? +g("ALPHA") : 255 });
|
|
3579
|
-
}
|
|
3580
|
-
return out;
|
|
3918
|
+
return parseLDConfig(readFileSync(join(this.root, "LDConfig.ldr"), "latin1"));
|
|
3581
3919
|
}
|
|
3582
3920
|
mesh(name, opts = {}) {
|
|
3583
3921
|
name = norm(name);
|
|
@@ -3746,11 +4084,11 @@ class Library {
|
|
|
3746
4084
|
return insts;
|
|
3747
4085
|
}
|
|
3748
4086
|
}
|
|
3749
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4087
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/build-pack.ts
|
|
3750
4088
|
import fs3 from "node:fs";
|
|
3751
4089
|
import path3 from "node:path";
|
|
3752
4090
|
|
|
3753
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4091
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/resolver.ts
|
|
3754
4092
|
import fs from "node:fs";
|
|
3755
4093
|
import path from "node:path";
|
|
3756
4094
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -4022,11 +4360,11 @@ function collectDeps(lib, refs) {
|
|
|
4022
4360
|
return out;
|
|
4023
4361
|
}
|
|
4024
4362
|
|
|
4025
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4363
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/compile.ts
|
|
4026
4364
|
import fs2 from "node:fs";
|
|
4027
4365
|
import path2 from "node:path";
|
|
4028
4366
|
|
|
4029
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4367
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/lod.ts
|
|
4030
4368
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
4031
4369
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
4032
4370
|
function reorderMesh(P, N, C, I) {
|
|
@@ -4218,7 +4556,7 @@ function lodChain(P, C, I) {
|
|
|
4218
4556
|
return out;
|
|
4219
4557
|
}
|
|
4220
4558
|
|
|
4221
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4559
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/compile.ts
|
|
4222
4560
|
function loadColors(root) {
|
|
4223
4561
|
const map = new Map;
|
|
4224
4562
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -4801,7 +5139,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
4801
5139
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
4802
5140
|
}
|
|
4803
5141
|
|
|
4804
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5142
|
+
// ../../../../../../../tmp/ldr-build-TjmzYL/src/node/build-pack.ts
|
|
4805
5143
|
function buildPack(o) {
|
|
4806
5144
|
const lib = new Library2(o.ldrawRoot);
|
|
4807
5145
|
const refs = new Map;
|
|
@@ -4853,8 +5191,13 @@ function buildPack(o) {
|
|
|
4853
5191
|
let extra;
|
|
4854
5192
|
if (o.colors !== false) {
|
|
4855
5193
|
const cfg = path3.join(o.ldrawRoot, "LDConfig.ldr");
|
|
4856
|
-
if (fs3.existsSync(cfg))
|
|
4857
|
-
|
|
5194
|
+
if (fs3.existsSync(cfg)) {
|
|
5195
|
+
const table = [...parseLDConfig(fs3.readFileSync(cfg, "latin1"))];
|
|
5196
|
+
extra = {
|
|
5197
|
+
colors: Object.fromEntries(table.map(([k, v]) => [k, v.hex])),
|
|
5198
|
+
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 }]))
|
|
5199
|
+
};
|
|
5200
|
+
}
|
|
4858
5201
|
}
|
|
4859
5202
|
const texture = (n) => {
|
|
4860
5203
|
const k = norm2(n), b = data.get(k) ?? data.get(k.replace(/^textures\//, "")) ?? data.get("textures/" + k);
|
|
@@ -4876,6 +5219,8 @@ export {
|
|
|
4876
5219
|
buildPack,
|
|
4877
5220
|
collectDeps,
|
|
4878
5221
|
colorToken,
|
|
5222
|
+
colourMaterialKey,
|
|
5223
|
+
colourSurface,
|
|
4879
5224
|
computeCulling,
|
|
4880
5225
|
conditionalLineVisible,
|
|
4881
5226
|
conditionalLines,
|
|
@@ -4906,12 +5251,14 @@ export {
|
|
|
4906
5251
|
loosePartName,
|
|
4907
5252
|
looseSource,
|
|
4908
5253
|
looseSteps,
|
|
5254
|
+
makeFinishMaterial,
|
|
4909
5255
|
makeMaterial,
|
|
4910
5256
|
mergePacks,
|
|
4911
5257
|
mul,
|
|
4912
5258
|
norm,
|
|
4913
5259
|
parse,
|
|
4914
5260
|
parseColor,
|
|
5261
|
+
parseColourLine,
|
|
4915
5262
|
parseLDConfig,
|
|
4916
5263
|
parseModel,
|
|
4917
5264
|
parseTexMap,
|