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
@@ -51,205 +51,247 @@ var l = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft ba
51
51
  samples: Math.min(n, i || n),
52
52
  orderIndependent: !0
53
53
  };
54
- }, _ = (l, d, h, _ = !1) => {
55
- let v = {
54
+ }, _ = 4, v = (l, d, h, v = !1) => {
55
+ let y = {
56
56
  alpha: !0,
57
57
  premultipliedAlpha: !0,
58
58
  antialias: d === 1,
59
59
  depth: !0,
60
60
  stencil: !1,
61
61
  preserveDrawingBuffer: !1,
62
- failIfMajorPerformanceCaveat: _
63
- }, y = l.getContext(d === 2 ? "webgl2" : "webgl", v);
64
- if (!y) return null;
65
- let b = () => y.getExtension("WEBGL_lose_context")?.loseContext(), x = d === 2 ? y : null;
66
- if (_ && u(y)) return b(), null;
67
- let S = null, C = (e, t) => {
68
- x ? x.vertexAttribDivisor(e, t) : S?.vertexAttribDivisorANGLE(e, t);
69
- }, w = (e) => {
70
- x ? x.drawArraysInstanced(y.TRIANGLE_STRIP, 0, 4, e) : S?.drawArraysInstancedANGLE(y.TRIANGLE_STRIP, 0, 4, e);
71
- }, T = null, E = null, D = {
62
+ failIfMajorPerformanceCaveat: v
63
+ }, b = l.getContext(d === 2 ? "webgl2" : "webgl", y);
64
+ if (!b) return null;
65
+ let x = () => b.getExtension("WEBGL_lose_context")?.loseContext(), S = d === 2 ? b : null;
66
+ if (v && u(b)) return x(), null;
67
+ let C = null, w = (e, t) => {
68
+ S ? S.vertexAttribDivisor(e, t) : C?.vertexAttribDivisorANGLE(e, t);
69
+ }, T = (e) => {
70
+ S ? S.drawArraysInstanced(b.TRIANGLE_STRIP, 0, 4, e) : C?.drawArraysInstancedANGLE(b.TRIANGLE_STRIP, 0, 4, e);
71
+ }, E = null, D = null, O = {
72
72
  samples: 0,
73
73
  orderIndependent: !1
74
- }, O = null, k = null, A = () => {
75
- T = null, E = null, O = null, k = null, S = x ? null : y.getExtension("ANGLE_instanced_arrays");
76
- let e = x ? !0 : !!y.getExtension("OES_element_index_uint");
77
- if (!x && (!S || !e)) return !1;
78
- let t = s(d), n = f(y, t.points, a.points), r = f(y, t.mesh, a.mesh), c = f(y, t.lines, a.lines), l = y.createBuffer();
74
+ }, k = null, A = null, j = () => {
75
+ E = null, D = null, k = null, A = null, C = S ? null : b.getExtension("ANGLE_instanced_arrays");
76
+ let e = S ? !0 : !!b.getExtension("OES_element_index_uint");
77
+ if (!S && (!C || !e)) return !1;
78
+ let t = s(d), n = f(b, t.points, a.points), r = f(b, t.mesh, a.mesh), c = f(b, t.lines, a.lines), l = b.createBuffer();
79
79
  if (!n || !r || !c || !l) return !1;
80
- if (T = {
80
+ if (E = {
81
81
  points: n,
82
82
  mesh: r,
83
83
  lines: c
84
- }, E = l, y.bindBuffer(y.ARRAY_BUFFER, E), y.bufferData(y.ARRAY_BUFFER, p, y.STATIC_DRAW), D = x ? g(x) : {
84
+ }, D = l, b.bindBuffer(b.ARRAY_BUFFER, D), b.bufferData(b.ARRAY_BUFFER, p, b.STATIC_DRAW), O = S ? g(S) : {
85
85
  samples: 0,
86
86
  orderIndependent: !1
87
- }, x && D.orderIndependent) {
88
- let e = o(), t = f(y, e.points, a.points), n = f(y, e.mesh, a.mesh), r = f(y, i, []);
89
- if (t && n && r) O = {
90
- points: t,
91
- mesh: n,
92
- composite: r.program
93
- }, y.useProgram(r.program), y.uniform1i(y.getUniformLocation(r.program, "u_accum"), 0), y.uniform1i(y.getUniformLocation(r.program, "u_extra"), 1);
94
- else for (let e of [
87
+ }, S && O.orderIndependent) {
88
+ let e = o(), t = f(b, e.points, a.points), n = f(b, e.mesh, a.mesh), r = f(b, e.front.points, a.points), s = f(b, e.front.mesh, a.mesh), c = f(b, i, []);
89
+ if (t && n && r && s && c) {
90
+ k = {
91
+ points: t,
92
+ mesh: n,
93
+ front: {
94
+ points: r,
95
+ mesh: s
96
+ },
97
+ composite: c.program
98
+ };
99
+ for (let e of [t, n]) b.useProgram(e.program), b.uniform1i(b.getUniformLocation(e.program, "u_front"), 0);
100
+ b.useProgram(c.program), [
101
+ "u_frontColor",
102
+ "u_accum",
103
+ "u_extra",
104
+ "u_behind"
105
+ ].forEach((e, t) => b.uniform1i(b.getUniformLocation(c.program, e), t));
106
+ } else for (let e of [
95
107
  t,
96
108
  n,
97
- r
98
- ]) e && y.deleteProgram(e.program);
109
+ r,
110
+ s,
111
+ c
112
+ ]) e && b.deleteProgram(e.program);
99
113
  }
100
114
  return !0;
101
115
  };
102
- if (!A()) return b(), null;
103
- let j = (e) => {
116
+ if (!j()) return x(), null;
117
+ let M = (e) => {
104
118
  if (e.oit) {
105
- y.deleteFramebuffer(e.oit.fbo);
106
- for (let t of e.oit.buffers) y.deleteRenderbuffer(t);
107
- for (let t of e.oit.resolved) y.deleteFramebuffer(t);
108
- for (let t of e.oit.textures) y.deleteTexture(t);
109
- e.oit = null;
119
+ b.deleteFramebuffer(e.oit.fbo);
120
+ for (let t of e.oit.buffers) b.deleteRenderbuffer(t);
121
+ for (let t of e.oit.resolved) b.deleteFramebuffer(t);
122
+ for (let t of e.oit.textures) b.deleteTexture(t);
123
+ b.deleteFramebuffer(e.oit.frontFbo), b.deleteTexture(e.oit.frontDepth), e.oit = null;
110
124
  }
111
- }, M = () => {
112
- k && (j(k), y.deleteFramebuffer(k.main), y.deleteRenderbuffer(k.color), y.deleteRenderbuffer(k.depth), k = null);
113
- }, N = (e, t, n) => {
114
- let r = y.createRenderbuffer();
115
- return !x || !r ? r : (y.bindRenderbuffer(y.RENDERBUFFER, r), D.samples > 1 ? x.renderbufferStorageMultisample(y.RENDERBUFFER, D.samples, e, t, n) : y.renderbufferStorage(y.RENDERBUFFER, e, t, n), r);
116
- }, P = () => y.checkFramebufferStatus(y.FRAMEBUFFER) === y.FRAMEBUFFER_COMPLETE, F = () => {
117
- if (!x) return null;
125
+ }, N = () => {
126
+ A && (M(A), b.deleteFramebuffer(A.main), b.deleteRenderbuffer(A.color), b.deleteRenderbuffer(A.depth), A = null);
127
+ }, P = (e, t, n) => {
128
+ let r = b.createRenderbuffer();
129
+ return !S || !r ? r : (b.bindRenderbuffer(b.RENDERBUFFER, r), O.samples > 1 ? S.renderbufferStorageMultisample(b.RENDERBUFFER, O.samples, e, t, n) : b.renderbufferStorage(b.RENDERBUFFER, e, t, n), r);
130
+ }, F = () => b.checkFramebufferStatus(b.FRAMEBUFFER) === b.FRAMEBUFFER_COMPLETE, I = () => {
131
+ if (!S) return null;
118
132
  let { width: e, height: t } = l;
119
- if (k?.width === e && k.height === t) return k;
120
- M();
121
- let n = y.createFramebuffer(), r = N(x.RGBA8, e, t), i = N(x.DEPTH_COMPONENT24, e, t);
122
- return !n || !r || !i ? null : (y.bindFramebuffer(y.FRAMEBUFFER, n), y.framebufferRenderbuffer(y.FRAMEBUFFER, y.COLOR_ATTACHMENT0, y.RENDERBUFFER, r), y.framebufferRenderbuffer(y.FRAMEBUFFER, y.DEPTH_ATTACHMENT, y.RENDERBUFFER, i), k = {
133
+ if (A?.width === e && A.height === t) return A;
134
+ N();
135
+ let n = b.createFramebuffer(), r = P(S.RGBA8, e, t), i = P(S.DEPTH_COMPONENT24, e, t);
136
+ return !n || !r || !i ? null : (b.bindFramebuffer(b.FRAMEBUFFER, n), b.framebufferRenderbuffer(b.FRAMEBUFFER, b.COLOR_ATTACHMENT0, b.RENDERBUFFER, r), b.framebufferRenderbuffer(b.FRAMEBUFFER, b.DEPTH_ATTACHMENT, b.RENDERBUFFER, i), A = {
123
137
  width: e,
124
138
  height: t,
125
139
  main: n,
126
140
  color: r,
127
141
  depth: i,
128
142
  oit: null
129
- }, P() ? k : (M(), null));
130
- }, I = (e) => {
131
- if (e.oit || !x) return e.oit;
132
- let { width: t, height: n } = e, r = y.createFramebuffer(), i = N(x.RGBA16F, t, n), a = N(x.RGBA16F, t, n), o = [y.createFramebuffer(), y.createFramebuffer()], s = [y.createTexture(), y.createTexture()], [c, l] = o, [u, d] = s;
133
- if (!r || !i || !a || !c || !l || !u || !d) return null;
134
- e.oit = {
143
+ }, F() ? A : (N(), null));
144
+ }, L = (e) => {
145
+ if (e.oit || !S) return e.oit;
146
+ let { width: t, height: n } = e, r = b.createFramebuffer(), i = b.createFramebuffer(), a = b.createTexture(), o = [], s = [], c = [];
147
+ for (let e = 0; e < _; e++) {
148
+ let e = P(S.RGBA16F, t, n), r = b.createFramebuffer(), i = b.createTexture();
149
+ e && o.push(e), r && s.push(r), i && c.push(i);
150
+ }
151
+ if (e.oit = {
135
152
  fbo: r,
136
- buffers: [i, a],
137
- resolved: [c, l],
138
- textures: [u, d]
139
- }, y.bindFramebuffer(y.FRAMEBUFFER, r), y.framebufferRenderbuffer(y.FRAMEBUFFER, y.COLOR_ATTACHMENT0, y.RENDERBUFFER, i), y.framebufferRenderbuffer(y.FRAMEBUFFER, x.COLOR_ATTACHMENT1, y.RENDERBUFFER, a), y.framebufferRenderbuffer(y.FRAMEBUFFER, y.DEPTH_ATTACHMENT, y.RENDERBUFFER, e.depth), x.drawBuffers([y.COLOR_ATTACHMENT0, x.COLOR_ATTACHMENT1]);
140
- let f = P();
141
- return e.oit.textures.forEach((r, i) => {
142
- y.bindTexture(y.TEXTURE_2D, r), x.texStorage2D(y.TEXTURE_2D, 1, x.RGBA16F, t, n), y.texParameteri(y.TEXTURE_2D, y.TEXTURE_MIN_FILTER, y.NEAREST), y.texParameteri(y.TEXTURE_2D, y.TEXTURE_MAG_FILTER, y.NEAREST), y.bindFramebuffer(y.FRAMEBUFFER, e.oit.resolved[i]), y.framebufferTexture2D(y.FRAMEBUFFER, y.COLOR_ATTACHMENT0, y.TEXTURE_2D, r, 0), f && (f = P());
143
- }), y.bindTexture(y.TEXTURE_2D, null), f || (j(e), O = null), e.oit;
144
- }, L = !1, R = null, z = /* @__PURE__ */ new Map(), B = e(l, y, {
153
+ buffers: o,
154
+ resolved: s,
155
+ textures: c,
156
+ frontFbo: i,
157
+ frontDepth: a
158
+ }, !r || !i || !a || o.length < _ || s.length < _ || c.length < _) return M(e), k = null, null;
159
+ let l = o.map((e, t) => b.COLOR_ATTACHMENT0 + t);
160
+ b.bindFramebuffer(b.FRAMEBUFFER, r), o.forEach((e, t) => b.framebufferRenderbuffer(b.FRAMEBUFFER, l[t], b.RENDERBUFFER, e)), b.framebufferRenderbuffer(b.FRAMEBUFFER, b.DEPTH_ATTACHMENT, b.RENDERBUFFER, e.depth), S.drawBuffers(l);
161
+ let u = F(), d = (e, r, i) => {
162
+ b.bindTexture(b.TEXTURE_2D, r), S.texStorage2D(b.TEXTURE_2D, 1, i, t, n), b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MIN_FILTER, b.NEAREST), b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MAG_FILTER, b.NEAREST), b.bindFramebuffer(b.FRAMEBUFFER, e), b.framebufferTexture2D(b.FRAMEBUFFER, b.COLOR_ATTACHMENT0, b.TEXTURE_2D, r, 0), u && (u = F());
163
+ };
164
+ return c.forEach((e, t) => d(s[t], e, S.RGBA16F)), d(i, a, S.R16F), b.bindTexture(b.TEXTURE_2D, null), u || (M(e), k = null), e.oit;
165
+ }, R = !1, z = null, B = /* @__PURE__ */ new Map(), V = e(l, b, {
145
166
  suspend: () => {
146
- z.clear(), T = null, O = null, E = null, k = null;
167
+ B.clear(), E = null, k = null, D = null, A = null;
147
168
  },
148
169
  restore: () => {
149
- L || (A() ? R && q(R.items, R.frame) : (L = !0, h()));
170
+ R || (j() ? z && J(z.items, z.frame) : (R = !0, h()));
150
171
  },
151
172
  lost: () => {
152
- L = !0, h();
173
+ R = !0, h();
174
+ }
175
+ }), H = /* @__PURE__ */ new Float32Array(40), U = (e, t, n, r, i, a) => {
176
+ b.enableVertexAttribArray(e), b.vertexAttribPointer(e, t, n, n === b.UNSIGNED_BYTE, r, i), w(e, +!!a);
177
+ }, W = (e, t, n) => {
178
+ let r = b.FLOAT, i = b.UNSIGNED_BYTE, a;
179
+ if (e.kind === "mesh") b.bindBuffer(b.ARRAY_BUFFER, t.vertex), U(0, 3, r, 28, 0, !1), U(1, 3, r, 28, 12, !1), U(2, 4, i, 28, 24, !1), a = 3;
180
+ else {
181
+ if (b.bindBuffer(b.ARRAY_BUFFER, D), U(0, 2, r, 0, 0, !1), b.bindBuffer(b.ARRAY_BUFFER, t.vertex), e.kind === "points") {
182
+ let e = n * 20;
183
+ U(1, 3, r, 20, e, !0), U(2, 1, r, 20, e + 12, !0), U(3, 4, i, 20, e + 16, !0);
184
+ } else U(1, 3, r, 28, 0, !0), U(2, 3, r, 28, 12, !0), U(3, 4, i, 28, 24, !0);
185
+ a = 4;
153
186
  }
154
- }), V = /* @__PURE__ */ new Float32Array(40), H = (e, t, n, r, i, a) => {
155
- y.enableVertexAttribArray(e), y.vertexAttribPointer(e, t, n, n === y.UNSIGNED_BYTE, r, i), C(e, +!!a);
156
- }, U = (e, t) => {
157
- let n = y.FLOAT, r = y.UNSIGNED_BYTE, i;
158
- e.kind === "mesh" ? (y.bindBuffer(y.ARRAY_BUFFER, t.vertex), H(0, 3, n, 28, 0, !1), H(1, 3, n, 28, 12, !1), H(2, 4, r, 28, 24, !1), i = 3) : (y.bindBuffer(y.ARRAY_BUFFER, E), H(0, 2, n, 0, 0, !1), y.bindBuffer(y.ARRAY_BUFFER, t.vertex), e.kind === "points" ? (H(1, 3, n, 20, 0, !0), H(2, 1, n, 20, 12, !0), H(3, 4, r, 20, 16, !0)) : (H(1, 3, n, 28, 0, !0), H(2, 3, n, 28, 12, !0), H(3, 4, r, 28, 24, !0)), i = 4);
159
- for (let e = i; e < m; e++) y.disableVertexAttribArray(e), C(e, 0);
160
- }, W = (e) => {
161
- let t = z.get(e.key);
162
- if (t && t.version === e.version && t.kind === e.kind) return e.kind === "mesh" && t.index && (e.order ?? 0) !== t.order && (y.bindBuffer(y.ELEMENT_ARRAY_BUFFER, t.index), y.bufferSubData(y.ELEMENT_ARRAY_BUFFER, 0, e.indices), t.order = e.order ?? 0), t;
163
- t && (y.deleteBuffer(t.vertex), t.index && y.deleteBuffer(t.index), z.delete(e.key));
164
- let n = y.createBuffer();
187
+ for (let e = a; e < m; e++) b.disableVertexAttribArray(e), w(e, 0);
188
+ }, G = (e) => {
189
+ let t = B.get(e.key);
190
+ if (t && t.version === e.version && t.kind === e.kind) {
191
+ let n = e.kind === "lines" ? 0 : e.order ?? 0;
192
+ return e.kind !== "lines" && n !== t.order && (e.kind === "mesh" && t.index ? (b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, t.index), b.bufferSubData(b.ELEMENT_ARRAY_BUFFER, 0, e.indices)) : e.kind === "points" && (b.bindBuffer(b.ARRAY_BUFFER, t.vertex), b.bufferSubData(b.ARRAY_BUFFER, 0, e.data)), t.order = n), t;
193
+ }
194
+ t && (b.deleteBuffer(t.vertex), t.index && b.deleteBuffer(t.index), B.delete(e.key));
195
+ let n = b.createBuffer();
165
196
  if (!n) return null;
166
- y.bindBuffer(y.ARRAY_BUFFER, n), y.bufferData(y.ARRAY_BUFFER, e.kind === "mesh" ? e.vertices : e.data, y.STATIC_DRAW);
197
+ b.bindBuffer(b.ARRAY_BUFFER, n), b.bufferData(b.ARRAY_BUFFER, e.kind === "mesh" ? e.vertices : e.data, e.kind === "points" && e.order !== void 0 ? b.DYNAMIC_DRAW : b.STATIC_DRAW);
167
198
  let r = null;
168
199
  if (e.kind === "mesh") {
169
- if (r = y.createBuffer(), !r) return y.deleteBuffer(n), null;
170
- y.bindBuffer(y.ELEMENT_ARRAY_BUFFER, r), y.bufferData(y.ELEMENT_ARRAY_BUFFER, e.indices, e.order === void 0 ? y.STATIC_DRAW : y.DYNAMIC_DRAW);
200
+ if (r = b.createBuffer(), !r) return b.deleteBuffer(n), null;
201
+ b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, r), b.bufferData(b.ELEMENT_ARRAY_BUFFER, e.indices, e.order === void 0 ? b.STATIC_DRAW : b.DYNAMIC_DRAW);
171
202
  }
172
203
  let i = {
173
204
  version: e.version,
174
205
  kind: e.kind,
175
206
  vertex: n,
176
207
  index: r,
177
- order: e.kind === "mesh" ? e.order ?? 0 : 0
208
+ order: e.kind === "lines" ? 0 : e.order ?? 0
178
209
  };
179
- return z.set(e.key, i), i;
180
- }, G = (e, t, n, r) => {
210
+ return B.set(e.key, i), i;
211
+ }, K = (e, t, n, r) => {
181
212
  r.add(e.key);
182
- let i = e.kind === "mesh" ? e.indices.length : e.count;
183
- if (i <= 0) return;
184
- let a = W(e);
185
- if (!a) return;
186
- y.useProgram(t.program);
187
- let o = c(e, n, V), s = t.uniforms;
188
- y.uniformMatrix4fv(s.u_viewProj, !1, o.subarray(0, 16)), y.uniform4fv(s.u_viewport, o.subarray(16, 20)), y.uniform4fv(s.u_eye, o.subarray(20, 24)), y.uniform4fv(s.u_light, o.subarray(24, 28)), y.uniform4fv(s.u_material, o.subarray(28, 32)), y.uniform4fv(s.u_params, o.subarray(32, 36)), y.uniform4fv(s.u_fog, o.subarray(36, 40)), U(e, a), e.kind === "mesh" ? (y.bindBuffer(y.ELEMENT_ARRAY_BUFFER, a.index), y.drawElements(y.TRIANGLES, i, y.UNSIGNED_INT, 0)) : w(i);
189
- }, K = (e, t, n, r, i) => {
190
- if (!x || !O) return;
191
- let { width: a, height: o } = e;
192
- y.bindFramebuffer(y.FRAMEBUFFER, t.fbo), x.clearBufferfv(x.COLOR, 0, [
193
- 0,
194
- 0,
195
- 0,
196
- 0
197
- ]), x.clearBufferfv(x.COLOR, 1, [
213
+ let i = e.kind === "mesh" ? e.indices.length : e.count, a = e.kind === "lines" ? void 0 : e.range, o = a ? Math.max(0, Math.min(i, a.first)) : 0, s = a ? Math.max(0, Math.min(i - o, a.count)) : i;
214
+ if (s <= 0) return;
215
+ let l = G(e);
216
+ if (!l) return;
217
+ b.useProgram(t.program);
218
+ let u = c(e, n, H), d = t.uniforms;
219
+ b.uniformMatrix4fv(d.u_viewProj, !1, u.subarray(0, 16)), b.uniform4fv(d.u_viewport, u.subarray(16, 20)), b.uniform4fv(d.u_eye, u.subarray(20, 24)), b.uniform4fv(d.u_light, u.subarray(24, 28)), b.uniform4fv(d.u_material, u.subarray(28, 32)), b.uniform4fv(d.u_params, u.subarray(32, 36)), b.uniform4fv(d.u_fog, u.subarray(36, 40)), W(e, l, e.kind === "points" ? o : 0), e.kind === "mesh" ? (b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, l.index), b.drawElements(b.TRIANGLES, s, b.UNSIGNED_INT, o * 4)) : T(s);
220
+ }, q = (e, t, n, r, i) => {
221
+ if (!S || !k) return;
222
+ let { width: a, height: o } = e, s = () => {
223
+ for (let e = 3; e >= 0; e--) b.activeTexture(b.TEXTURE0 + e), b.bindTexture(b.TEXTURE_2D, null);
224
+ };
225
+ b.bindFramebuffer(b.FRAMEBUFFER, t.frontFbo), S.clearBufferfv(S.COLOR, 0, [
226
+ 4,
227
+ 4,
228
+ 4,
229
+ 4
230
+ ]);
231
+ let c = n.filter((e) => e.kind !== "lines" && !(e.kind === "points" && e.additive));
232
+ if (b.depthMask(!1), c.length) {
233
+ b.disable(b.DEPTH_TEST), S.blendEquation(S.MIN), b.blendFunc(b.ONE, b.ONE);
234
+ for (let e of c) e.kind !== "lines" && K(e, k.front[e.kind], r, i);
235
+ S.blendEquation(b.FUNC_ADD), b.enable(b.DEPTH_TEST);
236
+ }
237
+ b.bindFramebuffer(b.FRAMEBUFFER, t.fbo);
238
+ for (let e = 0; e < _; e++) S.clearBufferfv(S.COLOR, e, [
198
239
  0,
199
240
  0,
200
241
  0,
201
242
  0
202
- ]), y.depthMask(!1), y.blendFunc(y.ONE, y.ONE);
203
- for (let e of n) e.kind !== "lines" && G(e, O[e.kind], r, i);
204
- y.bindFramebuffer(x.READ_FRAMEBUFFER, t.fbo), t.resolved.forEach((e, t) => {
205
- x.readBuffer(t === 0 ? y.COLOR_ATTACHMENT0 : x.COLOR_ATTACHMENT1), y.bindFramebuffer(x.DRAW_FRAMEBUFFER, e), x.blitFramebuffer(0, 0, a, o, 0, 0, a, o, y.COLOR_BUFFER_BIT, y.NEAREST);
206
- }), y.bindFramebuffer(y.FRAMEBUFFER, e.main), y.blendFunc(y.ONE, y.ONE_MINUS_SRC_ALPHA), y.disable(y.DEPTH_TEST);
207
- for (let e = 0; e < m; e++) y.disableVertexAttribArray(e), C(e, 0);
208
- y.useProgram(O.composite), t.textures.forEach((e, t) => {
209
- y.activeTexture(y.TEXTURE0 + t), y.bindTexture(y.TEXTURE_2D, e);
210
- }), y.drawArrays(y.TRIANGLES, 0, 3), y.bindTexture(y.TEXTURE_2D, null), y.activeTexture(y.TEXTURE0), y.bindTexture(y.TEXTURE_2D, null), y.enable(y.DEPTH_TEST);
211
- }, q = (e, i) => {
212
- let a = T;
243
+ ]);
244
+ b.blendFunc(b.ONE, b.ONE), b.activeTexture(b.TEXTURE0), b.bindTexture(b.TEXTURE_2D, t.frontDepth);
245
+ for (let e of n) e.kind !== "lines" && K(e, k[e.kind], r, i);
246
+ b.bindTexture(b.TEXTURE_2D, null), b.bindFramebuffer(S.READ_FRAMEBUFFER, t.fbo), t.resolved.forEach((e, t) => {
247
+ S.readBuffer(b.COLOR_ATTACHMENT0 + t), b.bindFramebuffer(S.DRAW_FRAMEBUFFER, e), S.blitFramebuffer(0, 0, a, o, 0, 0, a, o, b.COLOR_BUFFER_BIT, b.NEAREST);
248
+ }), b.bindFramebuffer(b.FRAMEBUFFER, e.main), b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA), b.disable(b.DEPTH_TEST);
249
+ for (let e = 0; e < m; e++) b.disableVertexAttribArray(e), w(e, 0);
250
+ b.useProgram(k.composite), t.textures.forEach((e, t) => {
251
+ b.activeTexture(b.TEXTURE0 + t), b.bindTexture(b.TEXTURE_2D, e);
252
+ }), b.drawArrays(b.TRIANGLES, 0, 3), s(), b.enable(b.DEPTH_TEST);
253
+ }, J = (e, i) => {
254
+ let a = E;
213
255
  if (!a) return;
214
- let o = F();
215
- y.bindFramebuffer(y.FRAMEBUFFER, o ? o.main : null), y.viewport(0, 0, l.width, l.height), y.clearColor(0, 0, 0, 0), y.clearDepth(1), y.depthMask(!0), y.clear(y.COLOR_BUFFER_BIT | y.DEPTH_BUFFER_BIT), y.enable(y.BLEND), y.blendFunc(y.ONE, y.ONE_MINUS_SRC_ALPHA), y.enable(y.DEPTH_TEST), y.depthFunc(y.LEQUAL), y.disable(y.CULL_FACE);
216
- let s = /* @__PURE__ */ new Set(), c = t(e), u = c.filter((e) => n(e) === 2), d = o && O && u.length > 0 ? I(o) : null, f = !1, p = !d;
256
+ let o = I();
257
+ b.bindFramebuffer(b.FRAMEBUFFER, o ? o.main : null), b.viewport(0, 0, l.width, l.height), b.clearColor(0, 0, 0, 0), b.clearDepth(1), b.depthMask(!0), b.clear(b.COLOR_BUFFER_BIT | b.DEPTH_BUFFER_BIT), b.enable(b.BLEND), b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA), b.enable(b.DEPTH_TEST), b.depthFunc(b.LEQUAL), b.disable(b.CULL_FACE);
258
+ let s = /* @__PURE__ */ new Set(), c = t(e), u = c.filter((e) => n(e) === 2), d = o && k && u.length > 0 ? L(o) : null, f = !1, p = !d;
217
259
  for (let e of c) {
218
260
  let t = n(e);
219
261
  if (d && t === 2) continue;
220
- o && d && t === 3 && !p && (K(o, d, u, i, s), p = !0, f = !1), y.depthMask(r(e));
262
+ o && d && t === 3 && !p && (q(o, d, u, i, s), p = !0, f = !1), b.depthMask(r(e));
221
263
  let c = e.kind === "points" && !!e.additive;
222
- c !== f && (c ? y.blendFuncSeparate(y.ONE, y.ONE, y.ONE, y.ONE_MINUS_SRC_ALPHA) : y.blendFunc(y.ONE, y.ONE_MINUS_SRC_ALPHA), f = c), G(e, a[e.kind], i, s);
264
+ c !== f && (c ? b.blendFuncSeparate(b.ONE, b.ONE_MINUS_SRC_COLOR, b.ONE, b.ONE_MINUS_SRC_ALPHA) : b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA), f = c), K(e, a[e.kind], i, s);
223
265
  }
