three-slicer 0.1.3 → 0.1.4
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 +67 -8
- package/components/README.md +1 -1
- package/components/dist/SettingsPanel.js +12 -12
- package/data/README.md +39 -2
- package/data/config-schema.json +164 -0
- package/data/filaments.js +2 -0
- package/data/processes.js +1 -1
- package/data/ui-tree.json +21 -2
- package/engine/README.md +56 -4
- package/engine/src/data.js +2 -0
- package/engine/src/settings.js +133 -6
- package/engine/src/slicer.worker.js +142 -5
- package/engine/src/slicer_core.js +0 -0
- package/engine/src/slicer_core.mt.js +0 -0
- package/package.json +15 -2
- package/types/data/filaments.js.d.ts +27 -0
- package/types/data.d.ts +7 -0
- package/types/settings-keys.d.ts +35 -1
- package/types/settings.d.ts +30 -0
- package/types/viewer-gcode.d.ts +29 -0
- package/types/viewer-toolpath.d.ts +9 -1
- package/types/viewer.d.ts +53 -0
- package/viewer/README.md +48 -2
- package/viewer/dist/Viewport.js +2484 -1521
- package/viewer/dist/gcode_parse.js +190 -0
- package/viewer/dist/toolpath_gpu.js +162 -137
- package/viewer/styles.css +50 -2
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
const it = {
|
|
2
|
+
// OrcaSlicer / PrusaSlicer ;TYPE: names
|
|
3
|
+
"outer wall": 1,
|
|
4
|
+
"external perimeter": 1,
|
|
5
|
+
"inner wall": 1,
|
|
6
|
+
perimeter: 1,
|
|
7
|
+
"internal perimeter": 1,
|
|
8
|
+
"overhang wall": 1,
|
|
9
|
+
"overhang perimeter": 1,
|
|
10
|
+
"sparse infill": 2,
|
|
11
|
+
"internal infill": 2,
|
|
12
|
+
"solid infill": 3,
|
|
13
|
+
"internal solid infill": 3,
|
|
14
|
+
"top solid infill": 3,
|
|
15
|
+
"top surface": 3,
|
|
16
|
+
"bottom surface": 3,
|
|
17
|
+
skirt: 4,
|
|
18
|
+
brim: 4,
|
|
19
|
+
"skirt/brim": 4,
|
|
20
|
+
support: 5,
|
|
21
|
+
"support material": 5,
|
|
22
|
+
"support material interface": 5,
|
|
23
|
+
"support interface": 5,
|
|
24
|
+
"support transition": 5,
|
|
25
|
+
raft: 6,
|
|
26
|
+
"gap fill": 7,
|
|
27
|
+
"gap infill": 7,
|
|
28
|
+
"thin wall": 8,
|
|
29
|
+
bridge: 9,
|
|
30
|
+
"bridge infill": 9,
|
|
31
|
+
"internal bridge": 9,
|
|
32
|
+
"internal bridge infill": 9,
|
|
33
|
+
ironing: 10,
|
|
34
|
+
"prime tower": 11,
|
|
35
|
+
"wipe tower": 11,
|
|
36
|
+
custom: 1,
|
|
37
|
+
// Cura ;TYPE: names
|
|
38
|
+
"wall-outer": 1,
|
|
39
|
+
"wall-inner": 1,
|
|
40
|
+
fill: 2,
|
|
41
|
+
skin: 3,
|
|
42
|
+
"support-interface": 5,
|
|
43
|
+
"prime-tower": 11
|
|
44
|
+
}, nt = [
|
|
45
|
+
["skirt/brim", 4],
|
|
46
|
+
["skirt", 4],
|
|
47
|
+
["walls", 1],
|
|
48
|
+
["thin-wall", 8],
|
|
49
|
+
["gap-fill", 7],
|
|
50
|
+
["bridge", 9],
|
|
51
|
+
["ironing", 10],
|
|
52
|
+
["support", 5],
|
|
53
|
+
["prime tower", 11],
|
|
54
|
+
["wipe_tower_real", 11]
|
|
55
|
+
], st = (w, c) => w === c || c.length < w.length && " (:/".includes(w[c.length]) && w.startsWith(c), at = {
|
|
56
|
+
1: 1,
|
|
57
|
+
2: 1,
|
|
58
|
+
3: 1,
|
|
59
|
+
4: 2,
|
|
60
|
+
5: 3,
|
|
61
|
+
6: 3,
|
|
62
|
+
7: 3,
|
|
63
|
+
8: 10,
|
|
64
|
+
9: 9,
|
|
65
|
+
10: 9,
|
|
66
|
+
11: 7,
|
|
67
|
+
12: 4,
|
|
68
|
+
13: 4,
|
|
69
|
+
14: 5,
|
|
70
|
+
15: 5,
|
|
71
|
+
16: 5,
|
|
72
|
+
17: 11
|
|
73
|
+
};
|
|
74
|
+
function rt(w, c = {}) {
|
|
75
|
+
const V = Math.PI / 4 * (c.filamentDiameter > 0 ? c.filamentDiameter : 1.75) ** 2, tt = c.defaultLayerHeight > 0 ? c.defaultLayerHeight : 0.2;
|
|
76
|
+
let f = 0, u = 0, m = 0, L = 0, x = !0, v = !0, E = 0, P = 1, S = 0, p = null;
|
|
77
|
+
const g = [];
|
|
78
|
+
let z = !1, I = !0, R = NaN, q = 0, H = 0, O = 0;
|
|
79
|
+
const j = /* @__PURE__ */ new Set([0]), W = (s) => {
|
|
80
|
+
p = { z: s, p: [], w: [] }, g.push(p), I = !1, R = NaN, P = 1, S = 0;
|
|
81
|
+
}, et = () => g.length > 1 ? g[g.length - 2].z : 0, C = (s, o, d, b, N, e, t) => {
|
|
82
|
+
const a = Math.hypot(b - s, N - o, e - d);
|
|
83
|
+
if (!(a < 1e-6))
|
|
84
|
+
if (t > 1e-6) {
|
|
85
|
+
O += t, I ? W(Number.isNaN(R) ? e : R) : !z && e > p.z + 1e-3 && W(e);
|
|
86
|
+
const r = P + E * 16;
|
|
87
|
+
p.p.push(s, o, d, r, b, N, e, r);
|
|
88
|
+
const i = Math.max(0.02, p.z - et() || tt), F = S > 0 ? S : t * V / (a * i) + i * (1 - Math.PI / 4);
|
|
89
|
+
p.w.push(Math.min(3, Math.max(0.05, F))), q++;
|
|
90
|
+
} else p && (p.p.push(s, o, d, E * 16, b, N, e, E * 16), p.w.push(0), H++);
|
|
91
|
+
};
|
|
92
|
+
for (const s of w.split(`
|
|
93
|
+
`)) {
|
|
94
|
+
const o = s.indexOf(";"), d = (o < 0 ? s : s.slice(0, o)).trim(), b = o < 0 ? "" : s.slice(o + 1).trim();
|
|
95
|
+
if (b && !d) {
|
|
96
|
+
const t = b.toLowerCase();
|
|
97
|
+
if (t.startsWith("type:")) {
|
|
98
|
+
P = it[t.slice(5).trim()] ?? 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (t.startsWith("_extrusion_role:")) {
|
|
102
|
+
P = at[parseInt(t.slice(16), 10)] ?? 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (t.startsWith("width:")) {
|
|
106
|
+
const i = parseFloat(t.slice(6));
|
|
107
|
+
S = i > 0 ? i : 0;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (t.startsWith("layer_change") || t.startsWith("layer:")) {
|
|
111
|
+
z = !0, I = !0;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (t.startsWith("z:")) {
|
|
115
|
+
const i = parseFloat(t.slice(2));
|
|
116
|
+
I && i > 0 && (z = !0, W(i));
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const a = /^layer \d+ z([-\d.]+)/.exec(t);
|
|
120
|
+
if (a) {
|
|
121
|
+
z = !0, W(parseFloat(a[1]));
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const r = nt.find(([i]) => st(t, i));
|
|
125
|
+
r && (P = r[1]);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!d) continue;
|
|
129
|
+
const N = d.split(/\s+/), e = N[0].toUpperCase();
|
|
130
|
+
if (e === "G90") {
|
|
131
|
+
x = !0;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (e === "G91") {
|
|
135
|
+
x = !1;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (e === "M82") {
|
|
139
|
+
v = !0;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (e === "M83") {
|
|
143
|
+
v = !1;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (/^T\d+$/.test(e)) {
|
|
147
|
+
E = parseInt(e.slice(1), 10), j.add(E);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (e === "G92" || e === "G0" || e === "G1" || e === "G2" || e === "G3") {
|
|
151
|
+
let t = NaN, a = NaN, r = NaN, i = NaN, F = 0, D = 0;
|
|
152
|
+
for (let h = 1; h < N.length; h++) {
|
|
153
|
+
const n = N[h][0], l = parseFloat(N[h].slice(1));
|
|
154
|
+
Number.isNaN(l) || (n === "X" || n === "x" ? t = l : n === "Y" || n === "y" ? a = l : n === "Z" || n === "z" ? r = l : n === "E" || n === "e" ? i = l : n === "I" || n === "i" ? F = l : (n === "J" || n === "j") && (D = l));
|
|
155
|
+
}
|
|
156
|
+
if (e === "G92") {
|
|
157
|
+
Number.isNaN(t) || (f = t), Number.isNaN(a) || (u = a), Number.isNaN(r) || (m = r), Number.isNaN(i) || (L = i);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const k = Number.isNaN(t) ? f : x ? t : f + t, A = Number.isNaN(a) ? u : x ? a : u + a, Z = Number.isNaN(r) ? m : x ? r : m + r, K = Number.isNaN(i) ? 0 : v ? i - L : i;
|
|
161
|
+
if (e === "G2" || e === "G3") {
|
|
162
|
+
const h = f + F, n = u + D, l = Math.hypot(f - h, u - n), _ = Math.atan2(u - n, f - h);
|
|
163
|
+
let M = Math.atan2(A - n, k - h);
|
|
164
|
+
const T = e === "G3";
|
|
165
|
+
T && M <= _ + 1e-6 && (M += 2 * Math.PI), !T && M >= _ - 1e-6 && (M -= 2 * Math.PI);
|
|
166
|
+
const y = Math.max(1, Math.min(360, Math.ceil(Math.abs(M - _) * l / 0.3)));
|
|
167
|
+
let X = f, Y = u, J = m;
|
|
168
|
+
for (let G = 1; G <= y; G++) {
|
|
169
|
+
const U = _ + (M - _) * G / y, $ = G === y ? k : h + l * Math.cos(U), B = G === y ? A : n + l * Math.sin(U), Q = m + (Z - m) * G / y;
|
|
170
|
+
C(X, Y, J, $, B, Q, K / y), X = $, Y = B, J = Q;
|
|
171
|
+
}
|
|
172
|
+
} else
|
|
173
|
+
C(f, u, m, k, A, Z, K);
|
|
174
|
+
f = k, u = A, m = Z, Number.isNaN(i) || (L = v ? i : L + i);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
layers: g.map((s) => ({ z: s.z, paths: Float32Array.from(s.p), widths: Float32Array.from(s.w) })),
|
|
179
|
+
stats: {
|
|
180
|
+
layers: g.length,
|
|
181
|
+
path_segments: q,
|
|
182
|
+
travel_segments: H,
|
|
183
|
+
filament_mm: O,
|
|
184
|
+
tools: [...j].sort((s, o) => s - o)
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export {
|
|
189
|
+
rt as parseGcode
|
|
190
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const W = {
|
|
2
2
|
0: [0.42, 0.45, 0.5],
|
|
3
3
|
1: [0.85, 0.51, 0.17],
|
|
4
4
|
2: [0.21, 0.45, 0.76],
|
|
@@ -11,12 +11,27 @@ const U = {
|
|
|
11
11
|
9: [0.9, 0.25, 0.25],
|
|
12
12
|
10: [0.6, 0.82, 0.55],
|
|
13
13
|
11: [0.3, 0.72, 0.7]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
}, _e = [
|
|
15
|
+
[0.85, 0.28, 0.25],
|
|
16
|
+
[0.2, 0.52, 0.85],
|
|
17
|
+
[0.25, 0.72, 0.38],
|
|
18
|
+
[0.96, 0.74, 0.16],
|
|
19
|
+
[0.62, 0.36, 0.82],
|
|
20
|
+
[0.18, 0.74, 0.74],
|
|
21
|
+
[0.95, 0.5, 0.15],
|
|
22
|
+
[0.55, 0.56, 0.6]
|
|
23
|
+
];
|
|
24
|
+
function de(t) {
|
|
25
|
+
const i = String(t ?? "").trim().replace(/^#/, "");
|
|
26
|
+
if (i.length !== 3 && i.length !== 6) return null;
|
|
27
|
+
const o = i.length === 3 ? i.split("").map((a) => a + a).join("") : i, n = [0, 2, 4].map((a) => parseInt(o.slice(a, a + 2), 16) / 255);
|
|
28
|
+
return n.some(Number.isNaN) ? null : n;
|
|
29
|
+
}
|
|
30
|
+
function re(t) {
|
|
31
|
+
const i = Math.round(t[0] * 255), o = Math.round(t[1] * 255), n = Math.round(t[2] * 255);
|
|
32
|
+
return i << 16 | o << 8 | n;
|
|
18
33
|
}
|
|
19
|
-
const
|
|
34
|
+
const fe = { 1: "Wall", 2: "Sparse", 3: "Solid", 4: "Skirt", 5: "Support", 6: "Raft", 7: "Gap fill", 8: "Thin wall", 9: "Bridge", 10: "Ironing", 11: "Prime" }, ue = [
|
|
20
35
|
[11, 44, 122],
|
|
21
36
|
[19, 89, 133],
|
|
22
37
|
[28, 136, 145],
|
|
@@ -29,92 +44,93 @@ const le = { 1: "Wall", 2: "Sparse", 3: "Solid", 4: "Skirt", 5: "Support", 6: "R
|
|
|
29
44
|
[194, 82, 60],
|
|
30
45
|
[148, 38, 22]
|
|
31
46
|
].map((t) => [t[0] / 255, t[1] / 255, t[2] / 255]);
|
|
32
|
-
function
|
|
33
|
-
const
|
|
34
|
-
if (!(
|
|
35
|
-
const
|
|
36
|
-
return [
|
|
47
|
+
function pe(t, i, o, n) {
|
|
48
|
+
const a = n.length;
|
|
49
|
+
if (!(o > i)) return n[0];
|
|
50
|
+
const l = (o - i) / (a - 1), h = (t - i) / l, _ = Math.max(0, Math.min(a - 1, Math.floor(h))), x = Math.max(0, Math.min(a - 1, _ + 1)), g = h - _, s = n[_], u = n[x];
|
|
51
|
+
return [s[0] + (u[0] - s[0]) * g, s[1] + (u[1] - s[1]) * g, s[2] + (u[2] - s[2]) * g];
|
|
37
52
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
const ge = 15, ve = 4;
|
|
54
|
+
function be(t, i) {
|
|
55
|
+
const o = t.length, n = i > 0 ? i : 0.42, a = new Array(o);
|
|
56
|
+
for (let e = 0; e < o; e++) {
|
|
57
|
+
const r = t[e].z;
|
|
58
|
+
a[e] = Math.max(0.02, e === 0 ? r : r - t[e - 1].z);
|
|
43
59
|
}
|
|
44
|
-
const
|
|
45
|
-
let
|
|
46
|
-
const
|
|
47
|
-
for (let e = 0; e <
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
for (let
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
53
|
-
|
|
60
|
+
const l = [], h = [], _ = [], x = [], g = [], s = [], u = [], v = [], z = [], S = [], I = [], P = new Float64Array(16), G = [], k = [];
|
|
61
|
+
let $ = -1, E = 0, ee = 0, te = 0, c = -1, f = 0;
|
|
62
|
+
const p = 1e-4, w = (e, r, m, y, d, F, A) => (l.push(e), h.push(r), _.push(m), s.push(y), u.push(d), x.push(F), g.push(A), v.push(f), z.push(!1), l.length - 1);
|
|
63
|
+
for (let e = 0; e < o; e++) {
|
|
64
|
+
const r = t[e].paths, m = t[e].widths, y = a[e];
|
|
65
|
+
if (f = e, !!r)
|
|
66
|
+
for (let d = 0; d < r.length; d += 8) {
|
|
67
|
+
const F = r[d + 3], A = F & ge, V = F >>> ve, B = r[d], O = r[d + 1], J = r[d + 2], L = r[d + 4], C = r[d + 5], D = r[d + 6];
|
|
68
|
+
if (A === 0) {
|
|
69
|
+
G.push(B, O, J, L, C, D), k.push(e);
|
|
54
70
|
continue;
|
|
55
71
|
}
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
let
|
|
59
|
-
|
|
72
|
+
const oe = m && m[d / 8] > 0 ? m[d / 8] : n;
|
|
73
|
+
P[A] += Math.hypot(L - B, C - O);
|
|
74
|
+
let Q;
|
|
75
|
+
$ >= 0 && c === F && Math.abs(E - B) < p && Math.abs(ee - O) < p && Math.abs(te - J) < p ? (Q = $, w(L, C, D, A, V, y, oe)) : (Q = w(B, O, J, A, V, y, oe), w(L, C, D, A, V, y, oe)), z[Q] = !0, $ = Q + 1, E = L, ee = C, te = D, c = F, S.push(Q), I.push(e);
|
|
60
76
|
}
|
|
61
77
|
}
|
|
62
|
-
const
|
|
63
|
-
let
|
|
64
|
-
for (let e = 0; e <
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
let
|
|
69
|
-
if (
|
|
70
|
-
const
|
|
71
|
-
|
|
78
|
+
const b = l.length, M = S.length, R = new Float32Array(b * 4), U = new Float32Array(b * 4);
|
|
79
|
+
let ie = 0, ae = !1, Y = 1 / 0, j = 1 / 0, X = 1 / 0, K = -1 / 0, Z = -1 / 0, q = -1 / 0;
|
|
80
|
+
for (let e = 0; e < b; e++) {
|
|
81
|
+
const r = x[e], m = l[e], y = h[e], d = _[e] - 0.5 * r;
|
|
82
|
+
R[e * 4] = m, R[e * 4 + 1] = y, R[e * 4 + 2] = d;
|
|
83
|
+
const F = e > 0 && z[e - 1], A = z[e];
|
|
84
|
+
let V = 0;
|
|
85
|
+
if (F || A) {
|
|
86
|
+
const B = F ? l[e] - l[e - 1] : 0, O = F ? h[e] - h[e - 1] : 0, J = F ? _[e] - _[e - 1] : 0, L = A ? l[e + 1] - l[e] : 0, C = A ? h[e + 1] - h[e] : 0, D = A ? _[e + 1] - _[e] : 0;
|
|
87
|
+
V = Math.atan2(B * C - O * L, B * L + O * C + J * D);
|
|
72
88
|
}
|
|
73
|
-
|
|
89
|
+
U[e * 4] = r, U[e * 4 + 1] = g[e], U[e * 4 + 2] = V, U[e * 4 + 3] = re(W[s[e]] || W[1]), (!Number.isFinite(m) || !Number.isFinite(y) || !Number.isFinite(d) || !Number.isFinite(V)) && (ae = !0), ie = Math.max(ie, Math.abs(m), Math.abs(y), Math.abs(d)), m < Y && (Y = m), m > K && (K = m), y < j && (j = y), y > Z && (Z = y), d < X && (X = d), d > q && (q = d);
|
|
74
90
|
}
|
|
75
|
-
const
|
|
76
|
-
for (let e = 0; e <
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
for (let e = 0; e <
|
|
80
|
-
|
|
81
|
-
const
|
|
91
|
+
const ne = new Uint32Array(M * 4);
|
|
92
|
+
for (let e = 0; e < M; e++)
|
|
93
|
+
ne[e * 4] = S[e], ne[e * 4 + 1] = I[e];
|
|
94
|
+
const T = { vType: new Uint8Array(b), vTool: new Uint8Array(b), vWidth: new Float32Array(b), vHeight: new Float32Array(b), vLayer: new Int32Array(b) };
|
|
95
|
+
for (let e = 0; e < b; e++)
|
|
96
|
+
T.vType[e] = s[e], T.vTool[e] = u[e], T.vWidth[e] = g[e], T.vHeight[e] = x[e], T.vLayer[e] = v[e];
|
|
97
|
+
const le = new Int32Array(o + 1);
|
|
82
98
|
{
|
|
83
99
|
let e = 0;
|
|
84
|
-
for (let
|
|
85
|
-
for (; e <
|
|
86
|
-
|
|
100
|
+
for (let r = 0; r < o; r++) {
|
|
101
|
+
for (; e < M && I[e] === r; ) e++;
|
|
102
|
+
le[r + 1] = e;
|
|
87
103
|
}
|
|
88
104
|
}
|
|
89
|
-
const
|
|
90
|
-
for (let e = 0; e < N.length; e++) N[e] =
|
|
105
|
+
const H = k.length, N = new Float32Array(H * 6);
|
|
106
|
+
for (let e = 0; e < N.length; e++) N[e] = G[e];
|
|
91
107
|
for (let e = 0; e < N.length; e += 3) {
|
|
92
|
-
const
|
|
93
|
-
|
|
108
|
+
const r = N[e], m = N[e + 1], y = N[e + 2];
|
|
109
|
+
r < Y && (Y = r), r > K && (K = r), m < j && (j = m), m > Z && (Z = m), y < X && (X = y), y > q && (q = y);
|
|
94
110
|
}
|
|
95
|
-
const
|
|
111
|
+
const se = new Int32Array(o + 1);
|
|
96
112
|
{
|
|
97
113
|
let e = 0;
|
|
98
|
-
for (let
|
|
99
|
-
for (; e <
|
|
100
|
-
|
|
114
|
+
for (let r = 0; r < o; r++) {
|
|
115
|
+
for (; e < H && k[e] === r; ) e++;
|
|
116
|
+
se[r + 1] = e;
|
|
101
117
|
}
|
|
102
118
|
}
|
|
103
|
-
const
|
|
104
|
-
return { position:
|
|
119
|
+
const he = b + H > 0 ? { min: [Y, j, X], max: [K, Z, q] } : null;
|
|
120
|
+
return { position: R, hwa: U, segIndex: ne, nV: b, nSeg: M, layerSegPrefix: le, travelPos: N, travelPrefix: se, nTrav: H, layerCount: o, maxAbs: ie, hasNaN: ae, meta: T, typeLengths: P, bbox: he };
|
|
105
121
|
}
|
|
106
|
-
function
|
|
122
|
+
function ze(t) {
|
|
107
123
|
let i = 0;
|
|
108
124
|
for (let n = 1; n < 16; n++) i += t[n] || 0;
|
|
109
|
-
const
|
|
110
|
-
if (i <= 0) return
|
|
125
|
+
const o = [];
|
|
126
|
+
if (i <= 0) return o;
|
|
111
127
|
for (let n = 1; n < 16; n++) {
|
|
112
|
-
const
|
|
113
|
-
|
|
128
|
+
const a = t[n] || 0;
|
|
129
|
+
a > 0 && o.push({ type: n, label: fe[n] || "t" + n, pct: 100 * a / i, color: W[n] || W[1] });
|
|
114
130
|
}
|
|
115
|
-
return
|
|
131
|
+
return o.sort((n, a) => a.pct - n.pct);
|
|
116
132
|
}
|
|
117
|
-
const
|
|
133
|
+
const me = `
|
|
118
134
|
precision highp float;
|
|
119
135
|
precision highp int;
|
|
120
136
|
precision highp sampler2D;
|
|
@@ -234,14 +250,14 @@ void main() {
|
|
|
234
250
|
color = color_base * lighting(eye_position, eye_normal);
|
|
235
251
|
gl_Position = projection_matrix * vec4(eye_position, 1.0);
|
|
236
252
|
}
|
|
237
|
-
`,
|
|
253
|
+
`, ye = `
|
|
238
254
|
precision highp float;
|
|
239
255
|
in vec3 color;
|
|
240
256
|
out vec4 fragment_color;
|
|
241
257
|
void main() {
|
|
242
258
|
fragment_color = vec4(color, 1.0);
|
|
243
259
|
}
|
|
244
|
-
`,
|
|
260
|
+
`, xe = [
|
|
245
261
|
0,
|
|
246
262
|
1,
|
|
247
263
|
2,
|
|
@@ -271,16 +287,16 @@ void main() {
|
|
|
271
287
|
6
|
|
272
288
|
// back spike
|
|
273
289
|
];
|
|
274
|
-
function
|
|
275
|
-
const
|
|
276
|
-
const p = Math.min(2048, Math.max(1,
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
return
|
|
280
|
-
}, n =
|
|
281
|
-
|
|
290
|
+
function Ae(t, i) {
|
|
291
|
+
const o = (c, f) => {
|
|
292
|
+
const p = Math.min(2048, Math.max(1, f)), w = Math.max(1, Math.ceil(f / p)), b = new Float32Array(p * w * 4);
|
|
293
|
+
b.set(c.subarray(0, Math.min(c.length, p * w * 4)));
|
|
294
|
+
const M = new t.DataTexture(b, p, w, t.RGBAFormat, t.FloatType);
|
|
295
|
+
return M.minFilter = M.magFilter = t.NearestFilter, M.generateMipmaps = !1, M.needsUpdate = !0, M;
|
|
296
|
+
}, n = o(i.position, i.nV), a = o(i.hwa, i.nV), l = new t.InstancedBufferGeometry();
|
|
297
|
+
l.setIndex(xe), l.setAttribute("position", new t.BufferAttribute(new Float32Array(8 * 3), 3)), l.setAttribute("vertex_id_float", new t.BufferAttribute(new Float32Array([0, 1, 2, 3, 4, 5, 6, 7]), 1));
|
|
282
298
|
const h = new t.InstancedInterleavedBuffer(i.segIndex, 4);
|
|
283
|
-
|
|
299
|
+
l.setAttribute("seg_id_a_u", new t.InterleavedBufferAttribute(h, 1, 0)), l.setAttribute("seg_layer_u", new t.InterleavedBufferAttribute(h, 1, 1)), l.instanceCount = 0;
|
|
284
300
|
const _ = new t.RawShaderMaterial({
|
|
285
301
|
glslVersion: t.GLSL3,
|
|
286
302
|
uniforms: {
|
|
@@ -288,98 +304,107 @@ function ge(t, i) {
|
|
|
288
304
|
projection_matrix: { value: new t.Matrix4() },
|
|
289
305
|
camera_position: { value: new t.Vector3() },
|
|
290
306
|
position_tex: { value: n },
|
|
291
|
-
height_width_angle_tex: { value:
|
|
307
|
+
height_width_angle_tex: { value: a },
|
|
292
308
|
layer_lo: { value: 0 },
|
|
293
309
|
layer_hi: { value: i.layerCount }
|
|
294
310
|
},
|
|
295
|
-
vertexShader:
|
|
296
|
-
fragmentShader:
|
|
311
|
+
vertexShader: me,
|
|
312
|
+
fragmentShader: ye,
|
|
297
313
|
side: t.DoubleSide
|
|
298
|
-
}),
|
|
299
|
-
let
|
|
314
|
+
}), x = new t.Mesh(l, _);
|
|
315
|
+
let g = null;
|
|
300
316
|
if (i.bbox) {
|
|
301
|
-
const { min: c, max:
|
|
302
|
-
|
|
317
|
+
const { min: c, max: f } = i.bbox, p = new t.Vector3((c[0] + f[0]) / 2, (c[1] + f[1]) / 2, (c[2] + f[2]) / 2), w = Math.hypot(f[0] - c[0], f[1] - c[1], f[2] - c[2]) / 2 + 2;
|
|
318
|
+
g = new t.Sphere(p, w);
|
|
303
319
|
}
|
|
304
|
-
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
_.uniforms.projection_matrix.value.copy(p.projectionMatrix), _.uniforms.view_matrix.value.multiplyMatrices(p.matrixWorldInverse,
|
|
320
|
+
x.frustumCulled = !!g, g && (l.boundingSphere = g);
|
|
321
|
+
const s = new t.Matrix4(), u = new t.Vector3();
|
|
322
|
+
x.onBeforeRender = (c, f, p) => {
|
|
323
|
+
_.uniforms.projection_matrix.value.copy(p.projectionMatrix), _.uniforms.view_matrix.value.multiplyMatrices(p.matrixWorldInverse, x.matrixWorld), s.copy(x.matrixWorld).invert(), p.getWorldPosition(u).applyMatrix4(s), _.uniforms.camera_position.value.copy(u);
|
|
308
324
|
};
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
let
|
|
314
|
-
const
|
|
315
|
-
const c = i.travelPrefix[
|
|
316
|
-
|
|
317
|
-
},
|
|
325
|
+
const v = new t.BufferGeometry();
|
|
326
|
+
v.setAttribute("position", new t.BufferAttribute(i.travelPos, 3)), v.setDrawRange(0, 0);
|
|
327
|
+
const z = new t.LineSegments(v, new t.LineBasicMaterial({ color: 7041658 }));
|
|
328
|
+
z.frustumCulled = !!g, z.visible = !1, g && (v.boundingSphere = g);
|
|
329
|
+
let S = !1, I = 0, P = i.layerCount - 1;
|
|
330
|
+
const G = () => {
|
|
331
|
+
const c = i.travelPrefix[I], f = i.travelPrefix[P + 1];
|
|
332
|
+
v.setDrawRange(S ? c * 2 : 0, S ? (f - c) * 2 : 0);
|
|
333
|
+
}, k = (c, f) => {
|
|
318
334
|
const p = i.layerCount;
|
|
319
|
-
|
|
335
|
+
I = Math.max(0, Math.min(p - 1, c | 0)), P = Math.max(I, Math.min(p - 1, f | 0)), _.uniforms.layer_lo.value = I, _.uniforms.layer_hi.value = P, l.instanceCount = i.layerSegPrefix[P + 1], G();
|
|
320
336
|
};
|
|
321
|
-
return { mesh:
|
|
322
|
-
|
|
337
|
+
return { mesh: x, travLines: z, setVisibleLayers: (c) => k(0, (c | 0) - 1), setLayerRange: k, setTravelVisible: (c) => {
|
|
338
|
+
S = !!c, z.visible = S, G();
|
|
323
339
|
}, setColors: (c) => {
|
|
324
|
-
const
|
|
325
|
-
for (let
|
|
326
|
-
|
|
340
|
+
const f = a.image.data, p = Math.min(c.length, f.length) / 4;
|
|
341
|
+
for (let w = 0; w < p; w++) f[w * 4 + 3] = c[w * 4];
|
|
342
|
+
a.needsUpdate = !0;
|
|
327
343
|
}, dispose: () => {
|
|
328
|
-
|
|
344
|
+
l.dispose(), _.dispose(), n.dispose(), a.dispose(), v.dispose(), z.material.dispose();
|
|
329
345
|
}, nSeg: i.nSeg, layerCount: i.layerCount };
|
|
330
346
|
}
|
|
331
|
-
const
|
|
347
|
+
const ce = [
|
|
332
348
|
{ key: "feature", label: "Feature type", cont: !1, unit: "" },
|
|
333
349
|
{ key: "speed", label: "Speed", cont: !0, unit: "mm/s" },
|
|
334
350
|
{ key: "height", label: "Layer Height", cont: !0, unit: "mm" },
|
|
335
351
|
{ key: "width", label: "Line Width", cont: !0, unit: "mm" },
|
|
336
352
|
{ key: "fan", label: "Fan Speed", cont: !0, unit: "%" },
|
|
337
|
-
{ key: "temp", label: "Temperature", cont: !0, unit: "°C" }
|
|
353
|
+
{ key: "temp", label: "Temperature", cont: !0, unit: "°C" },
|
|
354
|
+
// Last, like upstream's EViewType::Tool: it answers "did my painted regions come out on the extruder I assigned?",
|
|
355
|
+
// which is a check you run after slicing, not a property you scrub through. Discrete like the feature view — an
|
|
356
|
+
// extruder index is a label, and a heatmap over it would imply tool 2 sits "between" tools 1 and 3.
|
|
357
|
+
{ key: "filament", label: "Filament", cont: !1, unit: "" }
|
|
338
358
|
];
|
|
339
|
-
function
|
|
340
|
-
const
|
|
359
|
+
function we(t, i, o, n) {
|
|
360
|
+
const a = i.vType[o], l = i.vLayer[o], h = l === 0;
|
|
341
361
|
switch (t) {
|
|
342
362
|
case "height":
|
|
343
|
-
return i.vHeight[
|
|
363
|
+
return i.vHeight[o];
|
|
344
364
|
case "width":
|
|
345
|
-
return i.vWidth[
|
|
365
|
+
return i.vWidth[o];
|
|
346
366
|
case "speed":
|
|
347
|
-
return h ? n.firstLayerSpeed : n.speedByType[
|
|
367
|
+
return h ? n.firstLayerSpeed : n.speedByType[a] ?? n.speedByType[1];
|
|
348
368
|
case "fan":
|
|
349
|
-
return
|
|
369
|
+
return l < n.closeFanLayers ? 0 : a === 9 ? 100 : n.fanNormal;
|
|
350
370
|
case "temp":
|
|
351
371
|
return h ? n.tempFirst : n.tempNormal;
|
|
352
372
|
default:
|
|
353
373
|
return 0;
|
|
354
374
|
}
|
|
355
375
|
}
|
|
356
|
-
function
|
|
357
|
-
const { meta: n, nV:
|
|
376
|
+
function Fe(t, i, o) {
|
|
377
|
+
const { meta: n, nV: a } = t, l = new Float32Array(a * 4), h = ce.find((s) => s.key === i) || ce[0];
|
|
358
378
|
if (!h.cont) {
|
|
359
|
-
|
|
360
|
-
|
|
379
|
+
const s = ((o == null ? void 0 : o.toolColors) ?? []).map(de), u = h.key === "filament" ? (v) => {
|
|
380
|
+
const z = n.vTool ? n.vTool[v] : 0;
|
|
381
|
+
return s[z] || _e[z % _e.length];
|
|
382
|
+
} : (v) => W[n.vType[v]] || W[1];
|
|
383
|
+
for (let v = 0; v < a; v++) l[v * 4] = re(u(v));
|
|
384
|
+
return { color: l, min: 0, max: 0, viewType: i, label: h.label, unit: h.unit, cont: !1 };
|
|
361
385
|
}
|
|
362
|
-
let _ = 1 / 0,
|
|
363
|
-
const
|
|
364
|
-
for (let
|
|
365
|
-
const
|
|
366
|
-
|
|
386
|
+
let _ = 1 / 0, x = -1 / 0;
|
|
387
|
+
const g = new Float32Array(a);
|
|
388
|
+
for (let s = 0; s < a; s++) {
|
|
389
|
+
const u = we(i, n, s, o);
|
|
390
|
+
g[s] = u, u < _ && (_ = u), u > x && (x = u);
|
|
367
391
|
}
|
|
368
|
-
Number.isFinite(_) || (_ = 0,
|
|
369
|
-
for (let
|
|
370
|
-
const
|
|
371
|
-
|
|
392
|
+
Number.isFinite(_) || (_ = 0, x = 1);
|
|
393
|
+
for (let s = 0; s < a; s++) {
|
|
394
|
+
const u = pe(g[s], _, x, ue);
|
|
395
|
+
l[s * 4] = re(u);
|
|
372
396
|
}
|
|
373
|
-
return { color:
|
|
397
|
+
return { color: l, min: _, max: x, viewType: i, label: h.label, unit: h.unit, cont: !0 };
|
|
374
398
|
}
|
|
375
399
|
export {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
fe as
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
400
|
+
ue as DEFAULT_RANGES_COLORS,
|
|
401
|
+
_e as TOOL_COLOR,
|
|
402
|
+
W as TYPE_COLOR,
|
|
403
|
+
fe as TYPE_LABEL,
|
|
404
|
+
xe as VERTEX_DATA,
|
|
405
|
+
ce as VIEW_TYPES,
|
|
406
|
+
be as buildSegmentData,
|
|
407
|
+
Fe as computeColors,
|
|
408
|
+
Ae as makeToolpath,
|
|
409
|
+
ze as roleRatios
|
|
385
410
|
};
|