@luma.gl/webgl 9.0.11 → 9.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +34 -0
- package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/device-parameters.js +12 -1
- package/dist/adapter/converters/texture-formats.d.ts +22 -16
- package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
- package/dist/adapter/converters/texture-formats.js +31 -32
- package/dist/adapter/device-helpers/webgl-device-features.js +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
- package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
- package/dist/adapter/helpers/webgl-texture-utils.js +368 -0
- package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +2 -2
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +6 -9
- package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +42 -60
- package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +1 -3
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +45 -20
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +2 -2
- package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
- package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture-view.js +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts +58 -172
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +402 -510
- package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +5 -2
- package/dist/adapter/webgl-canvas-context.d.ts +3 -1
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +2 -0
- package/dist/adapter/webgl-device.d.ts +4 -3
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +6 -5
- package/dist/classic/accessor.d.ts +22 -1
- package/dist/classic/accessor.d.ts.map +1 -1
- package/dist/classic/accessor.js +1 -9
- package/dist/classic/clear.d.ts.map +1 -1
- package/dist/classic/clear.js +2 -5
- package/dist/classic/copy-and-blit.d.ts +2 -1
- package/dist/classic/copy-and-blit.d.ts.map +1 -1
- package/dist/classic/copy-and-blit.js +11 -9
- package/dist/classic/format-utils.d.ts.map +1 -1
- package/dist/classic/format-utils.js +0 -3
- package/dist/classic/typed-array-utils.d.ts +1 -1
- package/dist/classic/typed-array-utils.d.ts.map +1 -1
- package/dist/context/debug/spector.d.ts.map +1 -1
- package/dist/context/debug/spector.js +2 -1
- package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +2 -5
- package/dist/context/parameters/webgl-parameter-tables.js +1 -1
- package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
- package/dist/context/state-tracker/track-context-state.js +5 -6
- package/dist/dist.dev.js +872 -1262
- package/dist/dist.min.js +2 -2
- package/dist/index.cjs +861 -1138
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/utils/fill-array.d.ts +8 -0
- package/dist/utils/fill-array.d.ts.map +1 -0
- package/dist/utils/fill-array.js +26 -0
- package/dist/utils/load-script.d.ts +8 -0
- package/dist/utils/load-script.d.ts.map +1 -0
- package/dist/utils/load-script.js +26 -0
- package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
- package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
- package/dist/utils/split-uniforms-and-bindings.js +20 -0
- package/package.json +6 -5
- package/src/adapter/converters/device-parameters.ts +13 -1
- package/src/adapter/converters/texture-formats.ts +45 -42
- package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
- package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
- package/src/adapter/helpers/webgl-texture-utils.ts +481 -0
- package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
- package/src/adapter/resources/webgl-buffer.ts +2 -2
- package/src/adapter/resources/webgl-command-buffer.ts +8 -10
- package/src/adapter/resources/webgl-framebuffer.ts +22 -56
- package/src/adapter/resources/webgl-render-pass.ts +4 -5
- package/src/adapter/resources/webgl-render-pipeline.ts +48 -23
- package/src/adapter/resources/webgl-shader.ts +3 -3
- package/src/adapter/resources/webgl-texture-view.ts +1 -3
- package/src/adapter/resources/webgl-texture.ts +432 -784
- package/src/adapter/resources/webgl-transform-feedback.ts +1 -1
- package/src/adapter/resources/webgl-vertex-array.ts +11 -7
- package/src/adapter/webgl-canvas-context.ts +4 -1
- package/src/adapter/webgl-device.ts +10 -18
- package/src/classic/accessor.ts +31 -11
- package/src/classic/clear.ts +3 -6
- package/src/classic/copy-and-blit.ts +19 -19
- package/src/classic/format-utils.ts +0 -3
- package/src/classic/typed-array-utils.ts +1 -1
- package/src/context/debug/spector.ts +2 -1
- package/src/context/debug/webgl-developer-tools.ts +3 -7
- package/src/context/parameters/webgl-parameter-tables.ts +3 -3
- package/src/context/state-tracker/track-context-state.ts +5 -6
- package/src/index.ts +0 -6
- package/src/utils/fill-array.ts +35 -0
- package/src/utils/load-script.ts +30 -0
- package/src/utils/split-uniforms-and-bindings.ts +31 -0
- package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
- package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
- package/dist/adapter/objects/constants-to-keys.js +0 -22
- package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
- package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
- package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
- package/dist/adapter/objects/webgl-resource.d.ts +0 -32
- package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
- package/dist/adapter/objects/webgl-resource.js +0 -114
- package/src/adapter/objects/constants-to-keys.ts +0 -27
- package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
- 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,
|
|
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,
|
|
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
|
|
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;
|
|
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 {
|
|
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 =
|
|
39
|
-
const 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 =
|
|
104
|
-
const sourceFormat = sourceParams.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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"}
|