@luma.gl/webgl 9.0.11 → 9.1.0-alpha.1

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 (121) hide show
  1. package/LICENSE +34 -0
  2. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  3. package/dist/adapter/converters/device-parameters.js +12 -1
  4. package/dist/adapter/converters/texture-formats.d.ts +22 -16
  5. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  6. package/dist/adapter/converters/texture-formats.js +31 -32
  7. package/dist/adapter/device-helpers/webgl-device-features.js +1 -1
  8. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  9. package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
  10. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
  11. package/dist/adapter/helpers/webgl-texture-utils.js +368 -0
  12. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  13. package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
  14. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  15. package/dist/adapter/resources/webgl-buffer.js +2 -2
  16. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  17. package/dist/adapter/resources/webgl-command-buffer.js +6 -9
  18. package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
  19. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  20. package/dist/adapter/resources/webgl-framebuffer.js +42 -60
  21. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
  22. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  23. package/dist/adapter/resources/webgl-render-pass.js +1 -3
  24. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  25. package/dist/adapter/resources/webgl-render-pipeline.js +45 -20
  26. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  27. package/dist/adapter/resources/webgl-shader.js +2 -2
  28. package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
  29. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
  30. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  31. package/dist/adapter/resources/webgl-texture.d.ts +58 -172
  32. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  33. package/dist/adapter/resources/webgl-texture.js +402 -510
  34. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
  35. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  36. package/dist/adapter/resources/webgl-vertex-array.js +2 -2
  37. package/dist/adapter/webgl-canvas-context.d.ts +3 -1
  38. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  39. package/dist/adapter/webgl-canvas-context.js +2 -0
  40. package/dist/adapter/webgl-device.d.ts +4 -3
  41. package/dist/adapter/webgl-device.d.ts.map +1 -1
  42. package/dist/adapter/webgl-device.js +6 -5
  43. package/dist/classic/accessor.d.ts +22 -1
  44. package/dist/classic/accessor.d.ts.map +1 -1
  45. package/dist/classic/accessor.js +1 -9
  46. package/dist/classic/clear.d.ts.map +1 -1
  47. package/dist/classic/clear.js +2 -5
  48. package/dist/classic/copy-and-blit.d.ts +2 -1
  49. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  50. package/dist/classic/copy-and-blit.js +11 -9
  51. package/dist/classic/format-utils.d.ts.map +1 -1
  52. package/dist/classic/format-utils.js +0 -3
  53. package/dist/classic/typed-array-utils.d.ts +1 -1
  54. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  55. package/dist/context/debug/spector.d.ts.map +1 -1
  56. package/dist/context/debug/spector.js +2 -1
  57. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  58. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  59. package/dist/context/debug/webgl-developer-tools.js +2 -5
  60. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  61. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  62. package/dist/context/state-tracker/track-context-state.js +5 -6
  63. package/dist/dist.dev.js +870 -1261
  64. package/dist/dist.min.js +2 -2
  65. package/dist/index.cjs +859 -1137
  66. package/dist/index.cjs.map +4 -4
  67. package/dist/index.d.ts +0 -4
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +0 -3
  70. package/dist/utils/fill-array.d.ts +8 -0
  71. package/dist/utils/fill-array.d.ts.map +1 -0
  72. package/dist/utils/fill-array.js +26 -0
  73. package/dist/utils/load-script.d.ts +8 -0
  74. package/dist/utils/load-script.d.ts.map +1 -0
  75. package/dist/utils/load-script.js +26 -0
  76. package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
  77. package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
  78. package/dist/utils/split-uniforms-and-bindings.js +20 -0
  79. package/package.json +6 -5
  80. package/src/adapter/converters/device-parameters.ts +13 -1
  81. package/src/adapter/converters/texture-formats.ts +45 -42
  82. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  83. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  84. package/src/adapter/helpers/webgl-texture-utils.ts +481 -0
  85. package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
  86. package/src/adapter/resources/webgl-buffer.ts +2 -2
  87. package/src/adapter/resources/webgl-command-buffer.ts +8 -10
  88. package/src/adapter/resources/webgl-framebuffer.ts +22 -56
  89. package/src/adapter/resources/webgl-render-pass.ts +4 -5
  90. package/src/adapter/resources/webgl-render-pipeline.ts +48 -23
  91. package/src/adapter/resources/webgl-shader.ts +3 -3
  92. package/src/adapter/resources/webgl-texture-view.ts +1 -3
  93. package/src/adapter/resources/webgl-texture.ts +432 -784
  94. package/src/adapter/resources/webgl-vertex-array.ts +8 -7
  95. package/src/adapter/webgl-canvas-context.ts +4 -1
  96. package/src/adapter/webgl-device.ts +10 -18
  97. package/src/classic/accessor.ts +31 -11
  98. package/src/classic/clear.ts +3 -6
  99. package/src/classic/copy-and-blit.ts +19 -19
  100. package/src/classic/format-utils.ts +0 -3
  101. package/src/classic/typed-array-utils.ts +1 -1
  102. package/src/context/debug/spector.ts +2 -1
  103. package/src/context/debug/webgl-developer-tools.ts +3 -7
  104. package/src/context/parameters/webgl-parameter-tables.ts +3 -3
  105. package/src/context/state-tracker/track-context-state.ts +5 -6
  106. package/src/index.ts +0 -6
  107. package/src/utils/fill-array.ts +35 -0
  108. package/src/utils/load-script.ts +30 -0
  109. package/src/utils/split-uniforms-and-bindings.ts +31 -0
  110. package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
  111. package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
  112. package/dist/adapter/objects/constants-to-keys.js +0 -22
  113. package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
  114. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
  115. package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
  116. package/dist/adapter/objects/webgl-resource.d.ts +0 -32
  117. package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
  118. package/dist/adapter/objects/webgl-resource.js +0 -114
  119. package/src/adapter/objects/constants-to-keys.ts +0 -27
  120. package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
  121. package/src/adapter/objects/webgl-resource.ts +0 -183