224
- o && d && !p && (K(o, d, u, i, s), f = !1), y.depthMask(!0), f && y.blendFunc(y.ONE, y.ONE_MINUS_SRC_ALPHA), o && x && (y.bindFramebuffer(x.READ_FRAMEBUFFER, o.main), y.bindFramebuffer(x.DRAW_FRAMEBUFFER, null), x.blitFramebuffer(0, 0, o.width, o.height, 0, 0, o.width, o.height, y.COLOR_BUFFER_BIT, y.NEAREST), y.bindFramebuffer(y.FRAMEBUFFER, null));
225
- for (let [e, t] of z) s.has(e) || (y.deleteBuffer(t.vertex), t.index && y.deleteBuffer(t.index), z.delete(e));
266
+ o && d && !p && (q(o, d, u, i, s), f = !1), b.depthMask(!0), f && b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA), o && S && (b.bindFramebuffer(S.READ_FRAMEBUFFER, o.main), b.bindFramebuffer(S.DRAW_FRAMEBUFFER, null), S.blitFramebuffer(0, 0, o.width, o.height, 0, 0, o.width, o.height, b.COLOR_BUFFER_BIT, b.NEAREST), b.bindFramebuffer(b.FRAMEBUFFER, null));
267
+ for (let [e, t] of B) s.has(e) || (b.deleteBuffer(t.vertex), t.index && b.deleteBuffer(t.index), B.delete(e));
226
268
  };
