@zephyr3d/device 0.2.5 → 0.2.7
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/dist/base_types.js +12 -13
- package/dist/base_types.js.map +1 -1
- package/dist/builder/ast.js +34 -48
- package/dist/builder/ast.js.map +1 -1
- package/dist/builder/base.js +6 -2
- package/dist/builder/base.js.map +1 -1
- package/dist/builder/builtinfunc.js +42 -6
- package/dist/builder/builtinfunc.js.map +1 -1
- package/dist/builder/constructors.js +2 -0
- package/dist/builder/constructors.js.map +1 -1
- package/dist/builder/errors.js +4 -4
- package/dist/builder/errors.js.map +1 -1
- package/dist/builder/misc.js +1 -1
- package/dist/builder/misc.js.map +1 -1
- package/dist/builder/programbuilder.js +18 -27
- package/dist/builder/programbuilder.js.map +1 -1
- package/dist/builder/reflection.js +1 -1
- package/dist/builder/reflection.js.map +1 -1
- package/dist/builder/types.js +7 -6
- package/dist/builder/types.js.map +1 -1
- package/dist/device.js +148 -39
- package/dist/device.js.map +1 -1
- package/dist/gpuobject.js +2 -1
- package/dist/gpuobject.js.map +1 -1
- package/dist/helpers/drawtext.js +29 -25
- package/dist/helpers/drawtext.js.map +1 -1
- package/dist/helpers/font.js.map +1 -1
- package/dist/helpers/glyphmanager.js +26 -8
- package/dist/helpers/glyphmanager.js.map +1 -1
- package/dist/helpers/textureatlas.js +7 -3
- package/dist/helpers/textureatlas.js.map +1 -1
- package/dist/index.d.ts +290 -266
- package/dist/pool.js +15 -6
- package/dist/pool.js.map +1 -1
- package/dist/timer.js +3 -2
- package/dist/timer.js.map +1 -1
- package/dist/uniformdata.js +1 -1
- package/dist/uniformdata.js.map +1 -1
- package/dist/vertexdata.js +2 -2
- package/dist/vertexdata.js.map +1 -1
- package/package.json +80 -80
package/dist/device.js
CHANGED
|
@@ -5,10 +5,113 @@ import { Pool } from './pool.js';
|
|
|
5
5
|
import { ProgramBuilder } from './builder/programbuilder.js';
|
|
6
6
|
import { DrawText } from './helpers/drawtext.js';
|
|
7
7
|
|
|
8
|
+
class ResizeHandler {
|
|
9
|
+
_canvas;
|
|
10
|
+
_dpr;
|
|
11
|
+
_cssWidth;
|
|
12
|
+
_cssHeight;
|
|
13
|
+
_deviceWidth;
|
|
14
|
+
_deviceHeight;
|
|
15
|
+
_resizeObserver;
|
|
16
|
+
_mutationObserver;
|
|
17
|
+
_onResizeCallback;
|
|
18
|
+
constructor(canvas, onResize, dpr){
|
|
19
|
+
this._canvas = canvas;
|
|
20
|
+
this._dpr = dpr;
|
|
21
|
+
this._cssWidth = 0;
|
|
22
|
+
this._cssHeight = 0;
|
|
23
|
+
this._deviceWidth = 0;
|
|
24
|
+
this._deviceHeight = 0;
|
|
25
|
+
this._onResizeCallback = onResize;
|
|
26
|
+
}
|
|
27
|
+
init() {
|
|
28
|
+
const canvas = this._canvas;
|
|
29
|
+
if (window.ResizeObserver) {
|
|
30
|
+
this._resizeObserver = new ResizeObserver((entries)=>{
|
|
31
|
+
const entry = entries[0];
|
|
32
|
+
this._handleResizeEntry(entry);
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
this._resizeObserver.observe(canvas);
|
|
36
|
+
} catch {
|
|
37
|
+
this._resizeObserver.observe(canvas);
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
if (window.MutationObserver) {
|
|
41
|
+
this._mutationObserver = new MutationObserver((mutations)=>{
|
|
42
|
+
if (mutations.length > 0) {
|
|
43
|
+
this._handleLegacyResize();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
this._mutationObserver.observe(canvas, {
|
|
47
|
+
attributes: true,
|
|
48
|
+
attributeFilter: [
|
|
49
|
+
'style'
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
window.addEventListener('resize', this._handleLegacyResize);
|
|
54
|
+
this._handleLegacyResize();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
_handleResizeEntry(_entry) {
|
|
58
|
+
// CSS pixel
|
|
59
|
+
const cssWidth = _entry.contentBoxSize[0].inlineSize;
|
|
60
|
+
const cssHeight = _entry.contentBoxSize[0].blockSize;
|
|
61
|
+
// Device pixel
|
|
62
|
+
/*
|
|
63
|
+
let deviceWidth: number;
|
|
64
|
+
let deviceHeight: number;
|
|
65
|
+
|
|
66
|
+
const dpBox = (entry as any).devicePixelContentBoxSize?.[0];
|
|
67
|
+
if (dpBox) {
|
|
68
|
+
deviceWidth = dpBox.inlineSize;
|
|
69
|
+
deviceHeight = dpBox.blockSize;
|
|
70
|
+
} else {
|
|
71
|
+
deviceWidth = Math.round(cssWidth * this._dpr);
|
|
72
|
+
deviceHeight = Math.round(cssHeight * this._dpr);
|
|
73
|
+
}
|
|
74
|
+
*/ const deviceWidth = cssWidth * this._dpr;
|
|
75
|
+
const deviceHeight = cssHeight * this._dpr;
|
|
76
|
+
if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this._cssWidth = cssWidth;
|
|
80
|
+
this._cssHeight = cssHeight;
|
|
81
|
+
this._deviceWidth = deviceWidth;
|
|
82
|
+
this._deviceHeight = deviceHeight;
|
|
83
|
+
this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
84
|
+
}
|
|
85
|
+
_handleLegacyResize = ()=>{
|
|
86
|
+
const cssWidth = this._canvas.clientWidth;
|
|
87
|
+
const cssHeight = this._canvas.clientHeight;
|
|
88
|
+
const dpr = window.devicePixelRatio || 1;
|
|
89
|
+
const deviceWidth = Math.round(cssWidth * dpr);
|
|
90
|
+
const deviceHeight = Math.round(cssHeight * dpr);
|
|
91
|
+
if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this._cssWidth = cssWidth;
|
|
95
|
+
this._cssHeight = cssHeight;
|
|
96
|
+
this._deviceWidth = deviceWidth;
|
|
97
|
+
this._deviceHeight = deviceHeight;
|
|
98
|
+
this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
99
|
+
};
|
|
100
|
+
dispose() {
|
|
101
|
+
if (this._resizeObserver) {
|
|
102
|
+
this._resizeObserver.disconnect();
|
|
103
|
+
}
|
|
104
|
+
if (this._mutationObserver) {
|
|
105
|
+
this._mutationObserver.disconnect();
|
|
106
|
+
}
|
|
107
|
+
window.removeEventListener('resize', this._handleLegacyResize);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
8
110
|
/**
|
|
9
111
|
* Base class for rendering device
|
|
10
112
|
* @public
|
|
11
113
|
*/ class BaseDevice extends Observable {
|
|
114
|
+
_dpr;
|
|
12
115
|
_canvas;
|
|
13
116
|
_canvasClientWidth;
|
|
14
117
|
_canvasClientHeight;
|
|
@@ -30,9 +133,11 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
30
133
|
_defaultPoolKey;
|
|
31
134
|
_temporalFramebuffer;
|
|
32
135
|
_vSync;
|
|
136
|
+
_resizer;
|
|
33
137
|
_stateStack;
|
|
34
|
-
constructor(cvs, backend){
|
|
138
|
+
constructor(cvs, backend, dpr){
|
|
35
139
|
super();
|
|
140
|
+
this._dpr = dpr ?? window.devicePixelRatio ?? 1;
|
|
36
141
|
this._backend = backend;
|
|
37
142
|
this._gpuObjectList = {
|
|
38
143
|
textures: [],
|
|
@@ -81,7 +186,16 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
81
186
|
this._temporalFramebuffer = false;
|
|
82
187
|
this._temporalFramebuffer = false;
|
|
83
188
|
this._vSync = true;
|
|
84
|
-
this._registerEventHandlers();
|
|
189
|
+
//this._registerEventHandlers();
|
|
190
|
+
this._resizer = new ResizeHandler(this._canvas, (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
191
|
+
this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
192
|
+
}, this._dpr);
|
|
193
|
+
}
|
|
194
|
+
getScaleX() {
|
|
195
|
+
return this._canvas.width / this._canvas.clientWidth;
|
|
196
|
+
}
|
|
197
|
+
getScaleY() {
|
|
198
|
+
return this._canvas.height / this._canvas.clientHeight;
|
|
85
199
|
}
|
|
86
200
|
get backend() {
|
|
87
201
|
return this._backend;
|
|
@@ -130,8 +244,8 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
130
244
|
setFont(fontName) {
|
|
131
245
|
DrawText.setFont(this, fontName);
|
|
132
246
|
}
|
|
133
|
-
drawText(text, x, y, color) {
|
|
134
|
-
DrawText.drawText(this, text, color, x, y);
|
|
247
|
+
drawText(text, x, y, color, viewport) {
|
|
248
|
+
DrawText.drawText(this, text, color, x, y, viewport);
|
|
135
249
|
}
|
|
136
250
|
setFramebuffer(colorOrRT, depth, sampleCount) {
|
|
137
251
|
let newRT = null;
|
|
@@ -144,7 +258,7 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
144
258
|
}
|
|
145
259
|
const currentRT = this.getFramebuffer();
|
|
146
260
|
if (currentRT !== newRT) {
|
|
147
|
-
if (this._temporalFramebuffer) {
|
|
261
|
+
if (this._temporalFramebuffer && currentRT) {
|
|
148
262
|
this.pool.releaseFrameBuffer(currentRT);
|
|
149
263
|
}
|
|
150
264
|
this._temporalFramebuffer = temporal;
|
|
@@ -213,6 +327,10 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
213
327
|
size += getVertexFormatSize(format);
|
|
214
328
|
}
|
|
215
329
|
const vertexBufferType = makeVertexBufferType(data.byteLength / size >> 0, ...attribFormats);
|
|
330
|
+
if (!vertexBufferType) {
|
|
331
|
+
console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
216
334
|
const opt = Object.assign({
|
|
217
335
|
usage: 'vertex',
|
|
218
336
|
dynamic: false,
|
|
@@ -235,6 +353,10 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
235
353
|
}
|
|
236
354
|
const count = getVertexFormatSize(attribFormat);
|
|
237
355
|
const vertexBufferType = makeVertexBufferType(data.byteLength / count >> 0, attribFormat);
|
|
356
|
+
if (!vertexBufferType) {
|
|
357
|
+
console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
238
360
|
const opt = Object.assign({
|
|
239
361
|
usage: 'vertex',
|
|
240
362
|
dynamic: false,
|
|
@@ -378,11 +500,17 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
378
500
|
}
|
|
379
501
|
return null;
|
|
380
502
|
}
|
|
381
|
-
|
|
382
|
-
return this.getFramebuffer() ? val : Math.round(val * this.
|
|
503
|
+
screenXToDevice(val) {
|
|
504
|
+
return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());
|
|
505
|
+
}
|
|
506
|
+
deviceXToScreen(val) {
|
|
507
|
+
return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());
|
|
508
|
+
}
|
|
509
|
+
screenYToDevice(val) {
|
|
510
|
+
return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());
|
|
383
511
|
}
|
|
384
|
-
|
|
385
|
-
return this.getFramebuffer() ? val : Math.round(val / this.
|
|
512
|
+
deviceYToScreen(val) {
|
|
513
|
+
return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());
|
|
386
514
|
}
|
|
387
515
|
buildRenderProgram(options) {
|
|
388
516
|
return this._programBuilder.buildRenderProgram(options);
|
|
@@ -410,37 +538,17 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
410
538
|
updateVideoMemoryCost(delta) {
|
|
411
539
|
this._gpuMemCost += delta;
|
|
412
540
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
this.
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
420
|
-
_registerEventHandlers() {
|
|
421
|
-
const canvas = this._canvas;
|
|
422
|
-
const that = this;
|
|
423
|
-
if (window.ResizeObserver) {
|
|
424
|
-
new window.ResizeObserver(()=>{
|
|
425
|
-
that._onresize();
|
|
426
|
-
}).observe(canvas, {});
|
|
427
|
-
} else {
|
|
428
|
-
if (window.MutationObserver) {
|
|
429
|
-
new MutationObserver(function(mutations) {
|
|
430
|
-
if (mutations.length > 0) {
|
|
431
|
-
that._onresize();
|
|
432
|
-
}
|
|
433
|
-
}).observe(canvas, {
|
|
434
|
-
attributes: true,
|
|
435
|
-
attributeFilter: [
|
|
436
|
-
'style'
|
|
437
|
-
]
|
|
541
|
+
async initResizer() {
|
|
542
|
+
return new Promise((resolve)=>{
|
|
543
|
+
this.once('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
544
|
+
this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
545
|
+
this.on('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
546
|
+
this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
438
547
|
});
|
|
439
|
-
|
|
440
|
-
window.addEventListener('resize', ()=>{
|
|
441
|
-
this._onresize();
|
|
548
|
+
resolve();
|
|
442
549
|
});
|
|
443
|
-
|
|
550
|
+
this._resizer.init();
|
|
551
|
+
});
|
|
444
552
|
}
|
|
445
553
|
updateFrameInfo() {
|
|
446
554
|
this._frameInfo.drawCalls = 0;
|
|
@@ -551,7 +659,8 @@ import { DrawText } from './helpers/drawtext.js';
|
|
|
551
659
|
return noMipmapFlag | writableFlag | dynamicFlag;
|
|
552
660
|
}
|
|
553
661
|
parseBufferOptions(options, defaultUsage) {
|
|
554
|
-
|
|
662
|
+
options = options ?? {};
|
|
663
|
+
const usage = options.usage ?? defaultUsage;
|
|
555
664
|
let usageFlag;
|
|
556
665
|
switch(usage){
|
|
557
666
|
case 'uniform':
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import { type Vector4, type TypedArray, type IEventTarget, Observable } from '@zephyr3d/base';\r\nimport type { ITimer } from './timer';\r\nimport { CPUTimer } from './timer';\r\nimport type {\r\n BlendingState,\r\n ColorState,\r\n DepthState,\r\n RasterizerState,\r\n RenderStateSet,\r\n StencilState\r\n} from './render_states';\r\nimport type {\r\n FrameBufferOptions,\r\n SamplerOptions,\r\n TextureSampler,\r\n Texture2D,\r\n Texture3D,\r\n TextureCube,\r\n VertexLayout,\r\n GPUDataBuffer,\r\n FrameBuffer,\r\n GPUProgram,\r\n GPUObject,\r\n StructuredBuffer,\r\n BindGroupLayout,\r\n BindGroup,\r\n IndexBuffer,\r\n TextureVideo,\r\n TextureMipmapData,\r\n TextureImageElement,\r\n Texture2DArray,\r\n TextureCreationOptions,\r\n BufferCreationOptions,\r\n BufferUsage,\r\n VertexSemantic,\r\n VertexAttribFormat,\r\n VertexLayoutOptions,\r\n BaseTexture,\r\n RenderBundle\r\n} from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n makeVertexBufferType,\r\n getVertexFormatSize,\r\n getVertexAttribFormat\r\n} from './gpuobject';\r\nimport type { PBComputeOptions, PBRenderOptions, PBStructTypeInfo } from './builder';\r\nimport { ProgramBuilder } from './builder';\r\nimport type {\r\n DataType,\r\n PrimitiveType,\r\n TextureFormat,\r\n GPUObjectList,\r\n FrameInfo,\r\n DeviceCaps,\r\n GPUProgramConstructParams,\r\n AbstractDevice,\r\n DeviceOptions,\r\n DeviceEventMap,\r\n DeviceViewport\r\n} from './base_types';\r\nimport { DrawText } from './helpers';\r\nimport { Pool } from './pool';\r\n\r\n/**\r\n * The device backend interface\r\n * @public\r\n */\r\nexport interface DeviceBackend {\r\n typeName(): string;\r\n supported(): boolean;\r\n createDevice(cvs: HTMLCanvasElement, options?: DeviceOptions): Promise<AbstractDevice>;\r\n}\r\n\r\ntype DeviceState = {\r\n framebuffer: FrameBuffer;\r\n windowOrderReversed: boolean;\r\n viewport: DeviceViewport;\r\n scissor: DeviceViewport;\r\n renderStateSet: RenderStateSet;\r\n program: GPUProgram;\r\n vertexLayout: VertexLayout;\r\n bindGroups: [BindGroup, Iterable<number>][];\r\n};\r\n\r\n/**\r\n * Base class for rendering device\r\n * @public\r\n */\r\nexport abstract class BaseDevice extends Observable<DeviceEventMap> {\r\n protected _canvas: HTMLCanvasElement;\r\n protected _canvasClientWidth: number;\r\n protected _canvasClientHeight: number;\r\n protected _gpuObjectList: GPUObjectList;\r\n protected _gpuMemCost: number;\r\n protected _disposeObjectList: GPUObject[];\r\n protected _beginFrameTime: number;\r\n protected _endFrameTime: number;\r\n protected _frameInfo: FrameInfo;\r\n protected _cpuTimer: CPUTimer;\r\n protected _gpuTimer: ITimer;\r\n protected _runningLoop: number;\r\n protected _fpsCounter: { time: number; frame: number };\r\n protected _runLoopFunc: (device: AbstractDevice) => void;\r\n protected _backend: DeviceBackend;\r\n protected _beginFrameCounter: number;\r\n protected _programBuilder: ProgramBuilder;\r\n protected _poolMap: Map<string | symbol, Pool>;\r\n protected _defaultPoolKey: symbol;\r\n protected _temporalFramebuffer: boolean;\r\n protected _vSync: boolean;\r\n private readonly _stateStack: DeviceState[];\r\n constructor(cvs: HTMLCanvasElement, backend: DeviceBackend) {\r\n super();\r\n this._backend = backend;\r\n this._gpuObjectList = {\r\n textures: [],\r\n samplers: [],\r\n buffers: [],\r\n programs: [],\r\n framebuffers: [],\r\n vertexArrayObjects: [],\r\n bindGroups: []\r\n };\r\n this._canvas = cvs;\r\n this._canvas.setAttribute('tabindex', '1');\r\n this._canvasClientWidth = cvs.clientWidth;\r\n this._canvasClientHeight = cvs.clientHeight;\r\n this._gpuMemCost = 0;\r\n this._disposeObjectList = [];\r\n this._beginFrameTime = 0;\r\n this._endFrameTime = 0;\r\n this._runLoopFunc = null;\r\n this._frameInfo = {\r\n frameCounter: 0,\r\n frameTimestamp: 0,\r\n elapsedTimeCPU: 0,\r\n elapsedTimeGPU: 0,\r\n elapsedFrame: 0,\r\n elapsedOverall: 0,\r\n FPS: 0,\r\n drawCalls: 0,\r\n computeCalls: 0,\r\n nextFrameCall: [],\r\n nextFrameCallNext: []\r\n };\r\n this._programBuilder = new ProgramBuilder(this);\r\n this._cpuTimer = new CPUTimer();\r\n this._gpuTimer = null;\r\n this._runningLoop = null;\r\n this._fpsCounter = { time: 0, frame: 0 };\r\n this._stateStack = [];\r\n this._beginFrameCounter = 0;\r\n this._poolMap = new Map();\r\n this._defaultPoolKey = Symbol('defaultPool');\r\n this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));\r\n this._temporalFramebuffer = false;\r\n this._temporalFramebuffer = false;\r\n this._vSync = true;\r\n this._registerEventHandlers();\r\n }\r\n abstract getAdapterInfo(): any;\r\n abstract getFrameBufferSampleCount(): number;\r\n abstract isContextLost(): boolean;\r\n abstract getScale(): number;\r\n abstract getDrawingBufferWidth(): number;\r\n abstract getDrawingBufferHeight(): number;\r\n abstract getBackBufferWidth(): number;\r\n abstract getBackBufferHeight(): number;\r\n abstract getDeviceCaps(): DeviceCaps;\r\n abstract initContext(): Promise<void>;\r\n abstract clearFrameBuffer(clearColor: Vector4, clearDepth: number, clearStencil: number);\r\n abstract createGPUTimer(): ITimer;\r\n abstract createRenderStateSet(): RenderStateSet;\r\n abstract createBlendingState(): BlendingState;\r\n abstract createColorState(): ColorState;\r\n abstract createRasterizerState(): RasterizerState;\r\n abstract createDepthState(): DepthState;\r\n abstract createStencilState(): StencilState;\r\n abstract createSampler(options: SamplerOptions): TextureSampler;\r\n abstract createTextureFromMipmapData<T extends BaseTexture>(\r\n data: TextureMipmapData,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): T;\r\n abstract createTexture2D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n options?: TextureCreationOptions\r\n ): Texture2D;\r\n abstract createTexture2DFromImage(\r\n element: TextureImageElement,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Texture2D;\r\n abstract createTexture2DArray(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Texture2DArray;\r\n abstract createTexture2DArrayFromImages(\r\n elements: TextureImageElement[],\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Texture2DArray;\r\n abstract createTexture3D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Texture3D;\r\n abstract createCubeTexture(\r\n format: TextureFormat,\r\n size: number,\r\n options?: TextureCreationOptions\r\n ): TextureCube;\r\n abstract createTextureVideo(el: HTMLVideoElement, samplerOptions?: SamplerOptions): TextureVideo;\r\n abstract reverseVertexWindingOrder(reverse: boolean): void;\r\n abstract isWindingOrderReversed(): boolean;\r\n abstract copyTexture2D(src: Texture2D, srcLevel: number, dst: Texture2D, dstLevel: number);\r\n abstract copyFramebufferToTexture2D(src: FrameBuffer, index: number, dst: Texture2D, level: number);\r\n // program\r\n abstract createGPUProgram(params: GPUProgramConstructParams): GPUProgram;\r\n abstract createBindGroup(layout: BindGroupLayout): BindGroup;\r\n abstract createBuffer(sizeInBytes: number, options: BufferCreationOptions): GPUDataBuffer;\r\n abstract copyBuffer(\r\n sourceBuffer: GPUDataBuffer,\r\n destBuffer: GPUDataBuffer,\r\n srcOffset: number,\r\n dstOffset: number,\r\n bytes: number\r\n );\r\n abstract createIndexBuffer(\r\n data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>,\r\n options?: BufferCreationOptions\r\n ): IndexBuffer;\r\n abstract createStructuredBuffer(\r\n structureType: PBStructTypeInfo,\r\n options: BufferCreationOptions,\r\n data?: TypedArray\r\n ): StructuredBuffer;\r\n abstract createVertexLayout(options: VertexLayoutOptions): VertexLayout;\r\n abstract createFrameBuffer(\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: BaseTexture,\r\n options?: FrameBufferOptions\r\n ): FrameBuffer;\r\n // render related\r\n abstract setViewport(vp?: number[] | DeviceViewport): void;\r\n abstract getViewport(): DeviceViewport;\r\n abstract setScissor(scissor?: number[] | DeviceViewport): void;\r\n abstract getScissor(): DeviceViewport;\r\n abstract setProgram(program: GPUProgram): void;\r\n abstract getProgram(): GPUProgram;\r\n abstract setVertexLayout(vertexData: VertexLayout): void;\r\n abstract getVertexLayout(): VertexLayout;\r\n abstract setRenderStates(renderStates: RenderStateSet): void;\r\n abstract getRenderStates(): RenderStateSet;\r\n abstract getFramebuffer(): FrameBuffer;\r\n abstract setBindGroup(index: number, bindGroup: BindGroup, dynamicOffsets?: Iterable<number>);\r\n abstract getBindGroup(index: number): [BindGroup, Iterable<number>];\r\n abstract flush(): void;\r\n abstract nextFrame(callback: () => void): number;\r\n abstract cancelNextFrame(handle: number);\r\n // misc\r\n abstract readPixels(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: TypedArray\r\n ): Promise<void>;\r\n abstract readPixelsToBuffer(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: GPUDataBuffer\r\n ): void;\r\n abstract beginCapture(): void;\r\n abstract endCapture(): RenderBundle;\r\n abstract looseContext(): void;\r\n abstract restoreContext(): void;\r\n protected abstract _executeRenderBundle(renderBundle: RenderBundle): number;\r\n protected abstract _draw(primitiveType: PrimitiveType, first: number, count: number): void;\r\n protected abstract _drawInstanced(\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ): void;\r\n protected abstract _compute(\r\n workgroupCountX: number,\r\n workgroupCountY: number,\r\n workgroupCountZ: number\r\n ): void;\r\n get backend(): DeviceBackend {\r\n return this._backend;\r\n }\r\n get videoMemoryUsage(): number {\r\n return this._gpuMemCost;\r\n }\r\n get frameInfo(): FrameInfo {\r\n return this._frameInfo;\r\n }\r\n get isRendering(): boolean {\r\n return this._runningLoop !== null;\r\n }\r\n get canvas(): HTMLCanvasElement {\r\n return this._canvas;\r\n }\r\n get type(): string {\r\n return this._backend.typeName();\r\n }\r\n get vSync(): boolean {\r\n return this._vSync;\r\n }\r\n set vSync(val: boolean) {\r\n this._vSync = !!val;\r\n }\r\n get pool(): Pool {\r\n return this._poolMap.get(this._defaultPoolKey);\r\n }\r\n get runLoopFunction(): (device: AbstractDevice) => void {\r\n return this._runLoopFunc;\r\n }\r\n get programBuilder(): ProgramBuilder {\r\n return this._programBuilder;\r\n }\r\n poolExists(key: string | symbol): boolean {\r\n return this._poolMap.has(key);\r\n }\r\n getPool(key: string | symbol): Pool {\r\n let pool = this._poolMap.get(key);\r\n if (!pool) {\r\n pool = new Pool(this, key);\r\n this._poolMap.set(key, pool);\r\n }\r\n return pool;\r\n }\r\n setFont(fontName: string) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n drawText(text: string, x: number, y: number, color: string) {\r\n DrawText.drawText(this, text, color, x, y);\r\n }\r\n setFramebuffer(rt: FrameBuffer);\r\n setFramebuffer(color: BaseTexture[], depth?: BaseTexture, sampleCount?: number);\r\n setFramebuffer(colorOrRT: BaseTexture[] | FrameBuffer, depth?: BaseTexture, sampleCount?: number) {\r\n let newRT: FrameBuffer = null;\r\n let temporal = false;\r\n if (!Array.isArray(colorOrRT)) {\r\n newRT = colorOrRT ?? null;\r\n } else {\r\n newRT = this.pool.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);\r\n temporal = true;\r\n }\r\n const currentRT = this.getFramebuffer();\r\n if (currentRT !== newRT) {\r\n if (this._temporalFramebuffer) {\r\n this.pool.releaseFrameBuffer(currentRT);\r\n }\r\n this._temporalFramebuffer = temporal;\r\n this._setFramebuffer(newRT);\r\n }\r\n }\r\n disposeObject(obj: GPUObject, remove = true) {\r\n if (obj) {\r\n if (remove) {\r\n this.removeGPUObject(obj);\r\n }\r\n if (this.isContextLost()) {\r\n obj.destroy();\r\n } else {\r\n this._disposeObjectList.push(obj);\r\n }\r\n }\r\n }\r\n restoreObject(obj: GPUObject) {\r\n if (obj && obj.disposed && !this.isContextLost()) {\r\n obj.restore();\r\n obj.restoreHandler?.(obj);\r\n }\r\n }\r\n enableGPUTimeRecording(enable: boolean) {\r\n if (enable && !this._gpuTimer) {\r\n this._gpuTimer = this.createGPUTimer();\r\n } else if (!enable) {\r\n this._gpuTimer?.end();\r\n this._gpuTimer = null;\r\n }\r\n }\r\n beginFrame(): boolean {\r\n if (this._beginFrameCounter === 0) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n this._beginFrameCounter++;\r\n this._beginFrameTime = this._cpuTimer.now();\r\n this.updateFrameInfo();\r\n this._poolMap.forEach((pool) => pool.autoRelease());\r\n return this.onBeginFrame();\r\n }\r\n endFrame(): void {\r\n if (this._beginFrameCounter > 0) {\r\n this._beginFrameCounter--;\r\n if (this._beginFrameCounter === 0) {\r\n this._endFrameTime = this._cpuTimer.now();\r\n this._frameInfo.frameCounter++;\r\n this.onEndFrame();\r\n }\r\n }\r\n }\r\n getVertexAttribFormat(\r\n semantic: VertexSemantic,\r\n dataType: DataType,\r\n componentCount: number\r\n ): VertexAttribFormat {\r\n return getVertexAttribFormat(semantic, dataType, componentCount);\r\n }\r\n createInterleavedVertexBuffer(\r\n attribFormats: VertexAttribFormat[],\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ): StructuredBuffer {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n let size = 0;\r\n for (const format of attribFormats) {\r\n size += getVertexFormatSize(format);\r\n }\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / size) >> 0, ...attribFormats);\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n createVertexBuffer(\r\n attribFormat: VertexAttribFormat,\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ): StructuredBuffer {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n const count = getVertexFormatSize(attribFormat);\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / count) >> 0, attribFormat);\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n draw(primitiveType: PrimitiveType, first: number, count: number): void {\r\n this._frameInfo.drawCalls++;\r\n this._draw(primitiveType, first, count);\r\n }\r\n drawInstanced(primitiveType: PrimitiveType, first: number, count: number, numInstances: number): void {\r\n this._frameInfo.drawCalls++;\r\n this._drawInstanced(primitiveType, first, count, numInstances);\r\n }\r\n executeRenderBundle(renderBundle: RenderBundle) {\r\n this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);\r\n }\r\n compute(workgroupCountX, workgroupCountY, workgroupCountZ): void {\r\n this._frameInfo.computeCalls++;\r\n this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);\r\n }\r\n runNextFrame(f: () => void) {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(f);\r\n }\r\n }\r\n async runNextFrameAsync(f: () => void | Promise<void>): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(() => {\r\n const p = f();\r\n if (p instanceof Promise) {\r\n p.then(() => resolve());\r\n } else {\r\n resolve();\r\n }\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n exitLoop() {\r\n if (this._runningLoop !== null) {\r\n if (this._runningLoop !== 0) {\r\n cancelAnimationFrame(this._runningLoop);\r\n } else {\r\n this.cancelNextFrame(this._runningLoop);\r\n }\r\n this._runningLoop = null;\r\n }\r\n }\r\n runLoop(func: (device: AbstractDevice) => void) {\r\n if (this._runningLoop !== null) {\r\n console.error('Device.runLoop() can not be nested');\r\n return;\r\n }\r\n if (!func) {\r\n console.error('Device.runLoop() argment error');\r\n return;\r\n }\r\n const that = this;\r\n that._runLoopFunc = func;\r\n (function entry() {\r\n if (that._vSync) {\r\n that._runningLoop = requestAnimationFrame(entry);\r\n } else {\r\n that._runningLoop = that.nextFrame(() => {\r\n if (that._runningLoop !== null) {\r\n entry();\r\n }\r\n });\r\n }\r\n if (that.beginFrame()) {\r\n that._runLoopFunc(that as unknown as AbstractDevice);\r\n that.endFrame();\r\n }\r\n })();\r\n }\r\n pushDeviceStates() {\r\n this._stateStack.push({\r\n windowOrderReversed: this.isWindingOrderReversed(),\r\n framebuffer: this.getFramebuffer(),\r\n viewport: this.getViewport(),\r\n scissor: this.getScissor(),\r\n program: this.getProgram(),\r\n renderStateSet: this.getRenderStates(),\r\n vertexLayout: this.getVertexLayout(),\r\n bindGroups: [this.getBindGroup(0), this.getBindGroup(1), this.getBindGroup(2), this.getBindGroup(3)]\r\n });\r\n }\r\n popDeviceStates() {\r\n if (this._stateStack.length === 0) {\r\n console.error('Device.popDeviceStates(): stack is empty');\r\n } else {\r\n const top = this._stateStack.pop();\r\n this.setFramebuffer(top.framebuffer);\r\n this.setViewport(top.viewport);\r\n this.setScissor(top.scissor);\r\n this.setProgram(top.program);\r\n this.setRenderStates(top.renderStateSet);\r\n this.setVertexLayout(top.vertexLayout);\r\n this.setBindGroup(0, ...top.bindGroups[0]);\r\n this.setBindGroup(1, ...top.bindGroups[1]);\r\n this.setBindGroup(2, ...top.bindGroups[2]);\r\n this.setBindGroup(3, ...top.bindGroups[3]);\r\n this.reverseVertexWindingOrder(top.windowOrderReversed);\r\n }\r\n }\r\n getGPUObjects(): GPUObjectList {\r\n return this._gpuObjectList;\r\n }\r\n getGPUObjectById(uid: number): GPUObject {\r\n for (const list of [\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.vertexArrayObjects\r\n ]) {\r\n for (const obj of list) {\r\n if (obj.uid === uid) {\r\n return obj;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n screenToDevice(val: number): number {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScale());\r\n }\r\n deviceToScreen(val: number): number {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScale());\r\n }\r\n buildRenderProgram(options: PBRenderOptions): GPUProgram {\r\n return this._programBuilder.buildRenderProgram(options);\r\n }\r\n buildComputeProgram(options: PBComputeOptions): GPUProgram {\r\n return this._programBuilder.buildComputeProgram(options);\r\n }\r\n addGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list && list.indexOf(obj) < 0) {\r\n list.push(obj);\r\n this.dispatchEvent('gpuobject_added', obj);\r\n }\r\n }\r\n removeGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list) {\r\n const index = list.indexOf(obj);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n this.dispatchEvent('gpuobject_removed', obj);\r\n }\r\n }\r\n }\r\n updateVideoMemoryCost(delta: number) {\r\n this._gpuMemCost += delta;\r\n }\r\n protected abstract onBeginFrame(): boolean;\r\n protected abstract onEndFrame(): void;\r\n protected abstract _setFramebuffer(fb: FrameBuffer);\r\n private _onresize() {\r\n if (\r\n this._canvasClientWidth !== this._canvas.clientWidth ||\r\n this._canvasClientHeight !== this._canvas.clientHeight\r\n ) {\r\n this._canvasClientWidth = this._canvas.clientWidth;\r\n this._canvasClientHeight = this._canvas.clientHeight;\r\n this.dispatchEvent('resize', this._canvasClientWidth, this._canvasClientHeight);\r\n }\r\n }\r\n private _registerEventHandlers() {\r\n const canvas: HTMLCanvasElement = this._canvas;\r\n const that = this;\r\n if (window.ResizeObserver) {\r\n new window.ResizeObserver(() => {\r\n that._onresize();\r\n }).observe(canvas, {});\r\n } else {\r\n if (window.MutationObserver) {\r\n new MutationObserver(function (mutations) {\r\n if (mutations.length > 0) {\r\n that._onresize();\r\n }\r\n }).observe(canvas, { attributes: true, attributeFilter: ['style'] });\r\n }\r\n window.addEventListener('resize', () => {\r\n this._onresize();\r\n });\r\n }\r\n }\r\n private updateFrameInfo() {\r\n this._frameInfo.drawCalls = 0;\r\n this._frameInfo.computeCalls = 0;\r\n const now = this._beginFrameTime;\r\n if (this._frameInfo.frameTimestamp === 0) {\r\n this._frameInfo.frameTimestamp = now;\r\n this._frameInfo.elapsedTimeCPU = 0;\r\n this._frameInfo.elapsedTimeGPU = 0;\r\n this._frameInfo.elapsedFrame = 0;\r\n this._frameInfo.elapsedOverall = 0;\r\n this._frameInfo.FPS = 0;\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n if (this._gpuTimer) {\r\n this._gpuTimer.begin();\r\n }\r\n } else {\r\n this._frameInfo.elapsedFrame = now - this._frameInfo.frameTimestamp;\r\n this._frameInfo.elapsedOverall += this._frameInfo.elapsedFrame;\r\n let gpuTime = 0;\r\n let cpuTime = 0;\r\n if (this._endFrameTime !== 0) {\r\n gpuTime = now - this._endFrameTime;\r\n cpuTime = this._endFrameTime - this._frameInfo.frameTimestamp;\r\n }\r\n this._frameInfo.frameTimestamp = now;\r\n if (now >= this._fpsCounter.time + 1000) {\r\n this._frameInfo.FPS =\r\n ((this._frameInfo.frameCounter - this._fpsCounter.frame) * 1000) / (now - this._fpsCounter.time);\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n this._frameInfo.elapsedTimeGPU = gpuTime;\r\n this._frameInfo.elapsedTimeCPU = cpuTime;\r\n }\r\n }\r\n const tmp = this._frameInfo.nextFrameCall;\r\n this._frameInfo.nextFrameCall = this._frameInfo.nextFrameCallNext;\r\n this._frameInfo.nextFrameCallNext = tmp;\r\n for (const f of this._frameInfo.nextFrameCallNext) {\r\n f();\r\n }\r\n this._frameInfo.nextFrameCallNext.length = 0;\r\n }\r\n private getGPUObjectList(obj: GPUObject): GPUObject[] {\r\n let list: GPUObject[] = null;\r\n if (obj.isTexture()) {\r\n list = this._gpuObjectList.textures;\r\n } else if (obj.isSampler()) {\r\n list = this._gpuObjectList.samplers;\r\n } else if (obj.isBuffer()) {\r\n list = this._gpuObjectList.buffers;\r\n } else if (obj.isFramebuffer()) {\r\n list = this._gpuObjectList.framebuffers;\r\n } else if (obj.isProgram()) {\r\n list = this._gpuObjectList.programs;\r\n } else if (obj.isVertexLayout()) {\r\n list = this._gpuObjectList.vertexArrayObjects;\r\n } else if (obj.isBindGroup()) {\r\n list = this._gpuObjectList.bindGroups;\r\n }\r\n return list;\r\n }\r\n protected invalidateAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n for (const obj of list) {\r\n this.disposeObject(obj, false);\r\n }\r\n }\r\n if (this.isContextLost()) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n }\r\n protected reloadAll(): void {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n // obj.reload() may change the list, so make a copy first\r\n for (const obj of list.slice()) {\r\n obj.reload();\r\n }\r\n }\r\n return;\r\n }\r\n protected parseTextureOptions(options?: TextureCreationOptions): number {\r\n const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;\r\n const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;\r\n const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n if (noMipmapFlag && options?.samplerOptions) {\r\n options.samplerOptions.mipFilter = 'none';\r\n }\r\n return noMipmapFlag | writableFlag | dynamicFlag;\r\n }\r\n protected parseBufferOptions(options: BufferCreationOptions, defaultUsage?: BufferUsage): number {\r\n const usage = options?.usage || defaultUsage;\r\n let usageFlag: number;\r\n switch (usage) {\r\n case 'uniform':\r\n usageFlag = GPUResourceUsageFlags.BF_UNIFORM;\r\n options.managed = false;\r\n options.dynamic = options.dynamic ?? true;\r\n break;\r\n case 'vertex':\r\n usageFlag = GPUResourceUsageFlags.BF_VERTEX;\r\n break;\r\n case 'index':\r\n usageFlag = GPUResourceUsageFlags.BF_INDEX;\r\n break;\r\n case 'read':\r\n usageFlag = GPUResourceUsageFlags.BF_READ;\r\n options.managed = false;\r\n break;\r\n case 'write':\r\n usageFlag = GPUResourceUsageFlags.BF_WRITE;\r\n options.managed = false;\r\n break;\r\n case 'pack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n case 'unpack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n default:\r\n usageFlag = 0;\r\n break;\r\n }\r\n const storageFlag = (options?.storage ?? false) ? GPUResourceUsageFlags.BF_STORAGE : 0;\r\n const dynamicFlag = (options?.dynamic ?? false) ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n const managedFlag = dynamicFlag === 0 && (options?.managed ?? true) ? GPUResourceUsageFlags.MANAGED : 0;\r\n return usageFlag | storageFlag | dynamicFlag | managedFlag;\r\n }\r\n}\r\n\r\n/**\r\n * Merge event target interface\r\n * @public\r\n */\r\nexport interface BaseDevice extends IEventTarget<DeviceEventMap> {}\r\n"],"names":["BaseDevice","Observable","_canvas","_canvasClientWidth","_canvasClientHeight","_gpuObjectList","_gpuMemCost","_disposeObjectList","_beginFrameTime","_endFrameTime","_frameInfo","_cpuTimer","_gpuTimer","_runningLoop","_fpsCounter","_runLoopFunc","_backend","_beginFrameCounter","_programBuilder","_poolMap","_defaultPoolKey","_temporalFramebuffer","_vSync","_stateStack","cvs","backend","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","clientWidth","clientHeight","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","Map","Symbol","set","Pool","_registerEventHandlers","videoMemoryUsage","frameInfo","isRendering","canvas","type","typeName","vSync","val","pool","get","runLoopFunction","programBuilder","poolExists","key","has","getPool","setFont","fontName","DrawText","drawText","text","x","y","color","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","Array","isArray","fetchTemporalFramebuffer","currentRT","getFramebuffer","releaseFrameBuffer","_setFramebuffer","disposeObject","obj","remove","removeGPUObject","isContextLost","destroy","push","restoreObject","disposed","restore","restoreHandler","enableGPUTimeRecording","enable","createGPUTimer","end","beginFrame","now","updateFrameInfo","forEach","autoRelease","onBeginFrame","endFrame","onEndFrame","getVertexAttribFormat","semantic","dataType","componentCount","createInterleavedVertexBuffer","attribFormats","data","options","usage","console","error","size","format","getVertexFormatSize","vertexBufferType","makeVertexBufferType","byteLength","opt","Object","assign","dynamic","managed","storage","createStructuredBuffer","createVertexBuffer","attribFormat","count","draw","primitiveType","first","_draw","drawInstanced","numInstances","_drawInstanced","executeRenderBundle","renderBundle","_executeRenderBundle","compute","workgroupCountX","workgroupCountY","workgroupCountZ","_compute","runNextFrame","f","runNextFrameAsync","Promise","resolve","p","then","exitLoop","cancelAnimationFrame","cancelNextFrame","runLoop","func","that","entry","requestAnimationFrame","nextFrame","pushDeviceStates","windowOrderReversed","isWindingOrderReversed","framebuffer","viewport","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","length","top","pop","setViewport","setScissor","setProgram","setRenderStates","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenToDevice","Math","round","getScale","deviceToScreen","buildRenderProgram","buildComputeProgram","addGPUObject","getGPUObjectList","indexOf","dispatchEvent","index","splice","updateVideoMemoryCost","delta","_onresize","window","ResizeObserver","observe","MutationObserver","mutations","attributes","attributeFilter","addEventListener","begin","gpuTime","cpuTime","tmp","isTexture","isSampler","isBuffer","isFramebuffer","isProgram","isVertexLayout","isBindGroup","invalidateAll","reloadAll","slice","reload","parseTextureOptions","noMipmapFlag","mipmapping","GPUResourceUsageFlags","TF_NO_MIPMAP","writableFlag","writable","TF_WRITABLE","dynamicFlag","DYNAMIC","samplerOptions","mipFilter","parseBufferOptions","defaultUsage","usageFlag","BF_UNIFORM","BF_VERTEX","BF_INDEX","BF_READ","BF_WRITE","BF_PACK_PIXEL","BF_UNPACK_PIXEL","storageFlag","BF_STORAGE","managedFlag","MANAGED"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { type Vector4, type TypedArray, type IEventTarget, Observable } from '@zephyr3d/base';\r\nimport type { ITimer } from './timer';\r\nimport { CPUTimer } from './timer';\r\nimport type {\r\n BlendingState,\r\n ColorState,\r\n DepthState,\r\n RasterizerState,\r\n RenderStateSet,\r\n StencilState\r\n} from './render_states';\r\nimport type {\r\n FrameBufferOptions,\r\n SamplerOptions,\r\n TextureSampler,\r\n Texture2D,\r\n Texture3D,\r\n TextureCube,\r\n VertexLayout,\r\n GPUDataBuffer,\r\n FrameBuffer,\r\n GPUProgram,\r\n GPUObject,\r\n StructuredBuffer,\r\n BindGroupLayout,\r\n BindGroup,\r\n IndexBuffer,\r\n TextureVideo,\r\n TextureMipmapData,\r\n TextureImageElement,\r\n Texture2DArray,\r\n TextureCreationOptions,\r\n BufferCreationOptions,\r\n BufferUsage,\r\n VertexSemantic,\r\n VertexAttribFormat,\r\n VertexLayoutOptions,\r\n BaseTexture,\r\n RenderBundle\r\n} from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n makeVertexBufferType,\r\n getVertexFormatSize,\r\n getVertexAttribFormat\r\n} from './gpuobject';\r\nimport type { PBComputeOptions, PBRenderOptions, PBStructTypeInfo } from './builder';\r\nimport { ProgramBuilder } from './builder';\r\nimport type {\r\n DataType,\r\n PrimitiveType,\r\n TextureFormat,\r\n GPUObjectList,\r\n FrameInfo,\r\n DeviceCaps,\r\n GPUProgramConstructParams,\r\n AbstractDevice,\r\n DeviceOptions,\r\n DeviceEventMap,\r\n DeviceViewport\r\n} from './base_types';\r\nimport { DrawText } from './helpers';\r\nimport { Pool } from './pool';\r\n\r\n/**\r\n * The device backend interface\r\n * @public\r\n */\r\nexport interface DeviceBackend {\r\n typeName(): string;\r\n supported(): Promise<boolean>;\r\n createDevice(cvs: HTMLCanvasElement, options?: DeviceOptions): Promise<Nullable<AbstractDevice>>;\r\n}\r\n\r\ntype DeviceState = {\r\n framebuffer: Nullable<FrameBuffer>;\r\n windowOrderReversed: boolean;\r\n viewport: DeviceViewport;\r\n scissor: DeviceViewport;\r\n renderStateSet: Nullable<RenderStateSet>;\r\n program: Nullable<GPUProgram>;\r\n vertexLayout: Nullable<VertexLayout>;\r\n bindGroups: [BindGroup, Nullable<Iterable<number>>][];\r\n};\r\n\r\ntype ResizeCallback = (\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n) => void;\r\n\r\nclass ResizeHandler {\r\n private readonly _canvas: HTMLCanvasElement;\r\n private readonly _dpr: number;\r\n private _cssWidth: number;\r\n private _cssHeight: number;\r\n private _deviceWidth: number;\r\n private _deviceHeight: number;\r\n\r\n private _resizeObserver!: ResizeObserver;\r\n private _mutationObserver!: MutationObserver;\r\n private _onResizeCallback: ResizeCallback;\r\n\r\n constructor(canvas: HTMLCanvasElement, onResize: ResizeCallback, dpr: number) {\r\n this._canvas = canvas;\r\n this._dpr = dpr;\r\n this._cssWidth = 0;\r\n this._cssHeight = 0;\r\n this._deviceWidth = 0;\r\n this._deviceHeight = 0;\r\n this._onResizeCallback = onResize;\r\n }\r\n\r\n init() {\r\n const canvas = this._canvas;\r\n if (window.ResizeObserver) {\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n this._handleResizeEntry(entry);\r\n });\r\n try {\r\n (this._resizeObserver as any).observe(canvas);\r\n } catch {\r\n this._resizeObserver.observe(canvas);\r\n }\r\n } else {\r\n if (window.MutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n if (mutations.length > 0) {\r\n this._handleLegacyResize();\r\n }\r\n });\r\n this._mutationObserver.observe(canvas, { attributes: true, attributeFilter: ['style'] });\r\n }\r\n window.addEventListener('resize', this._handleLegacyResize);\r\n this._handleLegacyResize();\r\n }\r\n }\r\n\r\n private _handleResizeEntry(_entry: ResizeObserverEntry) {\r\n // CSS pixel\r\n const cssWidth = _entry.contentBoxSize[0].inlineSize;\r\n const cssHeight = _entry.contentBoxSize[0].blockSize;\r\n\r\n // Device pixel\r\n /*\r\n let deviceWidth: number;\r\n let deviceHeight: number;\r\n\r\n const dpBox = (entry as any).devicePixelContentBoxSize?.[0];\r\n if (dpBox) {\r\n deviceWidth = dpBox.inlineSize;\r\n deviceHeight = dpBox.blockSize;\r\n } else {\r\n deviceWidth = Math.round(cssWidth * this._dpr);\r\n deviceHeight = Math.round(cssHeight * this._dpr);\r\n }\r\n */\r\n const deviceWidth = cssWidth * this._dpr;\r\n const deviceHeight = cssHeight * this._dpr;\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n\r\n private _handleLegacyResize = () => {\r\n const cssWidth = this._canvas.clientWidth;\r\n const cssHeight = this._canvas.clientHeight;\r\n const dpr = window.devicePixelRatio || 1;\r\n const deviceWidth = Math.round(cssWidth * dpr);\r\n const deviceHeight = Math.round(cssHeight * dpr);\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n };\r\n\r\n public dispose() {\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n }\r\n window.removeEventListener('resize', this._handleLegacyResize);\r\n }\r\n}\r\n\r\n/**\r\n * Base class for rendering device\r\n * @public\r\n */\r\nexport abstract class BaseDevice extends Observable<DeviceEventMap> {\r\n protected _dpr: number;\r\n protected _canvas: HTMLCanvasElement;\r\n protected _canvasClientWidth: number;\r\n protected _canvasClientHeight: number;\r\n protected _gpuObjectList: GPUObjectList;\r\n protected _gpuMemCost: number;\r\n protected _disposeObjectList: GPUObject[];\r\n protected _beginFrameTime: number;\r\n protected _endFrameTime: number;\r\n protected _frameInfo: FrameInfo;\r\n protected _cpuTimer: CPUTimer;\r\n protected _gpuTimer: Nullable<ITimer>;\r\n protected _runningLoop: Nullable<number>;\r\n protected _fpsCounter: { time: number; frame: number };\r\n protected _runLoopFunc: Nullable<(device: AbstractDevice) => void>;\r\n protected _backend: DeviceBackend;\r\n protected _beginFrameCounter: number;\r\n protected _programBuilder: ProgramBuilder;\r\n protected _poolMap: Map<string | symbol, Pool>;\r\n protected _defaultPoolKey: symbol;\r\n protected _temporalFramebuffer: boolean;\r\n protected _vSync: boolean;\r\n private readonly _resizer: ResizeHandler;\r\n private readonly _stateStack: DeviceState[];\r\n constructor(cvs: HTMLCanvasElement, backend: DeviceBackend, dpr?: number) {\r\n super();\r\n this._dpr = dpr ?? window.devicePixelRatio ?? 1;\r\n this._backend = backend;\r\n this._gpuObjectList = {\r\n textures: [],\r\n samplers: [],\r\n buffers: [],\r\n programs: [],\r\n framebuffers: [],\r\n vertexArrayObjects: [],\r\n bindGroups: []\r\n };\r\n this._canvas = cvs;\r\n this._canvas.setAttribute('tabindex', '1');\r\n this._canvasClientWidth = cvs.clientWidth;\r\n this._canvasClientHeight = cvs.clientHeight;\r\n this._gpuMemCost = 0;\r\n this._disposeObjectList = [];\r\n this._beginFrameTime = 0;\r\n this._endFrameTime = 0;\r\n this._runLoopFunc = null;\r\n this._frameInfo = {\r\n frameCounter: 0,\r\n frameTimestamp: 0,\r\n elapsedTimeCPU: 0,\r\n elapsedTimeGPU: 0,\r\n elapsedFrame: 0,\r\n elapsedOverall: 0,\r\n FPS: 0,\r\n drawCalls: 0,\r\n computeCalls: 0,\r\n nextFrameCall: [],\r\n nextFrameCallNext: []\r\n };\r\n this._programBuilder = new ProgramBuilder(this);\r\n this._cpuTimer = new CPUTimer();\r\n this._gpuTimer = null;\r\n this._runningLoop = null;\r\n this._fpsCounter = { time: 0, frame: 0 };\r\n this._stateStack = [];\r\n this._beginFrameCounter = 0;\r\n this._poolMap = new Map();\r\n this._defaultPoolKey = Symbol('defaultPool');\r\n this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));\r\n this._temporalFramebuffer = false;\r\n this._temporalFramebuffer = false;\r\n this._vSync = true;\r\n //this._registerEventHandlers();\r\n this._resizer = new ResizeHandler(\r\n this._canvas,\r\n (cssWidth, cssHeight, deviceWidth, deviceHeight) => {\r\n this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n },\r\n this._dpr\r\n );\r\n }\r\n getScaleX() {\r\n return this._canvas.width / this._canvas.clientWidth;\r\n }\r\n getScaleY() {\r\n return this._canvas.height / this._canvas.clientHeight;\r\n }\r\n abstract getAdapterInfo(): any;\r\n abstract getFrameBufferSampleCount(): number;\r\n abstract isContextLost(): boolean;\r\n abstract getDrawingBufferWidth(): number;\r\n abstract getDrawingBufferHeight(): number;\r\n abstract getBackBufferWidth(): number;\r\n abstract getBackBufferHeight(): number;\r\n abstract getDeviceCaps(): Immutable<DeviceCaps>;\r\n abstract initContext(): Promise<void>;\r\n abstract clearFrameBuffer(\r\n clearColor: Nullable<Vector4>,\r\n clearDepth: Nullable<number>,\r\n clearStencil: Nullable<number>\r\n ): void;\r\n abstract createGPUTimer(): Nullable<ITimer>;\r\n abstract createRenderStateSet(): RenderStateSet;\r\n abstract createBlendingState(): BlendingState;\r\n abstract createColorState(): ColorState;\r\n abstract createRasterizerState(): RasterizerState;\r\n abstract createDepthState(): DepthState;\r\n abstract createStencilState(): StencilState;\r\n abstract createSampler(options: SamplerOptions): TextureSampler;\r\n abstract createTextureFromMipmapData<T extends BaseTexture>(\r\n data: TextureMipmapData,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<T>;\r\n abstract createTexture2D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2D>;\r\n abstract createTexture2DFromImage(\r\n element: TextureImageElement,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2D>;\r\n abstract createTexture2DArray(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2DArray>;\r\n abstract createTexture2DArrayFromImages(\r\n elements: TextureImageElement[],\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2DArray>;\r\n abstract createTexture3D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture3D>;\r\n abstract createCubeTexture(\r\n format: TextureFormat,\r\n size: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<TextureCube>;\r\n abstract createTextureVideo(el: HTMLVideoElement, samplerOptions?: SamplerOptions): TextureVideo;\r\n abstract reverseVertexWindingOrder(reverse: boolean): void;\r\n abstract isWindingOrderReversed(): boolean;\r\n abstract copyTexture2D(src: Texture2D, srcLevel: number, dst: Texture2D, dstLevel: number): void;\r\n abstract copyFramebufferToTexture2D(src: FrameBuffer, index: number, dst: Texture2D, level: number): void;\r\n // program\r\n abstract createGPUProgram(params: GPUProgramConstructParams): GPUProgram;\r\n abstract createBindGroup(layout: Immutable<BindGroupLayout>): BindGroup;\r\n abstract createBuffer(sizeInBytes: number, options: BufferCreationOptions): GPUDataBuffer;\r\n abstract copyBuffer(\r\n sourceBuffer: GPUDataBuffer,\r\n destBuffer: GPUDataBuffer,\r\n srcOffset: number,\r\n dstOffset: number,\r\n bytes: number\r\n ): void;\r\n abstract createIndexBuffer(\r\n data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>,\r\n options?: BufferCreationOptions\r\n ): IndexBuffer;\r\n abstract createStructuredBuffer(\r\n structureType: PBStructTypeInfo,\r\n options: BufferCreationOptions,\r\n data?: TypedArray\r\n ): StructuredBuffer;\r\n abstract createVertexLayout(options: VertexLayoutOptions): VertexLayout;\r\n abstract createFrameBuffer(\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: Nullable<BaseTexture>,\r\n options?: Nullable<FrameBufferOptions>\r\n ): FrameBuffer;\r\n // render related\r\n abstract setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getViewport(): Immutable<DeviceViewport>;\r\n abstract setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getScissor(): Immutable<DeviceViewport>;\r\n abstract setProgram(program: Nullable<GPUProgram>): void;\r\n abstract getProgram(): Nullable<GPUProgram>;\r\n abstract setVertexLayout(vertexData: Nullable<VertexLayout>): void;\r\n abstract getVertexLayout(): Nullable<VertexLayout>;\r\n abstract setRenderStates(renderStates: Nullable<RenderStateSet>): void;\r\n abstract getRenderStates(): Nullable<RenderStateSet>;\r\n abstract getFramebuffer(): Nullable<FrameBuffer>;\r\n abstract setBindGroup(\r\n index: number,\r\n bindGroup: BindGroup,\r\n dynamicOffsets?: Nullable<Iterable<number>>\r\n ): void;\r\n abstract getBindGroup(index: number): [BindGroup, Nullable<Iterable<number>>];\r\n abstract flush(): void;\r\n abstract nextFrame(callback: () => void): number;\r\n abstract cancelNextFrame(handle: number): void;\r\n // misc\r\n abstract readPixels(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: TypedArray\r\n ): Promise<void>;\r\n abstract readPixelsToBuffer(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: GPUDataBuffer\r\n ): void;\r\n abstract beginCapture(): void;\r\n abstract endCapture(): RenderBundle;\r\n abstract looseContext(): void;\r\n abstract restoreContext(): void;\r\n protected abstract _executeRenderBundle(renderBundle: RenderBundle): number;\r\n protected abstract _draw(primitiveType: PrimitiveType, first: number, count: number): void;\r\n protected abstract _drawInstanced(\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ): void;\r\n protected abstract _compute(\r\n workgroupCountX: number,\r\n workgroupCountY: number,\r\n workgroupCountZ: number\r\n ): void;\r\n get backend() {\r\n return this._backend;\r\n }\r\n get videoMemoryUsage() {\r\n return this._gpuMemCost;\r\n }\r\n get frameInfo() {\r\n return this._frameInfo;\r\n }\r\n get isRendering() {\r\n return this._runningLoop !== null;\r\n }\r\n get canvas() {\r\n return this._canvas;\r\n }\r\n get type() {\r\n return this._backend.typeName();\r\n }\r\n get vSync() {\r\n return this._vSync;\r\n }\r\n set vSync(val) {\r\n this._vSync = !!val;\r\n }\r\n get pool() {\r\n return this._poolMap.get(this._defaultPoolKey)!;\r\n }\r\n get runLoopFunction() {\r\n return this._runLoopFunc;\r\n }\r\n get programBuilder() {\r\n return this._programBuilder;\r\n }\r\n poolExists(key: string | symbol) {\r\n return this._poolMap.has(key);\r\n }\r\n getPool(key: string | symbol) {\r\n let pool = this._poolMap.get(key);\r\n if (!pool) {\r\n pool = new Pool(this, key);\r\n this._poolMap.set(key, pool);\r\n }\r\n return pool;\r\n }\r\n setFont(fontName: string) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n drawText(text: string, x: number, y: number, color: string, viewport?: Immutable<number[]>) {\r\n DrawText.drawText(this, text, color, x, y, viewport);\r\n }\r\n setFramebuffer(rt: Nullable<FrameBuffer>): void;\r\n setFramebuffer(color: BaseTexture[], depth?: BaseTexture, sampleCount?: number): void;\r\n setFramebuffer(\r\n colorOrRT: BaseTexture[] | Nullable<FrameBuffer>,\r\n depth?: BaseTexture,\r\n sampleCount?: number\r\n ) {\r\n let newRT: Nullable<FrameBuffer> = null;\r\n let temporal = false;\r\n if (!Array.isArray(colorOrRT)) {\r\n newRT = colorOrRT ?? null;\r\n } else {\r\n newRT = this.pool!.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);\r\n temporal = true;\r\n }\r\n const currentRT = this.getFramebuffer();\r\n if (currentRT !== newRT) {\r\n if (this._temporalFramebuffer && currentRT) {\r\n this.pool!.releaseFrameBuffer(currentRT);\r\n }\r\n this._temporalFramebuffer = temporal;\r\n this._setFramebuffer(newRT);\r\n }\r\n }\r\n disposeObject(obj: GPUObject, remove = true) {\r\n if (obj) {\r\n if (remove) {\r\n this.removeGPUObject(obj);\r\n }\r\n if (this.isContextLost()) {\r\n obj.destroy();\r\n } else {\r\n this._disposeObjectList.push(obj);\r\n }\r\n }\r\n }\r\n restoreObject(obj: GPUObject) {\r\n if (obj && obj.disposed && !this.isContextLost()) {\r\n obj.restore();\r\n obj.restoreHandler?.(obj);\r\n }\r\n }\r\n enableGPUTimeRecording(enable: boolean) {\r\n if (enable && !this._gpuTimer) {\r\n this._gpuTimer = this.createGPUTimer();\r\n } else if (!enable) {\r\n this._gpuTimer?.end();\r\n this._gpuTimer = null;\r\n }\r\n }\r\n beginFrame() {\r\n if (this._beginFrameCounter === 0) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n this._beginFrameCounter++;\r\n this._beginFrameTime = this._cpuTimer.now();\r\n this.updateFrameInfo();\r\n this._poolMap.forEach((pool) => pool.autoRelease());\r\n return this.onBeginFrame();\r\n }\r\n endFrame() {\r\n if (this._beginFrameCounter > 0) {\r\n this._beginFrameCounter--;\r\n if (this._beginFrameCounter === 0) {\r\n this._endFrameTime = this._cpuTimer.now();\r\n this._frameInfo.frameCounter++;\r\n this.onEndFrame();\r\n }\r\n }\r\n }\r\n getVertexAttribFormat(semantic: VertexSemantic, dataType: DataType, componentCount: number) {\r\n return getVertexAttribFormat(semantic, dataType, componentCount);\r\n }\r\n createInterleavedVertexBuffer(\r\n attribFormats: VertexAttribFormat[],\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ) {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n let size = 0;\r\n for (const format of attribFormats) {\r\n size += getVertexFormatSize(format);\r\n }\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / size) >> 0, ...attribFormats);\r\n if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n createVertexBuffer(attribFormat: VertexAttribFormat, data: TypedArray, options?: BufferCreationOptions) {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n const count = getVertexFormatSize(attribFormat);\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / count) >> 0, attribFormat);\r\n if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n draw(primitiveType: PrimitiveType, first: number, count: number) {\r\n this._frameInfo.drawCalls++;\r\n this._draw(primitiveType, first, count);\r\n }\r\n drawInstanced(primitiveType: PrimitiveType, first: number, count: number, numInstances: number) {\r\n this._frameInfo.drawCalls++;\r\n this._drawInstanced(primitiveType, first, count, numInstances);\r\n }\r\n executeRenderBundle(renderBundle: RenderBundle): void {\r\n this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);\r\n }\r\n compute(workgroupCountX: number, workgroupCountY: number, workgroupCountZ: number) {\r\n this._frameInfo.computeCalls++;\r\n this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);\r\n }\r\n runNextFrame(f: () => void) {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(f);\r\n }\r\n }\r\n async runNextFrameAsync(f: () => void | Promise<void>) {\r\n return new Promise<void>((resolve) => {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(() => {\r\n const p = f();\r\n if (p instanceof Promise) {\r\n p.then(() => resolve());\r\n } else {\r\n resolve();\r\n }\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n exitLoop() {\r\n if (this._runningLoop !== null) {\r\n if (this._runningLoop !== 0) {\r\n cancelAnimationFrame(this._runningLoop);\r\n } else {\r\n this.cancelNextFrame(this._runningLoop);\r\n }\r\n this._runningLoop = null;\r\n }\r\n }\r\n runLoop(func: (device: AbstractDevice) => void) {\r\n if (this._runningLoop !== null) {\r\n console.error('Device.runLoop() can not be nested');\r\n return;\r\n }\r\n if (!func) {\r\n console.error('Device.runLoop() argment error');\r\n return;\r\n }\r\n const that = this;\r\n that._runLoopFunc = func;\r\n (function entry() {\r\n if (that._vSync) {\r\n that._runningLoop = requestAnimationFrame(entry);\r\n } else {\r\n that._runningLoop = that.nextFrame(() => {\r\n if (that._runningLoop !== null) {\r\n entry();\r\n }\r\n });\r\n }\r\n if (that.beginFrame()) {\r\n that._runLoopFunc(that as unknown as AbstractDevice);\r\n that.endFrame();\r\n }\r\n })();\r\n }\r\n pushDeviceStates() {\r\n this._stateStack.push({\r\n windowOrderReversed: this.isWindingOrderReversed(),\r\n framebuffer: this.getFramebuffer(),\r\n viewport: this.getViewport(),\r\n scissor: this.getScissor(),\r\n program: this.getProgram(),\r\n renderStateSet: this.getRenderStates(),\r\n vertexLayout: this.getVertexLayout(),\r\n bindGroups: [this.getBindGroup(0), this.getBindGroup(1), this.getBindGroup(2), this.getBindGroup(3)]\r\n });\r\n }\r\n popDeviceStates() {\r\n if (this._stateStack.length === 0) {\r\n console.error('Device.popDeviceStates(): stack is empty');\r\n } else {\r\n const top = this._stateStack.pop()!;\r\n this.setFramebuffer(top.framebuffer);\r\n this.setViewport(top.viewport);\r\n this.setScissor(top.scissor);\r\n this.setProgram(top.program);\r\n this.setRenderStates(top.renderStateSet);\r\n this.setVertexLayout(top.vertexLayout);\r\n this.setBindGroup(0, ...top.bindGroups[0]);\r\n this.setBindGroup(1, ...top.bindGroups[1]);\r\n this.setBindGroup(2, ...top.bindGroups[2]);\r\n this.setBindGroup(3, ...top.bindGroups[3]);\r\n this.reverseVertexWindingOrder(top.windowOrderReversed);\r\n }\r\n }\r\n getGPUObjects() {\r\n return this._gpuObjectList;\r\n }\r\n getGPUObjectById(uid: number) {\r\n for (const list of [\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.vertexArrayObjects\r\n ]) {\r\n for (const obj of list) {\r\n if (obj.uid === uid) {\r\n return obj;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n screenXToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());\r\n }\r\n deviceXToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());\r\n }\r\n screenYToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());\r\n }\r\n deviceYToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());\r\n }\r\n buildRenderProgram(options: PBRenderOptions) {\r\n return this._programBuilder.buildRenderProgram(options);\r\n }\r\n buildComputeProgram(options: PBComputeOptions) {\r\n return this._programBuilder.buildComputeProgram(options);\r\n }\r\n addGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list && list.indexOf(obj) < 0) {\r\n list.push(obj);\r\n this.dispatchEvent('gpuobject_added', obj);\r\n }\r\n }\r\n removeGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list) {\r\n const index = list.indexOf(obj);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n this.dispatchEvent('gpuobject_removed', obj);\r\n }\r\n }\r\n }\r\n updateVideoMemoryCost(delta: number) {\r\n this._gpuMemCost += delta;\r\n }\r\n protected abstract onBeginFrame(): boolean;\r\n protected abstract onEndFrame(): void;\r\n protected abstract _setFramebuffer(fb: Nullable<FrameBuffer>): void;\r\n protected abstract _handleResize(\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n ): void;\r\n protected async initResizer() {\r\n return new Promise<void>((resolve) => {\r\n this.once(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n this.on(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n );\r\n resolve();\r\n }\r\n );\r\n this._resizer.init();\r\n });\r\n }\r\n private updateFrameInfo() {\r\n this._frameInfo.drawCalls = 0;\r\n this._frameInfo.computeCalls = 0;\r\n const now = this._beginFrameTime;\r\n if (this._frameInfo.frameTimestamp === 0) {\r\n this._frameInfo.frameTimestamp = now;\r\n this._frameInfo.elapsedTimeCPU = 0;\r\n this._frameInfo.elapsedTimeGPU = 0;\r\n this._frameInfo.elapsedFrame = 0;\r\n this._frameInfo.elapsedOverall = 0;\r\n this._frameInfo.FPS = 0;\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n if (this._gpuTimer) {\r\n this._gpuTimer.begin();\r\n }\r\n } else {\r\n this._frameInfo.elapsedFrame = now - this._frameInfo.frameTimestamp;\r\n this._frameInfo.elapsedOverall += this._frameInfo.elapsedFrame;\r\n let gpuTime = 0;\r\n let cpuTime = 0;\r\n if (this._endFrameTime !== 0) {\r\n gpuTime = now - this._endFrameTime;\r\n cpuTime = this._endFrameTime - this._frameInfo.frameTimestamp;\r\n }\r\n this._frameInfo.frameTimestamp = now;\r\n if (now >= this._fpsCounter.time + 1000) {\r\n this._frameInfo.FPS =\r\n ((this._frameInfo.frameCounter - this._fpsCounter.frame) * 1000) / (now - this._fpsCounter.time);\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n this._frameInfo.elapsedTimeGPU = gpuTime;\r\n this._frameInfo.elapsedTimeCPU = cpuTime;\r\n }\r\n }\r\n const tmp = this._frameInfo.nextFrameCall;\r\n this._frameInfo.nextFrameCall = this._frameInfo.nextFrameCallNext;\r\n this._frameInfo.nextFrameCallNext = tmp;\r\n for (const f of this._frameInfo.nextFrameCallNext) {\r\n f();\r\n }\r\n this._frameInfo.nextFrameCallNext.length = 0;\r\n }\r\n private getGPUObjectList(obj: GPUObject) {\r\n let list: Nullable<GPUObject[]> = null;\r\n if (obj.isTexture()) {\r\n list = this._gpuObjectList.textures;\r\n } else if (obj.isSampler()) {\r\n list = this._gpuObjectList.samplers;\r\n } else if (obj.isBuffer()) {\r\n list = this._gpuObjectList.buffers;\r\n } else if (obj.isFramebuffer()) {\r\n list = this._gpuObjectList.framebuffers;\r\n } else if (obj.isProgram()) {\r\n list = this._gpuObjectList.programs;\r\n } else if (obj.isVertexLayout()) {\r\n list = this._gpuObjectList.vertexArrayObjects;\r\n } else if (obj.isBindGroup()) {\r\n list = this._gpuObjectList.bindGroups;\r\n }\r\n return list;\r\n }\r\n protected invalidateAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n for (const obj of list) {\r\n this.disposeObject(obj, false);\r\n }\r\n }\r\n if (this.isContextLost()) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n }\r\n protected reloadAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n // obj.reload() may change the list, so make a copy first\r\n for (const obj of list.slice()) {\r\n obj.reload();\r\n }\r\n }\r\n return;\r\n }\r\n protected parseTextureOptions(options?: TextureCreationOptions) {\r\n const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;\r\n const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;\r\n const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n if (noMipmapFlag && options?.samplerOptions) {\r\n options.samplerOptions.mipFilter = 'none';\r\n }\r\n return noMipmapFlag | writableFlag | dynamicFlag;\r\n }\r\n protected parseBufferOptions(options?: BufferCreationOptions, defaultUsage?: BufferUsage) {\r\n options = options ?? {};\r\n const usage = options.usage ?? defaultUsage;\r\n let usageFlag: number;\r\n switch (usage) {\r\n case 'uniform':\r\n usageFlag = GPUResourceUsageFlags.BF_UNIFORM;\r\n options.managed = false;\r\n options.dynamic = options.dynamic ?? true;\r\n break;\r\n case 'vertex':\r\n usageFlag = GPUResourceUsageFlags.BF_VERTEX;\r\n break;\r\n case 'index':\r\n usageFlag = GPUResourceUsageFlags.BF_INDEX;\r\n break;\r\n case 'read':\r\n usageFlag = GPUResourceUsageFlags.BF_READ;\r\n options.managed = false;\r\n break;\r\n case 'write':\r\n usageFlag = GPUResourceUsageFlags.BF_WRITE;\r\n options.managed = false;\r\n break;\r\n case 'pack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n case 'unpack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n default:\r\n usageFlag = 0;\r\n break;\r\n }\r\n const storageFlag = (options?.storage ?? false) ? GPUResourceUsageFlags.BF_STORAGE : 0;\r\n const dynamicFlag = (options?.dynamic ?? false) ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n const managedFlag = dynamicFlag === 0 && (options?.managed ?? true) ? GPUResourceUsageFlags.MANAGED : 0;\r\n return usageFlag | storageFlag | dynamicFlag | managedFlag;\r\n }\r\n}\r\n\r\n/**\r\n * Merge event target interface\r\n * @public\r\n */\r\nexport interface BaseDevice extends IEventTarget<DeviceEventMap> {}\r\n"],"names":["ResizeHandler","_canvas","_dpr","_cssWidth","_cssHeight","_deviceWidth","_deviceHeight","_resizeObserver","_mutationObserver","_onResizeCallback","canvas","onResize","dpr","init","window","ResizeObserver","entries","entry","_handleResizeEntry","observe","MutationObserver","mutations","length","_handleLegacyResize","attributes","attributeFilter","addEventListener","_entry","cssWidth","contentBoxSize","inlineSize","cssHeight","blockSize","deviceWidth","deviceHeight","clientWidth","clientHeight","devicePixelRatio","Math","round","dispose","disconnect","removeEventListener","BaseDevice","Observable","_canvasClientWidth","_canvasClientHeight","_gpuObjectList","_gpuMemCost","_disposeObjectList","_beginFrameTime","_endFrameTime","_frameInfo","_cpuTimer","_gpuTimer","_runningLoop","_fpsCounter","_runLoopFunc","_backend","_beginFrameCounter","_programBuilder","_poolMap","_defaultPoolKey","_temporalFramebuffer","_vSync","_resizer","_stateStack","cvs","backend","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","Map","Symbol","set","Pool","dispatchEvent","getScaleX","width","getScaleY","height","videoMemoryUsage","frameInfo","isRendering","type","typeName","vSync","val","pool","get","runLoopFunction","programBuilder","poolExists","key","has","getPool","setFont","fontName","DrawText","drawText","text","x","y","color","viewport","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","Array","isArray","fetchTemporalFramebuffer","currentRT","getFramebuffer","releaseFrameBuffer","_setFramebuffer","disposeObject","obj","remove","removeGPUObject","isContextLost","destroy","push","restoreObject","disposed","restore","restoreHandler","enableGPUTimeRecording","enable","createGPUTimer","end","beginFrame","now","updateFrameInfo","forEach","autoRelease","onBeginFrame","endFrame","onEndFrame","getVertexAttribFormat","semantic","dataType","componentCount","createInterleavedVertexBuffer","attribFormats","data","options","usage","console","error","size","format","getVertexFormatSize","vertexBufferType","makeVertexBufferType","byteLength","opt","Object","assign","dynamic","managed","storage","createStructuredBuffer","createVertexBuffer","attribFormat","count","draw","primitiveType","first","_draw","drawInstanced","numInstances","_drawInstanced","executeRenderBundle","renderBundle","_executeRenderBundle","compute","workgroupCountX","workgroupCountY","workgroupCountZ","_compute","runNextFrame","f","runNextFrameAsync","Promise","resolve","p","then","exitLoop","cancelAnimationFrame","cancelNextFrame","runLoop","func","that","requestAnimationFrame","nextFrame","pushDeviceStates","windowOrderReversed","isWindingOrderReversed","framebuffer","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","top","pop","setViewport","setScissor","setProgram","setRenderStates","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenXToDevice","deviceXToScreen","screenYToDevice","deviceYToScreen","buildRenderProgram","buildComputeProgram","addGPUObject","getGPUObjectList","indexOf","index","splice","updateVideoMemoryCost","delta","initResizer","once","_handleResize","on","begin","gpuTime","cpuTime","tmp","isTexture","isSampler","isBuffer","isFramebuffer","isProgram","isVertexLayout","isBindGroup","invalidateAll","reloadAll","slice","reload","parseTextureOptions","noMipmapFlag","mipmapping","GPUResourceUsageFlags","TF_NO_MIPMAP","writableFlag","writable","TF_WRITABLE","dynamicFlag","DYNAMIC","samplerOptions","mipFilter","parseBufferOptions","defaultUsage","usageFlag","BF_UNIFORM","BF_VERTEX","BF_INDEX","BF_READ","BF_WRITE","BF_PACK_PIXEL","BF_UNPACK_PIXEL","storageFlag","BF_STORAGE","managedFlag","MANAGED"],"mappings":";;;;;;;AA6FA,MAAMA,aAAAA,CAAAA;IACaC,OAA2B;IAC3BC,IAAa;IACtBC,SAAkB;IAClBC,UAAmB;IACnBC,YAAqB;IACrBC,aAAsB;IAEtBC,eAAiC;IACjCC,iBAAqC;IACrCC,iBAAkC;AAE1C,IAAA,WAAA,CAAYC,MAAyB,EAAEC,QAAwB,EAAEC,GAAW,CAAE;QAC5E,IAAI,CAACX,OAAO,GAAGS,MAAAA;QACf,IAAI,CAACR,IAAI,GAAGU,GAAAA;QACZ,IAAI,CAACT,SAAS,GAAG,CAAA;QACjB,IAAI,CAACC,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,YAAY,GAAG,CAAA;QACpB,IAAI,CAACC,aAAa,GAAG,CAAA;QACrB,IAAI,CAACG,iBAAiB,GAAGE,QAAAA;AAC3B;IAEAE,IAAO,GAAA;QACL,MAAMH,MAAAA,GAAS,IAAI,CAACT,OAAO;QAC3B,IAAIa,MAAAA,CAAOC,cAAc,EAAE;AACzB,YAAA,IAAI,CAACR,eAAe,GAAG,IAAIQ,eAAe,CAACC,OAAAA,GAAAA;gBACzC,MAAMC,KAAAA,GAAQD,OAAO,CAAC,CAAE,CAAA;gBACxB,IAAI,CAACE,kBAAkB,CAACD,KAAAA,CAAAA;AAC1B,aAAA,CAAA;YACA,IAAI;AACD,gBAAA,IAAI,CAACV,eAAe,CAASY,OAAO,CAACT,MAAAA,CAAAA;AACxC,aAAA,CAAE,OAAM;AACN,gBAAA,IAAI,CAACH,eAAe,CAACY,OAAO,CAACT,MAAAA,CAAAA;AAC/B;SACK,MAAA;YACL,IAAII,MAAAA,CAAOM,gBAAgB,EAAE;AAC3B,gBAAA,IAAI,CAACZ,iBAAiB,GAAG,IAAIY,iBAAiB,CAACC,SAAAA,GAAAA;oBAC7C,IAAIA,SAAAA,CAAUC,MAAM,GAAG,CAAG,EAAA;AACxB,wBAAA,IAAI,CAACC,mBAAmB,EAAA;AAC1B;AACF,iBAAA,CAAA;AACA,gBAAA,IAAI,CAACf,iBAAiB,CAACW,OAAO,CAACT,MAAQ,EAAA;oBAAEc,UAAY,EAAA,IAAA;oBAAMC,eAAiB,EAAA;AAAC,wBAAA;AAAQ;AAAC,iBAAA,CAAA;AACxF;AACAX,YAAAA,MAAAA,CAAOY,gBAAgB,CAAC,QAAU,EAAA,IAAI,CAACH,mBAAmB,CAAA;AAC1D,YAAA,IAAI,CAACA,mBAAmB,EAAA;AAC1B;AACF;AAEQL,IAAAA,kBAAAA,CAAmBS,MAA2B,EAAE;;AAEtD,QAAA,MAAMC,WAAWD,MAAOE,CAAAA,cAAc,CAAC,CAAA,CAAE,CAACC,UAAU;AACpD,QAAA,MAAMC,YAAYJ,MAAOE,CAAAA,cAAc,CAAC,CAAA,CAAE,CAACG,SAAS;;AAGpD;;;;;;;;;;;;AAYA,OACA,MAAMC,WAAAA,GAAcL,QAAW,GAAA,IAAI,CAAC1B,IAAI;AACxC,QAAA,MAAMgC,YAAeH,GAAAA,SAAAA,GAAY,IAAI,CAAC7B,IAAI;AAE1C,QAAA,IACE0B,aAAa,IAAI,CAACzB,SAAS,IAC3B4B,SAAAA,KAAc,IAAI,CAAC3B,UAAU,IAC7B6B,WAAgB,KAAA,IAAI,CAAC5B,YAAY,IACjC6B,iBAAiB,IAAI,CAAC5B,aAAa,EACnC;AACA,YAAA;AACF;QAEA,IAAI,CAACH,SAAS,GAAGyB,QAAAA;QACjB,IAAI,CAACxB,UAAU,GAAG2B,SAAAA;QAClB,IAAI,CAAC1B,YAAY,GAAG4B,WAAAA;QACpB,IAAI,CAAC3B,aAAa,GAAG4B,YAAAA;AAErB,QAAA,IAAI,CAACzB,iBAAiB,CAACmB,QAAAA,EAAUG,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AAC3D;IAEQX,mBAAsB,GAAA,IAAA;AAC5B,QAAA,MAAMK,QAAW,GAAA,IAAI,CAAC3B,OAAO,CAACkC,WAAW;AACzC,QAAA,MAAMJ,SAAY,GAAA,IAAI,CAAC9B,OAAO,CAACmC,YAAY;QAC3C,MAAMxB,GAAAA,GAAME,MAAOuB,CAAAA,gBAAgB,IAAI,CAAA;AACvC,QAAA,MAAMJ,WAAcK,GAAAA,IAAAA,CAAKC,KAAK,CAACX,QAAWhB,GAAAA,GAAAA,CAAAA;AAC1C,QAAA,MAAMsB,YAAeI,GAAAA,IAAAA,CAAKC,KAAK,CAACR,SAAYnB,GAAAA,GAAAA,CAAAA;AAE5C,QAAA,IACEgB,aAAa,IAAI,CAACzB,SAAS,IAC3B4B,SAAAA,KAAc,IAAI,CAAC3B,UAAU,IAC7B6B,WAAgB,KAAA,IAAI,CAAC5B,YAAY,IACjC6B,iBAAiB,IAAI,CAAC5B,aAAa,EACnC;AACA,YAAA;AACF;QAEA,IAAI,CAACH,SAAS,GAAGyB,QAAAA;QACjB,IAAI,CAACxB,UAAU,GAAG2B,SAAAA;QAClB,IAAI,CAAC1B,YAAY,GAAG4B,WAAAA;QACpB,IAAI,CAAC3B,aAAa,GAAG4B,YAAAA;AAErB,QAAA,IAAI,CAACzB,iBAAiB,CAACmB,QAAAA,EAAUG,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;KACzD;IAEKM,OAAU,GAAA;QACf,IAAI,IAAI,CAACjC,eAAe,EAAE;YACxB,IAAI,CAACA,eAAe,CAACkC,UAAU,EAAA;AACjC;QACA,IAAI,IAAI,CAACjC,iBAAiB,EAAE;YAC1B,IAAI,CAACA,iBAAiB,CAACiC,UAAU,EAAA;AACnC;AACA3B,QAAAA,MAAAA,CAAO4B,mBAAmB,CAAC,QAAU,EAAA,IAAI,CAACnB,mBAAmB,CAAA;AAC/D;AACF;AAEA;;;IAIO,MAAeoB,UAAmBC,SAAAA,UAAAA,CAAAA;IAC7B1C,IAAa;IACbD,OAA2B;IAC3B4C,kBAA2B;IAC3BC,mBAA4B;IAC5BC,cAA8B;IAC9BC,WAAoB;IACpBC,kBAAgC;IAChCC,eAAwB;IACxBC,aAAsB;IACtBC,UAAsB;IACtBC,SAAoB;IACpBC,SAA4B;IAC5BC,YAA+B;IAC/BC,WAA6C;IAC7CC,YAAyD;IACzDC,QAAwB;IACxBC,kBAA2B;IAC3BC,eAAgC;IAChCC,QAAqC;IACrCC,eAAwB;IACxBC,oBAA8B;IAC9BC,MAAgB;IACTC,QAAwB;IACxBC,WAA2B;AAC5C,IAAA,WAAA,CAAYC,GAAsB,EAAEC,OAAsB,EAAExD,GAAY,CAAE;QACxE,KAAK,EAAA;AACL,QAAA,IAAI,CAACV,IAAI,GAAGU,GAAOE,IAAAA,MAAAA,CAAOuB,gBAAgB,IAAI,CAAA;QAC9C,IAAI,CAACqB,QAAQ,GAAGU,OAAAA;QAChB,IAAI,CAACrB,cAAc,GAAG;AACpBsB,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,OAAAA,EAAS,EAAE;AACXC,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,YAAAA,EAAc,EAAE;AAChBC,YAAAA,kBAAAA,EAAoB,EAAE;AACtBC,YAAAA,UAAAA,EAAY;AACd,SAAA;QACA,IAAI,CAAC1E,OAAO,GAAGkE,GAAAA;AACf,QAAA,IAAI,CAAClE,OAAO,CAAC2E,YAAY,CAAC,UAAY,EAAA,GAAA,CAAA;AACtC,QAAA,IAAI,CAAC/B,kBAAkB,GAAGsB,GAAAA,CAAIhC,WAAW;AACzC,QAAA,IAAI,CAACW,mBAAmB,GAAGqB,GAAAA,CAAI/B,YAAY;QAC3C,IAAI,CAACY,WAAW,GAAG,CAAA;QACnB,IAAI,CAACC,kBAAkB,GAAG,EAAE;QAC5B,IAAI,CAACC,eAAe,GAAG,CAAA;QACvB,IAAI,CAACC,aAAa,GAAG,CAAA;QACrB,IAAI,CAACM,YAAY,GAAG,IAAA;QACpB,IAAI,CAACL,UAAU,GAAG;YAChByB,YAAc,EAAA,CAAA;YACdC,cAAgB,EAAA,CAAA;YAChBC,cAAgB,EAAA,CAAA;YAChBC,cAAgB,EAAA,CAAA;YAChBC,YAAc,EAAA,CAAA;YACdC,cAAgB,EAAA,CAAA;YAChBC,GAAK,EAAA,CAAA;YACLC,SAAW,EAAA,CAAA;YACXC,YAAc,EAAA,CAAA;AACdC,YAAAA,aAAAA,EAAe,EAAE;AACjBC,YAAAA,iBAAAA,EAAmB;AACrB,SAAA;AACA,QAAA,IAAI,CAAC3B,eAAe,GAAG,IAAI4B,eAAe,IAAI,CAAA;QAC9C,IAAI,CAACnC,SAAS,GAAG,IAAIoC,QAAAA,EAAAA;QACrB,IAAI,CAACnC,SAAS,GAAG,IAAA;QACjB,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG;YAAEkC,IAAM,EAAA,CAAA;YAAGC,KAAO,EAAA;AAAE,SAAA;QACvC,IAAI,CAACzB,WAAW,GAAG,EAAE;QACrB,IAAI,CAACP,kBAAkB,GAAG,CAAA;QAC1B,IAAI,CAACE,QAAQ,GAAG,IAAI+B,GAAAA,EAAAA;QACpB,IAAI,CAAC9B,eAAe,GAAG+B,MAAO,CAAA,aAAA,CAAA;AAC9B,QAAA,IAAI,CAAChC,QAAQ,CAACiC,GAAG,CAAC,IAAI,CAAChC,eAAe,EAAE,IAAIiC,IAAK,CAAA,IAAI,EAAE,IAAI,CAACjC,eAAe,CAAA,CAAA;QAC3E,IAAI,CAACC,oBAAoB,GAAG,KAAA;QAC5B,IAAI,CAACA,oBAAoB,GAAG,KAAA;QAC5B,IAAI,CAACC,MAAM,GAAG,IAAA;;AAEd,QAAA,IAAI,CAACC,QAAQ,GAAG,IAAIjE,aAClB,CAAA,IAAI,CAACC,OAAO,EACZ,CAAC2B,QAAUG,EAAAA,SAAAA,EAAWE,WAAaC,EAAAA,YAAAA,GAAAA;AACjC,YAAA,IAAI,CAAC8D,aAAa,CAAC,QAAUpE,EAAAA,QAAAA,EAAUG,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;SAEjE,EAAA,IAAI,CAAChC,IAAI,CAAA;AAEb;IACA+F,SAAY,GAAA;QACV,OAAO,IAAI,CAAChG,OAAO,CAACiG,KAAK,GAAG,IAAI,CAACjG,OAAO,CAACkC,WAAW;AACtD;IACAgE,SAAY,GAAA;QACV,OAAO,IAAI,CAAClG,OAAO,CAACmG,MAAM,GAAG,IAAI,CAACnG,OAAO,CAACmC,YAAY;AACxD;AAqJA,IAAA,IAAIgC,OAAU,GAAA;QACZ,OAAO,IAAI,CAACV,QAAQ;AACtB;AACA,IAAA,IAAI2C,gBAAmB,GAAA;QACrB,OAAO,IAAI,CAACrD,WAAW;AACzB;AACA,IAAA,IAAIsD,SAAY,GAAA;QACd,OAAO,IAAI,CAAClD,UAAU;AACxB;AACA,IAAA,IAAImD,WAAc,GAAA;QAChB,OAAO,IAAI,CAAChD,YAAY,KAAK,IAAA;AAC/B;AACA,IAAA,IAAI7C,MAAS,GAAA;QACX,OAAO,IAAI,CAACT,OAAO;AACrB;AACA,IAAA,IAAIuG,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC9C,QAAQ,CAAC+C,QAAQ,EAAA;AAC/B;AACA,IAAA,IAAIC,KAAQ,GAAA;QACV,OAAO,IAAI,CAAC1C,MAAM;AACpB;IACA,IAAI0C,KAAAA,CAAMC,GAAG,EAAE;AACb,QAAA,IAAI,CAAC3C,MAAM,GAAG,CAAC,CAAC2C,GAAAA;AAClB;AACA,IAAA,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAAC/C,QAAQ,CAACgD,GAAG,CAAC,IAAI,CAAC/C,eAAe,CAAA;AAC/C;AACA,IAAA,IAAIgD,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACrD,YAAY;AAC1B;AACA,IAAA,IAAIsD,cAAiB,GAAA;QACnB,OAAO,IAAI,CAACnD,eAAe;AAC7B;AACAoD,IAAAA,UAAAA,CAAWC,GAAoB,EAAE;AAC/B,QAAA,OAAO,IAAI,CAACpD,QAAQ,CAACqD,GAAG,CAACD,GAAAA,CAAAA;AAC3B;AACAE,IAAAA,OAAAA,CAAQF,GAAoB,EAAE;AAC5B,QAAA,IAAIL,OAAO,IAAI,CAAC/C,QAAQ,CAACgD,GAAG,CAACI,GAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACL,IAAM,EAAA;YACTA,IAAO,GAAA,IAAIb,IAAK,CAAA,IAAI,EAAEkB,GAAAA,CAAAA;AACtB,YAAA,IAAI,CAACpD,QAAQ,CAACiC,GAAG,CAACmB,GAAKL,EAAAA,IAAAA,CAAAA;AACzB;QACA,OAAOA,IAAAA;AACT;AACAQ,IAAAA,OAAAA,CAAQC,QAAgB,EAAE;QACxBC,QAASF,CAAAA,OAAO,CAAC,IAAI,EAAEC,QAAAA,CAAAA;AACzB;IACAE,QAASC,CAAAA,IAAY,EAAEC,CAAS,EAAEC,CAAS,EAAEC,KAAa,EAAEC,QAA8B,EAAE;AAC1FN,QAAAA,QAAAA,CAASC,QAAQ,CAAC,IAAI,EAAEC,IAAMG,EAAAA,KAAAA,EAAOF,GAAGC,CAAGE,EAAAA,QAAAA,CAAAA;AAC7C;AAGAC,IAAAA,cAAAA,CACEC,SAAgD,EAChDC,KAAmB,EACnBC,WAAoB,EACpB;AACA,QAAA,IAAIC,KAA+B,GAAA,IAAA;AACnC,QAAA,IAAIC,QAAW,GAAA,KAAA;AACf,QAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACN,SAAY,CAAA,EAAA;AAC7BG,YAAAA,KAAAA,GAAQH,SAAa,IAAA,IAAA;SAChB,MAAA;YACLG,KAAQ,GAAA,IAAI,CAACrB,IAAI,CAAEyB,wBAAwB,CAAC,KAAA,EAAO,CAAG,EAAA,CAAA,EAAGP,SAAWC,EAAAA,KAAAA,EAAO,IAAMC,EAAAA,WAAAA,CAAAA;YACjFE,QAAW,GAAA,IAAA;AACb;QACA,MAAMI,SAAAA,GAAY,IAAI,CAACC,cAAc,EAAA;AACrC,QAAA,IAAID,cAAcL,KAAO,EAAA;AACvB,YAAA,IAAI,IAAI,CAAClE,oBAAoB,IAAIuE,SAAW,EAAA;AAC1C,gBAAA,IAAI,CAAC1B,IAAI,CAAE4B,kBAAkB,CAACF,SAAAA,CAAAA;AAChC;YACA,IAAI,CAACvE,oBAAoB,GAAGmE,QAAAA;YAC5B,IAAI,CAACO,eAAe,CAACR,KAAAA,CAAAA;AACvB;AACF;AACAS,IAAAA,aAAAA,CAAcC,GAAc,EAAEC,MAAS,GAAA,IAAI,EAAE;AAC3C,QAAA,IAAID,GAAK,EAAA;AACP,YAAA,IAAIC,MAAQ,EAAA;gBACV,IAAI,CAACC,eAAe,CAACF,GAAAA,CAAAA;AACvB;YACA,IAAI,IAAI,CAACG,aAAa,EAAI,EAAA;AACxBH,gBAAAA,GAAAA,CAAII,OAAO,EAAA;aACN,MAAA;AACL,gBAAA,IAAI,CAAC9F,kBAAkB,CAAC+F,IAAI,CAACL,GAAAA,CAAAA;AAC/B;AACF;AACF;AACAM,IAAAA,aAAAA,CAAcN,GAAc,EAAE;QAC5B,IAAIA,GAAAA,IAAOA,IAAIO,QAAQ,IAAI,CAAC,IAAI,CAACJ,aAAa,EAAI,EAAA;AAChDH,YAAAA,GAAAA,CAAIQ,OAAO,EAAA;AACXR,YAAAA,GAAAA,CAAIS,cAAc,GAAGT,GAAAA,CAAAA;AACvB;AACF;AACAU,IAAAA,sBAAAA,CAAuBC,MAAe,EAAE;AACtC,QAAA,IAAIA,MAAU,IAAA,CAAC,IAAI,CAAChG,SAAS,EAAE;AAC7B,YAAA,IAAI,CAACA,SAAS,GAAG,IAAI,CAACiG,cAAc,EAAA;SAC/B,MAAA,IAAI,CAACD,MAAQ,EAAA;YAClB,IAAI,CAAChG,SAAS,EAAEkG,GAAAA,EAAAA;YAChB,IAAI,CAAClG,SAAS,GAAG,IAAA;AACnB;AACF;IACAmG,UAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC9F,kBAAkB,KAAK,CAAG,EAAA;AACjC,YAAA,KAAK,MAAMgF,GAAAA,IAAO,IAAI,CAAC1F,kBAAkB,CAAE;AACzC0F,gBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;YACA,IAAI,CAAC9F,kBAAkB,GAAG,EAAE;AAC9B;AACA,QAAA,IAAI,CAACU,kBAAkB,EAAA;AACvB,QAAA,IAAI,CAACT,eAAe,GAAG,IAAI,CAACG,SAAS,CAACqG,GAAG,EAAA;AACzC,QAAA,IAAI,CAACC,eAAe,EAAA;QACpB,IAAI,CAAC9F,QAAQ,CAAC+F,OAAO,CAAC,CAAChD,IAAAA,GAASA,KAAKiD,WAAW,EAAA,CAAA;QAChD,OAAO,IAAI,CAACC,YAAY,EAAA;AAC1B;IACAC,QAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAACpG,kBAAkB,GAAG,CAAG,EAAA;AAC/B,YAAA,IAAI,CAACA,kBAAkB,EAAA;AACvB,YAAA,IAAI,IAAI,CAACA,kBAAkB,KAAK,CAAG,EAAA;AACjC,gBAAA,IAAI,CAACR,aAAa,GAAG,IAAI,CAACE,SAAS,CAACqG,GAAG,EAAA;gBACvC,IAAI,CAACtG,UAAU,CAACyB,YAAY,EAAA;AAC5B,gBAAA,IAAI,CAACmF,UAAU,EAAA;AACjB;AACF;AACF;AACAC,IAAAA,qBAAAA,CAAsBC,QAAwB,EAAEC,QAAkB,EAAEC,cAAsB,EAAE;QAC1F,OAAOH,qBAAAA,CAAsBC,UAAUC,QAAUC,EAAAA,cAAAA,CAAAA;AACnD;AACAC,IAAAA,6BAAAA,CACEC,aAAmC,EACnCC,IAAgB,EAChBC,OAA+B,EAC/B;AACA,QAAA,IAAIA,WAAWA,OAAQC,CAAAA,KAAK,IAAID,OAAQC,CAAAA,KAAK,KAAK,QAAU,EAAA;AAC1DC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,iFAAiF,CAAC,CAAA;YACjG,OAAO,IAAA;AACT;AACA,QAAA,IAAIC,IAAO,GAAA,CAAA;QACX,KAAK,MAAMC,UAAUP,aAAe,CAAA;AAClCM,YAAAA,IAAAA,IAAQE,mBAAoBD,CAAAA,MAAAA,CAAAA;AAC9B;AACA,QAAA,MAAME,mBAAmBC,oBAAqB,CAACT,KAAKU,UAAU,GAAGL,QAAS,CAAMN,EAAAA,GAAAA,aAAAA,CAAAA;AAChF,QAAA,IAAI,CAACS,gBAAkB,EAAA;AACrBL,YAAAA,OAAAA,CAAQC,KAAK,CAAC,6EAAA,CAAA;YACd,OAAO,IAAA;AACT;QACA,MAAMO,GAAAA,GAAMC,MAAOC,CAAAA,MAAM,CACvB;YACEX,KAAO,EAAA,QAAA;YACPY,OAAS,EAAA,KAAA;YACTC,OAAS,EAAA,IAAA;YACTC,OAAS,EAAA;AACX,SAAA,EACAf,WAAW,EAAC,CAAA;QAEd,IAAIU,GAAAA,CAAIK,OAAO,EAAE;AACfL,YAAAA,GAAAA,CAAIG,OAAO,GAAG,KAAA;AACdH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;QACA,IAAIJ,GAAAA,CAAIG,OAAO,EAAE;AACfH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;AACA,QAAA,OAAO,IAAI,CAACE,sBAAsB,CAACT,kBAAkBG,GAAKX,EAAAA,IAAAA,CAAAA;AAC5D;AACAkB,IAAAA,kBAAAA,CAAmBC,YAAgC,EAAEnB,IAAgB,EAAEC,OAA+B,EAAE;AACtG,QAAA,IAAIA,WAAWA,OAAQC,CAAAA,KAAK,IAAID,OAAQC,CAAAA,KAAK,KAAK,QAAU,EAAA;AAC1DC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,sEAAsE,CAAC,CAAA;YACtF,OAAO,IAAA;AACT;AACA,QAAA,MAAMgB,QAAQb,mBAAoBY,CAAAA,YAAAA,CAAAA;AAClC,QAAA,MAAMX,mBAAmBC,oBAAqB,CAACT,KAAKU,UAAU,GAAGU,SAAU,CAAGD,EAAAA,YAAAA,CAAAA;AAC9E,QAAA,IAAI,CAACX,gBAAkB,EAAA;AACrBL,YAAAA,OAAAA,CAAQC,KAAK,CAAC,6EAAA,CAAA;YACd,OAAO,IAAA;AACT;QACA,MAAMO,GAAAA,GAAMC,MAAOC,CAAAA,MAAM,CACvB;YACEX,KAAO,EAAA,QAAA;YACPY,OAAS,EAAA,KAAA;YACTC,OAAS,EAAA,IAAA;YACTC,OAAS,EAAA;AACX,SAAA,EACAf,WAAW,EAAC,CAAA;QAEd,IAAIU,GAAAA,CAAIK,OAAO,EAAE;AACfL,YAAAA,GAAAA,CAAIG,OAAO,GAAG,KAAA;AACdH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;QACA,IAAIJ,GAAAA,CAAIG,OAAO,EAAE;AACfH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;AACA,QAAA,OAAO,IAAI,CAACE,sBAAsB,CAACT,kBAAkBG,GAAKX,EAAAA,IAAAA,CAAAA;AAC5D;AACAqB,IAAAA,IAAAA,CAAKC,aAA4B,EAAEC,KAAa,EAAEH,KAAa,EAAE;QAC/D,IAAI,CAACvI,UAAU,CAACgC,SAAS,EAAA;AACzB,QAAA,IAAI,CAAC2G,KAAK,CAACF,aAAAA,EAAeC,KAAOH,EAAAA,KAAAA,CAAAA;AACnC;AACAK,IAAAA,aAAAA,CAAcH,aAA4B,EAAEC,KAAa,EAAEH,KAAa,EAAEM,YAAoB,EAAE;QAC9F,IAAI,CAAC7I,UAAU,CAACgC,SAAS,EAAA;AACzB,QAAA,IAAI,CAAC8G,cAAc,CAACL,aAAAA,EAAeC,OAAOH,KAAOM,EAAAA,YAAAA,CAAAA;AACnD;AACAE,IAAAA,mBAAAA,CAAoBC,YAA0B,EAAQ;QACpD,IAAI,CAAChJ,UAAU,CAACgC,SAAS,IAAI,IAAI,CAACiH,oBAAoB,CAACD,YAAAA,CAAAA;AACzD;AACAE,IAAAA,OAAAA,CAAQC,eAAuB,EAAEC,eAAuB,EAAEC,eAAuB,EAAE;QACjF,IAAI,CAACrJ,UAAU,CAACiC,YAAY,EAAA;AAC5B,QAAA,IAAI,CAACqH,QAAQ,CAACH,eAAAA,EAAiBC,eAAiBC,EAAAA,eAAAA,CAAAA;AAClD;AACAE,IAAAA,YAAAA,CAAaC,CAAa,EAAE;AAC1B,QAAA,IAAIA,CAAG,EAAA;AACL,YAAA,IAAI,CAACxJ,UAAU,CAACkC,aAAa,CAAC0D,IAAI,CAAC4D,CAAAA,CAAAA;AACrC;AACF;IACA,MAAMC,iBAAAA,CAAkBD,CAA6B,EAAE;QACrD,OAAO,IAAIE,QAAc,CAACC,OAAAA,GAAAA;AACxB,YAAA,IAAIH,CAAG,EAAA;AACL,gBAAA,IAAI,CAACxJ,UAAU,CAACkC,aAAa,CAAC0D,IAAI,CAAC,IAAA;AACjC,oBAAA,MAAMgE,CAAIJ,GAAAA,CAAAA,EAAAA;AACV,oBAAA,IAAII,aAAaF,OAAS,EAAA;wBACxBE,CAAEC,CAAAA,IAAI,CAAC,IAAMF,OAAAA,EAAAA,CAAAA;qBACR,MAAA;AACLA,wBAAAA,OAAAA,EAAAA;AACF;AACF,iBAAA,CAAA;aACK,MAAA;AACLA,gBAAAA,OAAAA,EAAAA;AACF;AACF,SAAA,CAAA;AACF;IACAG,QAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC3J,YAAY,KAAK,IAAM,EAAA;AAC9B,YAAA,IAAI,IAAI,CAACA,YAAY,KAAK,CAAG,EAAA;gBAC3B4J,oBAAqB,CAAA,IAAI,CAAC5J,YAAY,CAAA;aACjC,MAAA;AACL,gBAAA,IAAI,CAAC6J,eAAe,CAAC,IAAI,CAAC7J,YAAY,CAAA;AACxC;YACA,IAAI,CAACA,YAAY,GAAG,IAAA;AACtB;AACF;AACA8J,IAAAA,OAAAA,CAAQC,IAAsC,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC/J,YAAY,KAAK,IAAM,EAAA;AAC9BmH,YAAAA,OAAAA,CAAQC,KAAK,CAAC,oCAAA,CAAA;AACd,YAAA;AACF;AACA,QAAA,IAAI,CAAC2C,IAAM,EAAA;AACT5C,YAAAA,OAAAA,CAAQC,KAAK,CAAC,gCAAA,CAAA;AACd,YAAA;AACF;AACA,QAAA,MAAM4C,OAAO,IAAI;AACjBA,QAAAA,IAAAA,CAAK9J,YAAY,GAAG6J,IAAAA;AACnB,QAAA,CAAA,SAASrM,KAAAA,GAAAA;YACR,IAAIsM,IAAAA,CAAKvJ,MAAM,EAAE;gBACfuJ,IAAKhK,CAAAA,YAAY,GAAGiK,qBAAsBvM,CAAAA,KAAAA,CAAAA;aACrC,MAAA;AACLsM,gBAAAA,IAAAA,CAAKhK,YAAY,GAAGgK,IAAKE,CAAAA,SAAS,CAAC,IAAA;oBACjC,IAAIF,IAAAA,CAAKhK,YAAY,KAAK,IAAM,EAAA;AAC9BtC,wBAAAA,KAAAA,EAAAA;AACF;AACF,iBAAA,CAAA;AACF;YACA,IAAIsM,IAAAA,CAAK9D,UAAU,EAAI,EAAA;AACrB8D,gBAAAA,IAAAA,CAAK9J,YAAY,CAAC8J,IAAAA,CAAAA;AAClBA,gBAAAA,IAAAA,CAAKxD,QAAQ,EAAA;AACf;SACF,GAAA;AACF;IACA2D,gBAAmB,GAAA;AACjB,QAAA,IAAI,CAACxJ,WAAW,CAAC8E,IAAI,CAAC;YACpB2E,mBAAqB,EAAA,IAAI,CAACC,sBAAsB,EAAA;YAChDC,WAAa,EAAA,IAAI,CAACtF,cAAc,EAAA;YAChCX,QAAU,EAAA,IAAI,CAACkG,WAAW,EAAA;YAC1BC,OAAS,EAAA,IAAI,CAACC,UAAU,EAAA;YACxBC,OAAS,EAAA,IAAI,CAACC,UAAU,EAAA;YACxBC,cAAgB,EAAA,IAAI,CAACC,eAAe,EAAA;YACpCC,YAAc,EAAA,IAAI,CAACC,eAAe,EAAA;YAClC3J,UAAY,EAAA;gBAAC,IAAI,CAAC4J,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA;AAAG;AACtG,SAAA,CAAA;AACF;IACAC,eAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAACtK,WAAW,CAAC5C,MAAM,KAAK,CAAG,EAAA;AACjCoJ,YAAAA,OAAAA,CAAQC,KAAK,CAAC,0CAAA,CAAA;SACT,MAAA;AACL,YAAA,MAAM8D,GAAM,GAAA,IAAI,CAACvK,WAAW,CAACwK,GAAG,EAAA;AAChC,YAAA,IAAI,CAAC7G,cAAc,CAAC4G,GAAAA,CAAIZ,WAAW,CAAA;AACnC,YAAA,IAAI,CAACc,WAAW,CAACF,GAAAA,CAAI7G,QAAQ,CAAA;AAC7B,YAAA,IAAI,CAACgH,UAAU,CAACH,GAAAA,CAAIV,OAAO,CAAA;AAC3B,YAAA,IAAI,CAACc,UAAU,CAACJ,GAAAA,CAAIR,OAAO,CAAA;AAC3B,YAAA,IAAI,CAACa,eAAe,CAACL,GAAAA,CAAIN,cAAc,CAAA;AACvC,YAAA,IAAI,CAACY,eAAe,CAACN,GAAAA,CAAIJ,YAAY,CAAA;AACrC,YAAA,IAAI,CAACW,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACsK,yBAAyB,CAACR,GAAAA,CAAId,mBAAmB,CAAA;AACxD;AACF;IACAuB,aAAgB,GAAA;QACd,OAAO,IAAI,CAACnM,cAAc;AAC5B;AACAoM,IAAAA,gBAAAA,CAAiBC,GAAW,EAAE;AAC5B,QAAA,KAAK,MAAMC,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC2B;SACrB,CAAE;YACD,KAAK,MAAMiE,OAAO0G,IAAM,CAAA;gBACtB,IAAI1G,GAAAA,CAAIyG,GAAG,KAAKA,GAAK,EAAA;oBACnB,OAAOzG,GAAAA;AACT;AACF;AACF;QACA,OAAO,IAAA;AACT;AACA2G,IAAAA,eAAAA,CAAgB3I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACV,SAAS,EAAA,CAAA;AACtE;AACAsJ,IAAAA,eAAAA,CAAgB5I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACV,SAAS,EAAA,CAAA;AACtE;AACAuJ,IAAAA,eAAAA,CAAgB7I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACR,SAAS,EAAA,CAAA;AACtE;AACAsJ,IAAAA,eAAAA,CAAgB9I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACR,SAAS,EAAA,CAAA;AACtE;AACAuJ,IAAAA,kBAAAA,CAAmBlF,OAAwB,EAAE;AAC3C,QAAA,OAAO,IAAI,CAAC5G,eAAe,CAAC8L,kBAAkB,CAAClF,OAAAA,CAAAA;AACjD;AACAmF,IAAAA,mBAAAA,CAAoBnF,OAAyB,EAAE;AAC7C,QAAA,OAAO,IAAI,CAAC5G,eAAe,CAAC+L,mBAAmB,CAACnF,OAAAA,CAAAA;AAClD;AACAoF,IAAAA,YAAAA,CAAajH,GAAc,EAAE;AAC3B,QAAA,MAAM0G,IAAO,GAAA,IAAI,CAACQ,gBAAgB,CAAClH,GAAAA,CAAAA;AACnC,QAAA,IAAI0G,IAAQA,IAAAA,IAAAA,CAAKS,OAAO,CAACnH,OAAO,CAAG,EAAA;AACjC0G,YAAAA,IAAAA,CAAKrG,IAAI,CAACL,GAAAA,CAAAA;YACV,IAAI,CAAC3C,aAAa,CAAC,iBAAmB2C,EAAAA,GAAAA,CAAAA;AACxC;AACF;AACAE,IAAAA,eAAAA,CAAgBF,GAAc,EAAE;AAC9B,QAAA,MAAM0G,IAAO,GAAA,IAAI,CAACQ,gBAAgB,CAAClH,GAAAA,CAAAA;AACnC,QAAA,IAAI0G,IAAM,EAAA;YACR,MAAMU,KAAAA,GAAQV,IAAKS,CAAAA,OAAO,CAACnH,GAAAA,CAAAA;AAC3B,YAAA,IAAIoH,SAAS,CAAG,EAAA;gBACdV,IAAKW,CAAAA,MAAM,CAACD,KAAO,EAAA,CAAA,CAAA;gBACnB,IAAI,CAAC/J,aAAa,CAAC,mBAAqB2C,EAAAA,GAAAA,CAAAA;AAC1C;AACF;AACF;AACAsH,IAAAA,qBAAAA,CAAsBC,KAAa,EAAE;QACnC,IAAI,CAAClN,WAAW,IAAIkN,KAAAA;AACtB;AAUA,IAAA,MAAgBC,WAAc,GAAA;QAC5B,OAAO,IAAIrD,QAAc,CAACC,OAAAA,GAAAA;AACxB,YAAA,IAAI,CAACqD,IAAI,CACP,UACA,CAACxO,QAAAA,EAAkBG,WAAmBE,WAAqBC,EAAAA,YAAAA,GAAAA;AACzD,gBAAA,IAAI,CAACmO,aAAa,CAACzO,QAAAA,EAAUG,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AACrD,gBAAA,IAAI,CAACoO,EAAE,CACL,UACA,CAAC1O,QAAAA,EAAkBG,WAAmBE,WAAqBC,EAAAA,YAAAA,GAAAA;AACzD,oBAAA,IAAI,CAACmO,aAAa,CAACzO,QAAAA,EAAUG,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AACvD,iBAAA,CAAA;AAEF6K,gBAAAA,OAAAA,EAAAA;AACF,aAAA,CAAA;YAEF,IAAI,CAAC9I,QAAQ,CAACpD,IAAI,EAAA;AACpB,SAAA,CAAA;AACF;IACQ8I,eAAkB,GAAA;AACxB,QAAA,IAAI,CAACvG,UAAU,CAACgC,SAAS,GAAG,CAAA;AAC5B,QAAA,IAAI,CAAChC,UAAU,CAACiC,YAAY,GAAG,CAAA;QAC/B,MAAMqE,GAAAA,GAAM,IAAI,CAACxG,eAAe;AAChC,QAAA,IAAI,IAAI,CAACE,UAAU,CAAC0B,cAAc,KAAK,CAAG,EAAA;AACxC,YAAA,IAAI,CAAC1B,UAAU,CAAC0B,cAAc,GAAG4E,GAAAA;AACjC,YAAA,IAAI,CAACtG,UAAU,CAAC2B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC3B,UAAU,CAAC4B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC5B,UAAU,CAAC6B,YAAY,GAAG,CAAA;AAC/B,YAAA,IAAI,CAAC7B,UAAU,CAAC8B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC9B,UAAU,CAAC+B,GAAG,GAAG,CAAA;AACtB,YAAA,IAAI,CAAC3B,WAAW,CAACkC,IAAI,GAAGgE,GAAAA;YACxB,IAAI,CAAClG,WAAW,CAACmC,KAAK,GAAG,IAAI,CAACvC,UAAU,CAACyB,YAAY;YACrD,IAAI,IAAI,CAACvB,SAAS,EAAE;gBAClB,IAAI,CAACA,SAAS,CAACiN,KAAK,EAAA;AACtB;SACK,MAAA;YACL,IAAI,CAACnN,UAAU,CAAC6B,YAAY,GAAGyE,MAAM,IAAI,CAACtG,UAAU,CAAC0B,cAAc;YACnE,IAAI,CAAC1B,UAAU,CAAC8B,cAAc,IAAI,IAAI,CAAC9B,UAAU,CAAC6B,YAAY;AAC9D,YAAA,IAAIuL,OAAU,GAAA,CAAA;AACd,YAAA,IAAIC,OAAU,GAAA,CAAA;AACd,YAAA,IAAI,IAAI,CAACtN,aAAa,KAAK,CAAG,EAAA;gBAC5BqN,OAAU9G,GAAAA,GAAAA,GAAM,IAAI,CAACvG,aAAa;gBAClCsN,OAAU,GAAA,IAAI,CAACtN,aAAa,GAAG,IAAI,CAACC,UAAU,CAAC0B,cAAc;AAC/D;AACA,YAAA,IAAI,CAAC1B,UAAU,CAAC0B,cAAc,GAAG4E,GAAAA;AACjC,YAAA,IAAIA,OAAO,IAAI,CAAClG,WAAW,CAACkC,IAAI,GAAG,IAAM,EAAA;AACvC,gBAAA,IAAI,CAACtC,UAAU,CAAC+B,GAAG,GACf,CAAA,IAAI,CAAC/B,UAAU,CAACyB,YAAY,GAAG,IAAI,CAACrB,WAAW,CAACmC,KAAK,IAAI,IAAS+D,IAAAA,GAAM,GAAA,IAAI,CAAClG,WAAW,CAACkC,IAAI,CAAD;AAChG,gBAAA,IAAI,CAAClC,WAAW,CAACkC,IAAI,GAAGgE,GAAAA;gBACxB,IAAI,CAAClG,WAAW,CAACmC,KAAK,GAAG,IAAI,CAACvC,UAAU,CAACyB,YAAY;AACrD,gBAAA,IAAI,CAACzB,UAAU,CAAC4B,cAAc,GAAGwL,OAAAA;AACjC,gBAAA,IAAI,CAACpN,UAAU,CAAC2B,cAAc,GAAG0L,OAAAA;AACnC;AACF;AACA,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACtN,UAAU,CAACkC,aAAa;QACzC,IAAI,CAAClC,UAAU,CAACkC,aAAa,GAAG,IAAI,CAAClC,UAAU,CAACmC,iBAAiB;AACjE,QAAA,IAAI,CAACnC,UAAU,CAACmC,iBAAiB,GAAGmL,GAAAA;AACpC,QAAA,KAAK,MAAM9D,CAAK,IAAA,IAAI,CAACxJ,UAAU,CAACmC,iBAAiB,CAAE;AACjDqH,YAAAA,CAAAA,EAAAA;AACF;AACA,QAAA,IAAI,CAACxJ,UAAU,CAACmC,iBAAiB,CAACjE,MAAM,GAAG,CAAA;AAC7C;AACQuO,IAAAA,gBAAAA,CAAiBlH,GAAc,EAAE;AACvC,QAAA,IAAI0G,IAA8B,GAAA,IAAA;QAClC,IAAI1G,GAAAA,CAAIgI,SAAS,EAAI,EAAA;AACnBtB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACsB,QAAQ;SAC9B,MAAA,IAAIsE,GAAIiI,CAAAA,SAAS,EAAI,EAAA;AAC1BvB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACuB,QAAQ;SAC9B,MAAA,IAAIqE,GAAIkI,CAAAA,QAAQ,EAAI,EAAA;AACzBxB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACwB,OAAO;SAC7B,MAAA,IAAIoE,GAAImI,CAAAA,aAAa,EAAI,EAAA;AAC9BzB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC0B,YAAY;SAClC,MAAA,IAAIkE,GAAIoI,CAAAA,SAAS,EAAI,EAAA;AAC1B1B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACyB,QAAQ;SAC9B,MAAA,IAAImE,GAAIqI,CAAAA,cAAc,EAAI,EAAA;AAC/B3B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC2B,kBAAkB;SACxC,MAAA,IAAIiE,GAAIsI,CAAAA,WAAW,EAAI,EAAA;AAC5B5B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC4B,UAAU;AACvC;QACA,OAAO0K,IAAAA;AACT;IACU6B,aAAgB,GAAA;AACxB,QAAA,KAAK,MAAM7B,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAAC2B,kBAAkB;YACtC,IAAI,CAAC3B,cAAc,CAAC4B;SACrB,CAAE;YACD,KAAK,MAAMgE,OAAO0G,IAAM,CAAA;gBACtB,IAAI,CAAC3G,aAAa,CAACC,GAAK,EAAA,KAAA,CAAA;AAC1B;AACF;QACA,IAAI,IAAI,CAACG,aAAa,EAAI,EAAA;AACxB,YAAA,KAAK,MAAMH,GAAAA,IAAO,IAAI,CAAC1F,kBAAkB,CAAE;AACzC0F,gBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;YACA,IAAI,CAAC9F,kBAAkB,GAAG,EAAE;AAC9B;AACF;IACUkO,SAAY,GAAA;AACpB,QAAA,KAAK,MAAM9B,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAAC2B,kBAAkB;YACtC,IAAI,CAAC3B,cAAc,CAAC4B;SACrB,CAAE;;AAED,YAAA,KAAK,MAAMgE,GAAAA,IAAO0G,IAAK+B,CAAAA,KAAK,EAAI,CAAA;AAC9BzI,gBAAAA,GAAAA,CAAI0I,MAAM,EAAA;AACZ;AACF;AACA,QAAA;AACF;AACUC,IAAAA,mBAAAA,CAAoB9G,OAAgC,EAAE;AAC9D,QAAA,MAAM+G,eAAe/G,OAASgH,EAAAA,UAAAA,KAAe,KAAQC,GAAAA,qBAAAA,CAAsBC,YAAY,GAAG,CAAA;AAC1F,QAAA,MAAMC,YAAenH,GAAAA,OAAAA,EAASoH,QAAWH,GAAAA,qBAAAA,CAAsBI,WAAW,GAAG,CAAA;AAC7E,QAAA,MAAMC,WAActH,GAAAA,OAAAA,EAASa,OAAUoG,GAAAA,qBAAAA,CAAsBM,OAAO,GAAG,CAAA;QACvE,IAAIR,YAAAA,IAAgB/G,SAASwH,cAAgB,EAAA;YAC3CxH,OAAQwH,CAAAA,cAAc,CAACC,SAAS,GAAG,MAAA;AACrC;AACA,QAAA,OAAOV,eAAeI,YAAeG,GAAAA,WAAAA;AACvC;IACUI,kBAAmB1H,CAAAA,OAA+B,EAAE2H,YAA0B,EAAE;AACxF3H,QAAAA,OAAAA,GAAUA,WAAW,EAAC;QACtB,MAAMC,KAAAA,GAAQD,OAAQC,CAAAA,KAAK,IAAI0H,YAAAA;QAC/B,IAAIC,SAAAA;QACJ,OAAQ3H,KAAAA;YACN,KAAK,SAAA;AACH2H,gBAAAA,SAAAA,GAAYX,sBAAsBY,UAAU;AAC5C7H,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClBd,gBAAAA,OAAAA,CAAQa,OAAO,GAAGb,OAAQa,CAAAA,OAAO,IAAI,IAAA;AACrC,gBAAA;YACF,KAAK,QAAA;AACH+G,gBAAAA,SAAAA,GAAYX,sBAAsBa,SAAS;AAC3C,gBAAA;YACF,KAAK,OAAA;AACHF,gBAAAA,SAAAA,GAAYX,sBAAsBc,QAAQ;AAC1C,gBAAA;YACF,KAAK,MAAA;AACHH,gBAAAA,SAAAA,GAAYX,sBAAsBe,OAAO;AACzChI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,OAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBgB,QAAQ;AAC1CjI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,YAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBiB,aAAa;AAC/ClI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,cAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBkB,eAAe;AACjDnI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;AACF,YAAA;gBACE8G,SAAY,GAAA,CAAA;AACZ,gBAAA;AACJ;AACA,QAAA,MAAMQ,cAAc,OAACpI,EAASe,WAAW,KAASkG,GAAAA,qBAAAA,CAAsBoB,UAAU,GAAG,CAAA;AACrF,QAAA,MAAMf,cAAc,OAACtH,EAASa,WAAW,KAASoG,GAAAA,qBAAAA,CAAsBM,OAAO,GAAG,CAAA;QAClF,MAAMe,WAAAA,GAAchB,WAAgB,KAAA,CAAA,KAAMtH,OAAAA,EAASc,WAAW,IAAG,CAAA,GAAKmG,qBAAsBsB,CAAAA,OAAO,GAAG,CAAA;QACtG,OAAOX,SAAAA,GAAYQ,cAAcd,WAAcgB,GAAAA,WAAAA;AACjD;AACF;;;;"}
|
package/dist/gpuobject.js
CHANGED
|
@@ -1979,7 +1979,7 @@ const vertexAttribNameRevMap = {
|
|
|
1979
1979
|
* Get vertex attribute index by semantic
|
|
1980
1980
|
* @public
|
|
1981
1981
|
*/ function getVertexAttribByName(name) {
|
|
1982
|
-
return vertexAttribNameMap[name];
|
|
1982
|
+
return name ? vertexAttribNameMap[name] : undefined;
|
|
1983
1983
|
}
|
|
1984
1984
|
/**
|
|
1985
1985
|
* Get vertex semantic by attribute index
|
|
@@ -2012,6 +2012,7 @@ const vertexAttribNameRevMap = {
|
|
|
2012
2012
|
} else {
|
|
2013
2013
|
return buffer.structure.structMembers[0].name === name;
|
|
2014
2014
|
}
|
|
2015
|
+
return false;
|
|
2015
2016
|
}
|
|
2016
2017
|
/**
|
|
2017
2018
|
* Get vertex attribute type of specified vertex format
|