@@ -0,0 +1,368 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ // import {Buffer} from '@luma.gl/core';
5
+ import { GL } from '@luma.gl/constants';
6
+ /** A "border" parameter is required in many WebGL texture APIs, but must always be 0... */
7
+ const BORDER = 0;
8
+ /**
9
+ * Initializes a texture memory space
10
+ * Clear all the textures and mip levels of a two-dimensional or array texture at the same time.
11
+ * On some implementations faster than repeatedly setting levels
12
+ *
13
+ * @note From WebGL 2 spec section 3.7.6:
14
+ * @see https://registry.khronos.org/webgl/specs/latest/2.0/
15
+ * - The image contents are set as if a buffer of sufficient size initialized to 0 would be passed to each level's texImage2D/3D
16
+ * - texStorage2D should be considered a preferred alternative to texImage2D. It may have lower memory costs than texImage2D in some implementations.
17
+ * - Once texStorage*D has been called, the texture is immutable and can only be updated with texSubImage*(), not texImage()
18
+ */
19
+ export function initializeTextureStorage(gl, levels, options) {
20
+ const { dimension, width, height, depth = 0 } = options;
21
+ const { glInternalFormat } = options;
22
+ const glTarget = options.glTarget; // getCubeTargetWebGL(options.glTarget, dimension, depth);
23
+ switch (dimension) {
24
+ case '2d-array':
25
+ case '3d':
26
+ gl.texStorage3D(glTarget, levels, glInternalFormat, width, height, depth);
27
+ break;
28
+ default:
29
+ gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);
30
+ }
31
+ }
32
+ /**
33
+ * Copy a region of compressed data from a GPU memory buffer into this texture.
34
+ */
35
+ export function copyCPUImageToMipLevel(gl, image, options) {
36
+ const { dimension, width, height, depth = 0, level = 0 } = options;
37
+ const { x = 0, y = 0, z = 0 } = options;
38
+ const { glFormat, glType } = options;
39
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
40
+ // width = size.width,
41
+ // height = size.height
42
+ switch (dimension) {
43
+ case '2d-array':
44
+ case '3d':
45
+ // prettier-ignore
46
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, image);
47
+ break;
48
+ case '2d':
49
+ case 'cube':
50
+ // prettier-ignore
51
+ gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, image);
52
+ break;
53
+ default:
54
+ throw new Error(dimension);
55
+ }
56
+ }
57
+ /**
58
+ * Copy a region of data from a CPU memory buffer into this texture.
59
+ */
60
+ export function copyCPUDataToMipLevel(gl, typedArray, options) {
61
+ const { dimension, width, height, depth = 0, level = 0, byteOffset = 0 } = options;
62
+ const { x = 0, y = 0, z = 0 } = options;
63
+ const { glFormat, glType, compressed } = options;
64
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
65
+ switch (dimension) {
66
+ case '2d-array':
67
+ case '3d':
68
+ if (compressed) {
69
+ // prettier-ignore
70
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength
71
+ }
72
+ else {
73
+ // prettier-ignore
74
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength
75
+ }
76
+ break;
77
+ case '2d':
78
+ case 'cube':
79
+ if (compressed) {
80
+ // prettier-ignore
81
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength
82
+ }
83
+ else {
84
+ // prettier-ignore
85
+ gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength
86
+ }
87
+ break;
88
+ default:
89
+ throw new Error(dimension);
90
+ }
91
+ }
92
+ /**
93
+ * Copy a region of compressed data from a GPU memory buffer into this texture.
94
+ */
95
+ export function copyGPUBufferToMipLevel(gl, webglBuffer, byteLength, options) {
96
+ const { dimension, width, height, depth = 0, level = 0, byteOffset = 0 } = options;
97
+ const { x = 0, y = 0, z = 0 } = options;
98
+ const { glFormat, glType, compressed } = options;
99
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
100
+ gl.bindBuffer(35052, webglBuffer);
101
+ switch (dimension) {
102
+ case '2d-array':
103
+ case '3d':
104
+ // 3 dimensional textures requires 3D texture functions
105
+ if (compressed) {
106
+ // TODO enable extension?
107
+ // prettier-ignore
108
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);
109
+ }
110
+ else {
111
+ // prettier-ignore
112
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, byteOffset);
113
+ }
114
+ break;
115
+ case '2d':
116
+ case 'cube':
117
+ if (compressed) {
118
+ // prettier-ignore
119
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, byteLength, byteOffset);
120
+ }
121
+ else {
122
+ // prettier-ignore
123
+ gl.texSubImage2D(glTarget, level, x, y, width, height, BORDER, glFormat, byteOffset);
124
+ }
125
+ break;
126
+ default:
127
+ throw new Error(dimension);
128
+ }
129
+ }
130
+ // INTERNAL HELPERS
131
+ /** Convert a WebGPU style texture constant to a WebGL style texture constant */
132
+ export function getWebGLTextureTarget(dimension) {
133
+ // prettier-ignore
134
+ switch (dimension) {
135
+ case '1d': break; // not supported in any WebGL version
136
+ case '2d': return 3553; // supported in WebGL1
137
+ case '3d': return 32879; // supported in WebGL2
138
+ case 'cube': return 34067; // supported in WebGL1
139
+ case '2d-array': return 35866; // supported in WebGL2
140
+ case 'cube-array': break; // not supported in any WebGL version
141
+ }
142
+ throw new Error(dimension);
143
+ }
144
+ /**
145
+ * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.
146
+ * @returns glTarget unchanged, if dimension !== 'cube'.
147
+ */
148
+ function getCubeTargetWebGL(glTarget, dimension, level) {
149
+ return dimension === 'cube' ? 34069 + level : glTarget;
150
+ }
151
+ // texImage methods
152
+ /**
153
+ * Clear a texture mip level.
154
+ * Wrapper for the messy WebGL texture API
155
+ *
156
+ export function clearMipLevel(gl: WebGL2RenderingContext, options: WebGLSetTextureOptions): void {
157
+ const {dimension, width, height, depth = 0, level = 0} = options;
158
+ const {glInternalFormat, glFormat, glType, compressed} = options;
159
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
160
+
161
+ switch (dimension) {
162
+ case '2d-array':
163
+ case '3d':
164
+ if (compressed) {
165
+ // prettier-ignore
166
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, null);
167
+ } else {
168
+ // prettier-ignore
169
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);
170
+ }
171
+ break;
172
+
173
+ case '2d':
174
+ case 'cube':
175
+ if (compressed) {
176
+ // prettier-ignore
177
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, null);
178
+ } else {
179
+ // prettier-ignore
180
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, null);
181
+ }
182
+ break;
183
+
184
+ default:
185
+ throw new Error(dimension);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Set a texture mip level to the contents of an external image.
191
+ * Wrapper for the messy WebGL texture API
192
+ * @note Corresponds to WebGPU device.queue.copyExternalImageToTexture()
193
+ *
194
+ export function setMipLevelFromExternalImage(
195
+ gl: WebGL2RenderingContext,
196
+ image: ExternalImage,
197
+ options: WebGLSetTextureOptions
198
+ ): void {
199
+ const {dimension, width, height, depth = 0, level = 0} = options;
200
+ const {glInternalFormat, glType} = options;
201
+
202
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
203
+
204
+ // TODO - we can't change texture width (due to WebGPU limitations) -
205
+ // and the width/heigh of an external image is implicit, so why do we need to extract it?
206
+ // So what width height do we supply? The image size or the texture size?
207
+ // const {width, height} = Texture.getExternalImageSize(image);
208
+
209
+ switch (dimension) {
210
+ case '2d-array':
211
+ case '3d':
212
+ // prettier-ignore
213
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glInternalFormat, glType, image);
214
+ break;
215
+
216
+ case '2d':
217
+ case 'cube':
218
+ // prettier-ignore
219
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glInternalFormat, glType, image);
220
+ break;
221
+
222
+ default:
223
+ throw new Error(dimension);
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Set a texture mip level from CPU memory
229
+ * Wrapper for the messy WebGL texture API
230
+ * @note Not available (directly) in WebGPU
231
+ *
232
+ export function setMipLevelFromTypedArray(
233
+ gl: WebGL2RenderingContext,
234
+ data: TypedArray,
235
+ parameters: {},
236
+ options: {
237
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';
238
+ height: number;
239
+ width: number;
240
+ depth?: number;
241
+ level?: number;
242
+ offset?: number;
243
+ glTarget: GLTextureTarget;
244
+ glInternalFormat: GL;
245
+ glFormat: GL;
246
+ glType: GL;
247
+ compressed?: boolean;
248
+ }
249
+ ): void {
250
+ const {dimension, width, height, depth = 0, level = 0, offset = 0} = options;
251
+ const {glInternalFormat, glFormat, glType, compressed} = options;
252
+
253
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
254
+
255
+ withGLParameters(gl, parameters, () => {
256
+ switch (dimension) {
257
+ case '2d-array':
258
+ case '3d':
259
+ if (compressed) {
260
+ // prettier-ignore
261
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, data);
262
+ } else {
263
+ // prettier-ignore
264
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, data);
265
+ }
266
+ break;
267
+
268
+ case '2d':
269
+ if (compressed) {
270
+ // prettier-ignore
271
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, data);
272
+ } else {
273
+ // prettier-ignore
274
+ gl.texImage2D( glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, data, offset);
275
+ }
276
+ break;
277
+
278
+ default:
279
+ throw new Error(dimension);
280
+ }
281
+ });
282
+ }
283
+
284
+ /**
285
+ * Set a texture level from CPU memory
286
+ * @note Not available (directly) in WebGPU
287
+ _setMipLevelFromTypedArray(
288
+ depth: number,
289
+ level: number,
290
+ data: TextureLevelData,
291
+ offset = 0,
292
+ parameters
293
+ ): void {
294
+ withGLParameters(this.gl, parameters, () => {
295
+ switch (this.props.dimension) {
296
+ case '2d-array':
297
+ case '3d':
298
+ if (this.compressed) {
299
+ // prettier-ignore
300
+ this.device.gl.compressedTexImage3D(this.glTarget, level, this.glInternalFormat, data.width, data.height, depth, BORDER, data.data);
301
+ } else {
302
+ // prettier-ignore
303
+ this.gl.texImage3D( this.glTarget, level, this.glInternalFormat, this.width, this.height, depth, BORDER, this.glFormat, this.glType, data.data);
304
+ }
305
+ break;
306
+
307
+ case '2d':
308
+ if (this.compressed) {
309
+ // prettier-ignore
310
+ this.device.gl.compressedTexImage2D(this.glTarget, level, this.glInternalFormat, data.width, data.height, BORDER, data.data);
311
+ } else {
312
+ // prettier-ignore
313
+ this.device.gl.texImage2D( this.glTarget, level, this.glInternalFormat, this.width, this.height, BORDER, this.glFormat, this.glType, data.data, offset);
314
+ }
315
+ break;
316
+
317
+ default:
318
+ throw new Error(this.props.dimension);
319
+ }
320
+ });
321
+ }
322
+
323
+ * Set a texture level from a GPU buffer
324
+ *
325
+ export function setMipLevelFromGPUBuffer(
326
+ gl: WebGL2RenderingContext,
327
+ buffer: Buffer,
328
+ options: WebGLSetTextureOptions
329
+ ): void {
330
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
331
+ const {glInternalFormat, glFormat, glType, compressed} = options;
332
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
333
+
334
+ const webglBuffer = buffer as WEBGLBuffer;
335
+ const imageSize = buffer.byteLength;
336
+
337
+ // In WebGL the source buffer is not a parameter. Instead it needs to be bound to a special bind point
338
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer.handle);
339
+
340
+ switch (dimension) {
341
+ case '2d-array':
342
+ case '3d':
343
+ if (compressed) {
344
+ // prettier-ignore
345
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, imageSize, byteOffset);
346
+ } else {
347
+ // prettier-ignore
348
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, byteOffset);
349
+ }
350
+ break;
351
+
352
+ case '2d':
353
+ if (compressed) {
354
+ // prettier-ignore
355
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, imageSize, byteOffset);
356
+ } else {
357
+ // prettier-ignore
358
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, byteOffset);
359
+ }
360
+ break;
361
+
362
+ default:
363
+ throw new Error(dimension);
364
+ }
365
+
366
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
367
+ }
368
+ */
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-topology-utils.d.ts","sourceRoot":"","sources":["../../../src/adapter/helpers/webgl-topology-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGhD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,WAAW,CAmB/E;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAkBT;AAGD,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAaT;AAED,sCAAsC;AACtC,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,GAEzB,EAAE,CAAC,MAAM,GACT,EAAE,CAAC,KAAK,GACR,EAAE,CAAC,UAAU,GACb,EAAE,CAAC,SAAS,GACZ,EAAE,CAAC,SAAS,GACZ,EAAE,CAAC,cAAc,GACjB,EAAE,CAAC,YAAY,CAYlB;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAY/F"}
1
+ {"version":3,"file":"webgl-topology-utils.d.ts","sourceRoot":"","sources":["../../../src/adapter/helpers/webgl-topology-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGhD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,WAAW,CAmB/E;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAkBT;AAGD,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAaT;AAED,sCAAsC;AACtC,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,GAEzB,EAAE,CAAC,MAAM,GACT,EAAE,CAAC,KAAK,GACR,EAAE,CAAC,UAAU,GACb,EAAE,CAAC,SAAS,GACZ,EAAE,CAAC,SAAS,GACZ,EAAE,CAAC,cAAc,GACjB,EAAE,CAAC,YAAY,CAUlB;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAU/F"}
@@ -65,10 +65,8 @@ export function getGLDrawMode(topology) {
65
65
  case 'point-list': return 0;
66
66
  case 'line-list': return 1;
67
67
  case 'line-strip': return 3;
68
- case 'line-loop-webgl': return 2;
69
68
  case 'triangle-list': return 4;
70
69
  case 'triangle-strip': return 5;
71
- case 'triangle-fan-webgl': return 6;
72
70
  default: throw new Error(topology);
73
71
  }
74
72
  }