227
269
  return {
228
270
  kind: d === 2 ? "webgl2" : "webgl",
229
271
  canvas: l,
230
272
  get orderIndependent() {
231
- return !!O;
273
+ return !!k;
232
274
  },
233
275
  resize(e, t) {
234
276
  l.width = Math.max(1, e), l.height = Math.max(1, t);
235
277
  },
236
278
  render(e, t) {
237
- R = {
279
+ z = {
238
280
  items: e,
239
281
  frame: t
240
- }, !(L || !B.use() || y.isContextLost()) && q(e, t);
282
+ }, !(R || !V.use() || b.isContextLost()) && J(e, t);
241
283
  },
242
284
  destroy() {
243
- if (B.release(), R = null, !y.isContextLost()) {
244
- for (let e of z.values()) y.deleteBuffer(e.vertex), e.index && y.deleteBuffer(e.index);
245
- for (let e of Object.values(T ?? {})) y.deleteProgram(e.program);
246
- O && (y.deleteProgram(O.points.program), y.deleteProgram(O.mesh.program), y.deleteProgram(O.composite)), M(), y.deleteBuffer(E);
285
+ if (V.release(), z = null, !b.isContextLost()) {
286
+ for (let e of B.values()) b.deleteBuffer(e.vertex), e.index && b.deleteBuffer(e.index);
287
+ for (let e of Object.values(E ?? {})) b.deleteProgram(e.program);
288
+ k && (b.deleteProgram(k.points.program), b.deleteProgram(k.mesh.program), b.deleteProgram(k.front.points.program), b.deleteProgram(k.front.mesh.program), b.deleteProgram(k.composite)), N(), b.deleteBuffer(D);
247
289
  }
248
- O = null, T = null, E = null, k = null, z.clear(), b();
290
+ k = null, E = null, D = null, A = null, B.clear(), x();
249
291
  }
250
292
  };
251
293
  };
252
294
  //#endregion
253
- export { l as SOFTWARE_RENDERER, _ as createWebGl3D, u as isSoftwareRenderer, g as webGl2Capabilities };
295
+ export { l as SOFTWARE_RENDERER, v as createWebGl3D, u as isSoftwareRenderer, g as webGl2Capabilities };
254
296
 
