@luma.gl/test-utils 9.0.0-alpha.21 → 9.0.0-alpha.23

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.
@@ -0,0 +1,137 @@
1
+ /// <reference types="dist" />
2
+ /// <reference types="offscreencanvas" />
3
+ import { Device, DeviceProps } from '@luma.gl/api';
4
+ import { Timeline, AnimationProps } from '@luma.gl/engine';
5
+ import { Stats, Stat } from '@probe.gl/stats';
6
+ declare type ContextProps = DeviceProps;
7
+ /**
8
+ * Classic Animation Props.
9
+ * Contain a number of deprecated fields
10
+ * @deprecated Use new AnimationLoop in `@luma.gl/engine`
11
+ */
12
+ export declare type ClassicAnimationProps = AnimationProps & {
13
+ animationLoop: ClassicAnimationLoop;
14
+ /** @deprecated Use .device */
15
+ stop: () => ClassicAnimationLoop;
16
+ /** @deprecated Use .device */
17
+ gl: WebGLRenderingContext;
18
+ /** @deprecated Will be removed */
19
+ framebuffer: unknown;
20
+ /** @deprecated Use .timeline */
21
+ _timeline: Timeline;
22
+ /** @deprecated Use .animationLoop */
23
+ _loop: ClassicAnimationLoop;
24
+ /** @deprecated Use .animationLoop */
25
+ _animationLoop: ClassicAnimationLoop;
26
+ };
27
+ /** ClassicAnimationLoop properties */
28
+ export declare type ClassicAnimationLoopProps = {
29
+ onCreateDevice?: (props: DeviceProps) => Promise<Device>;
30
+ onCreateContext?: (props: ContextProps) => WebGLRenderingContext;
31
+ onAddHTML?: (div: HTMLDivElement) => string;
32
+ onInitialize?: (animationProps: ClassicAnimationProps) => {} | void | Promise<{} | void>;
33
+ onRender?: (animationProps: ClassicAnimationProps) => void;
34
+ onFinalize?: (animationProps: ClassicAnimationProps) => void;
35
+ onError?: (reason: any) => void;
36
+ stats?: Stats;
37
+ device?: Device;
38
+ glOptions?: ContextProps;
39
+ autoResizeViewport?: boolean;
40
+ autoResizeDrawingBuffer?: boolean;
41
+ useDevicePixels?: number | boolean;
42
+ /** @deprecated Use .device */
43
+ gl?: WebGLRenderingContext | null;
44
+ /** @deprecated Will be removed */
45
+ createFramebuffer?: boolean;
46
+ };
47
+ /**
48
+ * Convenient animation loop
49
+ * @deprecated Use `@luma.gl/engine` AnimationLoop
50
+ */
51
+ export declare class ClassicAnimationLoop {
52
+ device: Device;
53
+ canvas?: HTMLCanvasElement | OffscreenCanvas;
54
+ props: Required<ClassicAnimationLoopProps>;
55
+ animationProps: ClassicAnimationProps;
56
+ timeline: Timeline;
57
+ stats: Stats;
58
+ cpuTime: Stat;
59
+ gpuTime: Stat;
60
+ frameRate: Stat;
61
+ display: any;
62
+ needsRedraw: string | null;
63
+ _initialized: boolean;
64
+ _running: boolean;
65
+ _animationFrameId: any;
66
+ _pageLoadPromise: Promise<{}> | null;
67
+ _nextFramePromise: Promise<ClassicAnimationLoop> | null;
68
+ _resolveNextFrame: ((loop: ClassicAnimationLoop) => void) | null;
69
+ _cpuStartTime: number;
70
+ /** @deprecated */
71
+ gl: WebGLRenderingContext;
72
+ constructor(props?: ClassicAnimationLoopProps);
73
+ destroy(): void;
74
+ /** @deprecated Use .destroy() */
75
+ delete(): void;
76
+ setNeedsRedraw(reason: string): this;
77
+ setProps(props: ClassicAnimationLoopProps): this;
78
+ start(opts?: {}): this;
79
+ /** Starts a render loop if not already running */
80
+ _start(props: any): Promise<this>;
81
+ /** Explicitly draw a frame */
82
+ redraw(): this;
83
+ stop(): this;
84
+ attachTimeline(timeline: Timeline): Timeline;
85
+ detachTimeline(): void;
86
+ waitForRender(): Promise<ClassicAnimationLoop>;
87
+ toDataURL(): Promise<string>;
88
+ isContextLost(): boolean;
89
+ onCreateDevice(deviceProps: DeviceProps): Promise<Device>;
90
+ onInitialize(animationProps: ClassicAnimationProps): {} | void;
91
+ onRender(animationProps: ClassicAnimationProps): void;
92
+ onFinalize(animationProps: ClassicAnimationProps): void;
93
+ /** @deprecated Use .onCreateDevice() */
94
+ onCreateContext(props: ContextProps): WebGLRenderingContext;
95
+ /** @deprecated */
96
+ getHTMLControlValue(id: any, defaultValue?: number): number;
97
+ _initialize(props: ClassicAnimationLoopProps): void;
98
+ _getPageLoadPromise(): Promise<{}>;
99
+ _setDisplay(display: any): void;
100
+ _requestAnimationFrame(): void;
101
+ _cancelAnimationFrame(): void;
102
+ _animationFrame(): void;
103
+ _renderFrame(props: ClassicAnimationProps): void;
104
+ _clearNeedsRedraw(): void;
105
+ _setupFrame(): void;
106
+ _initializeCallbackData(): void;
107
+ _updateCallbackData(): void;
108
+ _finalizeCallbackData(): void;
109
+ /** Add application's data to the app context object */
110
+ _addCallbackData(appContext: any): void;
111
+ /** Either uses supplied or existing context, or calls provided callback to create one */
112
+ _createDevice(props: DeviceProps): Promise<void>;
113
+ _createInfoDiv(): void;
114
+ _getSizeAndAspect(): {
115
+ width: number;
116
+ height: number;
117
+ aspect: number;
118
+ };
119
+ /** Default viewport setup */
120
+ _resizeViewport(): void;
121
+ /**
122
+ * Resize the render buffer of the canvas to match canvas client size
123
+ * Optionally multiplying with devicePixel ratio
124
+ */
125
+ _resizeCanvasDrawingBuffer(): void;
126
+ _beginTimers(): void;
127
+ _endTimers(): void;
128
+ _startEventHandling(): void;
129
+ _onMousemove(e: any): void;
130
+ _onMouseleave(e: any): void;
131
+ /** @deprecated */
132
+ _createFramebuffer(): void;
133
+ /** @deprecated */
134
+ _resizeFramebuffer(): void;
135
+ }
136
+ export {};
137
+ //# sourceMappingURL=classic-animation-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classic-animation-loop.d.ts","sourceRoot":"","sources":["../../src/engine/classic-animation-loop.ts"],"names":[],"mappings":";;AAEA,OAAO,EAEL,MAAM,EACN,WAAW,EAIZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAO5C,aAAK,YAAY,GAAG,WAAW,CAAC;AAahC;;;;GAIG;AACH,oBAAY,qBAAqB,GAAG,cAAc,GAAG;IACnD,aAAa,EAAE,oBAAoB,CAAC;IAEpC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,oBAAoB,CAAC;IAEjC,8BAA8B;IAC9B,EAAE,EAAE,qBAAqB,CAAC;IAC1B,kCAAkC;IAClC,WAAW,EAAE,OAAO,CAAC;IAErB,gCAAgC;IAChC,SAAS,EAAE,QAAQ,CAAC;IACpB,qCAAqC;IACrC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,qCAAqC;IACrC,cAAc,EAAE,oBAAoB,CAAC;CACtC,CAAC;AAEF,sCAAsC;AACtC,oBAAY,yBAAyB,GAAG;IACtC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,qBAAqB,CAAC;IACjE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,KAAK,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzF,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAEhC,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,YAAY,CAAC;IAIzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEnC,8BAA8B;IAC9B,EAAE,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClC,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AA2BF;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAE7C,KAAK,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAC3C,cAAc,EAAE,qBAAqB,CAAC;IAEtC,QAAQ,EAAE,QAAQ,CAAQ;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAEhB,OAAO,EAAE,GAAG,CAAC;IAEb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAiB;IAE3C,YAAY,EAAE,OAAO,CAAS;IAC9B,QAAQ,EAAE,OAAO,CAAS;IAC1B,iBAAiB,EAAE,GAAG,CAAQ;IAC9B,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAQ;IAC5C,iBAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAQ;IAC/D,iBAAiB,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IACxE,aAAa,EAAE,MAAM,CAAK;IAI1B,kBAAkB;IAClB,EAAE,EAAE,qBAAqB,CAAC;gBAId,KAAK,GAAE,yBAA8B;IAoCjD,OAAO,IAAI,IAAI;IAKf,iCAAiC;IACjC,MAAM,IAAI,IAAI;IAId,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAahD,KAAK,CAAC,IAAI,KAAK;IAKf,kDAAkD;IAC5C,MAAM,CAAC,KAAK,KAAA;IAiDlB,8BAA8B;IAC9B,MAAM,IAAI,IAAI;IA2Bd,IAAI;IAYJ,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAK5C,cAAc,IAAI,IAAI;IAItB,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAWxC,SAAS;IAQf,aAAa,IAAI,OAAO;IAIxB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzD,YAAY,CAAC,cAAc,EAAE,qBAAqB,GAAG,EAAE,GAAG,IAAI;IAK9D,QAAQ,CAAC,cAAc,EAAE,qBAAqB;IAK9C,UAAU,CAAC,cAAc,EAAE,qBAAqB;IAOhD,wCAAwC;IACxC,eAAe,CAAC,KAAK,EAAE,YAAY;IAKnC,kBAAkB;IAClB,mBAAmB,CAAC,EAAE,KAAA,EAAE,YAAY,SAAI;IAQxC,WAAW,CAAC,KAAK,EAAE,yBAAyB;IAe5C,mBAAmB;IAiBnB,WAAW,CAAC,OAAO,EAAE,GAAG;IAcxB,sBAAsB;IActB,qBAAqB;IAerB,eAAe;IAUf,YAAY,CAAC,KAAK,EAAE,qBAAqB;IAYzC,iBAAiB;IAIjB,WAAW;IASX,uBAAuB;IAwCvB,mBAAmB;IA+BnB,qBAAqB;IAMrB,uDAAuD;IACvD,gBAAgB,CAAC,UAAU,KAAA;IAM3B,yFAAyF;IACnF,aAAa,CAAC,KAAK,EAAE,WAAW;IAqBtC,cAAc;IAuBd,iBAAiB;;;;;IAkBjB,6BAA6B;IAC7B,eAAe;IAMf;;;OAGG;IACH,0BAA0B;IAM1B,YAAY;IAuBZ,UAAU;IAWV,mBAAmB;IAQnB,YAAY,CAAC,CAAC,KAAA;IAGd,aAAa,CAAC,CAAC,KAAA;IAMf,kBAAkB;IAClB,kBAAkB;IAOlB,kBAAkB;IAClB,kBAAkB;CAQnB"}
@@ -0,0 +1,435 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { luma, log, requestAnimationFrame, cancelAnimationFrame } from '@luma.gl/api';
3
+ import { isBrowser } from '@probe.gl/env';
4
+ import { isWebGL, resetParameters } from '@luma.gl/webgl';
5
+ const isPage = isBrowser() && typeof document !== 'undefined';
6
+ function getHTMLCanvasElement(canvas) {
7
+ return typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement ? canvas : null;
8
+ }
9
+ let statIdCounter = 0;
10
+ const DEFAULT_CLASSIC_ANIMATION_LOOP_PROPS = {
11
+ onCreateDevice: props => luma.createDevice(props),
12
+ onCreateContext: undefined,
13
+ onAddHTML: undefined,
14
+ onInitialize: () => ({}),
15
+ onRender: () => {},
16
+ onFinalize: () => {},
17
+ onError: error => console.error(error),
18
+ device: null,
19
+ useDevicePixels: true,
20
+ autoResizeViewport: true,
21
+ autoResizeDrawingBuffer: true,
22
+ stats: luma.stats.get("animation-loop-".concat(statIdCounter++)),
23
+ gl: undefined,
24
+ glOptions: {},
25
+ createFramebuffer: false
26
+ };
27
+ export class ClassicAnimationLoop {
28
+ constructor() {
29
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
30
+ _defineProperty(this, "device", void 0);
31
+ _defineProperty(this, "canvas", void 0);
32
+ _defineProperty(this, "props", void 0);
33
+ _defineProperty(this, "animationProps", void 0);
34
+ _defineProperty(this, "timeline", null);
35
+ _defineProperty(this, "stats", void 0);
36
+ _defineProperty(this, "cpuTime", void 0);
37
+ _defineProperty(this, "gpuTime", void 0);
38
+ _defineProperty(this, "frameRate", void 0);
39
+ _defineProperty(this, "display", void 0);
40
+ _defineProperty(this, "needsRedraw", 'initialized');
41
+ _defineProperty(this, "_initialized", false);
42
+ _defineProperty(this, "_running", false);
43
+ _defineProperty(this, "_animationFrameId", null);
44
+ _defineProperty(this, "_pageLoadPromise", null);
45
+ _defineProperty(this, "_nextFramePromise", null);
46
+ _defineProperty(this, "_resolveNextFrame", null);
47
+ _defineProperty(this, "_cpuStartTime", 0);
48
+ _defineProperty(this, "gl", void 0);
49
+ this.props = {
50
+ ...DEFAULT_CLASSIC_ANIMATION_LOOP_PROPS,
51
+ ...props
52
+ };
53
+ props = this.props;
54
+ let {
55
+ useDevicePixels = true
56
+ } = this.props;
57
+ if ('useDevicePixelRatio' in props) {
58
+ log.deprecated('useDevicePixelRatio', 'useDevicePixels')();
59
+ useDevicePixels = props.useDevicePixelRatio;
60
+ }
61
+ this.device = props.device;
62
+ this.gl = this.device && this.device.gl || props.gl;
63
+ this.stats = props.stats;
64
+ this.cpuTime = this.stats.get('CPU Time');
65
+ this.gpuTime = this.stats.get('GPU Time');
66
+ this.frameRate = this.stats.get('Frame Rate');
67
+ this.setProps({
68
+ autoResizeViewport: props.autoResizeViewport,
69
+ autoResizeDrawingBuffer: props.autoResizeDrawingBuffer,
70
+ useDevicePixels
71
+ });
72
+ this.start = this.start.bind(this);
73
+ this.stop = this.stop.bind(this);
74
+ this._onMousemove = this._onMousemove.bind(this);
75
+ this._onMouseleave = this._onMouseleave.bind(this);
76
+ }
77
+ destroy() {
78
+ this.stop();
79
+ this._setDisplay(null);
80
+ }
81
+ delete() {
82
+ this.destroy();
83
+ }
84
+ setNeedsRedraw(reason) {
85
+ this.needsRedraw = this.needsRedraw || reason;
86
+ return this;
87
+ }
88
+ setProps(props) {
89
+ if ('autoResizeViewport' in props) {
90
+ this.props.autoResizeViewport = props.autoResizeViewport;
91
+ }
92
+ if ('autoResizeDrawingBuffer' in props) {
93
+ this.props.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;
94
+ }
95
+ if ('useDevicePixels' in props) {
96
+ this.props.useDevicePixels = props.useDevicePixels;
97
+ }
98
+ return this;
99
+ }
100
+ start() {
101
+ let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
102
+ this._start(opts);
103
+ return this;
104
+ }
105
+ async _start(props) {
106
+ if (this._running) {
107
+ return this;
108
+ }
109
+ this._running = true;
110
+ try {
111
+ await this._getPageLoadPromise();
112
+ if (!this._running) {
113
+ return null;
114
+ }
115
+ let appContext;
116
+ if (!this._initialized) {
117
+ this._initialized = true;
118
+ await this._createDevice(props);
119
+ this._initialize(props);
120
+ appContext = await this.onInitialize(this.animationProps);
121
+ this._addCallbackData(appContext || {});
122
+ }
123
+ if (!this._running) {
124
+ return null;
125
+ }
126
+ if (appContext !== false) {
127
+ this._cancelAnimationFrame();
128
+ this._requestAnimationFrame();
129
+ }
130
+ return this;
131
+ } catch (error) {
132
+ this.props.onError(error);
133
+ return null;
134
+ }
135
+ }
136
+ redraw() {
137
+ if (this.isContextLost()) {
138
+ return this;
139
+ }
140
+ this._beginTimers();
141
+ this._setupFrame();
142
+ this._updateCallbackData();
143
+ this._renderFrame(this.animationProps);
144
+ this._clearNeedsRedraw();
145
+ if (this._resolveNextFrame) {
146
+ this._resolveNextFrame(this);
147
+ this._nextFramePromise = null;
148
+ this._resolveNextFrame = null;
149
+ }
150
+ this._endTimers();
151
+ return this;
152
+ }
153
+ stop() {
154
+ if (this._running) {
155
+ this._finalizeCallbackData();
156
+ this._cancelAnimationFrame();
157
+ this._nextFramePromise = null;
158
+ this._resolveNextFrame = null;
159
+ this._running = false;
160
+ }
161
+ return this;
162
+ }
163
+ attachTimeline(timeline) {
164
+ this.timeline = timeline;
165
+ return this.timeline;
166
+ }
167
+ detachTimeline() {
168
+ this.timeline = null;
169
+ }
170
+ waitForRender() {
171
+ this.setNeedsRedraw('waitForRender');
172
+ if (!this._nextFramePromise) {
173
+ this._nextFramePromise = new Promise(resolve => {
174
+ this._resolveNextFrame = resolve;
175
+ });
176
+ }
177
+ return this._nextFramePromise;
178
+ }
179
+ async toDataURL() {
180
+ var _getHTMLCanvasElement;
181
+ this.setNeedsRedraw('toDataURL');
182
+ await this.waitForRender();
183
+ return (_getHTMLCanvasElement = getHTMLCanvasElement(this.gl.canvas)) === null || _getHTMLCanvasElement === void 0 ? void 0 : _getHTMLCanvasElement.toDataURL();
184
+ }
185
+ isContextLost() {
186
+ return this.gl.isContextLost();
187
+ }
188
+ onCreateDevice(deviceProps) {
189
+ const {
190
+ onCreateDevice
191
+ } = this.props;
192
+ return onCreateDevice(deviceProps);
193
+ }
194
+ onInitialize(animationProps) {
195
+ const {
196
+ onInitialize
197
+ } = this.props;
198
+ return onInitialize(animationProps);
199
+ }
200
+ onRender(animationProps) {
201
+ const {
202
+ onRender
203
+ } = this.props;
204
+ return onRender(animationProps);
205
+ }
206
+ onFinalize(animationProps) {
207
+ const {
208
+ onFinalize
209
+ } = this.props;
210
+ return onFinalize(animationProps);
211
+ }
212
+ onCreateContext(props) {
213
+ const {
214
+ onCreateContext
215
+ } = this.props;
216
+ return onCreateContext(props);
217
+ }
218
+ getHTMLControlValue(id) {
219
+ let defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
220
+ const element = document.getElementById(id);
221
+ return element ? Number(element.value) : defaultValue;
222
+ }
223
+ _initialize(props) {
224
+ this._createFramebuffer();
225
+ this._startEventHandling();
226
+ this._initializeCallbackData();
227
+ this._updateCallbackData();
228
+ this._resizeCanvasDrawingBuffer();
229
+ this._resizeViewport();
230
+ }
231
+ _getPageLoadPromise() {
232
+ if (!this._pageLoadPromise) {
233
+ this._pageLoadPromise = isPage ? new Promise((resolve, reject) => {
234
+ if (isPage && document.readyState === 'complete') {
235
+ resolve(document);
236
+ return;
237
+ }
238
+ window.addEventListener('load', () => {
239
+ resolve(document);
240
+ });
241
+ }) : Promise.resolve({});
242
+ }
243
+ return this._pageLoadPromise;
244
+ }
245
+ _setDisplay(display) {
246
+ if (this.display) {
247
+ this.display.destroy();
248
+ this.display.animationLoop = null;
249
+ }
250
+ if (display) {
251
+ display.animationLoop = this;
252
+ }
253
+ this.display = display;
254
+ }
255
+ _requestAnimationFrame() {
256
+ if (!this._running) {
257
+ return;
258
+ }
259
+ this._animationFrameId = requestAnimationFrame(this._animationFrame.bind(this));
260
+ }
261
+ _cancelAnimationFrame() {
262
+ if (this._animationFrameId !== null) {
263
+ return;
264
+ }
265
+ cancelAnimationFrame(this._animationFrameId);
266
+ this._animationFrameId = null;
267
+ }
268
+ _animationFrame() {
269
+ if (!this._running) {
270
+ return;
271
+ }
272
+ this.redraw();
273
+ this._requestAnimationFrame();
274
+ }
275
+ _renderFrame(props) {
276
+ if (this.display) {
277
+ this.display._renderFrame(props);
278
+ return;
279
+ }
280
+ this.onRender(props);
281
+ }
282
+ _clearNeedsRedraw() {
283
+ this.needsRedraw = null;
284
+ }
285
+ _setupFrame() {
286
+ this._resizeCanvasDrawingBuffer();
287
+ this._resizeViewport();
288
+ this._resizeFramebuffer();
289
+ }
290
+ _initializeCallbackData() {
291
+ this.animationProps = {
292
+ device: this.device,
293
+ gl: this.gl,
294
+ stop: this.stop,
295
+ canvas: this.gl.canvas,
296
+ useDevicePixels: this.props.useDevicePixels,
297
+ needsRedraw: null,
298
+ startTime: Date.now(),
299
+ engineTime: 0,
300
+ tick: 0,
301
+ tock: 0,
302
+ timeline: this.timeline,
303
+ animationLoop: this,
304
+ time: 0,
305
+ _mousePosition: null,
306
+ _timeline: this.timeline,
307
+ _loop: this,
308
+ _animationLoop: this
309
+ };
310
+ }
311
+ _updateCallbackData() {
312
+ const {
313
+ width,
314
+ height,
315
+ aspect
316
+ } = this._getSizeAndAspect();
317
+ if (width !== this.animationProps.width || height !== this.animationProps.height) {
318
+ this.setNeedsRedraw('drawing buffer resized');
319
+ }
320
+ if (aspect !== this.animationProps.aspect) {
321
+ this.setNeedsRedraw('drawing buffer aspect changed');
322
+ }
323
+ this.animationProps.width = width;
324
+ this.animationProps.height = height;
325
+ this.animationProps.aspect = aspect;
326
+ this.animationProps.needsRedraw = this.needsRedraw;
327
+ this.animationProps.engineTime = Date.now() - this.animationProps.startTime;
328
+ if (this.timeline) {
329
+ this.timeline.update(this.animationProps.engineTime);
330
+ }
331
+ this.animationProps.tick = Math.floor(this.animationProps.time / 1000 * 60);
332
+ this.animationProps.tock++;
333
+ this.animationProps.time = this.timeline ? this.timeline.getTime() : this.animationProps.engineTime;
334
+ }
335
+ _finalizeCallbackData() {
336
+ this.onFinalize(this.animationProps);
337
+ }
338
+ _addCallbackData(appContext) {
339
+ if (typeof appContext === 'object' && appContext !== null) {
340
+ this.animationProps = Object.assign({}, this.animationProps, appContext);
341
+ }
342
+ }
343
+ async _createDevice(props) {
344
+ const deviceProps = {
345
+ ...this.props,
346
+ ...props,
347
+ ...this.props.glOptions
348
+ };
349
+ this.device = await this.onCreateDevice(deviceProps);
350
+ this.gl = this.device.gl;
351
+ if (!isWebGL(this.gl)) {
352
+ throw new Error('ClassicAnimationLoop.onCreateContext - illegal context returned');
353
+ }
354
+ resetParameters(this.gl);
355
+ this._createInfoDiv();
356
+ }
357
+ _createInfoDiv() {
358
+ const canvas = getHTMLCanvasElement(this.gl.canvas);
359
+ if (canvas && this.props.onAddHTML) {
360
+ const wrapperDiv = document.createElement('div');
361
+ document.body.appendChild(wrapperDiv);
362
+ wrapperDiv.style.position = 'relative';
363
+ const div = document.createElement('div');
364
+ div.style.position = 'absolute';
365
+ div.style.left = '10px';
366
+ div.style.bottom = '10px';
367
+ div.style.width = '300px';
368
+ div.style.background = 'white';
369
+ if (canvas) {
370
+ wrapperDiv.appendChild(canvas);
371
+ }
372
+ wrapperDiv.appendChild(div);
373
+ const html = this.props.onAddHTML(div);
374
+ if (html) {
375
+ div.innerHTML = html;
376
+ }
377
+ }
378
+ }
379
+ _getSizeAndAspect() {
380
+ const width = this.gl.drawingBufferWidth;
381
+ const height = this.gl.drawingBufferHeight;
382
+ let aspect = 1;
383
+ const canvas = getHTMLCanvasElement(this.gl.canvas);
384
+ if (canvas && canvas.clientHeight) {
385
+ aspect = canvas.clientWidth / canvas.clientHeight;
386
+ } else if (width > 0 && height > 0) {
387
+ aspect = width / height;
388
+ }
389
+ return {
390
+ width,
391
+ height,
392
+ aspect
393
+ };
394
+ }
395
+ _resizeViewport() {
396
+ if (this.props.autoResizeViewport) {
397
+ this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);
398
+ }
399
+ }
400
+ _resizeCanvasDrawingBuffer() {
401
+ if (this.props.autoResizeDrawingBuffer) {
402
+ this.device.canvasContext.resize({
403
+ useDevicePixels: this.props.useDevicePixels
404
+ });
405
+ }
406
+ }
407
+ _beginTimers() {
408
+ this.frameRate.timeEnd();
409
+ this.frameRate.timeStart();
410
+ this.cpuTime.timeStart();
411
+ }
412
+ _endTimers() {
413
+ this.cpuTime.timeEnd();
414
+ }
415
+ _startEventHandling() {
416
+ const {
417
+ canvas
418
+ } = this.gl;
419
+ if (canvas) {
420
+ canvas.addEventListener('mousemove', this._onMousemove);
421
+ canvas.addEventListener('mouseleave', this._onMouseleave);
422
+ }
423
+ }
424
+ _onMousemove(e) {
425
+ this.animationProps._mousePosition = [e.offsetX, e.offsetY];
426
+ }
427
+ _onMouseleave(e) {
428
+ this.animationProps._mousePosition = null;
429
+ }
430
+ _createFramebuffer() {
431
+ if (this.props.createFramebuffer) {}
432
+ }
433
+ _resizeFramebuffer() {}
434
+ }
435
+ //# sourceMappingURL=classic-animation-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classic-animation-loop.js","names":["luma","log","requestAnimationFrame","cancelAnimationFrame","isBrowser","isWebGL","resetParameters","isPage","document","getHTMLCanvasElement","canvas","HTMLCanvasElement","statIdCounter","DEFAULT_CLASSIC_ANIMATION_LOOP_PROPS","onCreateDevice","props","createDevice","onCreateContext","undefined","onAddHTML","onInitialize","onRender","onFinalize","onError","error","console","device","useDevicePixels","autoResizeViewport","autoResizeDrawingBuffer","stats","get","concat","gl","glOptions","createFramebuffer","ClassicAnimationLoop","constructor","arguments","length","_defineProperty","deprecated","useDevicePixelRatio","cpuTime","gpuTime","frameRate","setProps","start","bind","stop","_onMousemove","_onMouseleave","destroy","_setDisplay","delete","setNeedsRedraw","reason","needsRedraw","opts","_start","_running","_getPageLoadPromise","appContext","_initialized","_createDevice","_initialize","animationProps","_addCallbackData","_cancelAnimationFrame","_requestAnimationFrame","redraw","isContextLost","_beginTimers","_setupFrame","_updateCallbackData","_renderFrame","_clearNeedsRedraw","_resolveNextFrame","_nextFramePromise","_endTimers","_finalizeCallbackData","attachTimeline","timeline","detachTimeline","waitForRender","Promise","resolve","toDataURL","_getHTMLCanvasElement","deviceProps","getHTMLControlValue","id","defaultValue","element","getElementById","Number","value","_createFramebuffer","_startEventHandling","_initializeCallbackData","_resizeCanvasDrawingBuffer","_resizeViewport","_pageLoadPromise","reject","readyState","window","addEventListener","display","animationLoop","_animationFrameId","_animationFrame","_resizeFramebuffer","startTime","Date","now","engineTime","tick","tock","time","_mousePosition","_timeline","_loop","_animationLoop","width","height","aspect","_getSizeAndAspect","update","Math","floor","getTime","Object","assign","Error","_createInfoDiv","wrapperDiv","createElement","body","appendChild","style","position","div","left","bottom","background","html","innerHTML","drawingBufferWidth","drawingBufferHeight","clientHeight","clientWidth","viewport","canvasContext","resize","timeEnd","timeStart","e","offsetX","offsetY"],"sources":["../../src/engine/classic-animation-loop.ts"],"sourcesContent":["// TODO - replace createGLContext, instrumentGLContext, resizeGLContext?\n// TODO - remove dependency on framebuffer (bundle size impact)\nimport {\n luma,\n Device,\n DeviceProps,\n log,\n requestAnimationFrame,\n cancelAnimationFrame\n} from '@luma.gl/api';\nimport {Timeline, AnimationProps} from '@luma.gl/engine';\nimport {Stats, Stat} from '@probe.gl/stats';\nimport {isBrowser} from '@probe.gl/env';\n\nimport {isWebGL, resetParameters} from '@luma.gl/webgl';\n// import {default as Query} from '../classic/query';\n// import {ClassicFramebuffer} from '../classic/framebuffer';\n\ntype ContextProps = DeviceProps;\n\nconst isPage = isBrowser() && typeof document !== 'undefined';\nfunction getHTMLCanvasElement(\n canvas: HTMLCanvasElement | OffscreenCanvas\n): HTMLCanvasElement | null {\n return typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement\n ? canvas\n : null;\n}\n\nlet statIdCounter = 0;\n\n/**\n * Classic Animation Props.\n * Contain a number of deprecated fields\n * @deprecated Use new AnimationLoop in `@luma.gl/engine`\n */\nexport type ClassicAnimationProps = AnimationProps & {\n animationLoop: ClassicAnimationLoop;\n\n /** @deprecated Use .device */\n stop: () => ClassicAnimationLoop;\n\n /** @deprecated Use .device */\n gl: WebGLRenderingContext;\n /** @deprecated Will be removed */\n framebuffer: unknown;\n\n /** @deprecated Use .timeline */\n _timeline: Timeline;\n /** @deprecated Use .animationLoop */\n _loop: ClassicAnimationLoop;\n /** @deprecated Use .animationLoop */\n _animationLoop: ClassicAnimationLoop;\n};\n\n/** ClassicAnimationLoop properties */\nexport type ClassicAnimationLoopProps = {\n onCreateDevice?: (props: DeviceProps) => Promise<Device>;\n onCreateContext?: (props: ContextProps) => WebGLRenderingContext; // TODO: signature from createGLContext\n onAddHTML?: (div: HTMLDivElement) => string; // innerHTML\n onInitialize?: (animationProps: ClassicAnimationProps) => {} | void | Promise<{} | void>;\n onRender?: (animationProps: ClassicAnimationProps) => void;\n onFinalize?: (animationProps: ClassicAnimationProps) => void;\n onError?: (reason: any) => void;\n\n stats?: Stats;\n\n device?: Device;\n glOptions?: ContextProps; // createGLContext options\n // debug?: boolean;\n\n // view parameters\n autoResizeViewport?: boolean;\n autoResizeDrawingBuffer?: boolean;\n useDevicePixels?: number | boolean;\n\n /** @deprecated Use .device */\n gl?: WebGLRenderingContext | null;\n /** @deprecated Will be removed */\n createFramebuffer?: boolean;\n};\n\nconst DEFAULT_CLASSIC_ANIMATION_LOOP_PROPS: Required<ClassicAnimationLoopProps> = {\n onCreateDevice: (props: DeviceProps) => luma.createDevice(props),\n onCreateContext: undefined,\n onAddHTML: undefined,\n onInitialize: () => ({}),\n onRender: () => {},\n onFinalize: () => {},\n onError: (error) => console.error(error), // eslint-disable-line no-console\n\n device: null,\n // debug: true,\n\n // view parameters\n useDevicePixels: true,\n autoResizeViewport: true,\n autoResizeDrawingBuffer: true,\n stats: luma.stats.get(`animation-loop-${statIdCounter++}`),\n\n // deprecated\n // onCreateContext: (opts) => createGLContext(opts),\n gl: undefined,\n glOptions: {},\n createFramebuffer: false\n};\n\n/**\n * Convenient animation loop\n * @deprecated Use `@luma.gl/engine` AnimationLoop\n */\nexport class ClassicAnimationLoop {\n device: Device;\n canvas?: HTMLCanvasElement | OffscreenCanvas;\n\n props: Required<ClassicAnimationLoopProps>;\n animationProps: ClassicAnimationProps;\n // framebuffer: ClassicFramebuffer = null;\n timeline: Timeline = null;\n stats: Stats;\n cpuTime: Stat;\n gpuTime: Stat;\n frameRate: Stat;\n\n display: any;\n\n needsRedraw: string | null = 'initialized';\n\n _initialized: boolean = false;\n _running: boolean = false;\n _animationFrameId: any = null;\n _pageLoadPromise: Promise<{}> | null = null;\n _nextFramePromise: Promise<ClassicAnimationLoop> | null = null;\n _resolveNextFrame: ((loop: ClassicAnimationLoop) => void) | null = null;\n _cpuStartTime: number = 0;\n\n // _gpuTimeQuery: Query | null = null;\n\n /** @deprecated */\n gl: WebGLRenderingContext;\n\n /*\n */\n constructor(props: ClassicAnimationLoopProps = {}) {\n this.props = {...DEFAULT_CLASSIC_ANIMATION_LOOP_PROPS, ...props};\n props = this.props;\n\n let {useDevicePixels = true} = this.props;\n\n if ('useDevicePixelRatio' in props) {\n log.deprecated('useDevicePixelRatio', 'useDevicePixels')();\n // @ts-expect-error\n useDevicePixels = props.useDevicePixelRatio;\n }\n\n // state\n this.device = props.device;\n // @ts-expect-error\n this.gl = (this.device && this.device.gl) || props.gl;\n\n this.stats = props.stats;\n this.cpuTime = this.stats.get('CPU Time');\n this.gpuTime = this.stats.get('GPU Time');\n this.frameRate = this.stats.get('Frame Rate');\n\n this.setProps({\n autoResizeViewport: props.autoResizeViewport,\n autoResizeDrawingBuffer: props.autoResizeDrawingBuffer,\n useDevicePixels\n });\n\n // Bind methods\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this._onMousemove = this._onMousemove.bind(this);\n this._onMouseleave = this._onMouseleave.bind(this);\n }\n\n destroy(): void {\n this.stop();\n this._setDisplay(null);\n }\n\n /** @deprecated Use .destroy() */\n delete(): void {\n this.destroy();\n }\n\n setNeedsRedraw(reason: string): this {\n this.needsRedraw = this.needsRedraw || reason;\n return this;\n }\n\n setProps(props: ClassicAnimationLoopProps): this {\n if ('autoResizeViewport' in props) {\n this.props.autoResizeViewport = props.autoResizeViewport;\n }\n if ('autoResizeDrawingBuffer' in props) {\n this.props.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n }\n if ('useDevicePixels' in props) {\n this.props.useDevicePixels = props.useDevicePixels;\n }\n return this;\n }\n\n start(opts = {}) {\n this._start(opts);\n return this;\n }\n\n /** Starts a render loop if not already running */\n async _start(props) {\n if (this._running) {\n return this;\n }\n this._running = true;\n\n // console.debug(`Starting ${this.constructor.name}`);\n // Wait for start promise before rendering frame\n try {\n await this._getPageLoadPromise();\n\n // check that we haven't been stopped\n if (!this._running) {\n return null;\n }\n\n let appContext;\n if (!this._initialized) {\n this._initialized = true;\n // Create the WebGL context\n await this._createDevice(props);\n this._initialize(props);\n\n // Note: onIntialize can return a promise (in case app needs to load resources)\n // eslint-disable-next-line @typescript-eslint/await-thenable\n appContext = await this.onInitialize(this.animationProps);\n this._addCallbackData(appContext || {});\n }\n\n // check that we haven't been stopped\n if (!this._running) {\n return null;\n }\n\n // Start the loop\n if (appContext !== false) {\n // cancel any pending renders to ensure only one loop can ever run\n this._cancelAnimationFrame();\n this._requestAnimationFrame();\n }\n\n return this;\n } catch (error) {\n this.props.onError(error);\n // this._running = false; // TODO\n return null;\n }\n }\n\n /** Explicitly draw a frame */\n redraw(): this {\n if (this.isContextLost()) {\n return this;\n }\n\n this._beginTimers();\n\n this._setupFrame();\n this._updateCallbackData();\n\n this._renderFrame(this.animationProps);\n\n // clear needsRedraw flag\n this._clearNeedsRedraw();\n\n if (this._resolveNextFrame) {\n this._resolveNextFrame(this);\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n }\n\n this._endTimers();\n\n return this;\n }\n\n // Stops a render loop if already running, finalizing\n stop() {\n // console.debug(`Stopping ${this.constructor.name}`);\n if (this._running) {\n this._finalizeCallbackData();\n this._cancelAnimationFrame();\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n this._running = false;\n }\n return this;\n }\n\n attachTimeline(timeline: Timeline): Timeline {\n this.timeline = timeline;\n return this.timeline;\n }\n\n detachTimeline(): void {\n this.timeline = null;\n }\n\n waitForRender(): Promise<ClassicAnimationLoop> {\n this.setNeedsRedraw('waitForRender');\n\n if (!this._nextFramePromise) {\n this._nextFramePromise = new Promise((resolve) => {\n this._resolveNextFrame = resolve;\n });\n }\n return this._nextFramePromise;\n }\n\n async toDataURL() {\n this.setNeedsRedraw('toDataURL');\n\n await this.waitForRender();\n\n return getHTMLCanvasElement(this.gl.canvas)?.toDataURL();\n }\n\n isContextLost(): boolean {\n return this.gl.isContextLost();\n }\n\n onCreateDevice(deviceProps: DeviceProps): Promise<Device> {\n const {onCreateDevice} = this.props;\n return onCreateDevice(deviceProps);\n }\n\n onInitialize(animationProps: ClassicAnimationProps): {} | void {\n const {onInitialize} = this.props;\n return onInitialize(animationProps);\n }\n\n onRender(animationProps: ClassicAnimationProps) {\n const {onRender} = this.props;\n return onRender(animationProps);\n }\n\n onFinalize(animationProps: ClassicAnimationProps) {\n const {onFinalize} = this.props;\n return onFinalize(animationProps);\n }\n\n // DEPRECATED/REMOVED METHODS\n\n /** @deprecated Use .onCreateDevice() */\n onCreateContext(props: ContextProps) {\n const {onCreateContext} = this.props;\n return onCreateContext(props);\n }\n\n /** @deprecated */\n getHTMLControlValue(id, defaultValue = 1) {\n const element = document.getElementById(id);\n // @ts-expect-error Not all html elements have value\n return element ? Number(element.value) : defaultValue;\n }\n\n // PRIVATE METHODS\n\n _initialize(props: ClassicAnimationLoopProps) {\n this._createFramebuffer();\n this._startEventHandling();\n\n // Initialize the callback data\n this._initializeCallbackData();\n this._updateCallbackData();\n\n // Default viewport setup, in case onInitialize wants to render\n this._resizeCanvasDrawingBuffer();\n this._resizeViewport();\n\n // this._gpuTimeQuery = Query.isSupported(this.gl, ['timers']) ? new Query(this.gl) : null;\n }\n\n _getPageLoadPromise() {\n if (!this._pageLoadPromise) {\n this._pageLoadPromise = isPage\n ? new Promise((resolve, reject) => {\n if (isPage && document.readyState === 'complete') {\n resolve(document);\n return;\n }\n window.addEventListener('load', () => {\n resolve(document);\n });\n })\n : Promise.resolve({});\n }\n return this._pageLoadPromise;\n }\n\n _setDisplay(display: any) {\n if (this.display) {\n this.display.destroy();\n this.display.animationLoop = null;\n }\n\n // store animation loop on the display\n if (display) {\n display.animationLoop = this;\n }\n\n this.display = display;\n }\n\n _requestAnimationFrame() {\n if (!this._running) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.requestAnimationFrame) {\n // this._animationFrameId = this.display.requestAnimationFrame(this._animationFrame.bind(this));\n // }\n this._animationFrameId = requestAnimationFrame(this._animationFrame.bind(this));\n }\n\n _cancelAnimationFrame() {\n if (this._animationFrameId !== null) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.cancelAnimationFrame) {\n // this.display.cancelAnimationFrame(this._animationFrameId);\n // }\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = null;\n }\n\n _animationFrame() {\n if (!this._running) {\n return;\n }\n this.redraw();\n this._requestAnimationFrame();\n }\n\n // Called on each frame, can be overridden to call onRender multiple times\n // to support e.g. stereoscopic rendering\n _renderFrame(props: ClassicAnimationProps) {\n // Allow e.g. VR display to render multiple frames.\n if (this.display) {\n this.display._renderFrame(props);\n return;\n }\n\n // call callback\n this.onRender(props);\n // end callback\n }\n\n _clearNeedsRedraw() {\n this.needsRedraw = null;\n }\n\n _setupFrame() {\n this._resizeCanvasDrawingBuffer();\n this._resizeViewport();\n this._resizeFramebuffer();\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Initialize the object that will be passed to app callbacks\n _initializeCallbackData() {\n this.animationProps = {\n device: this.device,\n gl: this.gl,\n\n stop: this.stop,\n canvas: this.gl.canvas,\n\n // Initial values\n useDevicePixels: this.props.useDevicePixels,\n needsRedraw: null,\n\n // Animation props\n startTime: Date.now(),\n engineTime: 0,\n tick: 0,\n tock: 0,\n\n timeline: this.timeline,\n // @ts-ignore\n animationLoop: this,\n\n // Timeline time for back compatibility\n time: 0,\n\n // Experimental\n _mousePosition: null, // Event props\n\n /** @deprecated */\n // framebuffer: this.framebuffer,\n /** @deprecated */\n _timeline: this.timeline,\n /** @deprecated */\n _loop: this,\n /** @deprecated */\n _animationLoop: this\n };\n }\n\n // Update the context object that will be passed to app callbacks\n _updateCallbackData() {\n const {width, height, aspect} = this._getSizeAndAspect();\n if (width !== this.animationProps.width || height !== this.animationProps.height) {\n this.setNeedsRedraw('drawing buffer resized');\n }\n if (aspect !== this.animationProps.aspect) {\n this.setNeedsRedraw('drawing buffer aspect changed');\n }\n\n this.animationProps.width = width;\n this.animationProps.height = height;\n this.animationProps.aspect = aspect;\n\n this.animationProps.needsRedraw = this.needsRedraw;\n\n // Update time properties\n this.animationProps.engineTime = Date.now() - this.animationProps.startTime;\n\n if (this.timeline) {\n this.timeline.update(this.animationProps.engineTime);\n }\n\n this.animationProps.tick = Math.floor((this.animationProps.time / 1000) * 60);\n this.animationProps.tock++;\n\n // For back compatibility\n this.animationProps.time = this.timeline\n ? this.timeline.getTime()\n : this.animationProps.engineTime;\n }\n\n _finalizeCallbackData() {\n // call callback\n this.onFinalize(this.animationProps);\n // end callback\n }\n\n /** Add application's data to the app context object */\n _addCallbackData(appContext) {\n if (typeof appContext === 'object' && appContext !== null) {\n this.animationProps = Object.assign({}, this.animationProps, appContext);\n }\n }\n\n /** Either uses supplied or existing context, or calls provided callback to create one */\n async _createDevice(props: DeviceProps) {\n const deviceProps = {...this.props, ...props, ...this.props.glOptions};\n\n // TODO - support this.onCreateContext\n // Create the WebGL context if necessary\n // this.gl = this.props.gl ? instrumentGLContext(this.props.gl, deviceProps) : this.onCreateContext(deviceProps);\n\n this.device = await this.onCreateDevice(deviceProps);\n // @ts-expect-error\n this.gl = this.device.gl;\n\n if (!isWebGL(this.gl)) {\n throw new Error('ClassicAnimationLoop.onCreateContext - illegal context returned');\n }\n\n // Reset the WebGL context.\n resetParameters(this.gl);\n\n this._createInfoDiv();\n }\n\n _createInfoDiv() {\n const canvas = getHTMLCanvasElement(this.gl.canvas)\n if (canvas && this.props.onAddHTML) {\n const wrapperDiv = document.createElement('div');\n document.body.appendChild(wrapperDiv);\n wrapperDiv.style.position = 'relative';\n const div = document.createElement('div');\n div.style.position = 'absolute';\n div.style.left = '10px';\n div.style.bottom = '10px';\n div.style.width = '300px';\n div.style.background = 'white';\n if (canvas) {\n wrapperDiv.appendChild(canvas);\n }\n wrapperDiv.appendChild(div);\n const html = this.props.onAddHTML(div);\n if (html) {\n div.innerHTML = html;\n }\n }\n }\n\n _getSizeAndAspect() {\n // https://webglfundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n const width = this.gl.drawingBufferWidth;\n const height = this.gl.drawingBufferHeight;\n\n // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html\n let aspect = 1;\n\n const canvas = getHTMLCanvasElement(this.gl.canvas);\n if (canvas && canvas.clientHeight) {\n aspect = canvas.clientWidth / canvas.clientHeight;\n } else if (width > 0 && height > 0) {\n aspect = width / height;\n }\n\n return {width, height, aspect};\n }\n\n /** Default viewport setup */\n _resizeViewport() {\n if (this.props.autoResizeViewport) {\n this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);\n }\n }\n\n /**\n * Resize the render buffer of the canvas to match canvas client size\n * Optionally multiplying with devicePixel ratio\n */\n _resizeCanvasDrawingBuffer() {\n if (this.props.autoResizeDrawingBuffer) {\n this.device.canvasContext.resize({useDevicePixels: this.props.useDevicePixels});\n }\n }\n\n _beginTimers() {\n this.frameRate.timeEnd();\n this.frameRate.timeStart();\n\n // Check if timer for last frame has completed.\n // GPU timer results are never available in the same\n // frame they are captured.\n // if (\n // this._gpuTimeQuery &&\n // this._gpuTimeQuery.isResultAvailable() &&\n // !this._gpuTimeQuery.isTimerDisjoint()\n // ) {\n // this.stats.get('GPU Time').addTime(this._gpuTimeQuery.getTimerMilliseconds());\n // }\n\n // if (this._gpuTimeQuery) {\n // // GPU time query start\n // this._gpuTimeQuery.beginTimeElapsedQuery();\n // }\n\n this.cpuTime.timeStart();\n }\n\n _endTimers() {\n this.cpuTime.timeEnd();\n\n // if (this._gpuTimeQuery) {\n // // GPU time query end. Results will be available on next frame.\n // this._gpuTimeQuery.end();\n // }\n }\n\n // Event handling\n\n _startEventHandling() {\n const {canvas} = this.gl;\n if (canvas) {\n canvas.addEventListener('mousemove', this._onMousemove);\n canvas.addEventListener('mouseleave', this._onMouseleave);\n }\n }\n\n _onMousemove(e) {\n this.animationProps._mousePosition = [e.offsetX, e.offsetY];\n }\n _onMouseleave(e) {\n this.animationProps._mousePosition = null;\n }\n\n // Deprecated\n\n /** @deprecated */\n _createFramebuffer() {\n // Setup default framebuffer\n if (this.props.createFramebuffer) {\n // this.framebuffer = new ClassicFramebuffer(this.gl);\n }\n }\n\n /** @deprecated */\n _resizeFramebuffer() {\n // if (this.framebuffer) {\n // this.framebuffer.resize({\n // width: this.gl.drawingBufferWidth,\n // height: this.gl.drawingBufferHeight\n // });\n // }\n }\n}\n"],"mappings":";AAEA,SACEA,IAAI,EAGJC,GAAG,EACHC,qBAAqB,EACrBC,oBAAoB,QACf,cAAc;AAGrB,SAAQC,SAAS,QAAO,eAAe;AAEvC,SAAQC,OAAO,EAAEC,eAAe,QAAO,gBAAgB;AAMvD,MAAMC,MAAM,GAAGH,SAAS,EAAE,IAAI,OAAOI,QAAQ,KAAK,WAAW;AAC7D,SAASC,oBAAoBA,CAC3BC,MAA2C,EACjB;EAC1B,OAAO,OAAOC,iBAAiB,KAAK,WAAW,IAAID,MAAM,YAAYC,iBAAiB,GAClFD,MAAM,GACN,IAAI;AACV;AAEA,IAAIE,aAAa,GAAG,CAAC;AAqDrB,MAAMC,oCAAyE,GAAG;EAChFC,cAAc,EAAGC,KAAkB,IAAKf,IAAI,CAACgB,YAAY,CAACD,KAAK,CAAC;EAChEE,eAAe,EAAEC,SAAS;EAC1BC,SAAS,EAAED,SAAS;EACpBE,YAAY,EAAEA,CAAA,MAAO,CAAC,CAAC,CAAC;EACxBC,QAAQ,EAAEA,CAAA,KAAM,CAAC,CAAC;EAClBC,UAAU,EAAEA,CAAA,KAAM,CAAC,CAAC;EACpBC,OAAO,EAAGC,KAAK,IAAKC,OAAO,CAACD,KAAK,CAACA,KAAK,CAAC;EAExCE,MAAM,EAAE,IAAI;EAIZC,eAAe,EAAE,IAAI;EACrBC,kBAAkB,EAAE,IAAI;EACxBC,uBAAuB,EAAE,IAAI;EAC7BC,KAAK,EAAE9B,IAAI,CAAC8B,KAAK,CAACC,GAAG,mBAAAC,MAAA,CAAmBpB,aAAa,EAAE,EAAG;EAI1DqB,EAAE,EAAEf,SAAS;EACbgB,SAAS,EAAE,CAAC,CAAC;EACbC,iBAAiB,EAAE;AACrB,CAAC;AAMD,OAAO,MAAMC,oBAAoB,CAAC;EAgChCC,WAAWA,CAAA,EAAwC;IAAA,IAAvCtB,KAAgC,GAAAuB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAApB,SAAA,GAAAoB,SAAA,MAAG,CAAC,CAAC;IAAAE,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,mBAzB5B,IAAI;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,sBAQI,aAAa;IAAAA,eAAA,uBAElB,KAAK;IAAAA,eAAA,mBACT,KAAK;IAAAA,eAAA,4BACA,IAAI;IAAAA,eAAA,2BACU,IAAI;IAAAA,eAAA,4BACe,IAAI;IAAAA,eAAA,4BACK,IAAI;IAAAA,eAAA,wBAC/C,CAAC;IAAAA,eAAA;IAUvB,IAAI,CAACzB,KAAK,GAAG;MAAC,GAAGF,oCAAoC;MAAE,GAAGE;IAAK,CAAC;IAChEA,KAAK,GAAG,IAAI,CAACA,KAAK;IAElB,IAAI;MAACY,eAAe,GAAG;IAAI,CAAC,GAAG,IAAI,CAACZ,KAAK;IAEzC,IAAI,qBAAqB,IAAIA,KAAK,EAAE;MAClCd,GAAG,CAACwC,UAAU,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,EAAE;MAE1Dd,eAAe,GAAGZ,KAAK,CAAC2B,mBAAmB;IAC7C;IAGA,IAAI,CAAChB,MAAM,GAAGX,KAAK,CAACW,MAAM;IAE1B,IAAI,CAACO,EAAE,GAAI,IAAI,CAACP,MAAM,IAAI,IAAI,CAACA,MAAM,CAACO,EAAE,IAAKlB,KAAK,CAACkB,EAAE;IAErD,IAAI,CAACH,KAAK,GAAGf,KAAK,CAACe,KAAK;IACxB,IAAI,CAACa,OAAO,GAAG,IAAI,CAACb,KAAK,CAACC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,CAACa,OAAO,GAAG,IAAI,CAACd,KAAK,CAACC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,CAACc,SAAS,GAAG,IAAI,CAACf,KAAK,CAACC,GAAG,CAAC,YAAY,CAAC;IAE7C,IAAI,CAACe,QAAQ,CAAC;MACZlB,kBAAkB,EAAEb,KAAK,CAACa,kBAAkB;MAC5CC,uBAAuB,EAAEd,KAAK,CAACc,uBAAuB;MACtDF;IACF,CAAC,CAAC;IAGF,IAAI,CAACoB,KAAK,GAAG,IAAI,CAACA,KAAK,CAACC,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAACC,IAAI,GAAG,IAAI,CAACA,IAAI,CAACD,IAAI,CAAC,IAAI,CAAC;IAEhC,IAAI,CAACE,YAAY,GAAG,IAAI,CAACA,YAAY,CAACF,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACG,aAAa,GAAG,IAAI,CAACA,aAAa,CAACH,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAI,OAAOA,CAAA,EAAS;IACd,IAAI,CAACH,IAAI,EAAE;IACX,IAAI,CAACI,WAAW,CAAC,IAAI,CAAC;EACxB;EAGAC,MAAMA,CAAA,EAAS;IACb,IAAI,CAACF,OAAO,EAAE;EAChB;EAEAG,cAAcA,CAACC,MAAc,EAAQ;IACnC,IAAI,CAACC,WAAW,GAAG,IAAI,CAACA,WAAW,IAAID,MAAM;IAC7C,OAAO,IAAI;EACb;EAEAV,QAAQA,CAAC/B,KAAgC,EAAQ;IAC/C,IAAI,oBAAoB,IAAIA,KAAK,EAAE;MACjC,IAAI,CAACA,KAAK,CAACa,kBAAkB,GAAGb,KAAK,CAACa,kBAAkB;IAC1D;IACA,IAAI,yBAAyB,IAAIb,KAAK,EAAE;MACtC,IAAI,CAACA,KAAK,CAACc,uBAAuB,GAAGd,KAAK,CAACc,uBAAuB;IACpE;IACA,IAAI,iBAAiB,IAAId,KAAK,EAAE;MAC9B,IAAI,CAACA,KAAK,CAACY,eAAe,GAAGZ,KAAK,CAACY,eAAe;IACpD;IACA,OAAO,IAAI;EACb;EAEAoB,KAAKA,CAAA,EAAY;IAAA,IAAXW,IAAI,GAAApB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAApB,SAAA,GAAAoB,SAAA,MAAG,CAAC,CAAC;IACb,IAAI,CAACqB,MAAM,CAACD,IAAI,CAAC;IACjB,OAAO,IAAI;EACb;EAGA,MAAMC,MAAMA,CAAC5C,KAAK,EAAE;IAClB,IAAI,IAAI,CAAC6C,QAAQ,EAAE;MACjB,OAAO,IAAI;IACb;IACA,IAAI,CAACA,QAAQ,GAAG,IAAI;IAIpB,IAAI;MACF,MAAM,IAAI,CAACC,mBAAmB,EAAE;MAGhC,IAAI,CAAC,IAAI,CAACD,QAAQ,EAAE;QAClB,OAAO,IAAI;MACb;MAEA,IAAIE,UAAU;MACd,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE;QACtB,IAAI,CAACA,YAAY,GAAG,IAAI;QAExB,MAAM,IAAI,CAACC,aAAa,CAACjD,KAAK,CAAC;QAC/B,IAAI,CAACkD,WAAW,CAAClD,KAAK,CAAC;QAIvB+C,UAAU,GAAG,MAAM,IAAI,CAAC1C,YAAY,CAAC,IAAI,CAAC8C,cAAc,CAAC;QACzD,IAAI,CAACC,gBAAgB,CAACL,UAAU,IAAI,CAAC,CAAC,CAAC;MACzC;MAGA,IAAI,CAAC,IAAI,CAACF,QAAQ,EAAE;QAClB,OAAO,IAAI;MACb;MAGA,IAAIE,UAAU,KAAK,KAAK,EAAE;QAExB,IAAI,CAACM,qBAAqB,EAAE;QAC5B,IAAI,CAACC,sBAAsB,EAAE;MAC/B;MAEA,OAAO,IAAI;IACb,CAAC,CAAC,OAAO7C,KAAK,EAAE;MACd,IAAI,CAACT,KAAK,CAACQ,OAAO,CAACC,KAAK,CAAC;MAEzB,OAAO,IAAI;IACb;EACF;EAGA8C,MAAMA,CAAA,EAAS;IACb,IAAI,IAAI,CAACC,aAAa,EAAE,EAAE;MACxB,OAAO,IAAI;IACb;IAEA,IAAI,CAACC,YAAY,EAAE;IAEnB,IAAI,CAACC,WAAW,EAAE;IAClB,IAAI,CAACC,mBAAmB,EAAE;IAE1B,IAAI,CAACC,YAAY,CAAC,IAAI,CAACT,cAAc,CAAC;IAGtC,IAAI,CAACU,iBAAiB,EAAE;IAExB,IAAI,IAAI,CAACC,iBAAiB,EAAE;MAC1B,IAAI,CAACA,iBAAiB,CAAC,IAAI,CAAC;MAC5B,IAAI,CAACC,iBAAiB,GAAG,IAAI;MAC7B,IAAI,CAACD,iBAAiB,GAAG,IAAI;IAC/B;IAEA,IAAI,CAACE,UAAU,EAAE;IAEjB,OAAO,IAAI;EACb;EAGA9B,IAAIA,CAAA,EAAG;IAEL,IAAI,IAAI,CAACW,QAAQ,EAAE;MACjB,IAAI,CAACoB,qBAAqB,EAAE;MAC5B,IAAI,CAACZ,qBAAqB,EAAE;MAC5B,IAAI,CAACU,iBAAiB,GAAG,IAAI;MAC7B,IAAI,CAACD,iBAAiB,GAAG,IAAI;MAC7B,IAAI,CAACjB,QAAQ,GAAG,KAAK;IACvB;IACA,OAAO,IAAI;EACb;EAEAqB,cAAcA,CAACC,QAAkB,EAAY;IAC3C,IAAI,CAACA,QAAQ,GAAGA,QAAQ;IACxB,OAAO,IAAI,CAACA,QAAQ;EACtB;EAEAC,cAAcA,CAAA,EAAS;IACrB,IAAI,CAACD,QAAQ,GAAG,IAAI;EACtB;EAEAE,aAAaA,CAAA,EAAkC;IAC7C,IAAI,CAAC7B,cAAc,CAAC,eAAe,CAAC;IAEpC,IAAI,CAAC,IAAI,CAACuB,iBAAiB,EAAE;MAC3B,IAAI,CAACA,iBAAiB,GAAG,IAAIO,OAAO,CAAEC,OAAO,IAAK;QAChD,IAAI,CAACT,iBAAiB,GAAGS,OAAO;MAClC,CAAC,CAAC;IACJ;IACA,OAAO,IAAI,CAACR,iBAAiB;EAC/B;EAEA,MAAMS,SAASA,CAAA,EAAG;IAAA,IAAAC,qBAAA;IAChB,IAAI,CAACjC,cAAc,CAAC,WAAW,CAAC;IAEhC,MAAM,IAAI,CAAC6B,aAAa,EAAE;IAE1B,QAAAI,qBAAA,GAAO/E,oBAAoB,CAAC,IAAI,CAACwB,EAAE,CAACvB,MAAM,CAAC,cAAA8E,qBAAA,uBAApCA,qBAAA,CAAsCD,SAAS,EAAE;EAC1D;EAEAhB,aAAaA,CAAA,EAAY;IACvB,OAAO,IAAI,CAACtC,EAAE,CAACsC,aAAa,EAAE;EAChC;EAEAzD,cAAcA,CAAC2E,WAAwB,EAAmB;IACxD,MAAM;MAAC3E;IAAc,CAAC,GAAG,IAAI,CAACC,KAAK;IACnC,OAAOD,cAAc,CAAC2E,WAAW,CAAC;EACpC;EAEArE,YAAYA,CAAC8C,cAAqC,EAAa;IAC7D,MAAM;MAAC9C;IAAY,CAAC,GAAG,IAAI,CAACL,KAAK;IACjC,OAAOK,YAAY,CAAC8C,cAAc,CAAC;EACrC;EAEA7C,QAAQA,CAAC6C,cAAqC,EAAE;IAC9C,MAAM;MAAC7C;IAAQ,CAAC,GAAG,IAAI,CAACN,KAAK;IAC7B,OAAOM,QAAQ,CAAC6C,cAAc,CAAC;EACjC;EAEA5C,UAAUA,CAAC4C,cAAqC,EAAE;IAChD,MAAM;MAAC5C;IAAU,CAAC,GAAG,IAAI,CAACP,KAAK;IAC/B,OAAOO,UAAU,CAAC4C,cAAc,CAAC;EACnC;EAKAjD,eAAeA,CAACF,KAAmB,EAAE;IACnC,MAAM;MAACE;IAAe,CAAC,GAAG,IAAI,CAACF,KAAK;IACpC,OAAOE,eAAe,CAACF,KAAK,CAAC;EAC/B;EAGA2E,mBAAmBA,CAACC,EAAE,EAAoB;IAAA,IAAlBC,YAAY,GAAAtD,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAApB,SAAA,GAAAoB,SAAA,MAAG,CAAC;IACtC,MAAMuD,OAAO,GAAGrF,QAAQ,CAACsF,cAAc,CAACH,EAAE,CAAC;IAE3C,OAAOE,OAAO,GAAGE,MAAM,CAACF,OAAO,CAACG,KAAK,CAAC,GAAGJ,YAAY;EACvD;EAIA3B,WAAWA,CAAClD,KAAgC,EAAE;IAC5C,IAAI,CAACkF,kBAAkB,EAAE;IACzB,IAAI,CAACC,mBAAmB,EAAE;IAG1B,IAAI,CAACC,uBAAuB,EAAE;IAC9B,IAAI,CAACzB,mBAAmB,EAAE;IAG1B,IAAI,CAAC0B,0BAA0B,EAAE;IACjC,IAAI,CAACC,eAAe,EAAE;EAGxB;EAEAxC,mBAAmBA,CAAA,EAAG;IACpB,IAAI,CAAC,IAAI,CAACyC,gBAAgB,EAAE;MAC1B,IAAI,CAACA,gBAAgB,GAAG/F,MAAM,GAC1B,IAAI8E,OAAO,CAAC,CAACC,OAAO,EAAEiB,MAAM,KAAK;QACjC,IAAIhG,MAAM,IAAIC,QAAQ,CAACgG,UAAU,KAAK,UAAU,EAAE;UAChDlB,OAAO,CAAC9E,QAAQ,CAAC;UACjB;QACF;QACAiG,MAAM,CAACC,gBAAgB,CAAC,MAAM,EAAE,MAAM;UACpCpB,OAAO,CAAC9E,QAAQ,CAAC;QACnB,CAAC,CAAC;MACJ,CAAC,CAAC,GACA6E,OAAO,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB;IACA,OAAO,IAAI,CAACgB,gBAAgB;EAC9B;EAEAjD,WAAWA,CAACsD,OAAY,EAAE;IACxB,IAAI,IAAI,CAACA,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,CAACvD,OAAO,EAAE;MACtB,IAAI,CAACuD,OAAO,CAACC,aAAa,GAAG,IAAI;IACnC;IAGA,IAAID,OAAO,EAAE;MACXA,OAAO,CAACC,aAAa,GAAG,IAAI;IAC9B;IAEA,IAAI,CAACD,OAAO,GAAGA,OAAO;EACxB;EAEAtC,sBAAsBA,CAAA,EAAG;IACvB,IAAI,CAAC,IAAI,CAACT,QAAQ,EAAE;MAClB;IACF;IAQA,IAAI,CAACiD,iBAAiB,GAAG3G,qBAAqB,CAAC,IAAI,CAAC4G,eAAe,CAAC9D,IAAI,CAAC,IAAI,CAAC,CAAC;EACjF;EAEAoB,qBAAqBA,CAAA,EAAG;IACtB,IAAI,IAAI,CAACyC,iBAAiB,KAAK,IAAI,EAAE;MACnC;IACF;IAQA1G,oBAAoB,CAAC,IAAI,CAAC0G,iBAAiB,CAAC;IAC5C,IAAI,CAACA,iBAAiB,GAAG,IAAI;EAC/B;EAEAC,eAAeA,CAAA,EAAG;IAChB,IAAI,CAAC,IAAI,CAAClD,QAAQ,EAAE;MAClB;IACF;IACA,IAAI,CAACU,MAAM,EAAE;IACb,IAAI,CAACD,sBAAsB,EAAE;EAC/B;EAIAM,YAAYA,CAAC5D,KAA4B,EAAE;IAEzC,IAAI,IAAI,CAAC4F,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,CAAChC,YAAY,CAAC5D,KAAK,CAAC;MAChC;IACF;IAGA,IAAI,CAACM,QAAQ,CAACN,KAAK,CAAC;EAEtB;EAEA6D,iBAAiBA,CAAA,EAAG;IAClB,IAAI,CAACnB,WAAW,GAAG,IAAI;EACzB;EAEAgB,WAAWA,CAAA,EAAG;IACZ,IAAI,CAAC2B,0BAA0B,EAAE;IACjC,IAAI,CAACC,eAAe,EAAE;IACtB,IAAI,CAACU,kBAAkB,EAAE;EAC3B;EAKAZ,uBAAuBA,CAAA,EAAG;IACxB,IAAI,CAACjC,cAAc,GAAG;MACpBxC,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBO,EAAE,EAAE,IAAI,CAACA,EAAE;MAEXgB,IAAI,EAAE,IAAI,CAACA,IAAI;MACfvC,MAAM,EAAE,IAAI,CAACuB,EAAE,CAACvB,MAAM;MAGtBiB,eAAe,EAAE,IAAI,CAACZ,KAAK,CAACY,eAAe;MAC3C8B,WAAW,EAAE,IAAI;MAGjBuD,SAAS,EAAEC,IAAI,CAACC,GAAG,EAAE;MACrBC,UAAU,EAAE,CAAC;MACbC,IAAI,EAAE,CAAC;MACPC,IAAI,EAAE,CAAC;MAEPnC,QAAQ,EAAE,IAAI,CAACA,QAAQ;MAEvB0B,aAAa,EAAE,IAAI;MAGnBU,IAAI,EAAE,CAAC;MAGPC,cAAc,EAAE,IAAI;MAKpBC,SAAS,EAAE,IAAI,CAACtC,QAAQ;MAExBuC,KAAK,EAAE,IAAI;MAEXC,cAAc,EAAE;IAClB,CAAC;EACH;EAGAhD,mBAAmBA,CAAA,EAAG;IACpB,MAAM;MAACiD,KAAK;MAAEC,MAAM;MAAEC;IAAM,CAAC,GAAG,IAAI,CAACC,iBAAiB,EAAE;IACxD,IAAIH,KAAK,KAAK,IAAI,CAACzD,cAAc,CAACyD,KAAK,IAAIC,MAAM,KAAK,IAAI,CAAC1D,cAAc,CAAC0D,MAAM,EAAE;MAChF,IAAI,CAACrE,cAAc,CAAC,wBAAwB,CAAC;IAC/C;IACA,IAAIsE,MAAM,KAAK,IAAI,CAAC3D,cAAc,CAAC2D,MAAM,EAAE;MACzC,IAAI,CAACtE,cAAc,CAAC,+BAA+B,CAAC;IACtD;IAEA,IAAI,CAACW,cAAc,CAACyD,KAAK,GAAGA,KAAK;IACjC,IAAI,CAACzD,cAAc,CAAC0D,MAAM,GAAGA,MAAM;IACnC,IAAI,CAAC1D,cAAc,CAAC2D,MAAM,GAAGA,MAAM;IAEnC,IAAI,CAAC3D,cAAc,CAACT,WAAW,GAAG,IAAI,CAACA,WAAW;IAGlD,IAAI,CAACS,cAAc,CAACiD,UAAU,GAAGF,IAAI,CAACC,GAAG,EAAE,GAAG,IAAI,CAAChD,cAAc,CAAC8C,SAAS;IAE3E,IAAI,IAAI,CAAC9B,QAAQ,EAAE;MACjB,IAAI,CAACA,QAAQ,CAAC6C,MAAM,CAAC,IAAI,CAAC7D,cAAc,CAACiD,UAAU,CAAC;IACtD;IAEA,IAAI,CAACjD,cAAc,CAACkD,IAAI,GAAGY,IAAI,CAACC,KAAK,CAAE,IAAI,CAAC/D,cAAc,CAACoD,IAAI,GAAG,IAAI,GAAI,EAAE,CAAC;IAC7E,IAAI,CAACpD,cAAc,CAACmD,IAAI,EAAE;IAG1B,IAAI,CAACnD,cAAc,CAACoD,IAAI,GAAG,IAAI,CAACpC,QAAQ,GACpC,IAAI,CAACA,QAAQ,CAACgD,OAAO,EAAE,GACvB,IAAI,CAAChE,cAAc,CAACiD,UAAU;EACpC;EAEAnC,qBAAqBA,CAAA,EAAG;IAEtB,IAAI,CAAC1D,UAAU,CAAC,IAAI,CAAC4C,cAAc,CAAC;EAEtC;EAGAC,gBAAgBA,CAACL,UAAU,EAAE;IAC3B,IAAI,OAAOA,UAAU,KAAK,QAAQ,IAAIA,UAAU,KAAK,IAAI,EAAE;MACzD,IAAI,CAACI,cAAc,GAAGiE,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAClE,cAAc,EAAEJ,UAAU,CAAC;IAC1E;EACF;EAGA,MAAME,aAAaA,CAACjD,KAAkB,EAAE;IACtC,MAAM0E,WAAW,GAAG;MAAC,GAAG,IAAI,CAAC1E,KAAK;MAAE,GAAGA,KAAK;MAAE,GAAG,IAAI,CAACA,KAAK,CAACmB;IAAS,CAAC;IAMtE,IAAI,CAACR,MAAM,GAAG,MAAM,IAAI,CAACZ,cAAc,CAAC2E,WAAW,CAAC;IAEpD,IAAI,CAACxD,EAAE,GAAG,IAAI,CAACP,MAAM,CAACO,EAAE;IAExB,IAAI,CAAC5B,OAAO,CAAC,IAAI,CAAC4B,EAAE,CAAC,EAAE;MACrB,MAAM,IAAIoG,KAAK,CAAC,iEAAiE,CAAC;IACpF;IAGA/H,eAAe,CAAC,IAAI,CAAC2B,EAAE,CAAC;IAExB,IAAI,CAACqG,cAAc,EAAE;EACvB;EAEAA,cAAcA,CAAA,EAAG;IACf,MAAM5H,MAAM,GAAGD,oBAAoB,CAAC,IAAI,CAACwB,EAAE,CAACvB,MAAM,CAAC;IACnD,IAAIA,MAAM,IAAI,IAAI,CAACK,KAAK,CAACI,SAAS,EAAE;MAClC,MAAMoH,UAAU,GAAG/H,QAAQ,CAACgI,aAAa,CAAC,KAAK,CAAC;MAChDhI,QAAQ,CAACiI,IAAI,CAACC,WAAW,CAACH,UAAU,CAAC;MACrCA,UAAU,CAACI,KAAK,CAACC,QAAQ,GAAG,UAAU;MACtC,MAAMC,GAAG,GAAGrI,QAAQ,CAACgI,aAAa,CAAC,KAAK,CAAC;MACzCK,GAAG,CAACF,KAAK,CAACC,QAAQ,GAAG,UAAU;MAC/BC,GAAG,CAACF,KAAK,CAACG,IAAI,GAAG,MAAM;MACvBD,GAAG,CAACF,KAAK,CAACI,MAAM,GAAG,MAAM;MACzBF,GAAG,CAACF,KAAK,CAAChB,KAAK,GAAG,OAAO;MACzBkB,GAAG,CAACF,KAAK,CAACK,UAAU,GAAG,OAAO;MAC9B,IAAItI,MAAM,EAAE;QACV6H,UAAU,CAACG,WAAW,CAAChI,MAAM,CAAC;MAChC;MACA6H,UAAU,CAACG,WAAW,CAACG,GAAG,CAAC;MAC3B,MAAMI,IAAI,GAAG,IAAI,CAAClI,KAAK,CAACI,SAAS,CAAC0H,GAAG,CAAC;MACtC,IAAII,IAAI,EAAE;QACRJ,GAAG,CAACK,SAAS,GAAGD,IAAI;MACtB;IACF;EACF;EAEAnB,iBAAiBA,CAAA,EAAG;IAElB,MAAMH,KAAK,GAAG,IAAI,CAAC1F,EAAE,CAACkH,kBAAkB;IACxC,MAAMvB,MAAM,GAAG,IAAI,CAAC3F,EAAE,CAACmH,mBAAmB;IAG1C,IAAIvB,MAAM,GAAG,CAAC;IAEd,MAAMnH,MAAM,GAAGD,oBAAoB,CAAC,IAAI,CAACwB,EAAE,CAACvB,MAAM,CAAC;IACnD,IAAIA,MAAM,IAAIA,MAAM,CAAC2I,YAAY,EAAE;MACjCxB,MAAM,GAAGnH,MAAM,CAAC4I,WAAW,GAAG5I,MAAM,CAAC2I,YAAY;IACnD,CAAC,MAAM,IAAI1B,KAAK,GAAG,CAAC,IAAIC,MAAM,GAAG,CAAC,EAAE;MAClCC,MAAM,GAAGF,KAAK,GAAGC,MAAM;IACzB;IAEA,OAAO;MAACD,KAAK;MAAEC,MAAM;MAAEC;IAAM,CAAC;EAChC;EAGAxB,eAAeA,CAAA,EAAG;IAChB,IAAI,IAAI,CAACtF,KAAK,CAACa,kBAAkB,EAAE;MACjC,IAAI,CAACK,EAAE,CAACsH,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACtH,EAAE,CAACkH,kBAAkB,EAAE,IAAI,CAAClH,EAAE,CAACmH,mBAAmB,CAAC;IACjF;EACF;EAMAhD,0BAA0BA,CAAA,EAAG;IAC3B,IAAI,IAAI,CAACrF,KAAK,CAACc,uBAAuB,EAAE;MACtC,IAAI,CAACH,MAAM,CAAC8H,aAAa,CAACC,MAAM,CAAC;QAAC9H,eAAe,EAAE,IAAI,CAACZ,KAAK,CAACY;MAAe,CAAC,CAAC;IACjF;EACF;EAEA6C,YAAYA,CAAA,EAAG;IACb,IAAI,CAAC3B,SAAS,CAAC6G,OAAO,EAAE;IACxB,IAAI,CAAC7G,SAAS,CAAC8G,SAAS,EAAE;IAkB1B,IAAI,CAAChH,OAAO,CAACgH,SAAS,EAAE;EAC1B;EAEA5E,UAAUA,CAAA,EAAG;IACX,IAAI,CAACpC,OAAO,CAAC+G,OAAO,EAAE;EAMxB;EAIAxD,mBAAmBA,CAAA,EAAG;IACpB,MAAM;MAACxF;IAAM,CAAC,GAAG,IAAI,CAACuB,EAAE;IACxB,IAAIvB,MAAM,EAAE;MACVA,MAAM,CAACgG,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACxD,YAAY,CAAC;MACvDxC,MAAM,CAACgG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACvD,aAAa,CAAC;IAC3D;EACF;EAEAD,YAAYA,CAAC0G,CAAC,EAAE;IACd,IAAI,CAAC1F,cAAc,CAACqD,cAAc,GAAG,CAACqC,CAAC,CAACC,OAAO,EAAED,CAAC,CAACE,OAAO,CAAC;EAC7D;EACA3G,aAAaA,CAACyG,CAAC,EAAE;IACf,IAAI,CAAC1F,cAAc,CAACqD,cAAc,GAAG,IAAI;EAC3C;EAKAtB,kBAAkBA,CAAA,EAAG;IAEnB,IAAI,IAAI,CAAClF,KAAK,CAACoB,iBAAiB,EAAE,CAElC;EACF;EAGA4E,kBAAkBA,CAAA,EAAG,CAOrB;AACF"}