@@ -79,10 +77,8 @@ export function getGLPrimitive(topology) {
79
77
  case 'point-list': return 0;
80
78
  case 'line-list': return 1;
81
79
  case 'line-strip': return 1;
82
- case 'line-loop-webgl': return 1;
83
80
  case 'triangle-list': return 4;
84
81
  case 'triangle-strip': return 4;
85
- case 'triangle-fan-webgl': return 4;
86
82
  default: throw new Error(topology);
87
83
  }
88
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,MAAM,EAAS,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAE5C,6BAA6B;AAC7B,qBAAa,WAAY,SAAQ,MAAM;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,oBAAoB,GAAG,EAAE,CAAC,cAAc,CAAC;IACjF,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY,CAAqB;IAE9E,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,WAAgB;IA2BxD,sEAAsE;IACtE,aAAa,CACX,IAAI,EAAE,WAAW,GAAG,eAAe,EACnC,UAAU,GAAE,MAAU,EACtB,UAAU,GAAE,MAAqC,GAChD,IAAI;IAgBP,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA2BpC,OAAO,IAAI,IAAI;IAWf,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,GAAE,MAAU,GAAG,IAAI;IAmBnE,+CAA+C;IAChC,SAAS,CAAC,UAAU,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIlF,2DAA2D;IAClD,aAAa,CAAC,UAAU,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;CAexE"}
1
+ {"version":3,"file":"webgl-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAE5C,6BAA6B;AAC7B,qBAAa,WAAY,SAAQ,MAAM;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,oBAAoB,GAAG,EAAE,CAAC,cAAc,CAAC;IACjF,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY,CAAqB;IAE9E,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,WAAgB;IA2BxD,sEAAsE;IACtE,aAAa,CACX,IAAI,EAAE,WAAW,GAAG,eAAe,EACnC,UAAU,GAAE,MAAU,EACtB,UAAU,GAAE,MAAqC,GAChD,IAAI;IAgBP,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA2BpC,OAAO,IAAI,IAAI;IAWf,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,GAAE,MAAU,GAAG,IAAI;IAmBnE,+CAA+C;IAChC,SAAS,CAAC,UAAU,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIlF,2DAA2D;IAClD,aAAa,CAAC,UAAU,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;CAexE"}
@@ -1,7 +1,7 @@
1
1
  // luma.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