255
297
  //# sourceMappingURL=webgl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgl.js","names":["SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","MAX_SAMPLES","webGl2Capabilities","max","samples","counts","floatMax","createWebGl3D","version","requireHardware","canvas","loseContext","gl2","angle","divisor","location","value","drawInstanced","count","programs","corners","capabilities","oitPrograms","framebuffers","build","uint","sources","glslPrograms","points","GLSL_ATTRIBUTES","mesh","lines","buffer","oit","glslOitPrograms","p","m","c","GLSL_COMPOSITE","deleteOit","fb","b","f","deleteFramebuffers","renderbuffer","rb","format","width","height","complete","mainFramebuffer","main","color","depth","oitFramebuffers","fbo","accum","extra","resolved","textures","r0","r1","t0","t1","ok","texture","lost","last","resources","slot","claimGlSlot","renderFrame","onLost","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","upload","existing","vertex","index","draw","u","itemUniforms","frame","loc","drawTransparent","blended","seen","target","progs","ordered","drawOrder","items","drawRank","additive","composited","rank","writesDepth","add","key"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n//\n// WebGL2 draws into its own multisampled framebuffer, blitted to the canvas.\n// With EXT_color_buffer_float (multisampled RGBA16F), the blended items go\n// through the weighted blended order-independent transparency (`oit.ts`):\n// opaque items, then the blended ones into two float targets sharing the\n// depth buffer (resolved into textures by blits), their composite, then the\n// lines. Otherwise (and on WebGL 1) the blended items are drawn sorted.\n//\n// The context is part of the page-wide budget (`gl-budget.ts`): when it is\n// suspended off-screen, its GPU objects go; the restore builds the programs\n// again (the framebuffers and buffers follow lazily) and redraws the last\n// frame. A suspension is not a loss: only real losses reach `onLost`.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { claimGlSlot } from \"../renderers/gl-budget\";\nimport { GLSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Frame3D,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslOitPrograms,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\nconst MAX_SAMPLES = 4;\n\n/**\n * Samples of the WebGL2 framebuffers and whether the order-independent\n * transparency is possible: float color buffers (EXT_color_buffer_float)\n * that can be multisampled as much as the color\n */\nexport const webGl2Capabilities = (\n gl: WebGL2RenderingContext,\n): { samples: number; orderIndependent: boolean } => {\n const max = Number(gl.getParameter(gl.MAX_SAMPLES)) || 0;\n const samples = Math.max(0, Math.min(MAX_SAMPLES, max));\n if (!gl.getExtension(\"EXT_color_buffer_float\"))\n return { samples, orderIndependent: false };\n const counts = gl.getInternalformatParameter(\n gl.RENDERBUFFER,\n gl.RGBA16F,\n gl.SAMPLES,\n ) as ArrayLike<number> | null;\n let floatMax = 0;\n for (let i = 0; i < (counts?.length ?? 0); i++)\n floatMax = Math.max(floatMax, counts?.[i] ?? 0);\n // single-sampled framebuffers: any float support is enough\n if (samples > 1 && floatMax < 2) return { samples, orderIndependent: false };\n return {\n samples: Math.min(samples, floatMax || samples),\n orderIndependent: true,\n };\n};\n\ninterface Framebuffers {\n width: number;\n height: number;\n main: WebGLFramebuffer;\n color: WebGLRenderbuffer;\n depth: WebGLRenderbuffer;\n /** Transparency targets, created on first use */\n oit: {\n fbo: WebGLFramebuffer;\n buffers: [WebGLRenderbuffer, WebGLRenderbuffer];\n resolved: [WebGLFramebuffer, WebGLFramebuffer];\n textures: [WebGLTexture, WebGLTexture];\n } | null;\n}\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n // WebGL2 multisamples its own framebuffer\n antialias: version === 1,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n loseContext();\n return null;\n }\n let angle: ANGLE_instanced_arrays | null = null;\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n let programs: Record<Item3D[\"kind\"], Program> | null = null;\n let corners: WebGLBuffer | null = null;\n let capabilities = { samples: 0, orderIndependent: false };\n let oitPrograms: {\n points: Program;\n mesh: Program;\n composite: WebGLProgram;\n } | null = null;\n let framebuffers: Framebuffers | null = null;\n\n /**\n * Extensions, programs, the corner buffer and the transparency programs:\n * at creation and again after a restore (GL objects and extension objects\n * don't survive the context). False when the context can't draw.\n */\n const build = (): boolean => {\n programs = null;\n corners = null;\n oitPrograms = null;\n // recreated lazily at the next draw\n framebuffers = null;\n angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (!gl2 && (!angle || !uint)) return false;\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const buffer = gl.createBuffer();\n if (!points || !mesh || !lines || !buffer) return false;\n programs = { points, mesh, lines };\n corners = buffer;\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n // order-independent transparency (WebGL2 with float color buffers)\n capabilities = gl2\n ? webGl2Capabilities(gl2)\n : { samples: 0, orderIndependent: false };\n if (gl2 && capabilities.orderIndependent) {\n const oit = glslOitPrograms();\n const p = compile(gl, oit.points, GLSL_ATTRIBUTES.points);\n const m = compile(gl, oit.mesh, GLSL_ATTRIBUTES.mesh);\n const c = compile(gl, GLSL_COMPOSITE, []);\n if (p && m && c) {\n oitPrograms = { points: p, mesh: m, composite: c.program };\n gl.useProgram(c.program);\n gl.uniform1i(gl.getUniformLocation(c.program, \"u_accum\"), 0);\n gl.uniform1i(gl.getUniformLocation(c.program, \"u_extra\"), 1);\n } else {\n for (const program of [p, m, c])\n if (program) gl.deleteProgram(program.program);\n }\n }\n return true;\n };\n if (!build()) {\n loseContext();\n return null;\n }\n const deleteOit = (fb: Framebuffers) => {\n if (!fb.oit) return;\n gl.deleteFramebuffer(fb.oit.fbo);\n for (const b of fb.oit.buffers) gl.deleteRenderbuffer(b);\n for (const f of fb.oit.resolved) gl.deleteFramebuffer(f);\n for (const t of fb.oit.textures) gl.deleteTexture(t);\n fb.oit = null;\n };\n const deleteFramebuffers = () => {\n if (!framebuffers) return;\n deleteOit(framebuffers);\n gl.deleteFramebuffer(framebuffers.main);\n gl.deleteRenderbuffer(framebuffers.color);\n gl.deleteRenderbuffer(framebuffers.depth);\n framebuffers = null;\n };\n const renderbuffer = (format: number, width: number, height: number) => {\n const rb = gl.createRenderbuffer();\n if (!gl2 || !rb) return rb;\n gl.bindRenderbuffer(gl.RENDERBUFFER, rb);\n if (capabilities.samples > 1)\n gl2.renderbufferStorageMultisample(\n gl.RENDERBUFFER,\n capabilities.samples,\n format,\n width,\n height,\n );\n else gl.renderbufferStorage(gl.RENDERBUFFER, format, width, height);\n return rb;\n };\n const complete = () =>\n gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n /** The multisampled framebuffer of WebGL2 (null: draw into the canvas) */\n const mainFramebuffer = (): Framebuffers | null => {\n if (!gl2) return null;\n const { width, height } = canvas;\n if (framebuffers?.width === width && framebuffers.height === height)\n return framebuffers;\n deleteFramebuffers();\n const main = gl.createFramebuffer();\n const color = renderbuffer(gl2.RGBA8, width, height);\n const depth = renderbuffer(gl2.DEPTH_COMPONENT24, width, height);\n if (!main || !color || !depth) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, main);\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.RENDERBUFFER,\n color,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n depth,\n );\n framebuffers = { width, height, main, color, depth, oit: null };\n if (!complete()) {\n deleteFramebuffers();\n return null;\n }\n return framebuffers;\n };\n /** The transparency targets sharing the depth of `fb` */\n const oitFramebuffers = (fb: Framebuffers) => {\n if (fb.oit || !gl2) return fb.oit;\n const { width, height } = fb;\n const fbo = gl.createFramebuffer();\n const accum = renderbuffer(gl2.RGBA16F, width, height);\n const extra = renderbuffer(gl2.RGBA16F, width, height);\n const resolved = [gl.createFramebuffer(), gl.createFramebuffer()];\n const textures = [gl.createTexture(), gl.createTexture()];\n const [r0, r1] = resolved;\n const [t0, t1] = textures;\n if (!fbo || !accum || !extra || !r0 || !r1 || !t0 || !t1) return null;\n fb.oit = {\n fbo,\n buffers: [accum, extra],\n resolved: [r0, r1],\n textures: [t0, t1],\n };\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.RENDERBUFFER,\n accum,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl2.COLOR_ATTACHMENT1,\n gl.RENDERBUFFER,\n extra,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n fb.depth,\n );\n gl2.drawBuffers([gl.COLOR_ATTACHMENT0, gl2.COLOR_ATTACHMENT1]);\n let ok = complete();\n fb.oit.textures.forEach((texture, i) => {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl2.texStorage2D(gl.TEXTURE_2D, 1, gl2.RGBA16F, width, height);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb.oit!.resolved[i]!);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0,\n );\n ok &&= complete();\n });\n gl.bindTexture(gl.TEXTURE_2D, null);\n if (!ok) {\n deleteOit(fb);\n oitPrograms = null;\n }\n return fb.oit;\n };\n\n let lost = false;\n let last: { items: readonly Item3D[]; frame: Frame3D } | null = null;\n const resources = new Map<string, ItemResources>();\n // past the page-wide context budget, the context may be suspended while\n // off-screen (not a failure): its GPU objects go, and come back with the\n // context, which then redraws its last frame\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => {\n resources.clear();\n programs = null;\n oitPrograms = null;\n corners = null;\n framebuffers = null;\n },\n restore: () => {\n if (lost) return;\n if (!build()) {\n lost = true;\n onLost();\n } else if (last) renderFrame(last.items, last.frame);\n },\n lost: () => {\n lost = true;\n onLost();\n },\n });\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n attribute(1, 3, F, POINT_STRIDE, 0, true);\n attribute(2, 1, F, POINT_STRIDE, 12, true);\n attribute(3, 4, U8, POINT_STRIDE, 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n existing.index &&\n (item.order ?? 0) !== existing.order\n ) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n existing.order = item.order ?? 0;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n /** Sets the uniforms of an item and draws it */\n const draw = (\n item: Item3D,\n program: Program,\n frame: Frame3D,\n seen: Set<string>,\n ) => {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) return;\n const res = upload(item);\n if (!res) return;\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n bind(item, res);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0);\n } else {\n drawInstanced(count);\n }\n };\n\n /** Blended items into the transparency targets, then their composite */\n const drawTransparent = (\n fb: Framebuffers,\n oit: NonNullable<Framebuffers[\"oit\"]>,\n blended: readonly Item3D[],\n frame: Frame3D,\n seen: Set<string>,\n ) => {\n if (!gl2 || !oitPrograms) return;\n const { width, height } = fb;\n gl.bindFramebuffer(gl.FRAMEBUFFER, oit.fbo);\n gl2.clearBufferfv(gl2.COLOR, 0, [0, 0, 0, 0]);\n gl2.clearBufferfv(gl2.COLOR, 1, [0, 0, 0, 0]);\n gl.depthMask(false);\n gl.blendFunc(gl.ONE, gl.ONE);\n for (const item of blended) {\n if (item.kind !== \"lines\")\n draw(item, oitPrograms[item.kind], frame, seen);\n }\n // resolve the samples into the textures read by the composite\n gl.bindFramebuffer(gl2.READ_FRAMEBUFFER, oit.fbo);\n oit.resolved.forEach((target, i) => {\n gl2.readBuffer(i === 0 ? gl.COLOR_ATTACHMENT0 : gl2.COLOR_ATTACHMENT1);\n gl.bindFramebuffer(gl2.DRAW_FRAMEBUFFER, target);\n gl2.blitFramebuffer(\n 0,\n 0,\n width,\n height,\n 0,\n 0,\n width,\n height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n });\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb.main);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.disable(gl.DEPTH_TEST);\n for (let i = 0; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n gl.useProgram(oitPrograms.composite);\n oit.textures.forEach((texture, i) => {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n });\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.enable(gl.DEPTH_TEST);\n };\n\n /** Draws a frame (the context is live) */\n const renderFrame = (items: readonly Item3D[], frame: Frame3D) => {\n const progs = programs;\n if (!progs) return;\n const fb = mainFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb ? fb.main : null);\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n const ordered = drawOrder(items);\n const blended = ordered.filter((item) => drawRank(item) === 2);\n const oit =\n fb && oitPrograms && blended.length > 0 ? oitFramebuffers(fb) : null;\n let additive = false;\n let composited = !oit;\n for (const item of ordered) {\n const rank = drawRank(item);\n if (oit && rank === 2) continue;\n if (fb && oit && rank === 3 && !composited) {\n drawTransparent(fb, oit, blended, frame, seen);\n composited = true;\n additive = false;\n }\n gl.depthMask(writesDepth(item));\n const add = item.kind === \"points\" && !!item.additive;\n if (add !== additive) {\n // additive points: the colors add up, the coverage composites as usual\n if (add)\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n else gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n additive = add;\n }\n draw(item, progs[item.kind], frame, seen);\n }\n if (fb && oit && !composited) {\n drawTransparent(fb, oit, blended, frame, seen);\n additive = false;\n }\n gl.depthMask(true);\n if (additive) gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n if (fb && gl2) {\n // the samples resolved into the canvas\n gl.bindFramebuffer(gl2.READ_FRAMEBUFFER, fb.main);\n gl.bindFramebuffer(gl2.DRAW_FRAMEBUFFER, null);\n gl2.blitFramebuffer(\n 0,\n 0,\n fb.width,\n fb.height,\n 0,\n 0,\n fb.width,\n fb.height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n get orderIndependent() {\n return !!oitPrograms;\n },\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n last = { items, frame };\n // suspended by the context budget: redrawn by the restore\n if (lost || !slot.use() || gl.isContextLost()) return;\n renderFrame(items, frame);\n },\n destroy() {\n slot.release();\n last = null;\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs ?? {})) {\n gl.deleteProgram(p.program);\n }\n if (oitPrograms) {\n gl.deleteProgram(oitPrograms.points.program);\n gl.deleteProgram(oitPrograms.mesh.program);\n gl.deleteProgram(oitPrograms.composite);\n }\n deleteFramebuffers();\n gl.deleteBuffer(corners);\n }\n oitPrograms = null;\n programs = null;\n corners = null;\n framebuffers = null;\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":";;;;;AA2CA,IAAaA,IACX,+EAEWC,KAAsB,MAAoB;CACrD,IAAMC,IAAOC,EAAG,aAAa,2BAA2B,GAClDC,IAAOF,IACTC,EAAG,aAAaD,EAAK,uBAAuB,IAC5CC,EAAG,aAAaA,EAAG,QAAQ;CAC/B,OAAOH,EAAkB,KAAK,OAAOI,KAAQ,EAAE,CAAC;AAClD,GAEMC,IAAW;CACf;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAOMC,KACJ,GACA,GACA,MACmB;CACnB,IAAMC,KAAU,GAAc,MAAiB;EAC7C,IAAMC,IAAIL,EAAG,aAAaM,CAAI;EAQ9B,OAPKD,KACLL,EAAG,aAAaK,GAAGE,CAAI,GACvBP,EAAG,cAAcK,CAAC,GACbL,EAAG,mBAAmBK,GAAGL,EAAG,cAAc,IAIxCK,KAHLL,EAAG,aAAaK,CAAC,GACV,SALM;CAQjB,GACMG,IAAKJ,EAAOJ,EAAG,eAAeS,EAAO,MAAM,GAC3CC,IAAKN,EAAOJ,EAAG,iBAAiBS,EAAO,QAAQ,GAC/CE,IAAUX,EAAG,cAAc;CACjC,IAAI,CAACQ,KAAM,CAACE,KAAM,CAACC,GAAS,OAAO;CAOnC,IANAX,EAAG,aAAaW,GAASH,CAAE,GAC3BR,EAAG,aAAaW,GAASD,CAAE,GAC3BE,EAAW,SAAS,GAAM,MAAMZ,EAAG,mBAAmBW,GAASE,GAAGZ,CAAI,CAAC,GACvED,EAAG,YAAYW,CAAO,GACtBX,EAAG,aAAaQ,CAAE,GAClBR,EAAG,aAAaU,CAAE,GACd,CAACV,EAAG,oBAAoBW,GAASX,EAAG,WAAW,GAEjD,OADAA,EAAG,cAAcW,CAAO,GACjB;CAET,IAAMG,IAAW,CAAC;CAClB,KAAK,IAAMb,KAAQC,GACjB,EAASD,KAAQD,EAAG,mBAAmBW,GAASV,CAAI;CACtD,OAAO;EAAE;EAAS;CAAS;AAC7B,GAYMc,IAAU,IAAI,aAAa;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC,CAAC,GACnDC,IAAgB,GAChBC,IAAc,GAOPC,KACX,MACmD;CACnD,IAAMC,IAAM,OAAOnB,EAAG,aAAaA,EAAG,WAAW,CAAC,KAAK,GACjDoB,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIH,GAAaE,CAAG,CAAC;CACtD,IAAI,CAACnB,EAAG,aAAa,wBAAwB,GAC3C,OAAO;EAAE;EAAS,kBAAkB;CAAM;CAC5C,IAAMqB,IAASrB,EAAG,2BAChBA,EAAG,cACHA,EAAG,SACHA,EAAG,OACL,GACIsB,IAAW;CACf,KAAK,IAAIT,IAAI,GAAGA,KAAKQ,GAAQ,UAAU,IAAI,KACzC,IAAW,KAAK,IAAIC,GAAUD,IAASR,MAAM,CAAC;CAGhD,OADIO,IAAU,KAAKE,IAAW,IAAU;EAAE;EAAS,kBAAkB;CAAM,IACpE;EACL,SAAS,KAAK,IAAIF,GAASE,KAAYF,CAAO;EAC9C,kBAAkB;CACpB;AACF,GAiBaG,KACX,GACA,GACA,GAEA,IAAkB,OACI;CACtB,IAAMX,IAAqC;EACzC,OAAO;EACP,oBAAoB;EAEpB,WAAWY,MAAY;EACvB,OAAO;EACP,SAAS;EACT,uBAAuB;EACvB,8BAA8BC;CAChC,GACMzB,IAAK0B,EAAO,WAChBF,MAAY,IAAI,WAAW,SAC3BZ,CACF;CACA,IAAI,CAACZ,GAAI,OAAO;CAChB,IAAM2B,UACJ3B,EAAG,aAAa,oBAAoB,CAAC,EAAE,YAAY,GAC/C4B,IAAMJ,MAAY,IAAKxB,IAAgC;CAC7D,IAAIyB,KAAmB3B,EAAmBE,CAAE,GAE1C,OADA2B,EAAY,GACL;CAET,IAAIE,IAAuC,MACrCC,KAAW,GAAkB,MAAkB;EACnD,AAAIF,IAAKA,EAAI,oBAAoBG,GAAUC,CAAK,IAC3CH,GAAO,yBAAyBE,GAAUC,CAAK;CACtD,GACMC,KAAiB,MAAkB;EACvC,AAAIL,IAAKA,EAAI,oBAAoB5B,EAAG,gBAAgB,GAAG,GAAGkC,CAAK,IAC1DL,GAAO,yBAAyB7B,EAAG,gBAAgB,GAAG,GAAGkC,CAAK;CACrE,GAEIC,IAAmD,MACnDC,IAA8B,MAC9BC,IAAe;EAAE,SAAS;EAAG,kBAAkB;CAAM,GACrDC,IAIO,MACPC,IAAoC,MAOlCC,UAAuB;EAM3B,AALA,IAAW,MACX,IAAU,MACV,IAAc,MAEd,IAAe,MACf,IAAQZ,IAAM,OAAO5B,EAAG,aAAa,wBAAwB;EAC7D,IAAMyC,IAAOb,IAAM,KAAO,CAAC,CAAC5B,EAAG,aAAa,wBAAwB;EACpE,IAAI,CAAC4B,MAAQ,CAACC,KAAS,CAACY,IAAO,OAAO;EACtC,IAAMC,IAAUC,EAAanB,CAAO,GAC9BoB,IAASzC,EAAQH,GAAI0C,EAAQ,QAAQG,EAAgB,MAAM,GAC3DC,IAAO3C,EAAQH,GAAI0C,EAAQ,MAAMG,EAAgB,IAAI,GACrDE,IAAQ5C,EAAQH,GAAI0C,EAAQ,OAAOG,EAAgB,KAAK,GACxDG,IAAShD,EAAG,aAAa;EAC/B,IAAI,CAAC4C,KAAU,CAACE,KAAQ,CAACC,KAAS,CAACC,GAAQ,OAAO;EAUlD,IATA,IAAW;GAAE;GAAQ;GAAM;EAAM,GACjC,IAAUA,GACVhD,EAAG,WAAWA,EAAG,cAAcoC,CAAO,GACtCpC,EAAG,WAAWA,EAAG,cAAce,GAASf,EAAG,WAAW,GAGtD,IAAe4B,IACXV,EAAmBU,CAAG,IACtB;GAAE,SAAS;GAAG,kBAAkB;EAAM,GACtCA,KAAOS,EAAa,kBAAkB;GACxC,IAAMY,IAAMC,EAAgB,GACtBC,IAAIhD,EAAQH,GAAIiD,EAAI,QAAQJ,EAAgB,MAAM,GAClDO,IAAIjD,EAAQH,GAAIiD,EAAI,MAAMJ,EAAgB,IAAI,GAC9CQ,IAAIlD,EAAQH,GAAIsD,GAAgB,CAAC,CAAC;GACxC,IAAIH,KAAKC,KAAKC,GAIZ,AAHA,IAAc;IAAE,QAAQF;IAAG,MAAMC;IAAG,WAAWC,EAAE;GAAQ,GACzDrD,EAAG,WAAWqD,EAAE,OAAO,GACvBrD,EAAG,UAAUA,EAAG,mBAAmBqD,EAAE,SAAS,SAAS,GAAG,CAAC,GAC3DrD,EAAG,UAAUA,EAAG,mBAAmBqD,EAAE,SAAS,SAAS,GAAG,CAAC;QAE3D,KAAK,IAAM1C,KAAW;IAACwC;IAAGC;IAAGC;GAAC,GAC5B,AAAI1C,KAASX,EAAG,cAAcW,EAAQ,OAAO;EAEnD;EACA,OAAO;CACT;CACA,IAAI,CAAC6B,EAAM,GAET,OADAb,EAAY,GACL;CAET,IAAM4B,KAAa,MAAqB;EACtC,IAAKC,EAAG,KACR;KAAG,kBAAkBA,EAAG,IAAI,GAAG;GAC/B,KAAK,IAAMC,KAAKD,EAAG,IAAI,SAAS,EAAG,mBAAmBC,CAAC;GACvD,KAAK,IAAMC,KAAKF,EAAG,IAAI,UAAU,EAAG,kBAAkBE,CAAC;GACvD,KAAK,IAAM,KAAKF,EAAG,IAAI,UAAU,EAAG,cAAc,CAAC;GACnD,EAAG,MAAM;EAJsB;CAKjC,GACMG,UAA2B;EAC/B,AAAKpB,MACLgB,EAAUhB,CAAY,GACtBvC,EAAG,kBAAkBuC,EAAa,IAAI,GACtCvC,EAAG,mBAAmBuC,EAAa,KAAK,GACxCvC,EAAG,mBAAmBuC,EAAa,KAAK,GACxC,IAAe;CACjB,GACMqB,KAAgB,GAAgB,GAAe,MAAmB;EACtE,IAAMC,IAAK7D,EAAG,mBAAmB;EAYjC,OAXI,CAAC4B,KAAO,CAACiC,IAAWA,KACxB7D,EAAG,iBAAiBA,EAAG,cAAc6D,CAAE,GACnCxB,EAAa,UAAU,IACzBT,EAAI,+BACF5B,EAAG,cACHqC,EAAa,SACbyB,GACAC,GACAC,CACF,IACGhE,EAAG,oBAAoBA,EAAG,cAAc8D,GAAQC,GAAOC,CAAM,GAC3DH;CACT,GACMI,UACJjE,EAAG,uBAAuBA,EAAG,WAAW,MAAMA,EAAG,sBAE7CkE,UAA6C;EACjD,IAAI,CAACtC,GAAK,OAAO;EACjB,IAAM,EAAE,UAAO,cAAWF;EAC1B,IAAIa,GAAc,UAAUwB,KAASxB,EAAa,WAAWyB,GAC3D,OAAOzB;EACT,EAAmB;EACnB,IAAM4B,IAAOnE,EAAG,kBAAkB,GAC5BoE,IAAQR,EAAahC,EAAI,OAAOmC,GAAOC,CAAM,GAC7CK,IAAQT,EAAahC,EAAI,mBAAmBmC,GAAOC,CAAM;EAoB/D,OAnBI,CAACG,KAAQ,CAACC,KAAS,CAACC,IAAc,QACtCrE,EAAG,gBAAgBA,EAAG,aAAamE,CAAI,GACvCnE,EAAG,wBACDA,EAAG,aACHA,EAAG,mBACHA,EAAG,cACHoE,CACF,GACApE,EAAG,wBACDA,EAAG,aACHA,EAAG,kBACHA,EAAG,cACHqE,CACF,GACA,IAAe;GAAE;GAAO;GAAQ;GAAM;GAAO;GAAO,KAAK;EAAK,GACzDJ,EAAS,IAIP1B,KAHLoB,EAAmB,GACZ;CAGX,GAEMW,KAAmB,MAAqB;EAC5C,IAAId,EAAG,OAAO,CAAC5B,GAAK,OAAO4B,EAAG;EAC9B,IAAM,EAAE,UAAO,cAAWA,GACpBe,IAAMvE,EAAG,kBAAkB,GAC3BwE,IAAQZ,EAAahC,EAAI,SAASmC,GAAOC,CAAM,GAC/CS,IAAQb,EAAahC,EAAI,SAASmC,GAAOC,CAAM,GAC/CU,IAAW,CAAC1E,EAAG,kBAAkB,GAAGA,EAAG,kBAAkB,CAAC,GAC1D2E,IAAW,CAAC3E,EAAG,cAAc,GAAGA,EAAG,cAAc,CAAC,GAClD,CAAC4E,GAAIC,KAAMH,GACX,CAACI,GAAIC,KAAMJ;EACjB,IAAI,CAACJ,KAAO,CAACC,KAAS,CAACC,KAAS,CAACG,KAAM,CAACC,KAAM,CAACC,KAAM,CAACC,GAAI,OAAO;EA0BjE,AAzBA,EAAG,MAAM;GACP;GACA,SAAS,CAACP,GAAOC,CAAK;GACtB,UAAU,CAACG,GAAIC,CAAE;GACjB,UAAU,CAACC,GAAIC,CAAE;EACnB,GACA/E,EAAG,gBAAgBA,EAAG,aAAauE,CAAG,GACtCvE,EAAG,wBACDA,EAAG,aACHA,EAAG,mBACHA,EAAG,cACHwE,CACF,GACAxE,EAAG,wBACDA,EAAG,aACH4B,EAAI,mBACJ5B,EAAG,cACHyE,CACF,GACAzE,EAAG,wBACDA,EAAG,aACHA,EAAG,kBACHA,EAAG,cACHwD,EAAG,KACL,GACA5B,EAAI,YAAY,CAAC5B,EAAG,mBAAmB4B,EAAI,iBAAiB,CAAC;EAC7D,IAAIoD,IAAKf,EAAS;EAqBlB,OApBAT,EAAG,IAAI,SAAS,SAAS,GAAS,MAAM;GAatC,AAZAxD,EAAG,YAAYA,EAAG,YAAYiF,CAAO,GACrCrD,EAAI,aAAa5B,EAAG,YAAY,GAAG4B,EAAI,SAASmC,GAAOC,CAAM,GAC7DhE,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,OAAO,GACjEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,OAAO,GACjEA,EAAG,gBAAgBA,EAAG,aAAawD,EAAG,IAAK,SAAS,EAAG,GACvDxD,EAAG,qBACDA,EAAG,aACHA,EAAG,mBACHA,EAAG,YACHiF,GACA,CACF,GACAD,MAAA,IAAOf,EAAS;EAClB,CAAC,GACDjE,EAAG,YAAYA,EAAG,YAAY,IAAI,GAC7BgF,MACHzB,EAAUC,CAAE,GACZ,IAAc,OAETA,EAAG;CACZ,GAEI0B,IAAO,IACPC,IAA4D,MAC1DC,oBAAY,IAAI,IAA2B,GAI3CC,IAAOC,EAAY5D,GAAQ1B,GAAI;EACnC,eAAe;GAKb,AAJAoF,EAAU,MAAM,GAChB,IAAW,MACX,IAAc,MACd,IAAU,MACV,IAAe;EACjB;EACA,eAAe;GACb,AAAIF,MACC1C,EAAM,IAGA2C,KAAMI,EAAYJ,EAAK,OAAOA,EAAK,KAAK,KAFjD,IAAO,IACPK,EAAO;EAEX;EACA,YAAY;GAEV,AADA,IAAO,IACPA,EAAO;EACT;CACF,CAAC,GACKC,oBAAc,IAAI,aAAa,EAAE,GAEjCC,KACJ,GACA,GACA,GACA,GACA,GACA,MACG;EAUH,AATA1F,EAAG,wBAAwB+B,CAAQ,GACnC/B,EAAG,oBACD+B,GACA4D,GACArF,GACAA,MAASN,EAAG,eACZ4F,GACAC,CACF,GACA/D,EAAQC,GAAU,IAAmB;CACvC,GAEM+D,KAAQ,GAAc,MAAuB;EACjD,IAAMC,IAAI/F,EAAG,OACPgG,IAAKhG,EAAG,eACViG;EACJ,AAAIC,EAAK,SAAS,UAChBlG,EAAG,WAAWA,EAAG,cAAcmG,EAAI,MAAM,GACzCT,EAAU,GAAG,GAAGK,GAAA,IAAkB,GAAG,EAAK,GAC1CL,EAAU,GAAG,GAAGK,GAAA,IAAkB,IAAI,EAAK,GAC3CL,EAAU,GAAG,GAAGM,GAAA,IAAmB,IAAI,EAAK,GAC5C,IAAO,MAEPhG,EAAG,WAAWA,EAAG,cAAcoC,CAAO,GACtCsD,EAAU,GAAG,GAAGK,GAAG,GAAG,GAAG,EAAK,GAC9B/F,EAAG,WAAWA,EAAG,cAAcmG,EAAI,MAAM,GACrCD,EAAK,SAAS,YAChBR,EAAU,GAAG,GAAGK,GAAA,IAAiB,GAAG,EAAI,GACxCL,EAAU,GAAG,GAAGK,GAAA,IAAiB,IAAI,EAAI,GACzCL,EAAU,GAAG,GAAGM,GAAA,IAAkB,IAAI,EAAI,MAE1CN,EAAU,GAAG,GAAGK,GAAA,IAAmB,GAAG,EAAI,GAC1CL,EAAU,GAAG,GAAGK,GAAA,IAAmB,IAAI,EAAI,GAC3CL,EAAU,GAAG,GAAGM,GAAA,IAAoB,IAAI,EAAI,IAE9C,IAAO;EAET,KAAK,IAAInF,IAAIoF,GAAMpF,IAAIG,GAAe,KAEpC,AADAhB,EAAG,yBAAyBa,CAAC,GAC7BiB,EAAQjB,GAAG,CAAC;CAEhB,GAEMuF,KAAU,MAAuC;EACrD,IAAMC,IAAWjB,EAAU,IAAIc,EAAK,GAAG;EACvC,IACEG,KACAA,EAAS,YAAYH,EAAK,WAC1BG,EAAS,SAASH,EAAK,MAYvB,OAREA,EAAK,SAAS,UACdG,EAAS,UACRH,EAAK,SAAS,OAAOG,EAAS,UAE/BrG,EAAG,WAAWA,EAAG,sBAAsBqG,EAAS,KAAK,GACrDrG,EAAG,cAAcA,EAAG,sBAAsB,GAAGkG,EAAK,OAAO,GACzD,EAAS,QAAQA,EAAK,SAAS,IAE1BG;EAET,AAAIA,MACFrG,EAAG,aAAaqG,EAAS,MAAM,GAC3BA,EAAS,SAAOrG,EAAG,aAAaqG,EAAS,KAAK,GAClDjB,EAAU,OAAOc,EAAK,GAAG;EAE3B,IAAMI,IAAStG,EAAG,aAAa;EAC/B,IAAI,CAACsG,GAAQ,OAAO;EAEpB,AADAtG,EAAG,WAAWA,EAAG,cAAcsG,CAAM,GACrCtG,EAAG,WACDA,EAAG,cACHkG,EAAK,SAAS,SAASA,EAAK,WAAWA,EAAK,MAC5ClG,EAAG,WACL;EACA,IAAIuG,IAA4B;EAChC,IAAIL,EAAK,SAAS,QAAQ;GAExB,IADA,IAAQlG,EAAG,aAAa,GACpB,CAACuG,GAEH,OADAvG,EAAG,aAAasG,CAAM,GACf;GAGT,AADAtG,EAAG,WAAWA,EAAG,sBAAsBuG,CAAK,GAC5CvG,EAAG,WACDA,EAAG,sBACHkG,EAAK,SACLA,EAAK,UAAU,KAAA,IAAYlG,EAAG,cAAcA,EAAG,YACjD;EACF;EACA,IAAMmG,IAAM;GACV,SAASD,EAAK;GACd,MAAMA,EAAK;GACX;GACA;GACA,OAAOA,EAAK,SAAS,SAAUA,EAAK,SAAS,IAAK;EACpD;EAEA,OADAd,EAAU,IAAIc,EAAK,KAAKC,CAAG,GACpBA;CACT,GAGMK,KACJ,GACA,GACA,GACA,MACG;EACH,EAAK,IAAIN,EAAK,GAAG;EACjB,IAAMhE,IAAQgE,EAAK,SAAS,SAASA,EAAK,QAAQ,SAASA,EAAK;EAChE,IAAIhE,KAAS,GAAG;EAChB,IAAMiE,IAAMC,EAAOF,CAAI;EACvB,IAAI,CAACC,GAAK;EACV,EAAG,WAAWxF,EAAQ,OAAO;EAC7B,IAAM8F,IAAIC,EAAaR,GAAMS,GAAOlB,CAAW,GACzCmB,IAAMjG,EAAQ;EASpB,AARAX,EAAG,iBAAiB4G,EAAI,YAAY,IAAOH,EAAE,SAAS,GAAG,EAAE,CAAC,GAC5DzG,EAAG,WAAW4G,EAAI,YAAYH,EAAE,SAAS,IAAI,EAAE,CAAC,GAChDzG,EAAG,WAAW4G,EAAI,OAAOH,EAAE,SAAS,IAAI,EAAE,CAAC,GAC3CzG,EAAG,WAAW4G,EAAI,SAASH,EAAE,SAAS,IAAI,EAAE,CAAC,GAC7CzG,EAAG,WAAW4G,EAAI,YAAYH,EAAE,SAAS,IAAI,EAAE,CAAC,GAChDzG,EAAG,WAAW4G,EAAI,UAAUH,EAAE,SAAS,IAAI,EAAE,CAAC,GAC9CzG,EAAG,WAAW4G,EAAI,OAAOH,EAAE,SAAS,IAAI,EAAE,CAAC,GAC3CX,EAAKI,GAAMC,CAAG,GACVD,EAAK,SAAS,UAChBlG,EAAG,WAAWA,EAAG,sBAAsBmG,EAAI,KAAK,GAChDnG,EAAG,aAAaA,EAAG,WAAWkC,GAAOlC,EAAG,cAAc,CAAC,KAEvDiC,EAAcC,CAAK;CAEvB,GAGM2E,KACJ,GACA,GACA,GACA,GACA,MACG;EACH,IAAI,CAACjF,KAAO,CAACU,GAAa;EAC1B,IAAM,EAAE,UAAO,cAAWkB;EAK1B,AAJAxD,EAAG,gBAAgBA,EAAG,aAAaiD,EAAI,GAAG,GAC1CrB,EAAI,cAAcA,EAAI,OAAO,GAAG;GAAC;GAAG;GAAG;GAAG;EAAC,CAAC,GAC5CA,EAAI,cAAcA,EAAI,OAAO,GAAG;GAAC;GAAG;GAAG;GAAG;EAAC,CAAC,GAC5C5B,EAAG,UAAU,EAAK,GAClBA,EAAG,UAAUA,EAAG,KAAKA,EAAG,GAAG;EAC3B,KAAK,IAAMkG,KAAQY,GACjB,AAAIZ,EAAK,SAAS,WAChBM,EAAKN,GAAM5D,EAAY4D,EAAK,OAAOS,GAAOI,CAAI;EAsBlD,AAnBA/G,EAAG,gBAAgB4B,EAAI,kBAAkBqB,EAAI,GAAG,GAChDA,EAAI,SAAS,SAAS,GAAQ,MAAM;GAGlC,AAFArB,EAAI,WAAWf,MAAM,IAAIb,EAAG,oBAAoB4B,EAAI,iBAAiB,GACrE5B,EAAG,gBAAgB4B,EAAI,kBAAkBoF,CAAM,GAC/CpF,EAAI,gBACF,GACA,GACAmC,GACAC,GACA,GACA,GACAD,GACAC,GACAhE,EAAG,kBACHA,EAAG,OACL;EACF,CAAC,GACDA,EAAG,gBAAgBA,EAAG,aAAawD,EAAG,IAAI,GAC1CxD,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB,GAC3CA,EAAG,QAAQA,EAAG,UAAU;EACxB,KAAK,IAAIa,IAAI,GAAGA,IAAIG,GAAe,KAEjC,AADAhB,EAAG,yBAAyBa,CAAC,GAC7BiB,EAAQjB,GAAG,CAAC;EAWd,AATAb,EAAG,WAAWsC,EAAY,SAAS,GACnCW,EAAI,SAAS,SAAS,GAAS,MAAM;GAEnC,AADAjD,EAAG,cAAcA,EAAG,WAAWa,CAAC,GAChCb,EAAG,YAAYA,EAAG,YAAYiF,CAAO;EACvC,CAAC,GACDjF,EAAG,WAAWA,EAAG,WAAW,GAAG,CAAC,GAChCA,EAAG,YAAYA,EAAG,YAAY,IAAI,GAClCA,EAAG,cAAcA,EAAG,QAAQ,GAC5BA,EAAG,YAAYA,EAAG,YAAY,IAAI,GAClCA,EAAG,OAAOA,EAAG,UAAU;CACzB,GAGMuF,KAAe,GAA0B,MAAmB;EAChE,IAAM0B,IAAQ9E;EACd,IAAI,CAAC8E,GAAO;EACZ,IAAMzD,IAAKU,EAAgB;EAW3B,AAVAlE,EAAG,gBAAgBA,EAAG,aAAawD,IAAKA,EAAG,OAAO,IAAI,GACtDxD,EAAG,SAAS,GAAG,GAAG0B,EAAO,OAAOA,EAAO,MAAM,GAC7C1B,EAAG,WAAW,GAAG,GAAG,GAAG,CAAC,GACxBA,EAAG,WAAW,CAAC,GACfA,EAAG,UAAU,EAAI,GACjBA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB,GAClDA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB,GAC3CA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GACtBA,EAAG,QAAQA,EAAG,SAAS;EACvB,IAAM+G,oBAAO,IAAI,IAAY,GACvBG,IAAUC,EAAUC,CAAK,GACzBN,IAAUI,EAAQ,QAAQ,MAASG,EAASnB,CAAI,MAAM,CAAC,GACvDjD,IACJO,KAAMlB,KAAewE,EAAQ,SAAS,IAAIxC,EAAgBd,CAAE,IAAI,MAC9D8D,IAAW,IACXC,IAAa,CAACtE;EAClB,KAAK,IAAMiD,KAAQgB,GAAS;GAC1B,IAAMM,IAAOH,EAASnB,CAAI;GAC1B,IAAIjD,KAAOuE,MAAS,GAAG;GAMvB,AALIhE,KAAMP,KAAOuE,MAAS,KAAK,CAACD,MAC9BV,EAAgBrD,GAAIP,GAAK6D,GAASH,GAAOI,CAAI,GAC7C,IAAa,IACb,IAAW,KAEb/G,EAAG,UAAUyH,EAAYvB,CAAI,CAAC;GAC9B,IAAMwB,IAAMxB,EAAK,SAAS,YAAY,CAAC,CAACA,EAAK;GAQ7C,AAPIwB,MAAQJ,MAENI,IACF1H,EAAG,kBAAkBA,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,mBAAmB,IAChEA,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB,GAChD,IAAW0H,IAEblB,EAAKN,GAAMe,EAAMf,EAAK,OAAOS,GAAOI,CAAI;EAC1C;EAOA,AANIvD,KAAMP,KAAO,CAACsE,MAChBV,EAAgBrD,GAAIP,GAAK6D,GAASH,GAAOI,CAAI,GAC7C,IAAW,KAEb/G,EAAG,UAAU,EAAI,GACbsH,KAAUtH,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB,GACrDwD,KAAM5B,MAER5B,EAAG,gBAAgB4B,EAAI,kBAAkB4B,EAAG,IAAI,GAChDxD,EAAG,gBAAgB4B,EAAI,kBAAkB,IAAI,GAC7CA,EAAI,gBACF,GACA,GACA4B,EAAG,OACHA,EAAG,QACH,GACA,GACAA,EAAG,OACHA,EAAG,QACHxD,EAAG,kBACHA,EAAG,OACL,GACAA,EAAG,gBAAgBA,EAAG,aAAa,IAAI;EAEzC,KAAK,IAAM,CAAC2H,GAAKxB,MAAQf,GACvB,AAAK2B,EAAK,IAAIY,CAAG,MACf3H,EAAG,aAAamG,EAAI,MAAM,GACtBA,EAAI,SAAOnG,EAAG,aAAamG,EAAI,KAAK,GACxCf,EAAU,OAAOuC,CAAG;CAG1B;CAEA,OAAO;EACL,MAAMnG,MAAY,IAAI,WAAW;EACjC;EACA,IAAI,mBAAmB;GACrB,OAAO,CAAC,CAACc;EACX;EACA,OAAO,GAAO,GAAQ;GAEpB,AADA,EAAO,QAAQ,KAAK,IAAI,GAAGyB,CAAK,GAChC,EAAO,SAAS,KAAK,IAAI,GAAGC,CAAM;EACpC;EACA,OAAO,GAAO,GAAO;GAGnB,AAFA,IAAO;IAAE;IAAO;GAAM,GAElB,OAAQ,CAACqB,EAAK,IAAI,KAAKrF,EAAG,cAAc,MAC5CuF,EAAY6B,GAAOT,CAAK;EAC1B;EACA,UAAU;GAGR,IAFAtB,EAAK,QAAQ,GACb,IAAO,MACH,CAACrF,EAAG,cAAc,GAAG;IACvB,KAAK,IAAMmG,KAAOf,EAAU,OAAO,GAEjC,AADApF,EAAG,aAAamG,EAAI,MAAM,GACtBA,EAAI,SAAOnG,EAAG,aAAamG,EAAI,KAAK;IAE1C,KAAK,IAAMhD,KAAK,OAAO,OAAOhB,KAAY,CAAC,CAAC,GAC1C,EAAG,cAAcgB,EAAE,OAAO;IAQ5B,AANIb,MACFtC,EAAG,cAAcsC,EAAY,OAAO,OAAO,GAC3CtC,EAAG,cAAcsC,EAAY,KAAK,OAAO,GACzCtC,EAAG,cAAcsC,EAAY,SAAS,IAExCqB,EAAmB,GACnB3D,EAAG,aAAaoC,CAAO;GACzB;GAMA,AALA,IAAc,MACd,IAAW,MACX,IAAU,MACV,IAAe,MACfgD,EAAU,MAAM,GAChBzD,EAAY;EACd;CACF;AACF"}
