minerva-design 1.6.0 → 1.7.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/CHANGELOG.md +13 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +2 -0
- package/dist/charts/engine/data.d.ts +2 -0
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.js +22 -18
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +532 -493
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +12 -2
- package/dist/charts/engine/graph/geometry.d.ts +12 -2
- package/dist/charts/engine/graph/geometry.js +35 -31
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +95 -74
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +1 -1
- package/dist/charts/engine/orderbook/field.cjs.map +1 -1
- package/dist/charts/engine/orderbook/field.d.cts +15 -2
- package/dist/charts/engine/orderbook/field.d.ts +15 -2
- package/dist/charts/engine/orderbook/field.js +21 -9
- package/dist/charts/engine/orderbook/field.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
- package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
- package/dist/charts/engine/orderbook/heatmap.js +576 -453
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +36 -11
- package/dist/charts/engine/orderbook/types.d.ts +36 -11
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +16 -3
- package/dist/charts/engine/presets.d.ts +16 -3
- package/dist/charts/engine/presets.js +42 -32
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +4 -2
- package/dist/charts/engine/scene.d.ts +4 -2
- package/dist/charts/engine/scene.js +185 -107
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +119 -34
- package/dist/charts/engine/three-d/oit.cjs.map +1 -1
- package/dist/charts/engine/three-d/oit.d.cts +65 -10
- package/dist/charts/engine/three-d/oit.d.ts +65 -10
- package/dist/charts/engine/three-d/oit.js +119 -34
- package/dist/charts/engine/three-d/oit.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +19 -0
- package/dist/charts/engine/three-d/render-types.d.ts +19 -0
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +14 -6
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +6 -1
- package/dist/charts/engine/three-d/shaders.d.ts +6 -1
- package/dist/charts/engine/three-d/shaders.js +40 -26
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +167 -125
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +169 -140
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +1149 -1023
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +12 -0
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/layout.cjs +2 -0
- package/dist/charts/engine/trading/layout.cjs.map +1 -0
- package/dist/charts/engine/trading/layout.d.cts +37 -0
- package/dist/charts/engine/trading/layout.d.ts +37 -0
- package/dist/charts/engine/trading/layout.js +63 -0
- package/dist/charts/engine/trading/layout.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +24 -7
- package/dist/charts/engine/trading/types.d.ts +24 -7
- package/dist/charts/engine/types.d.cts +21 -8
- package/dist/charts/engine/types.d.ts +21 -8
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +104 -83
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +42 -32
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +185 -107
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/taro/index.js +1263 -1152
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
- package/dist/vue/components/Chart/orderbook.d.ts +7 -0
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/weapp/charts/canvas.js +234 -58
- package/package.json +1 -1
|
@@ -2,30 +2,30 @@ import { drawOrder as e, drawRank as t, writesDepth as n } from "./render-types.
|
|
|
2
2
|
import { WGSL_COMPOSITE as r } from "./oit.js";
|
|
3
3
|
import { WGSL_LINES as i, WGSL_MESH as a, WGSL_POINTS as o, itemUniforms as s } from "./shaders.js";
|
|
4
4
|
//#region src/engine/three-d/webgpu.ts
|
|
5
|
-
var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (
|
|
6
|
-
let
|
|
7
|
-
if (!
|
|
8
|
-
let
|
|
9
|
-
if (!
|
|
10
|
-
let
|
|
11
|
-
if (
|
|
12
|
-
let
|
|
13
|
-
if (!
|
|
14
|
-
let
|
|
15
|
-
|
|
16
|
-
device:
|
|
17
|
-
format:
|
|
5
|
+
var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = "r16float", g = 4, _ = async (_, v, y = !1) => {
|
|
6
|
+
let b = typeof navigator < "u" ? navigator.gpu : void 0;
|
|
7
|
+
if (!b) return null;
|
|
8
|
+
let x = await b.requestAdapter();
|
|
9
|
+
if (!x) return null;
|
|
10
|
+
let S = x;
|
|
11
|
+
if (y && (S.info?.isFallbackAdapter || S.isFallbackAdapter)) return null;
|
|
12
|
+
let C = await x.requestDevice(), w = _.getContext("webgpu");
|
|
13
|
+
if (!w) return C.destroy(), null;
|
|
14
|
+
let T = b.getPreferredCanvasFormat();
|
|
15
|
+
w.configure({
|
|
16
|
+
device: C,
|
|
17
|
+
format: T,
|
|
18
18
|
alphaMode: "premultiplied"
|
|
19
19
|
});
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
let E = !1;
|
|
21
|
+
C.lost.then(() => {
|
|
22
|
+
E || v();
|
|
23
23
|
});
|
|
24
|
-
let
|
|
24
|
+
let D = C.createBindGroupLayout({ entries: [{
|
|
25
25
|
binding: 0,
|
|
26
26
|
visibility: 3,
|
|
27
27
|
buffer: { type: "uniform" }
|
|
28
|
-
}] }),
|
|
28
|
+
}] }), O = C.createPipelineLayout({ bindGroupLayouts: [D] }), k = {
|
|
29
29
|
color: {
|
|
30
30
|
srcFactor: "one",
|
|
31
31
|
dstFactor: "one-minus-src-alpha",
|
|
@@ -36,14 +36,14 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
36
36
|
dstFactor: "one-minus-src-alpha",
|
|
37
37
|
operation: "add"
|
|
38
38
|
}
|
|
39
|
-
},
|
|
39
|
+
}, A = {
|
|
40
40
|
color: {
|
|
41
41
|
srcFactor: "one",
|
|
42
|
-
dstFactor: "one",
|
|
42
|
+
dstFactor: "one-minus-src",
|
|
43
43
|
operation: "add"
|
|
44
44
|
},
|
|
45
|
-
alpha:
|
|
46
|
-
},
|
|
45
|
+
alpha: k.alpha
|
|
46
|
+
}, j = {
|
|
47
47
|
color: {
|
|
48
48
|
srcFactor: "one",
|
|
49
49
|
dstFactor: "one",
|
|
@@ -54,10 +54,25 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
54
54
|
dstFactor: "one",
|
|
55
55
|
operation: "add"
|
|
56
56
|
}
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
}, M = {
|
|
58
|
+
color: {
|
|
59
|
+
srcFactor: "one",
|
|
60
|
+
dstFactor: "one",
|
|
61
|
+
operation: "min"
|
|
62
|
+
},
|
|
63
|
+
alpha: {
|
|
64
|
+
srcFactor: "one",
|
|
65
|
+
dstFactor: "one",
|
|
66
|
+
operation: "min"
|
|
67
|
+
}
|
|
68
|
+
}, N = C.createBindGroupLayout({ entries: [{
|
|
69
|
+
binding: 0,
|
|
70
|
+
visibility: d,
|
|
71
|
+
texture: { sampleType: "unfilterable-float" }
|
|
72
|
+
}] }), P = C.createPipelineLayout({ bindGroupLayouts: [D, N] }), F = (e, t, n, r, i = k, a = "plain") => {
|
|
73
|
+
let o = C.createShaderModule({ code: e });
|
|
74
|
+
return C.createRenderPipeline({
|
|
75
|
+
layout: a === "oit" ? P : O,
|
|
61
76
|
vertex: {
|
|
62
77
|
module: o,
|
|
63
78
|
entryPoint: "vs",
|
|
@@ -65,15 +80,15 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
65
80
|
},
|
|
66
81
|
fragment: {
|
|
67
82
|
module: o,
|
|
68
|
-
entryPoint: a ? "fsOit" : "fs",
|
|
69
|
-
targets: a ?
|
|
70
|
-
format: m,
|
|
71
|
-
blend: k
|
|
72
|
-
}, {
|
|
83
|
+
entryPoint: a === "oit" ? "fsOit" : a === "front" ? "fsFront" : "fs",
|
|
84
|
+
targets: a === "oit" ? Array.from({ length: g }, () => ({
|
|
73
85
|
format: m,
|
|
74
|
-
blend:
|
|
86
|
+
blend: j
|
|
87
|
+
})) : a === "front" ? [{
|
|
88
|
+
format: h,
|
|
89
|
+
blend: M
|
|
75
90
|
}] : [{
|
|
76
|
-
format:
|
|
91
|
+
format: T,
|
|
77
92
|
blend: i
|
|
78
93
|
}]
|
|
79
94
|
},
|
|
@@ -81,14 +96,14 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
81
96
|
topology: n,
|
|
82
97
|
cullMode: "none"
|
|
83
98
|
},
|
|
84
|
-
depthStencil: {
|
|
99
|
+
depthStencil: a === "front" ? void 0 : {
|
|
85
100
|
format: "depth24plus",
|
|
86
101
|
depthWriteEnabled: r,
|
|
87
102
|
depthCompare: "less-equal"
|
|
88
103
|
},
|
|
89
|
-
multisample: { count: p }
|
|
104
|
+
multisample: { count: a === "front" ? 1 : p }
|
|
90
105
|
});
|
|
91
|
-
},
|
|
106
|
+
}, I = [{
|
|
92
107
|
arrayStride: 20,
|
|
93
108
|
stepMode: "instance",
|
|
94
109
|
attributes: [
|
|
@@ -108,7 +123,7 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
108
123
|
format: "unorm8x4"
|
|
109
124
|
}
|
|
110
125
|
]
|
|
111
|
-
}],
|
|
126
|
+
}], L = [{
|
|
112
127
|
arrayStride: 28,
|
|
113
128
|
stepMode: "vertex",
|
|
114
129
|
attributes: [
|
|
@@ -128,7 +143,7 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
128
143
|
format: "unorm8x4"
|
|
129
144
|
}
|
|
130
145
|
]
|
|
131
|
-
}],
|
|
146
|
+
}], R = [{
|
|
132
147
|
arrayStride: 28,
|
|
133
148
|
stepMode: "instance",
|
|
134
149
|
attributes: [
|
|
@@ -148,35 +163,39 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
148
163
|
format: "unorm8x4"
|
|
149
164
|
}
|
|
150
165
|
]
|
|
151
|
-
}],
|
|
152
|
-
points: [
|
|
153
|
-
mesh: [
|
|
154
|
-
lines: [
|
|
155
|
-
},
|
|
156
|
-
if (e.kind === "points" && e.additive) return
|
|
157
|
-
let t =
|
|
166
|
+
}], z = {
|
|
167
|
+
points: [F(o, I, "triangle-strip", !1), F(o, I, "triangle-strip", !0)],
|
|
168
|
+
mesh: [F(a, L, "triangle-list", !1), F(a, L, "triangle-list", !0)],
|
|
169
|
+
lines: [F(i, R, "triangle-strip", !1), F(i, R, "triangle-strip", !0)]
|
|
170
|
+
}, B = null, V = (e) => {
|
|
171
|
+
if (e.kind === "points" && e.additive) return B ?? (B = F(o, I, "triangle-strip", !1, A)), B;
|
|
172
|
+
let t = z[e.kind];
|
|
158
173
|
return t[n(e) ? t.length - 1 : 0];
|
|
159
174
|
};
|
|
160
|
-
|
|
161
|
-
let
|
|
162
|
-
binding:
|
|
175
|
+
C.pushErrorScope("validation");
|
|
176
|
+
let H = C.createBindGroupLayout({ entries: Array.from({ length: g }, (e, t) => ({
|
|
177
|
+
binding: t,
|
|
163
178
|
visibility: d,
|
|
164
179
|
texture: { sampleType: "unfilterable-float" }
|
|
165
|
-
})) }),
|
|
166
|
-
points:
|
|
167
|
-
mesh:
|
|
168
|
-
|
|
169
|
-
|
|
180
|
+
})) }), U = C.createShaderModule({ code: r }), W = {
|
|
181
|
+
points: F(o, I, "triangle-strip", !1, k, "oit"),
|
|
182
|
+
mesh: F(a, L, "triangle-list", !1, k, "oit"),
|
|
183
|
+
front: {
|
|
184
|
+
points: F(o, I, "triangle-strip", !1, k, "front"),
|
|
185
|
+
mesh: F(a, L, "triangle-list", !1, k, "front")
|
|
186
|
+
},
|
|
187
|
+
composite: C.createRenderPipeline({
|
|
188
|
+
layout: C.createPipelineLayout({ bindGroupLayouts: [H] }),
|
|
170
189
|
vertex: {
|
|
171
|
-
module:
|
|
190
|
+
module: U,
|
|
172
191
|
entryPoint: "vs"
|
|
173
192
|
},
|
|
174
193
|
fragment: {
|
|
175
|
-
module:
|
|
194
|
+
module: U,
|
|
176
195
|
entryPoint: "fs",
|
|
177
196
|
targets: [{
|
|
178
|
-
format:
|
|
179
|
-
blend:
|
|
197
|
+
format: T,
|
|
198
|
+
blend: k
|
|
180
199
|
}]
|
|
181
200
|
},
|
|
182
201
|
primitive: { topology: "triangle-list" },
|
|
@@ -187,76 +206,84 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
187
206
|
},
|
|
188
207
|
multisample: { count: p }
|
|
189
208
|
})
|
|
190
|
-
},
|
|
191
|
-
let e =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
209
|
+
}, G = !await C.popErrorScope(), K = null, q = () => {
|
|
210
|
+
let e = K?.oit;
|
|
211
|
+
if (e) for (let t of [
|
|
212
|
+
...e.samples,
|
|
213
|
+
...e.resolved,
|
|
214
|
+
e.front
|
|
215
|
+
]) t.destroy();
|
|
216
|
+
}, J = () => {
|
|
217
|
+
let e = _.width, t = _.height;
|
|
218
|
+
return K && K.width === e && K.height === t ? K : (K?.color.destroy(), K?.depth.destroy(), q(), K = {
|
|
196
219
|
width: e,
|
|
197
220
|
height: t,
|
|
198
|
-
color:
|
|
221
|
+
color: C.createTexture({
|
|
199
222
|
size: [e, t],
|
|
200
223
|
sampleCount: p,
|
|
201
|
-
format:
|
|
224
|
+
format: T,
|
|
202
225
|
usage: f
|
|
203
226
|
}),
|
|
204
|
-
depth:
|
|
227
|
+
depth: C.createTexture({
|
|
205
228
|
size: [e, t],
|
|
206
229
|
sampleCount: p,
|
|
207
230
|
format: "depth24plus",
|
|
208
231
|
usage: f
|
|
209
232
|
}),
|
|
210
233
|
oit: null
|
|
211
|
-
},
|
|
212
|
-
},
|
|
234
|
+
}, K);
|
|
235
|
+
}, Y = (e) => {
|
|
213
236
|
if (e.oit) return e.oit;
|
|
214
|
-
let t = (t) =>
|
|
237
|
+
let t = (t, n = m) => C.createTexture({
|
|
215
238
|
size: [e.width, e.height],
|
|
216
239
|
sampleCount: t,
|
|
217
|
-
format:
|
|
240
|
+
format: n,
|
|
218
241
|
usage: t > 1 ? f : 20
|
|
219
|
-
}), n = t(1), r = t(1);
|
|
242
|
+
}), n = Array.from({ length: g }, () => t(1)), r = t(1, h);
|
|
220
243
|
return e.oit = {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
layout: L,
|
|
244
|
+
samples: Array.from({ length: g }, () => t(p)),
|
|
245
|
+
resolved: n,
|
|
246
|
+
front: r,
|
|
247
|
+
frontBindGroup: C.createBindGroup({
|
|
248
|
+
layout: N,
|
|
227
249
|
entries: [{
|
|
228
250
|
binding: 0,
|
|
229
|
-
resource: n.createView()
|
|
230
|
-
}, {
|
|
231
|
-
binding: 1,
|
|
232
251
|
resource: r.createView()
|
|
233
252
|
}]
|
|
253
|
+
}),
|
|
254
|
+
bindGroup: C.createBindGroup({
|
|
255
|
+
layout: H,
|
|
256
|
+
entries: n.map((e, t) => ({
|
|
257
|
+
binding: t,
|
|
258
|
+
resource: e.createView()
|
|
259
|
+
}))
|
|
234
260
|
})
|
|
235
261
|
}, e.oit;
|
|
236
|
-
},
|
|
262
|
+
}, X = /* @__PURE__ */ new Map(), Z = /* @__PURE__ */ new Float32Array(40), Q = (e, t) => {
|
|
237
263
|
let n = e.byteLength;
|
|
238
264
|
if (n <= 0) return null;
|
|
239
|
-
let r =
|
|
265
|
+
let r = C.createBuffer({
|
|
240
266
|
size: Math.max(16, Math.ceil(n / 4) * 4),
|
|
241
267
|
usage: t | u
|
|
242
268
|
});
|
|
243
|
-
return e instanceof Uint32Array ?
|
|
244
|
-
},
|
|
269
|
+
return e instanceof Uint32Array ? C.queue.writeBuffer(r, 0, e.buffer, e.byteOffset, n) : C.queue.writeBuffer(r, 0, e), r;
|
|
270
|
+
}, $ = (e) => {
|
|
245
271
|
e.vertex?.destroy(), e.index?.destroy();
|
|
246
|
-
},
|
|
247
|
-
let t =
|
|
272
|
+
}, ee = (e) => {
|
|
273
|
+
let t = X.get(e.key);
|
|
248
274
|
if (t && t.version === e.version && t.kind === e.kind) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
275
|
+
let n = e.kind === "lines" ? 0 : e.order ?? 0;
|
|
276
|
+
if (e.kind === "mesh" && t.index && n !== t.order) {
|
|
277
|
+
let { indices: r } = e;
|
|
278
|
+
C.queue.writeBuffer(t.index, 0, r.buffer, r.byteOffset, r.byteLength), t.order = n;
|
|
279
|
+
} else e.kind === "points" && t.vertex && n !== t.order && (C.queue.writeBuffer(t.vertex, 0, e.data), t.order = n);
|
|
253
280
|
return t;
|
|
254
281
|
}
|
|
255
|
-
t &&
|
|
256
|
-
let n =
|
|
257
|
-
if (t) t.version = e.version, t.kind = e.kind, t.vertex = n, t.index = r, t.order = e.kind === "
|
|
282
|
+
t && $(t);
|
|
283
|
+
let n = Q(e.kind === "mesh" ? e.vertices : e.data, l), r = e.kind === "mesh" ? Q(e.indices, c) : null;
|
|
284
|
+
if (t) t.version = e.version, t.kind = e.kind, t.vertex = n, t.index = r, t.order = e.kind === "lines" ? 0 : e.order ?? 0;
|
|
258
285
|
else {
|
|
259
|
-
let i =
|
|
286
|
+
let i = C.createBuffer({
|
|
260
287
|
size: 160,
|
|
261
288
|
usage: 72
|
|
262
289
|
});
|
|
@@ -265,37 +292,37 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
265
292
|
kind: e.kind,
|
|
266
293
|
vertex: n,
|
|
267
294
|
index: r,
|
|
268
|
-
order: e.kind === "
|
|
295
|
+
order: e.kind === "lines" ? 0 : e.order ?? 0,
|
|
269
296
|
uniform: i,
|
|
270
|
-
bindGroup:
|
|
271
|
-
layout:
|
|
297
|
+
bindGroup: C.createBindGroup({
|
|
298
|
+
layout: D,
|
|
272
299
|
entries: [{
|
|
273
300
|
binding: 0,
|
|
274
301
|
resource: { buffer: i }
|
|
275
302
|
}]
|
|
276
303
|
})
|
|
277
|
-
},
|
|
304
|
+
}, X.set(e.key, t);
|
|
278
305
|
}
|
|
279
306
|
return t;
|
|
280
307
|
};
|
|
281
308
|
return {
|
|
282
309
|
kind: "webgpu",
|
|
283
|
-
canvas:
|
|
284
|
-
orderIndependent:
|
|
310
|
+
canvas: _,
|
|
311
|
+
orderIndependent: G,
|
|
285
312
|
resize(e, t) {
|
|
286
|
-
|
|
313
|
+
_.width = Math.max(1, e), _.height = Math.max(1, t);
|
|
287
314
|
},
|
|
288
315
|
render(n, r) {
|
|
289
|
-
if (
|
|
290
|
-
let i =
|
|
291
|
-
let
|
|
292
|
-
if (
|
|
293
|
-
let
|
|
294
|
-
if (
|
|
295
|
-
if (
|
|
296
|
-
if (!
|
|
297
|
-
e.setIndexBuffer(
|
|
298
|
-
} else e.draw(4,
|
|
316
|
+
if (E) return;
|
|
317
|
+
let i = J(), a = e(n), o = G && a.some((e) => t(e) === 2), c = C.createCommandEncoder(), l = w.getCurrentTexture().createView(), u = /* @__PURE__ */ new Set(), d = (e, t, n, i) => {
|
|
318
|
+
let a = t.kind === "mesh" ? t.indices.length : t.count, o = t.kind === "lines" ? void 0 : t.range, c = o ? Math.max(0, Math.min(a, o.first)) : 0, l = o ? Math.max(0, Math.min(a - c, o.count)) : a;
|
|
319
|
+
if (l <= 0) return;
|
|
320
|
+
let u = ee(t);
|
|
321
|
+
if (u.vertex) {
|
|
322
|
+
if (C.queue.writeBuffer(u.uniform, 0, s(t, r, Z)), e.setPipeline(n), e.setBindGroup(0, u.bindGroup), i && e.setBindGroup(1, i), e.setVertexBuffer(0, u.vertex), t.kind === "mesh") {
|
|
323
|
+
if (!u.index) return;
|
|
324
|
+
e.setIndexBuffer(u.index, "uint32"), e.drawIndexed(l, 1, c);
|
|
325
|
+
} else e.draw(4, l, 0, c);
|
|
299
326
|
}
|
|
300
327
|
}, f = c.beginRenderPass({
|
|
301
328
|
colorAttachments: [{
|
|
@@ -319,24 +346,26 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
319
346
|
});
|
|
320
347
|
for (let e of a) {
|
|
321
348
|
if (o && t(e) > 1) break;
|
|
322
|
-
u.add(e.key), d(f, e,
|
|
349
|
+
u.add(e.key), d(f, e, V(e));
|
|
323
350
|
}
|
|
324
351
|
if (f.end(), o) {
|
|
325
|
-
let e =
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
352
|
+
let e = Y(i), n = c.beginRenderPass({ colorAttachments: [{
|
|
353
|
+
view: e.front.createView(),
|
|
354
|
+
clearValue: {
|
|
355
|
+
r: 4,
|
|
356
|
+
g: 4,
|
|
357
|
+
b: 4,
|
|
358
|
+
a: 4
|
|
359
|
+
},
|
|
360
|
+
loadOp: "clear",
|
|
361
|
+
storeOp: "store"
|
|
362
|
+
}] });
|
|
363
|
+
for (let e of a) t(e) === 2 && e.kind !== "lines" && (e.kind === "points" && e.additive || (u.add(e.key), d(n, e, W.front[e.kind])));
|
|
364
|
+
n.end();
|
|
365
|
+
let r = c.beginRenderPass({
|
|
366
|
+
colorAttachments: e.samples.map((t, n) => ({
|
|
367
|
+
view: t.createView(),
|
|
368
|
+
resolveTarget: e.resolved[n].createView(),
|
|
340
369
|
clearValue: {
|
|
341
370
|
r: 0,
|
|
342
371
|
g: 0,
|
|
@@ -345,15 +374,15 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
345
374
|
},
|
|
346
375
|
loadOp: "clear",
|
|
347
376
|
storeOp: "discard"
|
|
348
|
-
}
|
|
377
|
+
})),
|
|
349
378
|
depthStencilAttachment: {
|
|
350
379
|
view: i.depth.createView(),
|
|
351
380
|
depthReadOnly: !0
|
|
352
381
|
}
|
|
353
382
|
});
|
|
354
|
-
for (let
|
|
355
|
-
|
|
356
|
-
let
|
|
383
|
+
for (let n of a) t(n) === 2 && n.kind !== "lines" && (u.add(n.key), d(r, n, W[n.kind], e.frontBindGroup));
|
|
384
|
+
r.end();
|
|
385
|
+
let o = c.beginRenderPass({
|
|
357
386
|
colorAttachments: [{
|
|
358
387
|
view: i.color.createView(),
|
|
359
388
|
resolveTarget: l,
|
|
@@ -366,21 +395,21 @@ var c = 16, l = 32, u = 8, d = 2, f = 16, p = 4, m = "rgba16float", h = async (h
|
|
|
366
395
|
depthStoreOp: "discard"
|
|
367
396
|
}
|
|
368
397
|
});
|
|
369
|
-
|
|
370
|
-
for (let e of a) t(e) < 3 || (u.add(e.key), d(
|
|
371
|
-
|
|
398
|
+
o.setPipeline(W.composite), o.setBindGroup(0, e.bindGroup), o.draw(3);
|
|
399
|
+
for (let e of a) t(e) < 3 || (u.add(e.key), d(o, e, V(e)));
|
|
400
|
+
o.end();
|
|
372
401
|
}
|
|
373
|
-
|
|
374
|
-
for (let [e, t] of
|
|
402
|
+
C.queue.submit([c.finish()]);
|
|
403
|
+
for (let [e, t] of X) u.has(e) || ($(t), t.uniform.destroy(), X.delete(e));
|
|
375
404
|
},
|
|
376
405
|
destroy() {
|
|
377
|
-
|
|
378
|
-
for (let e of
|
|
379
|
-
|
|
406
|
+
E = !0;
|
|
407
|
+
for (let e of X.values()) $(e), e.uniform.destroy();
|
|
408
|
+
X.clear(), K?.color.destroy(), K?.depth.destroy(), q(), K = null, w.unconfigure(), C.destroy();
|
|
380
409
|
}
|
|
381
410
|
};
|
|
382
411
|
};
|
|
383
412
|
//#endregion
|
|
384
|
-
export {
|
|
413
|
+
export { _ as createWebGpu3D };
|
|
385
414
|
|
|
386
415
|
//# sourceMappingURL=webgpu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.js","names":["BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","STAGE_FRAGMENT","TEXTURE_RENDER_ATTACHMENT","SAMPLES","OIT_FORMAT","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","additive","sum","pipeline","module","oit","blending","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","WGSL_POINTS","WGSL_MESH","WGSL_LINES","additivePoints","pipelineOf","item","variants","writesDepth","compositeLayout","compositeModule","WGSL_COMPOSITE","oitPipelines","orderIndependent","targets","destroyOit","renderTargets","width","height","oitTargets","t","texture","samples","accumResolved","extraResolved","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","indices","vertex","index","uniform","ordered","drawOrder","items","blended","drawRank","encoder","screen","seen","draw","count","itemUniforms","frame","pass","chosen","main","transparent","last","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles). With blended\n// items (transparent meshes, blended or additive points), three passes:\n// the opaque items; the blended ones into the float targets of the\n// weighted blended order-independent transparency (`oit.ts`, multisampled,\n// testing the opaque depth, resolved); then their composite and the lines.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { WGSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_BINDING = 0x04;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n/** Format of the transparency targets (renderable, blendable, resolvable) */\nconst OIT_FORMAT: GPUTextureFormat = \"rgba16float\";\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n // additive points: the colors add up, the coverage composites as usual\n const additive: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: blend.alpha,\n };\n // transparency targets: plain sums\n const sum: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n };\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n blending: GPUBlendState = blend,\n oit = false,\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: oit ? \"fsOit\" : \"fs\",\n targets: oit\n ? [\n { format: OIT_FORMAT, blend: sum },\n { format: OIT_FORMAT, blend: sum },\n ]\n : [{ format, blend: blending }],\n },\n primitive: { topology, cullMode: \"none\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n let additivePoints: GPURenderPipeline | null = null;\n const pipelineOf = (item: Item3D) => {\n if (item.kind === \"points\" && item.additive) {\n additivePoints ??= pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n additive,\n );\n return additivePoints;\n }\n const variants = pipelines[item.kind];\n return variants[writesDepth(item) ? variants.length - 1 : 0];\n };\n\n // order-independent transparency: validated once (rgba16float targets are\n // core, but a failing driver falls back to the sorted blending)\n device.pushErrorScope(\"validation\");\n const compositeLayout = device.createBindGroupLayout({\n entries: [0, 1].map((binding) => ({\n binding,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" as const },\n })),\n });\n const compositeModule = device.createShaderModule({ code: WGSL_COMPOSITE });\n const oitPipelines = {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n true,\n ),\n mesh: pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false, blend, true),\n composite: device.createRenderPipeline({\n layout: device.createPipelineLayout({\n bindGroupLayouts: [compositeLayout],\n }),\n vertex: { module: compositeModule, entryPoint: \"vs\" },\n fragment: {\n module: compositeModule,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-list\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: false,\n depthCompare: \"always\",\n },\n multisample: { count: SAMPLES },\n }),\n };\n const orderIndependent = !(await device.popErrorScope());\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n /** Transparency targets, created on first use */\n oit: {\n accum: GPUTexture;\n extra: GPUTexture;\n accumResolved: GPUTexture;\n extraResolved: GPUTexture;\n bindGroup: GPUBindGroup;\n } | null;\n } | null = null;\n const destroyOit = () => {\n const oit = targets?.oit;\n if (!oit) return;\n oit.accum.destroy();\n oit.extra.destroy();\n oit.accumResolved.destroy();\n oit.extraResolved.destroy();\n };\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n oit: null,\n };\n return targets;\n };\n const oitTargets = (t: NonNullable<typeof targets>) => {\n if (t.oit) return t.oit;\n const texture = (samples: number) =>\n device.createTexture({\n size: [t.width, t.height],\n sampleCount: samples,\n format: OIT_FORMAT,\n usage:\n samples > 1\n ? TEXTURE_RENDER_ATTACHMENT\n : TEXTURE_RENDER_ATTACHMENT | TEXTURE_BINDING,\n });\n const accumResolved = texture(1);\n const extraResolved = texture(1);\n t.oit = {\n accum: texture(SAMPLES),\n extra: texture(SAMPLES),\n accumResolved,\n extraResolved,\n bindGroup: device.createBindGroup({\n layout: compositeLayout,\n entries: [\n { binding: 0, resource: accumResolved.createView() },\n { binding: 1, resource: extraResolved.createView() },\n ],\n }),\n };\n return t.oit;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n res.index &&\n (item.order ?? 0) !== res.order\n ) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = item.order ?? 0;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"mesh\" ? (item.order ?? 0) : 0;\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n orderIndependent,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const t = renderTargets();\n const ordered = drawOrder(items);\n const blended =\n orderIndependent && ordered.some((item) => drawRank(item) === 2);\n const encoder = device.createCommandEncoder();\n const screen = context.getCurrentTexture().createView();\n const seen = new Set<string>();\n /** Draws an item; false when it has nothing to draw */\n const draw = (\n pass: GPURenderPassEncoder,\n item: Item3D,\n chosen: GPURenderPipeline,\n ) => {\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) return;\n const res = upload(item);\n if (!res.vertex) return;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) return;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count);\n } else {\n pass.draw(4, count);\n }\n };\n\n // opaque items (every item without blended ones)\n const main = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: blended ? undefined : screen,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: blended ? \"store\" : \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: blended ? \"store\" : \"discard\",\n },\n });\n for (const item of ordered) {\n if (blended && drawRank(item) > 1) break;\n seen.add(item.key);\n draw(main, item, pipelineOf(item));\n }\n main.end();\n\n if (blended) {\n // blended items, in any order, into the transparency targets\n const oit = oitTargets(t);\n const transparent = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: oit.accum.createView(),\n resolveTarget: oit.accumResolved.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n {\n view: oit.extra.createView(),\n resolveTarget: oit.extraResolved.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthReadOnly: true,\n },\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n seen.add(item.key);\n draw(transparent, item, oitPipelines[item.kind]);\n }\n transparent.end();\n\n // their composite over the opaque items, then the lines\n const last = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: screen,\n loadOp: \"load\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthLoadOp: \"load\",\n depthStoreOp: \"discard\",\n },\n });\n last.setPipeline(oitPipelines.composite);\n last.setBindGroup(0, oit.bindGroup);\n last.draw(3);\n for (const item of ordered) {\n if (drawRank(item) < 3) continue;\n seen.add(item.key);\n draw(last, item, pipelineOf(item));\n }\n last.end();\n }\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.js","names":["BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","STAGE_FRAGMENT","TEXTURE_RENDER_ATTACHMENT","SAMPLES","OIT_FORMAT","FRONT_FORMAT","OIT_TARGETS","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","additive","sum","nearest","frontLayout","oitLayout","pipeline","module","mode","blending","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","WGSL_POINTS","WGSL_MESH","WGSL_LINES","additivePoints","pipelineOf","item","variants","writesDepth","compositeLayout","compositeModule","WGSL_COMPOSITE","oitPipelines","orderIndependent","targets","destroyOit","oit","texture","renderTargets","width","height","oitTargets","t","samples","kind","resolved","front","r","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","order","indices","vertex","index","uniform","ordered","drawOrder","items","blended","drawRank","encoder","screen","seen","draw","total","range","first","count","itemUniforms","frame","pass","chosen","main","frontPass","transparent","i","last","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles). With blended\n// items (transparent meshes, blended or additive points), four passes: the\n// opaque items; the depth of the front transparent layer (r16float, `min`\n// blending); the blended items into the four float targets of the hybrid\n// order-independent transparency (`oit.ts`, multisampled, testing the\n// opaque depth, resolved); then their composite and the lines.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { FRONT_CLEAR, WGSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_BINDING = 0x04;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n/** Format of the transparency targets (renderable, blendable, resolvable) */\nconst OIT_FORMAT: GPUTextureFormat = \"rgba16float\";\n/** Format of the front depth of the transparent layers (blendable: `min`) */\nconst FRONT_FORMAT: GPUTextureFormat = \"r16float\";\n/** Targets of the transparency pass (`oit.ts`) */\nconst OIT_TARGETS = 4;\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n // additive points: their light screen blended (tone mapped as it adds\n // up, `screenTone`), the coverage composites as usual\n const additive: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src\",\n operation: \"add\",\n },\n alpha: blend.alpha,\n };\n // transparency targets: plain sums\n const sum: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n };\n // front depth: the nearest\n const nearest: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"min\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"min\" },\n };\n // the front depth texture of the transparency pass (group 1)\n const frontLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" },\n },\n ],\n });\n const oitLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout, frontLayout],\n });\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n blending: GPUBlendState = blend,\n mode: \"plain\" | \"oit\" | \"front\" = \"plain\",\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout: mode === \"oit\" ? oitLayout : layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint:\n mode === \"oit\" ? \"fsOit\" : mode === \"front\" ? \"fsFront\" : \"fs\",\n targets:\n mode === \"oit\"\n ? Array.from({ length: OIT_TARGETS }, () => ({\n format: OIT_FORMAT,\n blend: sum,\n }))\n : mode === \"front\"\n ? [{ format: FRONT_FORMAT, blend: nearest }]\n : [{ format, blend: blending }],\n },\n primitive: { topology, cullMode: \"none\" },\n // the front pass has no depth (`oit.ts`) and one sample\n depthStencil:\n mode === \"front\"\n ? undefined\n : {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: mode === \"front\" ? 1 : SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n let additivePoints: GPURenderPipeline | null = null;\n const pipelineOf = (item: Item3D) => {\n if (item.kind === \"points\" && item.additive) {\n additivePoints ??= pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n additive,\n );\n return additivePoints;\n }\n const variants = pipelines[item.kind];\n return variants[writesDepth(item) ? variants.length - 1 : 0];\n };\n\n // order-independent transparency: validated once (rgba16float and\n // r16float targets are core, but a failing driver falls back to the\n // sorted blending)\n device.pushErrorScope(\"validation\");\n const compositeLayout = device.createBindGroupLayout({\n entries: Array.from({ length: OIT_TARGETS }, (_, binding) => ({\n binding,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" as const },\n })),\n });\n const compositeModule = device.createShaderModule({ code: WGSL_COMPOSITE });\n const oitPipelines = {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n \"oit\",\n ),\n mesh: pipeline(\n WGSL_MESH,\n meshBuffers,\n \"triangle-list\",\n false,\n blend,\n \"oit\",\n ),\n front: {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n \"front\",\n ),\n mesh: pipeline(\n WGSL_MESH,\n meshBuffers,\n \"triangle-list\",\n false,\n blend,\n \"front\",\n ),\n },\n composite: device.createRenderPipeline({\n layout: device.createPipelineLayout({\n bindGroupLayouts: [compositeLayout],\n }),\n vertex: { module: compositeModule, entryPoint: \"vs\" },\n fragment: {\n module: compositeModule,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-list\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: false,\n depthCompare: \"always\",\n },\n multisample: { count: SAMPLES },\n }),\n };\n const orderIndependent = !(await device.popErrorScope());\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n /** Transparency targets, created on first use */\n oit: {\n /** front color, accum, extra, behind (multisampled) */\n samples: GPUTexture[];\n /** Their resolved textures, read by the composite */\n resolved: GPUTexture[];\n /** Depth of the front transparent layer (single-sampled) */\n front: GPUTexture;\n frontBindGroup: GPUBindGroup;\n bindGroup: GPUBindGroup;\n } | null;\n } | null = null;\n const destroyOit = () => {\n const oit = targets?.oit;\n if (!oit) return;\n for (const texture of [...oit.samples, ...oit.resolved, oit.front])\n texture.destroy();\n };\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n oit: null,\n };\n return targets;\n };\n const oitTargets = (t: NonNullable<typeof targets>) => {\n if (t.oit) return t.oit;\n const texture = (samples: number, kind: GPUTextureFormat = OIT_FORMAT) =>\n device.createTexture({\n size: [t.width, t.height],\n sampleCount: samples,\n format: kind,\n usage:\n samples > 1\n ? TEXTURE_RENDER_ATTACHMENT\n : TEXTURE_RENDER_ATTACHMENT | TEXTURE_BINDING,\n });\n const resolved = Array.from({ length: OIT_TARGETS }, () => texture(1));\n const front = texture(1, FRONT_FORMAT);\n t.oit = {\n samples: Array.from({ length: OIT_TARGETS }, () => texture(SAMPLES)),\n resolved,\n front,\n frontBindGroup: device.createBindGroup({\n layout: frontLayout,\n entries: [{ binding: 0, resource: front.createView() }],\n }),\n bindGroup: device.createBindGroup({\n layout: compositeLayout,\n entries: resolved.map((r, binding) => ({\n binding,\n resource: r.createView(),\n })),\n }),\n };\n return t.oit;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same buffers in a new order (sorted back to front): rewritten\n const order = item.kind === \"lines\" ? 0 : (item.order ?? 0);\n if (item.kind === \"mesh\" && res.index && order !== res.order) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = order;\n } else if (item.kind === \"points\" && res.vertex && order !== res.order) {\n device.queue.writeBuffer(res.vertex, 0, item.data);\n res.order = order;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"lines\" ? 0 : (item.order ?? 0),\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"lines\" ? 0 : (item.order ?? 0);\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n orderIndependent,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const t = renderTargets();\n const ordered = drawOrder(items);\n const blended =\n orderIndependent && ordered.some((item) => drawRank(item) === 2);\n const encoder = device.createCommandEncoder();\n const screen = context.getCurrentTexture().createView();\n const seen = new Set<string>();\n /** Draws an item (or its `range`) */\n const draw = (\n pass: GPURenderPassEncoder,\n item: Item3D,\n chosen: GPURenderPipeline,\n front?: GPUBindGroup,\n ) => {\n const total = item.kind === \"mesh\" ? item.indices.length : item.count;\n const range = item.kind === \"lines\" ? undefined : item.range;\n const first = range ? Math.max(0, Math.min(total, range.first)) : 0;\n const count = range\n ? Math.max(0, Math.min(total - first, range.count))\n : total;\n if (count <= 0) return;\n const res = upload(item);\n if (!res.vertex) return;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n if (front) pass.setBindGroup(1, front);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) return;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count, 1, first);\n } else {\n pass.draw(4, count, 0, first);\n }\n };\n\n // opaque items (every item without blended ones)\n const main = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: blended ? undefined : screen,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: blended ? \"store\" : \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: blended ? \"store\" : \"discard\",\n },\n });\n for (const item of ordered) {\n if (blended && drawRank(item) > 1) break;\n seen.add(item.key);\n draw(main, item, pipelineOf(item));\n }\n main.end();\n\n if (blended) {\n const oit = oitTargets(t);\n // the depth of the front transparent layer: the nearest visible\n // fragment of the non-additive blended items\n const frontPass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: oit.front.createView(),\n clearValue: {\n r: FRONT_CLEAR,\n g: FRONT_CLEAR,\n b: FRONT_CLEAR,\n a: FRONT_CLEAR,\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n if (item.kind === \"points\" && item.additive) continue;\n seen.add(item.key);\n draw(frontPass, item, oitPipelines.front[item.kind]);\n }\n frontPass.end();\n\n // blended items, in any order, into the transparency targets\n const transparent = encoder.beginRenderPass({\n colorAttachments: oit.samples.map((texture, i) => ({\n view: texture.createView(),\n resolveTarget: oit.resolved[i]!.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\" as const,\n storeOp: \"discard\" as const,\n })),\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthReadOnly: true,\n },\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n seen.add(item.key);\n draw(transparent, item, oitPipelines[item.kind], oit.frontBindGroup);\n }\n transparent.end();\n\n // their composite over the opaque items, then the lines\n const last = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: screen,\n loadOp: \"load\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthLoadOp: \"load\",\n depthStoreOp: \"discard\",\n },\n });\n last.setPipeline(oitPipelines.composite);\n last.setBindGroup(0, oit.bindGroup);\n last.draw(3);\n for (const item of ordered) {\n if (drawRank(item) < 3) continue;\n seen.add(item.key);\n draw(last, item, pipelineOf(item));\n }\n last.end();\n }\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"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"}
|