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.
Files changed (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. 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 (h, g, _ = !1) => {
6
- let v = typeof navigator < "u" ? navigator.gpu : void 0;
7
- if (!v) return null;
8
- let y = await v.requestAdapter();
9
- if (!y) return null;
10
- let b = y;
11
- if (_ && (b.info?.isFallbackAdapter || b.isFallbackAdapter)) return null;
12
- let x = await y.requestDevice(), S = h.getContext("webgpu");
13
- if (!S) return x.destroy(), null;
14
- let C = v.getPreferredCanvasFormat();
15
- S.configure({
16
- device: x,
17
- format: C,
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 w = !1;
21
- x.lost.then(() => {
22
- w || g();
20
+ let E = !1;
21
+ C.lost.then(() => {
22
+ E || v();
23
23
  });
24
- let T = x.createBindGroupLayout({ entries: [{
24
+ let D = C.createBindGroupLayout({ entries: [{
25
25
  binding: 0,
26
26
  visibility: 3,
27
27
  buffer: { type: "uniform" }
28
- }] }), E = x.createPipelineLayout({ bindGroupLayouts: [T] }), D = {
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
- }, O = {
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: D.alpha
46
- }, k = {
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
- }, A = (e, t, n, r, i = D, a = !1) => {
58
- let o = x.createShaderModule({ code: e });
59
- return x.createRenderPipeline({
60
- layout: E,
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: k
86
+ blend: j
87
+ })) : a === "front" ? [{
88
+ format: h,
89
+ blend: M
75
90
  }] : [{
76
- format: C,
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
- }, j = [{
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
- }], M = [{
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
- }], N = [{
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
- }], P = {
152
- points: [A(o, j, "triangle-strip", !1), A(o, j, "triangle-strip", !0)],
153
- mesh: [A(a, M, "triangle-list", !1), A(a, M, "triangle-list", !0)],
154
- lines: [A(i, N, "triangle-strip", !1), A(i, N, "triangle-strip", !0)]
155
- }, F = null, I = (e) => {
156
- if (e.kind === "points" && e.additive) return F ?? (F = A(o, j, "triangle-strip", !1, O)), F;
157
- let t = P[e.kind];
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
- x.pushErrorScope("validation");
161
- let L = x.createBindGroupLayout({ entries: [0, 1].map((e) => ({
162
- binding: e,
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
- })) }), R = x.createShaderModule({ code: r }), z = {
166
- points: A(o, j, "triangle-strip", !1, D, !0),
167
- mesh: A(a, M, "triangle-list", !1, D, !0),
168
- composite: x.createRenderPipeline({
169
- layout: x.createPipelineLayout({ bindGroupLayouts: [L] }),
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: R,
190
+ module: U,
172
191
  entryPoint: "vs"
173
192
  },
174
193
  fragment: {
175
- module: R,
194
+ module: U,
176
195
  entryPoint: "fs",
177
196
  targets: [{
178
- format: C,
179
- blend: D
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
- }, B = !await x.popErrorScope(), V = null, H = () => {
191
- let e = V?.oit;
192
- e && (e.accum.destroy(), e.extra.destroy(), e.accumResolved.destroy(), e.extraResolved.destroy());
193
- }, U = () => {
194
- let e = h.width, t = h.height;
195
- return V && V.width === e && V.height === t ? V : (V?.color.destroy(), V?.depth.destroy(), H(), V = {
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: x.createTexture({
221
+ color: C.createTexture({
199
222
  size: [e, t],
200
223
  sampleCount: p,
201
- format: C,
224
+ format: T,
202
225
  usage: f
203
226
  }),
204
- depth: x.createTexture({
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
- }, V);
212
- }, W = (e) => {
234
+ }, K);
235
+ }, Y = (e) => {
213
236
  if (e.oit) return e.oit;
214
- let t = (t) => x.createTexture({
237
+ let t = (t, n = m) => C.createTexture({
215
238
  size: [e.width, e.height],
216
239
  sampleCount: t,
217
- format: m,
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
- accum: t(p),
222
- extra: t(p),
223
- accumResolved: n,
224
- extraResolved: r,
225
- bindGroup: x.createBindGroup({
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
- }, G = /* @__PURE__ */ new Map(), K = /* @__PURE__ */ new Float32Array(40), q = (e, t) => {
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 = x.createBuffer({
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 ? x.queue.writeBuffer(r, 0, e.buffer, e.byteOffset, n) : x.queue.writeBuffer(r, 0, e), r;
244
- }, J = (e) => {
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
- }, Y = (e) => {
247
- let t = G.get(e.key);
272
+ }, ee = (e) => {
273
+ let t = X.get(e.key);
248
274
  if (t && t.version === e.version && t.kind === e.kind) {
249
- if (e.kind === "mesh" && t.index && (e.order ?? 0) !== t.order) {
250
- let { indices: n } = e;
251
- x.queue.writeBuffer(t.index, 0, n.buffer, n.byteOffset, n.byteLength), t.order = e.order ?? 0;
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 && J(t);
256
- let n = q(e.kind === "mesh" ? e.vertices : e.data, l), r = e.kind === "mesh" ? q(e.indices, c) : null;
257
- if (t) t.version = e.version, t.kind = e.kind, t.vertex = n, t.index = r, t.order = e.kind === "mesh" ? e.order ?? 0 : 0;
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 = x.createBuffer({
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 === "mesh" ? e.order ?? 0 : 0,
295
+ order: e.kind === "lines" ? 0 : e.order ?? 0,
269
296
  uniform: i,
270
- bindGroup: x.createBindGroup({
271
- layout: T,
297
+ bindGroup: C.createBindGroup({
298
+ layout: D,
272
299
  entries: [{
273
300
  binding: 0,
274
301
  resource: { buffer: i }
275
302
  }]
276
303
  })
277
- }, G.set(e.key, t);
304
+ }, X.set(e.key, t);
278
305
  }
279
306
  return t;
280
307
  };
281
308
  return {
282
309
  kind: "webgpu",
283
- canvas: h,
284
- orderIndependent: B,
310
+ canvas: _,
311
+ orderIndependent: G,
285
312
  resize(e, t) {
286
- h.width = Math.max(1, e), h.height = Math.max(1, t);
313
+ _.width = Math.max(1, e), _.height = Math.max(1, t);
287
314
  },
288
315
  render(n, r) {
289
- if (w) return;
290
- let i = U(), a = e(n), o = B && a.some((e) => t(e) === 2), c = x.createCommandEncoder(), l = S.getCurrentTexture().createView(), u = /* @__PURE__ */ new Set(), d = (e, t, n) => {
291
- let i = t.kind === "mesh" ? t.indices.length : t.count;
292
- if (i <= 0) return;
293
- let a = Y(t);
294
- if (a.vertex) {
295
- if (x.queue.writeBuffer(a.uniform, 0, s(t, r, K)), e.setPipeline(n), e.setBindGroup(0, a.bindGroup), e.setVertexBuffer(0, a.vertex), t.kind === "mesh") {
296
- if (!a.index) return;
297
- e.setIndexBuffer(a.index, "uint32"), e.drawIndexed(i);
298
- } else e.draw(4, i);
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, I(e));
349
+ u.add(e.key), d(f, e, V(e));
323
350
  }
324
351
  if (f.end(), o) {
325
- let e = W(i), n = c.beginRenderPass({
326
- colorAttachments: [{
327
- view: e.accum.createView(),
328
- resolveTarget: e.accumResolved.createView(),
329
- clearValue: {
330
- r: 0,
331
- g: 0,
332
- b: 0,
333
- a: 0
334
- },
335
- loadOp: "clear",
336
- storeOp: "discard"
337
- }, {
338
- view: e.extra.createView(),
339
- resolveTarget: e.extraResolved.createView(),
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 e of a) t(e) === 2 && e.kind !== "lines" && (u.add(e.key), d(n, e, z[e.kind]));
355
- n.end();
356
- let r = c.beginRenderPass({
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
- r.setPipeline(z.composite), r.setBindGroup(0, e.bindGroup), r.draw(3);
370
- for (let e of a) t(e) < 3 || (u.add(e.key), d(r, e, I(e)));
371
- r.end();
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
- x.queue.submit([c.finish()]);
374
- for (let [e, t] of G) u.has(e) || (J(t), t.uniform.destroy(), G.delete(e));
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
- w = !0;
378
- for (let e of G.values()) J(e), e.uniform.destroy();
379
- G.clear(), V?.color.destroy(), V?.depth.destroy(), H(), V = null, S.unconfigure(), x.destroy();
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 { h as createWebGpu3D };
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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"}