1
+ {"version":3,"file":"webgl.js","names":["SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","MAX_SAMPLES","webGl2Capabilities","max","samples","counts","floatMax","OIT_TARGETS","createWebGl3D","version","requireHardware","canvas","loseContext","gl2","angle","divisor","location","value","drawInstanced","count","programs","corners","capabilities","oitPrograms","framebuffers","build","uint","sources","glslPrograms","points","GLSL_ATTRIBUTES","mesh","lines","buffer","oit","glslOitPrograms","p","m","fp","fm","GLSL_COMPOSITE","deleteOit","fb","b","f","deleteFramebuffers","renderbuffer","rb","format","width","height","complete","mainFramebuffer","main","color","depth","oitFramebuffers","fbo","frontFbo","frontDepth","buffers","resolved","textures","t","attachments","ok","attach","texture","target","lost","last","resources","slot","claimGlSlot","renderFrame","onLost","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","base","first","upload","existing","order","vertex","index","draw","total","range","itemUniforms","frame","loc","drawTransparent","unbind","layered","blended","seen","progs","ordered","drawOrder","items","drawRank","additive","composited","rank","writesDepth","add","key"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n//\n// WebGL2 draws into its own multisampled framebuffer, blitted to the canvas.\n// With EXT_color_buffer_float (multisampled RGBA16F, R16F), the blended items\n// go through the hybrid order-independent transparency (`oit.ts`): opaque\n// items; the depth of the front transparent layer (R16F, `min` blending);\n// the blended items into four float targets sharing the depth buffer\n// (resolved into textures by blits); their composite; then the lines.\n// Otherwise (and on WebGL 1) the blended items come sorted back to front\n// (`sort.ts`, possibly as ranges of their buffers interleaved together) and\n// the additive light is screen blended.\n//\n// The context is part of the page-wide budget (`gl-budget.ts`): when it is\n// suspended off-screen, its GPU objects go; the restore builds the programs\n// again (the framebuffers and buffers follow lazily) and redraws the last\n// frame. A suspension is not a loss: only real losses reach `onLost`.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { claimGlSlot } from \"../renderers/gl-budget\";\nimport { FRONT_CLEAR, GLSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Frame3D,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslOitPrograms,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) or points */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\nconst MAX_SAMPLES = 4;\n\n/**\n * Samples of the WebGL2 framebuffers and whether the order-independent\n * transparency is possible: float color buffers (EXT_color_buffer_float)\n * that can be multisampled as much as the color\n */\nexport const webGl2Capabilities = (\n gl: WebGL2RenderingContext,\n): { samples: number; orderIndependent: boolean } => {\n const max = Number(gl.getParameter(gl.MAX_SAMPLES)) || 0;\n const samples = Math.max(0, Math.min(MAX_SAMPLES, max));\n if (!gl.getExtension(\"EXT_color_buffer_float\"))\n return { samples, orderIndependent: false };\n const counts = gl.getInternalformatParameter(\n gl.RENDERBUFFER,\n gl.RGBA16F,\n gl.SAMPLES,\n ) as ArrayLike<number> | null;\n let floatMax = 0;\n for (let i = 0; i < (counts?.length ?? 0); i++)\n floatMax = Math.max(floatMax, counts?.[i] ?? 0);\n // single-sampled framebuffers: any float support is enough\n if (samples > 1 && floatMax < 2) return { samples, orderIndependent: false };\n return {\n samples: Math.min(samples, floatMax || samples),\n orderIndependent: true,\n };\n};\n\ninterface Framebuffers {\n width: number;\n height: number;\n main: WebGLFramebuffer;\n color: WebGLRenderbuffer;\n depth: WebGLRenderbuffer;\n /** Transparency targets, created on first use */\n oit: {\n /** front color, accum, extra, behind (multisampled, sharing the depth) */\n fbo: WebGLFramebuffer;\n buffers: WebGLRenderbuffer[];\n /** Their resolved textures, read by the composite */\n resolved: WebGLFramebuffer[];\n textures: WebGLTexture[];\n /** Depth of the front transparent layer (single-sampled R16F) */\n frontFbo: WebGLFramebuffer;\n frontDepth: WebGLTexture;\n } | null;\n}\n\n/** Targets of the transparency pass (`oit.ts`) */\nconst OIT_TARGETS = 4;\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n // WebGL2 multisamples its own framebuffer\n antialias: version === 1,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n loseContext();\n return null;\n }\n let angle: ANGLE_instanced_arrays | null = null;\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n let programs: Record<Item3D[\"kind\"], Program> | null = null;\n let corners: WebGLBuffer | null = null;\n let capabilities = { samples: 0, orderIndependent: false };\n let oitPrograms: {\n points: Program;\n mesh: Program;\n front: { points: Program; mesh: Program };\n composite: WebGLProgram;\n } | null = null;\n let framebuffers: Framebuffers | null = null;\n\n /**\n * Extensions, programs, the corner buffer and the transparency programs:\n * at creation and again after a restore (GL objects and extension objects\n * don't survive the context). False when the context can't draw.\n */\n const build = (): boolean => {\n programs = null;\n corners = null;\n oitPrograms = null;\n // recreated lazily at the next draw\n framebuffers = null;\n angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (!gl2 && (!angle || !uint)) return false;\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const buffer = gl.createBuffer();\n if (!points || !mesh || !lines || !buffer) return false;\n programs = { points, mesh, lines };\n corners = buffer;\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n // order-independent transparency (WebGL2 with float color buffers)\n capabilities = gl2\n ? webGl2Capabilities(gl2)\n : { samples: 0, orderIndependent: false };\n if (gl2 && capabilities.orderIndependent) {\n const oit = glslOitPrograms();\n const p = compile(gl, oit.points, GLSL_ATTRIBUTES.points);\n const m = compile(gl, oit.mesh, GLSL_ATTRIBUTES.mesh);\n const fp = compile(gl, oit.front.points, GLSL_ATTRIBUTES.points);\n const fm = compile(gl, oit.front.mesh, GLSL_ATTRIBUTES.mesh);\n const c = compile(gl, GLSL_COMPOSITE, []);\n if (p && m && fp && fm && c) {\n oitPrograms = {\n points: p,\n mesh: m,\n front: { points: fp, mesh: fm },\n composite: c.program,\n };\n // the front depth at unit 0 in the transparency pass\n for (const program of [p, m]) {\n gl.useProgram(program.program);\n gl.uniform1i(gl.getUniformLocation(program.program, \"u_front\"), 0);\n }\n gl.useProgram(c.program);\n [\"u_frontColor\", \"u_accum\", \"u_extra\", \"u_behind\"].forEach((name, i) =>\n gl.uniform1i(gl.getUniformLocation(c.program, name), i),\n );\n } else {\n for (const program of [p, m, fp, fm, c])\n if (program) gl.deleteProgram(program.program);\n }\n }\n return true;\n };\n if (!build()) {\n loseContext();\n return null;\n }\n const deleteOit = (fb: Framebuffers) => {\n if (!fb.oit) return;\n gl.deleteFramebuffer(fb.oit.fbo);\n for (const b of fb.oit.buffers) gl.deleteRenderbuffer(b);\n for (const f of fb.oit.resolved) gl.deleteFramebuffer(f);\n for (const t of fb.oit.textures) gl.deleteTexture(t);\n gl.deleteFramebuffer(fb.oit.frontFbo);\n gl.deleteTexture(fb.oit.frontDepth);\n fb.oit = null;\n };\n const deleteFramebuffers = () => {\n if (!framebuffers) return;\n deleteOit(framebuffers);\n gl.deleteFramebuffer(framebuffers.main);\n gl.deleteRenderbuffer(framebuffers.color);\n gl.deleteRenderbuffer(framebuffers.depth);\n framebuffers = null;\n };\n const renderbuffer = (format: number, width: number, height: number) => {\n const rb = gl.createRenderbuffer();\n if (!gl2 || !rb) return rb;\n gl.bindRenderbuffer(gl.RENDERBUFFER, rb);\n if (capabilities.samples > 1)\n gl2.renderbufferStorageMultisample(\n gl.RENDERBUFFER,\n capabilities.samples,\n format,\n width,\n height,\n );\n else gl.renderbufferStorage(gl.RENDERBUFFER, format, width, height);\n return rb;\n };\n const complete = () =>\n gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n /** The multisampled framebuffer of WebGL2 (null: draw into the canvas) */\n const mainFramebuffer = (): Framebuffers | null => {\n if (!gl2) return null;\n const { width, height } = canvas;\n if (framebuffers?.width === width && framebuffers.height === height)\n return framebuffers;\n deleteFramebuffers();\n const main = gl.createFramebuffer();\n const color = renderbuffer(gl2.RGBA8, width, height);\n const depth = renderbuffer(gl2.DEPTH_COMPONENT24, width, height);\n if (!main || !color || !depth) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, main);\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.RENDERBUFFER,\n color,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n depth,\n );\n framebuffers = { width, height, main, color, depth, oit: null };\n if (!complete()) {\n deleteFramebuffers();\n return null;\n }\n return framebuffers;\n };\n /** The transparency targets sharing the depth of `fb` */\n const oitFramebuffers = (fb: Framebuffers) => {\n if (fb.oit || !gl2) return fb.oit;\n const { width, height } = fb;\n const fbo = gl.createFramebuffer();\n const frontFbo = gl.createFramebuffer();\n const frontDepth = gl.createTexture();\n const buffers: WebGLRenderbuffer[] = [];\n const resolved: WebGLFramebuffer[] = [];\n const textures: WebGLTexture[] = [];\n for (let i = 0; i < OIT_TARGETS; i++) {\n const b = renderbuffer(gl2.RGBA16F, width, height);\n const r = gl.createFramebuffer();\n const t = gl.createTexture();\n if (b) buffers.push(b);\n if (r) resolved.push(r);\n if (t) textures.push(t);\n }\n fb.oit = {\n fbo: fbo!,\n buffers,\n resolved,\n textures,\n frontFbo: frontFbo!,\n frontDepth: frontDepth!,\n };\n if (\n !fbo ||\n !frontFbo ||\n !frontDepth ||\n buffers.length < OIT_TARGETS ||\n resolved.length < OIT_TARGETS ||\n textures.length < OIT_TARGETS\n ) {\n deleteOit(fb);\n oitPrograms = null;\n return null;\n }\n const attachments = buffers.map((_, i) => gl.COLOR_ATTACHMENT0 + i);\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n buffers.forEach((b, i) =>\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n attachments[i]!,\n gl.RENDERBUFFER,\n b,\n ),\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n fb.depth,\n );\n gl2.drawBuffers(attachments);\n let ok = complete();\n const attach = (\n target: WebGLFramebuffer,\n texture: WebGLTexture,\n format: number,\n ) => {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl2.texStorage2D(gl.TEXTURE_2D, 1, format, width, height);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0,\n );\n ok &&= complete();\n };\n textures.forEach((texture, i) =>\n attach(resolved[i]!, texture, gl2.RGBA16F),\n );\n attach(frontFbo, frontDepth, gl2.R16F);\n gl.bindTexture(gl.TEXTURE_2D, null);\n if (!ok) {\n deleteOit(fb);\n oitPrograms = null;\n }\n return fb.oit;\n };\n\n let lost = false;\n let last: { items: readonly Item3D[]; frame: Frame3D } | null = null;\n const resources = new Map<string, ItemResources>();\n // past the page-wide context budget, the context may be suspended while\n // off-screen (not a failure): its GPU objects go, and come back with the\n // context, which then redraws its last frame\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => {\n resources.clear();\n programs = null;\n oitPrograms = null;\n corners = null;\n framebuffers = null;\n },\n restore: () => {\n if (lost) return;\n if (!build()) {\n lost = true;\n onLost();\n } else if (last) renderFrame(last.items, last.frame);\n },\n lost: () => {\n lost = true;\n onLost();\n },\n });\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources, first: number) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n // a range of the instances: the attributes start at its first one\n const base = first * POINT_STRIDE;\n attribute(1, 3, F, POINT_STRIDE, base, true);\n attribute(2, 1, F, POINT_STRIDE, base + 12, true);\n attribute(3, 4, U8, POINT_STRIDE, base + 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\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 !== \"lines\" && order !== existing.order) {\n if (item.kind === \"mesh\" && existing.index) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n } else if (item.kind === \"points\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, existing.vertex);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, item.data);\n }\n existing.order = order;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n item.kind === \"points\" && item.order !== undefined\n ? gl.DYNAMIC_DRAW\n : gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"lines\" ? 0 : (item.order ?? 0),\n };\n resources.set(item.key, res);\n return res;\n };\n\n /** Sets the uniforms of an item and draws it */\n const draw = (\n item: Item3D,\n program: Program,\n frame: Frame3D,\n seen: Set<string>,\n ) => {\n seen.add(item.key);\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) return;\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n bind(item, res, item.kind === \"points\" ? first : 0);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, first * 4);\n } else {\n drawInstanced(count);\n }\n };\n\n /**\n * Blended items into the transparency targets (`oit.ts`): the depth of the\n * front layer first, then the four targets; their composite\n */\n const drawTransparent = (\n fb: Framebuffers,\n oit: NonNullable<Framebuffers[\"oit\"]>,\n blended: readonly Item3D[],\n frame: Frame3D,\n seen: Set<string>,\n ) => {\n if (!gl2 || !oitPrograms) return;\n const { width, height } = fb;\n const unbind = () => {\n for (let i = OIT_TARGETS - 1; i >= 0; i--) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n };\n // front pass: the nearest visible depth of the non-additive items\n gl.bindFramebuffer(gl.FRAMEBUFFER, oit.frontFbo);\n gl2.clearBufferfv(gl2.COLOR, 0, [\n FRONT_CLEAR,\n FRONT_CLEAR,\n FRONT_CLEAR,\n FRONT_CLEAR,\n ]);\n const layered = blended.filter(\n (item) =>\n item.kind !== \"lines\" && !(item.kind === \"points\" && item.additive),\n );\n gl.depthMask(false);\n if (layered.length) {\n gl.disable(gl.DEPTH_TEST);\n gl2.blendEquation(gl2.MIN);\n gl.blendFunc(gl.ONE, gl.ONE);\n for (const item of layered) {\n if (item.kind !== \"lines\")\n draw(item, oitPrograms.front[item.kind], frame, seen);\n }\n gl2.blendEquation(gl.FUNC_ADD);\n gl.enable(gl.DEPTH_TEST);\n }\n // main pass: every blended item, testing the opaque depth\n gl.bindFramebuffer(gl.FRAMEBUFFER, oit.fbo);\n for (let i = 0; i < OIT_TARGETS; i++)\n gl2.clearBufferfv(gl2.COLOR, i, [0, 0, 0, 0]);\n gl.blendFunc(gl.ONE, gl.ONE);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, oit.frontDepth);\n for (const item of blended) {\n if (item.kind !== \"lines\")\n draw(item, oitPrograms[item.kind], frame, seen);\n }\n gl.bindTexture(gl.TEXTURE_2D, null);\n // resolve the samples into the textures read by the composite\n gl.bindFramebuffer(gl2.READ_FRAMEBUFFER, oit.fbo);\n oit.resolved.forEach((target, i) => {\n gl2.readBuffer(gl.COLOR_ATTACHMENT0 + i);\n gl.bindFramebuffer(gl2.DRAW_FRAMEBUFFER, target);\n gl2.blitFramebuffer(\n 0,\n 0,\n width,\n height,\n 0,\n 0,\n width,\n height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n });\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb.main);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.disable(gl.DEPTH_TEST);\n for (let i = 0; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n gl.useProgram(oitPrograms.composite);\n oit.textures.forEach((texture, i) => {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n });\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n unbind();\n gl.enable(gl.DEPTH_TEST);\n };\n\n /** Draws a frame (the context is live) */\n const renderFrame = (items: readonly Item3D[], frame: Frame3D) => {\n const progs = programs;\n if (!progs) return;\n const fb = mainFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb ? fb.main : null);\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n const ordered = drawOrder(items);\n const blended = ordered.filter((item) => drawRank(item) === 2);\n const oit =\n fb && oitPrograms && blended.length > 0 ? oitFramebuffers(fb) : null;\n let additive = false;\n let composited = !oit;\n for (const item of ordered) {\n const rank = drawRank(item);\n if (oit && rank === 2) continue;\n if (fb && oit && rank === 3 && !composited) {\n drawTransparent(fb, oit, blended, frame, seen);\n composited = true;\n additive = false;\n }\n gl.depthMask(writesDepth(item));\n const add = item.kind === \"points\" && !!item.additive;\n if (add !== additive) {\n // additive points: their light screen blended (tone mapped as it\n // adds up, `screenTone`), the coverage composites as usual\n if (add)\n gl.blendFuncSeparate(\n gl.ONE,\n gl.ONE_MINUS_SRC_COLOR,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n else gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n additive = add;\n }\n draw(item, progs[item.kind], frame, seen);\n }\n if (fb && oit && !composited) {\n drawTransparent(fb, oit, blended, frame, seen);\n additive = false;\n }\n gl.depthMask(true);\n if (additive) gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n if (fb && gl2) {\n // the samples resolved into the canvas\n gl.bindFramebuffer(gl2.READ_FRAMEBUFFER, fb.main);\n gl.bindFramebuffer(gl2.DRAW_FRAMEBUFFER, null);\n gl2.blitFramebuffer(\n 0,\n 0,\n fb.width,\n fb.height,\n 0,\n 0,\n fb.width,\n fb.height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n get orderIndependent() {\n return !!oitPrograms;\n },\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n last = { items, frame };\n // suspended by the context budget: redrawn by the restore\n if (lost || !slot.use() || gl.isContextLost()) return;\n renderFrame(items, frame);\n },\n destroy() {\n slot.release();\n last = null;\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs ?? {})) {\n gl.deleteProgram(p.program);\n }\n if (oitPrograms) {\n gl.deleteProgram(oitPrograms.points.program);\n gl.deleteProgram(oitPrograms.mesh.program);\n gl.deleteProgram(oitPrograms.front.points.program);\n gl.deleteProgram(oitPrograms.front.mesh.program);\n gl.deleteProgram(oitPrograms.composite);\n }\n deleteFramebuffers();\n gl.deleteBuffer(corners);\n }\n oitPrograms = null;\n programs = null;\n corners = null;\n framebuffers = null;\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}