92 lines
3.2 KiB
JavaScript
92 lines
3.2 KiB
JavaScript
"use strict";
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.createNewWebGLContext = exports.createWebGLContext = void 0;
|
|
const instrument_1 = require("../../instrument");
|
|
const webgl_context_1 = require("./webgl-context");
|
|
const cache = {};
|
|
/**
|
|
* This factory function creates proper WebGLRenderingContext based on
|
|
* the current browsers capabilities
|
|
* The order is from higher/most recent versions to most basic
|
|
*/
|
|
function createWebGLContext(contextId) {
|
|
let context;
|
|
if ((!contextId || contextId === 'webgl2') && 'webgl2' in cache) {
|
|
context = cache.webgl2;
|
|
}
|
|
else if ((!contextId || contextId === 'webgl') && 'webgl' in cache) {
|
|
context = cache.webgl;
|
|
}
|
|
context = context || createNewWebGLContext(contextId);
|
|
contextId = contextId || context.version === 1 ? 'webgl' : 'webgl2';
|
|
const gl = context.gl;
|
|
cache[contextId] = context;
|
|
if (gl.isContextLost()) {
|
|
delete cache[contextId];
|
|
return createWebGLContext(contextId);
|
|
}
|
|
gl.disable(gl.DEPTH_TEST);
|
|
gl.disable(gl.STENCIL_TEST);
|
|
gl.disable(gl.BLEND);
|
|
gl.disable(gl.DITHER);
|
|
gl.disable(gl.POLYGON_OFFSET_FILL);
|
|
gl.disable(gl.SAMPLE_COVERAGE);
|
|
gl.enable(gl.SCISSOR_TEST);
|
|
gl.enable(gl.CULL_FACE);
|
|
gl.cullFace(gl.BACK);
|
|
return context;
|
|
}
|
|
exports.createWebGLContext = createWebGLContext;
|
|
function createNewWebGLContext(contextId) {
|
|
const canvas = createCanvas();
|
|
const contextAttributes = {
|
|
alpha: false,
|
|
depth: false,
|
|
antialias: false,
|
|
stencil: false,
|
|
preserveDrawingBuffer: false,
|
|
premultipliedAlpha: false,
|
|
failIfMajorPerformanceCaveat: false
|
|
};
|
|
let gl;
|
|
const ca = contextAttributes;
|
|
if (!contextId || contextId === 'webgl2') {
|
|
gl = canvas.getContext('webgl2', ca);
|
|
if (gl) {
|
|
try {
|
|
return new webgl_context_1.WebGLContext(gl, 2);
|
|
}
|
|
catch (err) {
|
|
instrument_1.Logger.warning('GlContextFactory', `failed to create WebGLContext using contextId 'webgl2'. Error: ${err}`);
|
|
}
|
|
}
|
|
}
|
|
if (!contextId || contextId === 'webgl') {
|
|
gl = canvas.getContext('webgl', ca) || canvas.getContext('experimental-webgl', ca);
|
|
if (gl) {
|
|
try {
|
|
return new webgl_context_1.WebGLContext(gl, 1);
|
|
}
|
|
catch (err) {
|
|
instrument_1.Logger.warning('GlContextFactory', `failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${err}`);
|
|
}
|
|
}
|
|
}
|
|
throw new Error('WebGL is not supported');
|
|
}
|
|
exports.createNewWebGLContext = createNewWebGLContext;
|
|
function createCanvas() {
|
|
if (typeof document === 'undefined') {
|
|
if (typeof OffscreenCanvas === 'undefined') {
|
|
throw new TypeError('failed to create canvas: OffscreenCanvas is not supported');
|
|
}
|
|
return new OffscreenCanvas(1, 1);
|
|
}
|
|
const canvas = document.createElement('canvas');
|
|
canvas.width = 1;
|
|
canvas.height = 1;
|
|
return canvas;
|
|
}
|
|
//# sourceMappingURL=webgl-context-factory.js.map
|