@deephaven/chart 0.104.1-virtual-webgl.11 → 0.105.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Chart.d.ts +2 -2
- package/dist/Chart.d.ts.map +1 -1
- package/dist/Chart.js +28 -13
- package/dist/Chart.js.map +1 -1
- package/dist/ChartModel.d.ts +2 -0
- package/dist/ChartModel.d.ts.map +1 -1
- package/dist/ChartModel.js +6 -0
- package/dist/ChartModel.js.map +1 -1
- package/dist/ChartTheme.d.ts +3 -0
- package/dist/ChartTheme.d.ts.map +1 -1
- package/dist/ChartTheme.js +5 -1
- package/dist/ChartTheme.js.map +1 -1
- package/dist/ChartTheme.module.css +4 -0
- package/dist/ChartTheme.module.css.map +1 -1
- package/dist/ChartUtils.d.ts.map +1 -1
- package/dist/ChartUtils.js +24 -1
- package/dist/ChartUtils.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/virtual-webgl.d.ts +0 -2
- package/dist/virtual-webgl.d.ts.map +0 -1
- package/dist/virtual-webgl.js +0 -915
- package/dist/virtual-webgl.js.map +0 -1
package/dist/virtual-webgl.js
DELETED
|
@@ -1,915 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
// Copied from https://github.com/greggman/virtual-webgl
|
|
4
|
-
// Used to show many WebGL plots on the same page
|
|
5
|
-
// https://github.com/plotly/plotly.js/?tab=readme-ov-file#need-to-have-several-webgl-graphs-on-a-page
|
|
6
|
-
/*
|
|
7
|
-
* Copyright 2018, Gregg Tavares.
|
|
8
|
-
* All rights reserved.
|
|
9
|
-
*
|
|
10
|
-
* Redistribution and use in source and binary forms, with or without
|
|
11
|
-
* modification, are permitted provided that the following conditions are
|
|
12
|
-
* met:
|
|
13
|
-
*
|
|
14
|
-
* * Redistributions of source code must retain the above copyright
|
|
15
|
-
* notice, this list of conditions and the following disclaimer.
|
|
16
|
-
*
|
|
17
|
-
* * Redistributions in binary form must reproduce the above
|
|
18
|
-
* copyright notice, this list of conditions and the following disclaimer
|
|
19
|
-
* in the documentation and/or other materials provided with the
|
|
20
|
-
* distribution.
|
|
21
|
-
*
|
|
22
|
-
* * Neither the name of Gregg Tavares. nor the names of his
|
|
23
|
-
* contributors may be used to endorse or promote products derived from
|
|
24
|
-
* this software without specific prior written permission.
|
|
25
|
-
*
|
|
26
|
-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
27
|
-
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
28
|
-
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
29
|
-
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
30
|
-
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
31
|
-
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
32
|
-
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
33
|
-
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
34
|
-
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
35
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
36
|
-
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
37
|
-
*/
|
|
38
|
-
export function initializeVirtualWebGL() {
|
|
39
|
-
var settings = {
|
|
40
|
-
disableWebGL2: false,
|
|
41
|
-
compositorCreator() {}
|
|
42
|
-
};
|
|
43
|
-
var canvasToVirtualContextMap = new Map();
|
|
44
|
-
var extensionInfo = {
|
|
45
|
-
webgl_draw_buffers: {
|
|
46
|
-
wrapperFnMakerFn: makeWEBGL_draw_buffersWrapper,
|
|
47
|
-
saveRestoreMakerFn: makeWEBGL_drawBuffersSaveRestoreHelper
|
|
48
|
-
},
|
|
49
|
-
oes_vertex_array_object: {
|
|
50
|
-
wrapperFnMakerFn: makeOES_vertex_array_objectWrapper
|
|
51
|
-
},
|
|
52
|
-
angle_instanced_arrays: {
|
|
53
|
-
wrapperFnMakerFn: makeANGLE_instanced_arraysWrapper
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
var extensionSaveRestoreHelpersArray = [];
|
|
57
|
-
var extensionSaveRestoreHelpers = {};
|
|
58
|
-
var currentVirtualContext = null;
|
|
59
|
-
var someContextsNeedRendering;
|
|
60
|
-
var sharedWebGLContext = document.createElement('canvas').getContext('webgl');
|
|
61
|
-
var sharedVAOExtension = sharedWebGLContext.getExtension('OES_vertex_array_object');
|
|
62
|
-
var sharedInstanceExtension = sharedWebGLContext.getExtension('ANGLE_instanced_arrays');
|
|
63
|
-
var numAttributes = sharedWebGLContext.getParameter(sharedWebGLContext.MAX_VERTEX_ATTRIBS);
|
|
64
|
-
var numTextureUnits = sharedWebGLContext.getParameter(sharedWebGLContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS);
|
|
65
|
-
var numDrawBuffers;
|
|
66
|
-
var baseState = makeDefaultState(300, 150);
|
|
67
|
-
var vs = "\n attribute vec4 position;\n varying vec2 v_texcoord;\n void main() {\n gl_Position = position;\n v_texcoord = position.xy * .5 + .5;\n }\n ";
|
|
68
|
-
var fs = "\n precision mediump float;\n varying vec2 v_texcoord;\n uniform sampler2D u_tex;\n void main() {\n gl_FragColor = texture2D(u_tex, v_texcoord);\n }\n ";
|
|
69
|
-
var fs2 = "\n precision mediump float;\n varying vec2 v_texcoord;\n uniform sampler2D u_tex;\n void main() {\n gl_FragColor = texture2D(u_tex, v_texcoord);\n gl_FragColor.rgb *= gl_FragColor.a;\n }\n ";
|
|
70
|
-
var premultplyAlphaTrueProgram = createProgram(sharedWebGLContext, [vs, fs]);
|
|
71
|
-
var premultplyAlphaFalseProgram = createProgram(sharedWebGLContext, [vs, fs2]);
|
|
72
|
-
if (sharedVAOExtension) {
|
|
73
|
-
var vao = sharedVAOExtension.createVertexArrayOES();
|
|
74
|
-
sharedVAOExtension.bindVertexArrayOES(vao);
|
|
75
|
-
baseState.vertexArray = vao;
|
|
76
|
-
}
|
|
77
|
-
{
|
|
78
|
-
var gl = sharedWebGLContext;
|
|
79
|
-
var positionLoc = 0; // hard coded in createProgram
|
|
80
|
-
|
|
81
|
-
var buffer = gl.createBuffer();
|
|
82
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
83
|
-
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW);
|
|
84
|
-
gl.enableVertexAttribArray(positionLoc);
|
|
85
|
-
gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);
|
|
86
|
-
}
|
|
87
|
-
saveAllState(baseState);
|
|
88
|
-
HTMLCanvasElement.prototype.getContext = function (origFn) {
|
|
89
|
-
return function (type, contextAttributes) {
|
|
90
|
-
if (type === 'webgl' || type === 'experimental-webgl') {
|
|
91
|
-
return createOrGetVirtualWebGLContext(this, type, contextAttributes);
|
|
92
|
-
} else if (type === 'webgl2' && settings.disableWebGL2) {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
return origFn.call(this, type, contextAttributes);
|
|
96
|
-
};
|
|
97
|
-
}(HTMLCanvasElement.prototype.getContext);
|
|
98
|
-
function valueOrDefault(value, defaultValue) {
|
|
99
|
-
return value === undefined ? defaultValue : value;
|
|
100
|
-
}
|
|
101
|
-
function errorDisposedContext(fnName) {
|
|
102
|
-
return function () {
|
|
103
|
-
throw new Error("tried to call ".concat(fnName, " on disposed context"));
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
class DefaultCompositor {
|
|
107
|
-
constructor(canvas) {
|
|
108
|
-
this._ctx = canvas.getContext('2d');
|
|
109
|
-
}
|
|
110
|
-
composite(gl, texture, canvas, contextAttributes) {
|
|
111
|
-
// note: not entirely sure what to do here. We need this canvas to be at least as large
|
|
112
|
-
// as the canvas we're drawing to. Resizing a canvas is slow so I think just making
|
|
113
|
-
// sure we never get smaller than the largest canvas. At the moment though I'm too lazy
|
|
114
|
-
// to make it smaller.
|
|
115
|
-
var ctx = this._ctx;
|
|
116
|
-
var width = canvas.width;
|
|
117
|
-
var height = canvas.height;
|
|
118
|
-
var maxWidth = Math.max(gl.canvas.width, width);
|
|
119
|
-
var maxHeight = Math.max(gl.canvas.height, height);
|
|
120
|
-
if (gl.canvas.width !== maxWidth || gl.canvas.height !== maxHeight) {
|
|
121
|
-
gl.canvas.width = maxWidth;
|
|
122
|
-
gl.canvas.height = maxHeight;
|
|
123
|
-
}
|
|
124
|
-
gl.viewport(0, 0, width, height);
|
|
125
|
-
gl.useProgram(contextAttributes.premultipliedAlpha ? premultplyAlphaTrueProgram : premultplyAlphaFalseProgram);
|
|
126
|
-
|
|
127
|
-
// draw the drawingbuffer's texture to the offscreen canvas
|
|
128
|
-
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
129
|
-
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
|
130
|
-
|
|
131
|
-
// copy it to target canvas
|
|
132
|
-
ctx.globalCompositeOperation = 'copy';
|
|
133
|
-
ctx.drawImage(gl.canvas, 0, maxHeight - height, width, height,
|
|
134
|
-
// src rect
|
|
135
|
-
0, 0, width, height); // dest rect
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
dispose() {}
|
|
139
|
-
}
|
|
140
|
-
class VirtualWebGLContext {
|
|
141
|
-
constructor(canvas) {
|
|
142
|
-
var contextAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
143
|
-
var compositor = arguments.length > 2 ? arguments[2] : undefined;
|
|
144
|
-
var disposeHelper = arguments.length > 3 ? arguments[3] : undefined;
|
|
145
|
-
var gl = sharedWebGLContext;
|
|
146
|
-
this.canvas = canvas;
|
|
147
|
-
// Should use Symbols or someting to hide these variables from the outside.
|
|
148
|
-
|
|
149
|
-
this._compositor = compositor;
|
|
150
|
-
this._disposeHelper = disposeHelper;
|
|
151
|
-
this._extensions = {};
|
|
152
|
-
// based on context attributes and canvas.width, canvas.height
|
|
153
|
-
// create a texture and framebuffer
|
|
154
|
-
this._drawingbufferTexture = gl.createTexture();
|
|
155
|
-
this._drawingbufferFramebuffer = gl.createFramebuffer();
|
|
156
|
-
this._contextAttributes = {
|
|
157
|
-
alpha: valueOrDefault(contextAttributes.alpha, true),
|
|
158
|
-
antialias: false,
|
|
159
|
-
depth: valueOrDefault(contextAttributes.depth, true),
|
|
160
|
-
failIfMajorPerformanceCaveat: false,
|
|
161
|
-
premultipliedAlpha: valueOrDefault(contextAttributes.premultipliedAlpha, true),
|
|
162
|
-
stencil: valueOrDefault(contextAttributes.stencil, false)
|
|
163
|
-
};
|
|
164
|
-
this._preserveDrawingbuffer = valueOrDefault(contextAttributes.preserveDrawingBuffer, false);
|
|
165
|
-
var oldTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
|
|
166
|
-
var oldFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
|
|
167
|
-
gl.bindTexture(gl.TEXTURE_2D, this._drawingbufferTexture);
|
|
168
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
169
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
170
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
171
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
172
|
-
// this._drawingbufferTexture.id = canvas.id;
|
|
173
|
-
// this._drawingbufferFramebuffer.id = canvas.id;
|
|
174
|
-
|
|
175
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, this._drawingbufferFramebuffer);
|
|
176
|
-
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this._drawingbufferTexture, 0);
|
|
177
|
-
if (this._contextAttributes.depth) {
|
|
178
|
-
var oldRenderbuffer = gl.getParameter(gl.RENDERBUFFER_BINDING);
|
|
179
|
-
this._depthRenderbuffer = gl.createRenderbuffer();
|
|
180
|
-
gl.bindRenderbuffer(gl.RENDERBUFFER, this._depthRenderbuffer);
|
|
181
|
-
var attachmentPoint = this._contextAttributes.stencil ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
182
|
-
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachmentPoint, gl.RENDERBUFFER, this._depthRenderbuffer);
|
|
183
|
-
gl.bindRenderbuffer(gl.RENDERBUFFER, oldRenderbuffer);
|
|
184
|
-
}
|
|
185
|
-
gl.bindTexture(gl.TEXTURE_2D, oldTexture);
|
|
186
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, oldFramebuffer);
|
|
187
|
-
|
|
188
|
-
// remember all WebGL state (default bindings, default texture units,
|
|
189
|
-
// default attributes and/or vertex shade object, default program,
|
|
190
|
-
// default blend, stencil, zbuffer, culling, viewport etc... state
|
|
191
|
-
this._state = makeDefaultState(canvas.width, canvas.height);
|
|
192
|
-
this._state.framebuffer = this._drawingbufferFramebuffer;
|
|
193
|
-
if (sharedVAOExtension) {
|
|
194
|
-
this._state.vertexArray = sharedVAOExtension.createVertexArrayOES();
|
|
195
|
-
this._defaultVertexArray = this._state.vertexArray;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
dispose() {
|
|
199
|
-
this._disposeHelper();
|
|
200
|
-
var gl = sharedWebGLContext;
|
|
201
|
-
gl.deleteFramebuffer(this._drawingbufferFramebuffer);
|
|
202
|
-
gl.deleteTexture(this._drawingbufferTexture);
|
|
203
|
-
if (this._depthRenderbuffer) {
|
|
204
|
-
gl.deleteRenderbuffer(this._depthRenderbuffer);
|
|
205
|
-
}
|
|
206
|
-
if (this._compositor.dispose) {
|
|
207
|
-
this._compositor.dispose();
|
|
208
|
-
}
|
|
209
|
-
for (var [key, value] of Object.entries(this)) {
|
|
210
|
-
if (typeof value === 'function') {
|
|
211
|
-
this[key] = errorDisposedContext(key);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
for (var [_key, _value] of Object.entries(VirtualWebGLContext.prototype)) {
|
|
215
|
-
if (typeof _value === 'function') {
|
|
216
|
-
this[_key] = errorDisposedContext(_key);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
get drawingBufferWidth() {
|
|
221
|
-
return this.canvas.width;
|
|
222
|
-
}
|
|
223
|
-
get drawingBufferHeight() {
|
|
224
|
-
return this.canvas.height;
|
|
225
|
-
}
|
|
226
|
-
composite(gl) {
|
|
227
|
-
this._compositor.composite(gl, this._drawingbufferTexture, this.canvas, this._contextAttributes);
|
|
228
|
-
if (!this._preserveDrawingbuffer) {
|
|
229
|
-
this._needClear = true;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
function makeDefaultState(width, height) {
|
|
234
|
-
var gl = WebGLRenderingContext;
|
|
235
|
-
var state = {
|
|
236
|
-
arrayBuffer: null,
|
|
237
|
-
renderbuffer: null,
|
|
238
|
-
framebuffer: null,
|
|
239
|
-
blend: false,
|
|
240
|
-
cullFace: false,
|
|
241
|
-
depthTest: false,
|
|
242
|
-
dither: false,
|
|
243
|
-
polygonOffsetFill: false,
|
|
244
|
-
sampleAlphaToCoverage: false,
|
|
245
|
-
sampleCoverage: false,
|
|
246
|
-
scissorTest: false,
|
|
247
|
-
stencilTest: false,
|
|
248
|
-
activeTexture: gl.TEXTURE0,
|
|
249
|
-
packAlignment: 4,
|
|
250
|
-
unpackAlignment: 4,
|
|
251
|
-
unpackColorspaceConversion: gl.BROWSER_DEFAULT_WEBGL,
|
|
252
|
-
unpackFlipY: 0,
|
|
253
|
-
unpackPremultiplyAlpha: 0,
|
|
254
|
-
currentProgram: null,
|
|
255
|
-
viewport: [0, 0, width, height],
|
|
256
|
-
scissor: [0, 0, 0, 0],
|
|
257
|
-
blendSrcRgb: gl.ONE,
|
|
258
|
-
blendDstRgb: gl.ZERO,
|
|
259
|
-
blendSrcAlpha: gl.ONE,
|
|
260
|
-
blendDstAlpha: gl.ZERO,
|
|
261
|
-
blendEquationRgb: gl.FUNC_ADD,
|
|
262
|
-
blendEquationAlpha: gl.FUNC_ADD,
|
|
263
|
-
blendColor: [0, 0, 0, 0],
|
|
264
|
-
colorClearValue: [0, 0, 0, 0],
|
|
265
|
-
colorMask: [true, true, true, true],
|
|
266
|
-
cullFaceMode: gl.BACK,
|
|
267
|
-
depthClearValue: 1,
|
|
268
|
-
depthFunc: gl.LESS,
|
|
269
|
-
depthRange: [0, 1],
|
|
270
|
-
depthMask: true,
|
|
271
|
-
frontFace: gl.CCW,
|
|
272
|
-
generateMipmapHint: gl.DONT_CARE,
|
|
273
|
-
lineWidth: 1,
|
|
274
|
-
polygonOffsetFactor: 0,
|
|
275
|
-
polygonOffsetUnits: 0,
|
|
276
|
-
sampleCoverageValue: 1,
|
|
277
|
-
sampleCoverageUnits: false,
|
|
278
|
-
stencilBackFail: gl.KEEP,
|
|
279
|
-
stencilBackFunc: gl.ALWAYS,
|
|
280
|
-
stencilBackPassDepthFail: gl.KEEP,
|
|
281
|
-
stencilBackPassDepthPass: gl.KEEP,
|
|
282
|
-
stencilBackRef: 0,
|
|
283
|
-
stencilBackValueMask: 0xffffffff,
|
|
284
|
-
stencilBackWriteMask: 0xffffffff,
|
|
285
|
-
stencilClearValue: 0,
|
|
286
|
-
stencilFail: gl.KEEP,
|
|
287
|
-
stencilFunc: gl.ALWAYS,
|
|
288
|
-
stencilPassDepthFail: gl.KEEP,
|
|
289
|
-
stencilPassDepthPass: gl.KEEP,
|
|
290
|
-
stencilRef: 0,
|
|
291
|
-
stencilValueMask: 0xffffffff,
|
|
292
|
-
stencilWriteMask: 0xffffffff,
|
|
293
|
-
textureUnits: []
|
|
294
|
-
};
|
|
295
|
-
if (sharedVAOExtension) {
|
|
296
|
-
state.vertexArray = null;
|
|
297
|
-
} else {
|
|
298
|
-
state.elementArrayBuffer = null;
|
|
299
|
-
state.attributes = [];
|
|
300
|
-
for (var i = 0; i < numAttributes; ++i) {
|
|
301
|
-
var attrib = {
|
|
302
|
-
buffer: null,
|
|
303
|
-
enabled: false,
|
|
304
|
-
size: 4,
|
|
305
|
-
stride: 0,
|
|
306
|
-
type: gl.FLOAT,
|
|
307
|
-
normalized: false,
|
|
308
|
-
value: [0, 0, 0, 1]
|
|
309
|
-
};
|
|
310
|
-
if (sharedInstanceExtension) {
|
|
311
|
-
attrib.divisor = 0;
|
|
312
|
-
}
|
|
313
|
-
state.attributes.push(attrib);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
for (var _i = 0; _i < numTextureUnits; ++_i) {
|
|
317
|
-
state.textureUnits.push({
|
|
318
|
-
texture2D: null,
|
|
319
|
-
textureCubemap: null
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
return state;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// copy all WebGL constants and functions to the prototype of
|
|
326
|
-
// VirtualWebGLContext
|
|
327
|
-
for (var key in WebGLRenderingContext.prototype) {
|
|
328
|
-
var propDesc = Object.getOwnPropertyDescriptor(WebGLRenderingContext.prototype, key);
|
|
329
|
-
if (propDesc.get) {
|
|
330
|
-
// it's a getter/setter ?
|
|
331
|
-
var virtualPropDesc = Object.getOwnPropertyDescriptor(VirtualWebGLContext.prototype, key);
|
|
332
|
-
if (!virtualPropDesc) {
|
|
333
|
-
console.warn("WebGLRenderingContext.".concat(key, " is not supported"));
|
|
334
|
-
}
|
|
335
|
-
continue;
|
|
336
|
-
}
|
|
337
|
-
switch (key) {
|
|
338
|
-
default:
|
|
339
|
-
{
|
|
340
|
-
var value = WebGLRenderingContext.prototype[key];
|
|
341
|
-
var newValue = value;
|
|
342
|
-
switch (key) {
|
|
343
|
-
case 'getContextAttributes':
|
|
344
|
-
newValue = virtualGetContextAttributes;
|
|
345
|
-
break;
|
|
346
|
-
case 'getExtension':
|
|
347
|
-
newValue = createGetExtensionWrapper(value);
|
|
348
|
-
break;
|
|
349
|
-
case 'bindFramebuffer':
|
|
350
|
-
newValue = virtualBindFramebuffer;
|
|
351
|
-
break;
|
|
352
|
-
case 'getParameter':
|
|
353
|
-
newValue = virtualGetParameter;
|
|
354
|
-
break;
|
|
355
|
-
case 'readPixels':
|
|
356
|
-
newValue = virtualReadPixels;
|
|
357
|
-
break;
|
|
358
|
-
case 'clear':
|
|
359
|
-
case 'drawArrays':
|
|
360
|
-
case 'drawElements':
|
|
361
|
-
newValue = createDrawWrapper(value);
|
|
362
|
-
break;
|
|
363
|
-
default:
|
|
364
|
-
if (typeof value === 'function') {
|
|
365
|
-
newValue = createWrapper(value);
|
|
366
|
-
}
|
|
367
|
-
break;
|
|
368
|
-
}
|
|
369
|
-
VirtualWebGLContext.prototype[key] = newValue;
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
function createGetExtensionWrapper(origFn) {
|
|
375
|
-
return function (extensionName) {
|
|
376
|
-
extensionName = extensionName.toLowerCase();
|
|
377
|
-
// just like the real context each extension needs a virtual class because each use
|
|
378
|
-
// of the extension might be modified (as in people adding properties to it)
|
|
379
|
-
var existingExt = this._extensions[extensionName];
|
|
380
|
-
if (existingExt) {
|
|
381
|
-
return existingExt;
|
|
382
|
-
}
|
|
383
|
-
var ext = origFn.call(sharedWebGLContext, extensionName);
|
|
384
|
-
var wrapperInfo = extensionInfo[extensionName] || {};
|
|
385
|
-
var wrapperFnMakerFn = wrapperInfo.wrapperFnMakerFn || (() => {
|
|
386
|
-
console.log('trying to get extension:', extensionName);
|
|
387
|
-
});
|
|
388
|
-
var saveRestoreHelper = extensionSaveRestoreHelpers[extensionName];
|
|
389
|
-
if (!saveRestoreHelper) {
|
|
390
|
-
var saveRestoreMakerFn = wrapperInfo.saveRestoreMakerFn;
|
|
391
|
-
if (saveRestoreMakerFn) {
|
|
392
|
-
var saveRestore = saveRestoreMakerFn(ext);
|
|
393
|
-
extensionSaveRestoreHelpers[extensionName] = saveRestore;
|
|
394
|
-
extensionSaveRestoreHelpersArray.push(saveRestore);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
var wrapper = {
|
|
398
|
-
_context: this
|
|
399
|
-
};
|
|
400
|
-
for (var _key2 in ext) {
|
|
401
|
-
var _value2 = ext[_key2];
|
|
402
|
-
if (typeof _value2 === 'function') {
|
|
403
|
-
_value2 = wrapperFnMakerFn(ext, _value2, extensionName);
|
|
404
|
-
}
|
|
405
|
-
wrapper[_key2] = _value2;
|
|
406
|
-
}
|
|
407
|
-
this._extensions[extensionName] = wrapper;
|
|
408
|
-
return wrapper;
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
function isFramebufferBindingNull(vctx) {
|
|
412
|
-
return vctx._state.framebuffer === vctx._drawingbufferFramebuffer;
|
|
413
|
-
}
|
|
414
|
-
function makeOES_vertex_array_objectWrapper(ext, origFn, name) {
|
|
415
|
-
switch (name) {
|
|
416
|
-
case 'bindVertexArrayOES':
|
|
417
|
-
return virutalbindVertexArrayOES;
|
|
418
|
-
}
|
|
419
|
-
return function () {
|
|
420
|
-
makeCurrentContext(this._context);
|
|
421
|
-
resizeCanvasIfChanged(this._context);
|
|
422
|
-
for (var _len = arguments.length, args = new Array(_len), _key3 = 0; _key3 < _len; _key3++) {
|
|
423
|
-
args[_key3] = arguments[_key3];
|
|
424
|
-
}
|
|
425
|
-
return origFn.call(ext, ...args);
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
function virutalbindVertexArrayOES(vao) {
|
|
429
|
-
makeCurrentContext(this._context);
|
|
430
|
-
resizeCanvasIfChanged(this._context);
|
|
431
|
-
if (!vao) {
|
|
432
|
-
vao = this._context._defaultVertexArray;
|
|
433
|
-
}
|
|
434
|
-
sharedVAOExtension.bindVertexArrayOES(vao);
|
|
435
|
-
}
|
|
436
|
-
function makeANGLE_instanced_arraysWrapper(ext, origFn, name) {
|
|
437
|
-
switch (name) {
|
|
438
|
-
case 'drawArraysInstancedANGLE':
|
|
439
|
-
case 'drawElementsInstancedANGLE':
|
|
440
|
-
return createExtDrawWrapper(ext, origFn);
|
|
441
|
-
break;
|
|
442
|
-
}
|
|
443
|
-
return function () {
|
|
444
|
-
makeCurrentContext(this._context);
|
|
445
|
-
resizeCanvasIfChanged(this._context);
|
|
446
|
-
for (var _len2 = arguments.length, args = new Array(_len2), _key4 = 0; _key4 < _len2; _key4++) {
|
|
447
|
-
args[_key4] = arguments[_key4];
|
|
448
|
-
}
|
|
449
|
-
return origFn.call(ext, ...args);
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
function createExtDrawWrapper(ext, origFn) {
|
|
453
|
-
return function () {
|
|
454
|
-
// a rendering function was called so we need to copy are drawingBuffer
|
|
455
|
-
// to the canvas for this context after the current event.
|
|
456
|
-
beforeDraw(this._context);
|
|
457
|
-
for (var _len3 = arguments.length, args = new Array(_len3), _key5 = 0; _key5 < _len3; _key5++) {
|
|
458
|
-
args[_key5] = arguments[_key5];
|
|
459
|
-
}
|
|
460
|
-
var result = origFn.call(exts, ...args);
|
|
461
|
-
afterDraw(this._context);
|
|
462
|
-
return result;
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
function makeWEBGL_draw_buffersWrapper(ext, origFn, name) {
|
|
466
|
-
var gl = sharedWebGLContext;
|
|
467
|
-
var backBuffer = [gl.COLOR_ATTACHMENT0];
|
|
468
|
-
return function (drawingBuffers) {
|
|
469
|
-
makeCurrentContext(this._context);
|
|
470
|
-
resizeCanvasIfChanged(this._context);
|
|
471
|
-
// if the virtual context is bound to canvas then fake it
|
|
472
|
-
if (isFramebufferBindingNull(this._context)) {
|
|
473
|
-
// this really isn't checking everything
|
|
474
|
-
// for example if the user passed in array.length != 1
|
|
475
|
-
// then we are supposed to generate an error
|
|
476
|
-
if (drawingBuffers[0] === gl.BACK) {
|
|
477
|
-
drawingBuffers = backBuffer;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
origFn.call(ext, drawingBuffers);
|
|
481
|
-
};
|
|
482
|
-
}
|
|
483
|
-
function makeWEBGL_drawBuffersSaveRestoreHelper(ext) {
|
|
484
|
-
var gl = sharedWebGLContext;
|
|
485
|
-
var maxDrawBuffers = gl.getParameter(ext.MAX_DRAW_BUFFERS_WEBGL);
|
|
486
|
-
var defaultBackDrawBuffers = [gl.BACK];
|
|
487
|
-
var defaultFBDrawBuffers = [gl.COLOR_ATTACHMENT0];
|
|
488
|
-
for (var i = 1; i < maxDrawBuffers; ++i) {
|
|
489
|
-
defaultFBDrawBuffers.push(gl.NONE);
|
|
490
|
-
}
|
|
491
|
-
function initDrawBufferState(state) {
|
|
492
|
-
state.drawBuffers = state.framebuffer ? defaultFBDrawBuffers.slice() : defaultBackDrawBuffers.slice();
|
|
493
|
-
}
|
|
494
|
-
function save(state) {
|
|
495
|
-
if (!state.drawBuffers) {
|
|
496
|
-
initDrawBufferState(state);
|
|
497
|
-
}
|
|
498
|
-
// remember state.framebuffer is only null for the offscreen canvas
|
|
499
|
-
var drawBuffers = state.drawBuffers;
|
|
500
|
-
for (var _i2 = 0; _i2 < drawBuffers.length; ++_i2) {
|
|
501
|
-
drawBuffers[_i2] = gl.getParameter(ext.DRAW_BUFFER0_WEBGL + _i2);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
function restore(state) {
|
|
505
|
-
if (!state.drawBuffers) {
|
|
506
|
-
initDrawBufferState(state);
|
|
507
|
-
}
|
|
508
|
-
ext.drawBuffersWEBGL(state.drawBuffers);
|
|
509
|
-
}
|
|
510
|
-
return {
|
|
511
|
-
save,
|
|
512
|
-
restore
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
function virtualGetContextAttributes() {
|
|
516
|
-
return this._contextAttributes;
|
|
517
|
-
}
|
|
518
|
-
function virtualReadPixels() {
|
|
519
|
-
makeCurrentContext(this);
|
|
520
|
-
resizeCanvasIfChanged(this);
|
|
521
|
-
clearIfNeeded(this);
|
|
522
|
-
var gl = sharedWebGLContext;
|
|
523
|
-
return gl.readPixels(...arguments);
|
|
524
|
-
}
|
|
525
|
-
function virtualGetParameter(pname) {
|
|
526
|
-
makeCurrentContext(this);
|
|
527
|
-
resizeCanvasIfChanged(this);
|
|
528
|
-
var gl = sharedWebGLContext;
|
|
529
|
-
var value = gl.getParameter(pname);
|
|
530
|
-
switch (pname) {
|
|
531
|
-
case gl.FRAMEBUFFER_BINDING:
|
|
532
|
-
if (value === this._drawingbufferFramebuffer) {
|
|
533
|
-
return null;
|
|
534
|
-
}
|
|
535
|
-
break;
|
|
536
|
-
case 0x8825:
|
|
537
|
-
// DRAW_BUFFER0_WEBGL
|
|
538
|
-
if (isFramebufferBindingNull(this)) {
|
|
539
|
-
if (value === gl.COLOR_ATTACHMENT0) {
|
|
540
|
-
return gl.BACK;
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
break;
|
|
544
|
-
case 0x85b5:
|
|
545
|
-
// VERTEX_ARRAY_BINDING_OES
|
|
546
|
-
if (value === this._defaultVertexArray) {
|
|
547
|
-
return null;
|
|
548
|
-
}
|
|
549
|
-
break;
|
|
550
|
-
}
|
|
551
|
-
return value;
|
|
552
|
-
}
|
|
553
|
-
function virtualBindFramebuffer(bindpoint, framebuffer) {
|
|
554
|
-
makeCurrentContext(this);
|
|
555
|
-
resizeCanvasIfChanged(this);
|
|
556
|
-
var gl = sharedWebGLContext;
|
|
557
|
-
if (bindpoint === WebGLRenderingContext.FRAMEBUFFER) {
|
|
558
|
-
if (framebuffer === null) {
|
|
559
|
-
// bind our drawingBuffer
|
|
560
|
-
framebuffer = this._drawingbufferFramebuffer;
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
gl.bindFramebuffer(bindpoint, framebuffer);
|
|
564
|
-
this._state.framebuffer = framebuffer;
|
|
565
|
-
}
|
|
566
|
-
function createWrapper(origFn) {
|
|
567
|
-
// lots of optimization could happen here depending on specific functions
|
|
568
|
-
return function () {
|
|
569
|
-
makeCurrentContext(this);
|
|
570
|
-
resizeCanvasIfChanged(this);
|
|
571
|
-
for (var _len4 = arguments.length, args = new Array(_len4), _key6 = 0; _key6 < _len4; _key6++) {
|
|
572
|
-
args[_key6] = arguments[_key6];
|
|
573
|
-
}
|
|
574
|
-
return origFn.call(sharedWebGLContext, ...args);
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
function clearIfNeeded(vctx) {
|
|
578
|
-
if (vctx._needClear) {
|
|
579
|
-
vctx._needClear = false;
|
|
580
|
-
var _gl = sharedWebGLContext;
|
|
581
|
-
_gl.bindFramebuffer(_gl.FRAMEBUFFER, vctx._drawingbufferFramebuffer);
|
|
582
|
-
_gl.disable(_gl.SCISSOR_TEST);
|
|
583
|
-
_gl.clear(_gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT | _gl.STENCIL_BUFFER_BIT);
|
|
584
|
-
enableDisable(_gl, _gl.SCISSOR_TEST, vctx._state.scissorTest);
|
|
585
|
-
_gl.bindFramebuffer(_gl.FRAMEBUFFER, vctx._state.framebuffer);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
function beforeDraw(vctx) {
|
|
589
|
-
makeCurrentContext(vctx);
|
|
590
|
-
resizeCanvasIfChanged(vctx);
|
|
591
|
-
clearIfNeeded(vctx);
|
|
592
|
-
}
|
|
593
|
-
function afterDraw(vctx) {
|
|
594
|
-
if (isFramebufferBindingNull(vctx)) {
|
|
595
|
-
vctx._needComposite = true;
|
|
596
|
-
if (!someContextsNeedRendering) {
|
|
597
|
-
someContextsNeedRendering = true;
|
|
598
|
-
setTimeout(renderAllDirtyVirtualCanvases, 0);
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
function createDrawWrapper(origFn) {
|
|
603
|
-
return function () {
|
|
604
|
-
// a rendering function was called so we need to copy are drawingBuffer
|
|
605
|
-
// to the canvas for this context after the current event.
|
|
606
|
-
beforeDraw(this);
|
|
607
|
-
for (var _len5 = arguments.length, args = new Array(_len5), _key7 = 0; _key7 < _len5; _key7++) {
|
|
608
|
-
args[_key7] = arguments[_key7];
|
|
609
|
-
}
|
|
610
|
-
var result = origFn.call(sharedWebGLContext, ...args);
|
|
611
|
-
afterDraw(this);
|
|
612
|
-
return result;
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
function makeCurrentContext(vctx) {
|
|
616
|
-
if (currentVirtualContext === vctx) {
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
// save all current WebGL state on the previous current virtual context
|
|
621
|
-
if (currentVirtualContext) {
|
|
622
|
-
saveAllState(currentVirtualContext._state, currentVirtualContext);
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
// restore all state for the new context
|
|
626
|
-
restoreAllState(vctx._state, vctx);
|
|
627
|
-
|
|
628
|
-
// check if the current state is supposed to be rendering to the canvas.
|
|
629
|
-
// if so bind vctx._drawingbuffer
|
|
630
|
-
|
|
631
|
-
currentVirtualContext = vctx;
|
|
632
|
-
}
|
|
633
|
-
function resizeCanvasIfChanged(vctx) {
|
|
634
|
-
var width = vctx.canvas.width;
|
|
635
|
-
var height = vctx.canvas.height;
|
|
636
|
-
if (width !== vctx._width || height !== vctx._height) {
|
|
637
|
-
vctx._width = width;
|
|
638
|
-
vctx._height = height;
|
|
639
|
-
var _gl2 = sharedWebGLContext;
|
|
640
|
-
var oldTexture = _gl2.getParameter(_gl2.TEXTURE_BINDING_2D);
|
|
641
|
-
var format = vctx._contextAttributes.alpha ? _gl2.RGBA : _gl2.RGB;
|
|
642
|
-
_gl2.bindTexture(_gl2.TEXTURE_2D, vctx._drawingbufferTexture);
|
|
643
|
-
_gl2.texImage2D(_gl2.TEXTURE_2D, 0, format, width, height, 0, format, _gl2.UNSIGNED_BYTE, null);
|
|
644
|
-
_gl2.bindTexture(_gl2.TEXTURE_2D, oldTexture);
|
|
645
|
-
if (vctx._depthRenderbuffer) {
|
|
646
|
-
var oldRenderbuffer = _gl2.getParameter(_gl2.RENDERBUFFER_BINDING);
|
|
647
|
-
var internalFormat = vctx._contextAttributes.stencil ? _gl2.DEPTH_STENCIL : _gl2.DEPTH_COMPONENT16;
|
|
648
|
-
_gl2.bindRenderbuffer(_gl2.RENDERBUFFER, vctx._depthRenderbuffer);
|
|
649
|
-
_gl2.renderbufferStorage(_gl2.RENDERBUFFER, internalFormat, width, height);
|
|
650
|
-
_gl2.bindRenderbuffer(_gl2.RENDERBUFFER, oldRenderbuffer);
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
function createOrGetVirtualWebGLContext(canvas, type, contextAttributes) {
|
|
655
|
-
// check if this canvas already has a context
|
|
656
|
-
var existingVirtualCtx = canvasToVirtualContextMap.get(canvas);
|
|
657
|
-
if (existingVirtualCtx) {
|
|
658
|
-
return existingVirtualCtx;
|
|
659
|
-
}
|
|
660
|
-
var compositor = settings.compositorCreator(canvas, type, contextAttributes) || new DefaultCompositor(canvas, type, contextAttributes);
|
|
661
|
-
var newVirtualCtx = new VirtualWebGLContext(canvas, contextAttributes, compositor, () => {
|
|
662
|
-
canvasToVirtualContextMap.delete(canvas);
|
|
663
|
-
});
|
|
664
|
-
canvasToVirtualContextMap.set(canvas, newVirtualCtx);
|
|
665
|
-
return newVirtualCtx;
|
|
666
|
-
}
|
|
667
|
-
function createProgram(gl, shaderSources) {
|
|
668
|
-
var program = gl.createProgram();
|
|
669
|
-
[gl.VERTEX_SHADER, gl.FRAGMENT_SHADER].forEach((type, ndx) => {
|
|
670
|
-
var shader = gl.createShader(type);
|
|
671
|
-
gl.shaderSource(shader, shaderSources[ndx]);
|
|
672
|
-
gl.compileShader(shader);
|
|
673
|
-
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
674
|
-
console.error(gl.getShaderInfoLog(shader)); // eslint-disable-line
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
gl.attachShader(program, shader);
|
|
678
|
-
});
|
|
679
|
-
gl.bindAttribLocation(program, 0, 'position');
|
|
680
|
-
gl.linkProgram(program);
|
|
681
|
-
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
682
|
-
console.error(gl.getProgramInfoLog(program)); // eslint-disable-line
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
return program;
|
|
686
|
-
}
|
|
687
|
-
function saveAllState(state, vctx) {
|
|
688
|
-
// save all WebGL state (current bindings, current texture units,
|
|
689
|
-
// current attributes and/or vertex shade object, current program,
|
|
690
|
-
// current blend, stencil, zbuffer, culling, viewport etc... state
|
|
691
|
-
var gl = sharedWebGLContext;
|
|
692
|
-
state.activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);
|
|
693
|
-
|
|
694
|
-
// save texture units
|
|
695
|
-
for (var i = 0; i < numTextureUnits; ++i) {
|
|
696
|
-
gl.activeTexture(gl.TEXTURE0 + i);
|
|
697
|
-
var unit = state.textureUnits[i];
|
|
698
|
-
unit.texture2D = gl.getParameter(gl.TEXTURE_BINDING_2D);
|
|
699
|
-
unit.textureCubemap = gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
// bindings
|
|
703
|
-
state.arrayBuffer = gl.getParameter(gl.ARRAY_BUFFER_BINDING);
|
|
704
|
-
state.renderbuffer = gl.getParameter(gl.RENDERBUFFER_BINDING);
|
|
705
|
-
state.framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
|
|
706
|
-
|
|
707
|
-
// save attributes
|
|
708
|
-
if (sharedVAOExtension) {
|
|
709
|
-
state.vertexArray = gl.getParameter(sharedVAOExtension.VERTEX_ARRAY_BINDING_OES);
|
|
710
|
-
} else {
|
|
711
|
-
for (var _i3 = 0; _i3 < numAttributes; ++_i3) {
|
|
712
|
-
var attrib = state.attributes[_i3];
|
|
713
|
-
attrib.buffer = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING);
|
|
714
|
-
attrib.enabled = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_ENABLED);
|
|
715
|
-
attrib.size = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_SIZE);
|
|
716
|
-
attrib.stride = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_STRIDE);
|
|
717
|
-
attrib.type = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_TYPE);
|
|
718
|
-
attrib.normalized = gl.getVertexAttrib(_i3, gl.VERTEX_ATTRIB_ARRAY_NORMALIZED);
|
|
719
|
-
attrib.value = gl.getVertexAttrib(_i3, gl.CURRENT_VERTEX_ATTRIB);
|
|
720
|
-
attrib.offset = gl.getVertexAttribOffset(_i3, gl.VERTEX_ATTRIB_ARRAY_POINTER);
|
|
721
|
-
if (sharedInstanceExtension) {
|
|
722
|
-
attrib.divisor = gl.getVertexAttrib(_i3, sharedInstanceExtension.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
state.elementArrayBuffer = gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING);
|
|
726
|
-
}
|
|
727
|
-
state.blend = gl.getParameter(gl.BLEND);
|
|
728
|
-
state.cullFace = gl.getParameter(gl.CULL_FACE);
|
|
729
|
-
state.depthTest = gl.getParameter(gl.DEPTH_TEST);
|
|
730
|
-
state.dither = gl.getParameter(gl.DITHER);
|
|
731
|
-
state.polygonOffsetFill = gl.getParameter(gl.POLYGON_OFFSET_FILL);
|
|
732
|
-
state.sampleAlphaToCoverage = gl.getParameter(gl.SAMPLE_ALPHA_TO_COVERAGE);
|
|
733
|
-
state.sampleCoverage = gl.getParameter(gl.SAMPLE_COVERAGE);
|
|
734
|
-
state.scissorTest = gl.getParameter(gl.SCISSOR_TEST);
|
|
735
|
-
state.stencilTest = gl.getParameter(gl.STENCIL_TEST);
|
|
736
|
-
state.packAlignment = gl.getParameter(gl.PACK_ALIGNMENT);
|
|
737
|
-
state.unpackAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);
|
|
738
|
-
state.unpackColorspaceConversion = gl.getParameter(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL);
|
|
739
|
-
state.unpackFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);
|
|
740
|
-
state.unpackPremultiplyAlpha = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);
|
|
741
|
-
state.currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
742
|
-
state.viewport = gl.getParameter(gl.VIEWPORT);
|
|
743
|
-
state.scissor = gl.getParameter(gl.SCISSOR_BOX);
|
|
744
|
-
state.blendSrcRgb = gl.getParameter(gl.BLEND_SRC_RGB);
|
|
745
|
-
state.blendDstRgb = gl.getParameter(gl.BLEND_DST_RGB);
|
|
746
|
-
state.blendSrcAlpha = gl.getParameter(gl.BLEND_SRC_ALPHA);
|
|
747
|
-
state.blendDstAlpha = gl.getParameter(gl.BLEND_DST_ALPHA);
|
|
748
|
-
state.blendEquationRgb = gl.getParameter(gl.BLEND_EQUATION_RGB);
|
|
749
|
-
state.blendEquationAlpha = gl.getParameter(gl.BLEND_EQUATION_ALPHA);
|
|
750
|
-
state.blendColor = gl.getParameter(gl.BLEND_COLOR);
|
|
751
|
-
state.colorClearValue = gl.getParameter(gl.COLOR_CLEAR_VALUE);
|
|
752
|
-
state.colorMask = gl.getParameter(gl.COLOR_WRITEMASK);
|
|
753
|
-
state.cullFaceMode = gl.getParameter(gl.CULL_FACE_MODE);
|
|
754
|
-
state.depthClearValue = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
|
|
755
|
-
state.depthFunc = gl.getParameter(gl.DEPTH_FUNC);
|
|
756
|
-
state.depthRange = gl.getParameter(gl.DEPTH_RANGE);
|
|
757
|
-
state.depthMask = gl.getParameter(gl.DEPTH_WRITEMASK);
|
|
758
|
-
state.frontFace = gl.getParameter(gl.FRONT_FACE);
|
|
759
|
-
state.generateMipmapHint = gl.getParameter(gl.GENERATE_MIPMAP_HINT);
|
|
760
|
-
state.lineWidth = gl.getParameter(gl.LINE_WIDTH);
|
|
761
|
-
state.polygonOffsetFactor = gl.getParameter(gl.POLYGON_OFFSET_FACTOR);
|
|
762
|
-
state.polygonOffsetUnits = gl.getParameter(gl.POLYGON_OFFSET_UNITS);
|
|
763
|
-
state.sampleCoverageValue = gl.getParameter(gl.SAMPLE_COVERAGE_VALUE);
|
|
764
|
-
state.sampleCoverageUnits = gl.getParameter(gl.SAMPLE_COVERAGE_INVERT);
|
|
765
|
-
state.stencilBackFail = gl.getParameter(gl.STENCIL_BACK_FAIL);
|
|
766
|
-
state.stencilBackFunc = gl.getParameter(gl.STENCIL_BACK_FUNC);
|
|
767
|
-
state.stencilBackPassDepthFail = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_FAIL);
|
|
768
|
-
state.stencilBackPassDepthPass = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_PASS);
|
|
769
|
-
state.stencilBackRef = gl.getParameter(gl.STENCIL_BACK_REF);
|
|
770
|
-
state.stencilBackValueMask = gl.getParameter(gl.STENCIL_BACK_VALUE_MASK);
|
|
771
|
-
state.stencilBackWriteMask = gl.getParameter(gl.STENCIL_BACK_WRITEMASK);
|
|
772
|
-
state.stencilClearValue = gl.getParameter(gl.STENCIL_CLEAR_VALUE);
|
|
773
|
-
state.stencilFail = gl.getParameter(gl.STENCIL_FAIL);
|
|
774
|
-
state.stencilFunc = gl.getParameter(gl.STENCIL_FUNC);
|
|
775
|
-
state.stencilPassDepthFail = gl.getParameter(gl.STENCIL_PASS_DEPTH_FAIL);
|
|
776
|
-
state.stencilPassDepthPass = gl.getParameter(gl.STENCIL_PASS_DEPTH_PASS);
|
|
777
|
-
state.stencilRef = gl.getParameter(gl.STENCIL_REF);
|
|
778
|
-
state.stencilValueMask = gl.getParameter(gl.STENCIL_VALUE_MASK);
|
|
779
|
-
state.stencilWriteMask = gl.getParameter(gl.STENCIL_WRITEMASK);
|
|
780
|
-
for (var fns of extensionSaveRestoreHelpersArray) {
|
|
781
|
-
fns.save(state, vctx);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
function restoreAllState(state, vctx) {
|
|
785
|
-
// restore all WebGL state (current bindings, current texture units,
|
|
786
|
-
// current attributes and/or vertex shade object, current program,
|
|
787
|
-
// current blend, stencil, zbuffer, culling, viewport etc... state
|
|
788
|
-
// save all WebGL state (current bindings, current texture units,
|
|
789
|
-
// current attributes and/or vertex shade object, current program,
|
|
790
|
-
// current blend, stencil, zbuffer, culling, viewport etc... state
|
|
791
|
-
var gl = sharedWebGLContext;
|
|
792
|
-
|
|
793
|
-
// restore texture units
|
|
794
|
-
for (var i = 0; i < numTextureUnits; ++i) {
|
|
795
|
-
gl.activeTexture(gl.TEXTURE0 + i);
|
|
796
|
-
var unit = state.textureUnits[i];
|
|
797
|
-
gl.bindTexture(gl.TEXTURE_2D, unit.texture2D);
|
|
798
|
-
gl.bindTexture(gl.TEXTURE_CUBE_MAP, unit.textureCubemap);
|
|
799
|
-
}
|
|
800
|
-
gl.activeTexture(state.activeTexture);
|
|
801
|
-
|
|
802
|
-
// restore attributes
|
|
803
|
-
if (sharedVAOExtension) {
|
|
804
|
-
sharedVAOExtension.bindVertexArrayOES(state.vertexArray);
|
|
805
|
-
} else {
|
|
806
|
-
for (var _i4 = 0; _i4 < numAttributes; ++_i4) {
|
|
807
|
-
var attrib = state.attributes[_i4];
|
|
808
|
-
if (attrib.enabled) {
|
|
809
|
-
gl.enableVertexAttribArray(_i4);
|
|
810
|
-
} else {
|
|
811
|
-
gl.disableVertexAttribArray(_i4);
|
|
812
|
-
}
|
|
813
|
-
gl.vertexAttrib4fv(_i4, attrib.value);
|
|
814
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);
|
|
815
|
-
gl.vertexAttribPointer(_i4, attrib.size, attrib.type, attrib.normalized, attrib.stride, attrib.offset);
|
|
816
|
-
if (sharedInstanceExtension) {
|
|
817
|
-
sharedInstanceExtension.vertexAttribDivisorANGLE(_i4, attrib.divisor);
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, state.elementArrayBuffer);
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
// bindings'
|
|
824
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, state.arrayBuffer);
|
|
825
|
-
gl.bindRenderbuffer(gl.RENDERBUFFER, state.renderbuffer);
|
|
826
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, state.framebuffer);
|
|
827
|
-
enableDisable(gl, gl.BLEND, state.blend);
|
|
828
|
-
enableDisable(gl, gl.CULL_FACE, state.cullFace);
|
|
829
|
-
enableDisable(gl, gl.DEPTH_TEST, state.depthTest);
|
|
830
|
-
enableDisable(gl, gl.DITHER, state.dither);
|
|
831
|
-
enableDisable(gl, gl.POLYGON_OFFSET_FILL, state.polygonOffsetFill);
|
|
832
|
-
enableDisable(gl, gl.SAMPLE_ALPHA_TO_COVERAGE, state.sampleAlphaToCoverage);
|
|
833
|
-
enableDisable(gl, gl.SAMPLE_COVERAGE, state.sampleCoverage);
|
|
834
|
-
enableDisable(gl, gl.SCISSOR_TEST, state.scissorTest);
|
|
835
|
-
enableDisable(gl, gl.STENCIL_TEST, state.stencilTest);
|
|
836
|
-
gl.pixelStorei(gl.PACK_ALIGNMENT, state.packAlignment);
|
|
837
|
-
gl.pixelStorei(gl.UNPACK_ALIGNMENT, state.unpackAlignment);
|
|
838
|
-
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, state.unpackColorspaceConversion);
|
|
839
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, state.unpackFlipY);
|
|
840
|
-
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, state.unpackPremultiplyAlpha);
|
|
841
|
-
gl.useProgram(state.currentProgram);
|
|
842
|
-
gl.viewport(...state.viewport);
|
|
843
|
-
gl.scissor(...state.scissor);
|
|
844
|
-
gl.blendFuncSeparate(state.blendSrcRgb, state.blendDstRgb, state.blendSrcAlpha, state.blendDstAlpha);
|
|
845
|
-
gl.blendEquationSeparate(state.blendEquationRgb, state.blendEquationAlpha);
|
|
846
|
-
gl.blendColor(...state.blendColor);
|
|
847
|
-
gl.clearColor(...state.colorClearValue);
|
|
848
|
-
gl.colorMask(...state.colorMask);
|
|
849
|
-
gl.cullFace(state.cullFaceMode);
|
|
850
|
-
gl.clearDepth(state.depthClearValue);
|
|
851
|
-
gl.depthFunc(state.depthFunc);
|
|
852
|
-
gl.depthRange(...state.depthRange);
|
|
853
|
-
gl.depthMask(state.depthMask);
|
|
854
|
-
gl.frontFace(state.frontFace);
|
|
855
|
-
gl.hint(gl.GENERATE_MIPMAP_HINT, state.generateMipmapHint);
|
|
856
|
-
gl.lineWidth(state.lineWidth);
|
|
857
|
-
gl.polygonOffset(state.polygonOffsetFactor, state.polygonOffsetUnits);
|
|
858
|
-
gl.sampleCoverage(state.sampleCoverageValue, state.sampleCoverageUnits);
|
|
859
|
-
gl.stencilFuncSeparate(gl.BACK, state.stencilBackFunc, state.stencilBackRef, state.stencilBackValueMask);
|
|
860
|
-
gl.stencilFuncSeparate(gl.FRONT, state.stencilFunc, state.stencilRef, state.stencilValueMask);
|
|
861
|
-
gl.stencilOpSeparate(gl.BACK, state.stencilBackFail, state.stencilBackPassDepthFail, state.stencilBackPassDepthPass);
|
|
862
|
-
gl.stencilOpSeparate(gl.FRONT, state.stencilFail, state.stencilPassDepthFail, state.stencilPassDepthPass);
|
|
863
|
-
gl.stencilMaskSeparate(gl.BACK, state.stencilBackWriteMask);
|
|
864
|
-
gl.stencilMaskSeparate(gl.FRONT, state.stencilWriteMask);
|
|
865
|
-
gl.clearStencil(state.stencilClearValue);
|
|
866
|
-
for (var fns of extensionSaveRestoreHelpersArray) {
|
|
867
|
-
fns.restore(state, vctx);
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
function enableDisable(gl, feature, enable) {
|
|
871
|
-
if (enable) {
|
|
872
|
-
gl.enable(feature);
|
|
873
|
-
} else {
|
|
874
|
-
gl.disable(feature);
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
function renderAllDirtyVirtualCanvases() {
|
|
878
|
-
if (!someContextsNeedRendering) {
|
|
879
|
-
return;
|
|
880
|
-
}
|
|
881
|
-
someContextsNeedRendering = false;
|
|
882
|
-
|
|
883
|
-
// save all current WebGL state on the previous current virtual context
|
|
884
|
-
if (currentVirtualContext) {
|
|
885
|
-
saveAllState(currentVirtualContext._state, currentVirtualContext);
|
|
886
|
-
currentVirtualContext = null;
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
// set the state back to the one for drawing the canvas
|
|
890
|
-
restoreAllState(baseState);
|
|
891
|
-
for (var vctx of canvasToVirtualContextMap.values()) {
|
|
892
|
-
if (!vctx._needComposite) {
|
|
893
|
-
continue;
|
|
894
|
-
}
|
|
895
|
-
vctx._needComposite = false;
|
|
896
|
-
vctx.composite(sharedWebGLContext);
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
window.requestAnimationFrame = function (origFn) {
|
|
900
|
-
return function (callback) {
|
|
901
|
-
return origFn.call(window, time => {
|
|
902
|
-
var result = callback(time);
|
|
903
|
-
renderAllDirtyVirtualCanvases();
|
|
904
|
-
return result;
|
|
905
|
-
});
|
|
906
|
-
};
|
|
907
|
-
}(window.requestAnimationFrame);
|
|
908
|
-
function setup(options) {
|
|
909
|
-
Object.assign(settings, options);
|
|
910
|
-
}
|
|
911
|
-
window.virtualWebGL = {
|
|
912
|
-
setup
|
|
913
|
-
};
|
|
914
|
-
}
|
|
915
|
-
//# sourceMappingURL=virtual-webgl.js.map
|