- import { Buffer, assert } from '@luma.gl/core';
4
+ import { Buffer } from '@luma.gl/core';
5
5
  import { GL } from '@luma.gl/constants';
6
6
  /** WebGL Buffer interface */
7
7
  export class WEBGLBuffer extends Buffer {
@@ -55,7 +55,7 @@ export class WEBGLBuffer extends Buffer {
55
55
  }
56
56
  // Allocate a GPU buffer of specified size.
57
57
  _initWithByteLength(byteLength) {
58
- assert(byteLength >= 0);
58
+ // assert(byteLength >= 0);
59
59
  // Workaround needed for Safari (#291):
60
60
  // gl.bufferData with size equal to 0 crashes. Instead create zero sized array.
61
61
  let data = byteLength;
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-command-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-command-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,aAAa,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AAEtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAU5C,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,IAAI,EAAE,yBAAyB,CAAC;IAChC,OAAO,EAAE,2BAA2B,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GACR,yBAAyB,GACzB,0BAA0B,GAC1B,0BAA0B,GAC1B,2BAA2B,CAAC;AAEhC,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAM;gBAEb,MAAM,EAAE,WAAW;IAK/B,cAAc,CAAC,QAAQ,GAAE,OAAO,EAAkB;CAkBnD;AAgPD,wBAAgB,oBAAoB,CAAC,MAAM,KAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAmB1D;AAGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAcjD"}
1
+ {"version":3,"file":"webgl-command-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-command-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,aAAa,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AAEtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAM5C,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,IAAI,EAAE,yBAAyB,CAAC;IAChC,OAAO,EAAE,2BAA2B,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GACR,yBAAyB,GACzB,0BAA0B,GAC1B,0BAA0B,GAC1B,2BAA2B,CAAC;AAEhC,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAM;gBAEb,MAAM,EAAE,WAAW;IAK/B,cAAc,CAAC,QAAQ,GAAE,OAAO,EAAkB;CAkBnD;AAkPD,wBAAgB,oBAAoB,CAAC,MAAM,KAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAmB1D;AAGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAcjD"}
@@ -4,10 +4,7 @@
4
4
  import { CommandBuffer, Texture } from '@luma.gl/core';
5
5
  import { GL } from '@luma.gl/constants';
6
6
  import { WEBGLTexture } from "./webgl-texture.js";
7
- import { getWebGLTextureParameters } from "../converters/texture-formats.js";
8
- function cast(value) {
9
- return value;
10
- }
7
+ import { getTextureFormatWebGL } from "../converters/texture-formats.js";
11
8
  export class WEBGLCommandBuffer extends CommandBuffer {
12
9
  device;
13
10
  commands = [];
@@ -35,8 +32,8 @@ export class WEBGLCommandBuffer extends CommandBuffer {
35
32
  }
36
33
  }
37
34
  function _copyBufferToBuffer(device, options) {
38
- const source = cast(options.source);
39
- const destination = cast(options.destination);
35
+ const source = options.source;
36
+ const destination = options.destination;
40
37
  // {In WebGL2 we can p}erform the copy on the GPU
41
38
  // Use GL.COPY_READ_BUFFER+GL.COPY_WRITE_BUFFER avoid disturbing other targets and locking type
42
39
  device.gl.bindBuffer(36662, source.handle);
@@ -100,8 +97,8 @@ function _copyTextureToBuffer(device, options) {
100
97
  const webglBuffer = destination;
101
98
  const sourceWidth = width || framebuffer.width;
102
99
  const sourceHeight = height || framebuffer.height;
103
- const sourceParams = getWebGLTextureParameters(framebuffer.texture.props.format);
104
- const sourceFormat = sourceParams.dataFormat;
100
+ const sourceParams = getTextureFormatWebGL(framebuffer.colorAttachments[0].texture.props.format);
101
+ const sourceFormat = sourceParams.format;
105
102
  const sourceType = sourceParams.type;
106
103
  // if (!target) {
107
104
  // // Create new buffer with enough size
@@ -186,7 +183,7 @@ function _copyTextureToTexture(device, options) {
186
183
  width = Number.isFinite(width) ? width : texture.width;
187
184
  height = Number.isFinite(height) ? height : texture.height;
188
185
  texture.bind(0);
189
- textureTarget = texture.target;
186
+ textureTarget = texture.glTarget;
190
187
  }
191
188
  else {
192
189
  throw new Error('invalid destination');
@@ -10,7 +10,8 @@ export declare class WEBGLFramebuffer extends Framebuffer {
10
10
  device: WebGLDevice;
11
11
  gl: WebGL2RenderingContext;
12
12
  handle: WebGLFramebuffer;
13
- get texture(): import("@luma.gl/core").TextureView;
13
+ colorAttachments: WEBGLTextureView[];
14
+ depthStencilAttachment: WEBGLTextureView | null;
14
15
  constructor(device: WebGLDevice, props: FramebufferProps);
15
16
  /** destroys any auto created resources etc. */
16
17
  destroy(): void;
@@ -18,16 +19,42 @@ export declare class WEBGLFramebuffer extends Framebuffer {
18
19
  protected createDepthStencilTexture(format: TextureFormat): Texture;
19
20
  /**
20
21
  * Attachment resize is expected to be a noop if size is same
21
- */
22
- protected resizeAttachments(width: number, height: number): this;
22
+ *
23
+ protected override resizeAttachments(width: number, height: number): this {
24
+ // for default framebuffer, just update the stored size
25
+ if (this.handle === null) {
26
+ // assert(width === undefined && height === undefined);
27
+ this.width = this.gl.drawingBufferWidth;
28
+ this.height = this.gl.drawingBufferHeight;
29
+ return this;
30
+ }
31
+
32
+ if (width === undefined) {
33
+ width = this.gl.drawingBufferWidth;
34
+ }
35
+ if (height === undefined) {
36
+ height = this.gl.drawingBufferHeight;
37
+ }
38
+
39
+ // TODO Not clear that this is better than default destroy/create implementation
40
+
41
+ for (const colorAttachment of this.colorAttachments) {
42
+ colorAttachment.texture.clone({width, height});
43
+ }
44
+ if (this.depthStencilAttachment) {
45
+ this.depthStencilAttachment.texture.resize({width, height});
46
+ }
47
+ return this;
48
+ }
49
+ */
23
50
  /** Attach one attachment */
24
- protected _attachOne(attachmentPoint: GL, attachment: Attachment): WEBGLTexture;
51
+ protected _attachTexture(attachmentPoint: GL, textureView: WEBGLTextureView): void;
25
52
  /**
26
53
  * @param attachment
27
54
  * @param texture
28
55
  * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`
29
56
  * @param level = 0 - mipmapLevel
30
57
  */
31
- protected _attachTexture(attachment: GL, texture: WEBGLTexture, layer: number, level: number): void;
58
+ protected _attachTextureView(attachment: GL, textureView: WEBGLTextureView): void;
32
59
  }
33
60
  //# sourceMappingURL=webgl-framebuffer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-framebuffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-framebuffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AACnE,OAAO,EAAC,WAAW,EAAE,OAAO,EAAS,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAC5C,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,gBAAgB,EAAC,gCAA6B;AAMtD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAEzD,iDAAiD;AACjD,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,sBAAsB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IAEzB,IAAI,OAAO,wCAEV;gBAEW,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB;IAsDxD,+CAA+C;IACtC,OAAO,IAAI,IAAI;IAUxB,mGAAmG;cAChF,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAW5E;;OAEG;cACgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA2BzE,4BAA4B;IAC5B,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,YAAY;IAqC/E;;;;;OAKG;IACH,SAAS,CAAC,cAAc,CACtB,UAAU,EAAE,EAAE,EACd,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI;CA2BR"}
1
+ {"version":3,"file":"webgl-framebuffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-framebuffer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AACnE,OAAO,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,EAAE,EAAC,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAC5C,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,gBAAgB,EAAC,gCAA6B;AAGtD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAEzD,iDAAiD;AACjD,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,sBAAsB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IAEzB,gBAAgB,EAAE,gBAAgB,EAAE,CAAM;IAC1C,sBAAsB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;gBAE3C,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB;IAsDxD,+CAA+C;IACtC,OAAO,IAAI,IAAI;IAUxB,mGAAmG;cAChF,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAW5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6BE;IAEF,4BAA4B;IAC5B,SAAS,CAAC,cAAc,CAAC,eAAe,EAAE,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,IAAI;IAQlF;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,IAAI;CA8BlF"}