UNPKG

@pixi/core

Version:
178 lines (177 loc) 7.8 kB
"use strict"; var constants = require("@pixi/constants"), extensions = require("@pixi/extensions"), settings = require("@pixi/settings"); let CONTEXT_UID_COUNTER = 0; class ContextSystem { /** @param renderer - The renderer this System works for. */ constructor(renderer) { this.renderer = renderer, this.webGLVersion = 1, this.extensions = {}, this.supports = { uint32Indices: !1 }, this.handleContextLost = this.handleContextLost.bind(this), this.handleContextRestored = this.handleContextRestored.bind(this); } /** * `true` if the context is lost * @readonly */ get isLost() { return !this.gl || this.gl.isContextLost(); } /** * Handles the context change event. * @param {WebGLRenderingContext} gl - New WebGL context. */ contextChange(gl) { this.gl = gl, this.renderer.gl = gl, this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++; } init(options) { if (options.context) this.initFromContext(options.context); else { const alpha = this.renderer.background.alpha < 1, premultipliedAlpha = options.premultipliedAlpha; this.preserveDrawingBuffer = options.preserveDrawingBuffer, this.useContextAlpha = options.useContextAlpha, this.powerPreference = options.powerPreference, this.initFromOptions({ alpha, premultipliedAlpha, antialias: options.antialias, stencil: !0, preserveDrawingBuffer: options.preserveDrawingBuffer, powerPreference: options.powerPreference }); } } /** * Initializes the context. * @protected * @param {WebGLRenderingContext} gl - WebGL context */ initFromContext(gl) { this.gl = gl, this.validateContext(gl), this.renderer.gl = gl, this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++, this.renderer.runners.contextChange.emit(gl); const view = this.renderer.view; view.addEventListener !== void 0 && (view.addEventListener("webglcontextlost", this.handleContextLost, !1), view.addEventListener("webglcontextrestored", this.handleContextRestored, !1)); } /** * Initialize from context options * @protected * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext * @param {object} options - context attributes */ initFromOptions(options) { const gl = this.createContext(this.renderer.view, options); this.initFromContext(gl); } /** * Helper class to create a WebGL Context * @param canvas - the canvas element that we will get the context from * @param options - An options object that gets passed in to the canvas element containing the * context attributes * @see https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/getContext * @returns {WebGLRenderingContext} the WebGL context */ createContext(canvas, options) { let gl; if (settings.settings.PREFER_ENV >= constants.ENV.WEBGL2 && (gl = canvas.getContext("webgl2", options)), gl) this.webGLVersion = 2; else if (this.webGLVersion = 1, gl = canvas.getContext("webgl", options) || canvas.getContext("experimental-webgl", options), !gl) throw new Error("This browser does not support WebGL. Try using the canvas renderer"); return this.gl = gl, this.getExtensions(), this.gl; } /** Auto-populate the {@link PIXI.ContextSystem.extensions extensions}. */ getExtensions() { const { gl } = this, common = { loseContext: gl.getExtension("WEBGL_lose_context"), anisotropicFiltering: gl.getExtension("EXT_texture_filter_anisotropic"), floatTextureLinear: gl.getExtension("OES_texture_float_linear"), s3tc: gl.getExtension("WEBGL_compressed_texture_s3tc"), s3tc_sRGB: gl.getExtension("WEBGL_compressed_texture_s3tc_srgb"), // eslint-disable-line camelcase etc: gl.getExtension("WEBGL_compressed_texture_etc"), etc1: gl.getExtension("WEBGL_compressed_texture_etc1"), pvrtc: gl.getExtension("WEBGL_compressed_texture_pvrtc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), atc: gl.getExtension("WEBGL_compressed_texture_atc"), astc: gl.getExtension("WEBGL_compressed_texture_astc"), bptc: gl.getExtension("EXT_texture_compression_bptc") }; this.webGLVersion === 1 ? Object.assign(this.extensions, common, { drawBuffers: gl.getExtension("WEBGL_draw_buffers"), depthTexture: gl.getExtension("WEBGL_depth_texture"), vertexArrayObject: gl.getExtension("OES_vertex_array_object") || gl.getExtension("MOZ_OES_vertex_array_object") || gl.getExtension("WEBKIT_OES_vertex_array_object"), uint32ElementIndex: gl.getExtension("OES_element_index_uint"), // Floats and half-floats floatTexture: gl.getExtension("OES_texture_float"), floatTextureLinear: gl.getExtension("OES_texture_float_linear"), textureHalfFloat: gl.getExtension("OES_texture_half_float"), textureHalfFloatLinear: gl.getExtension("OES_texture_half_float_linear") }) : this.webGLVersion === 2 && Object.assign(this.extensions, common, { // Floats and half-floats colorBufferFloat: gl.getExtension("EXT_color_buffer_float") }); } /** * Handles a lost webgl context * @param {WebGLContextEvent} event - The context lost event. */ handleContextLost(event) { event.preventDefault(), setTimeout(() => { this.gl.isContextLost() && this.extensions.loseContext && this.extensions.loseContext.restoreContext(); }, 0); } /** Handles a restored webgl context. */ handleContextRestored() { this.renderer.runners.contextChange.emit(this.gl); } destroy() { const view = this.renderer.view; this.renderer = null, view.removeEventListener !== void 0 && (view.removeEventListener("webglcontextlost", this.handleContextLost), view.removeEventListener("webglcontextrestored", this.handleContextRestored)), this.gl.useProgram(null), this.extensions.loseContext && this.extensions.loseContext.loseContext(); } /** Handle the post-render runner event. */ postrender() { this.renderer.objectRenderer.renderingToScreen && this.gl.flush(); } /** * Validate context. * @param {WebGLRenderingContext} gl - Render context. */ validateContext(gl) { const attributes = gl.getContextAttributes(), isWebGl2 = "WebGL2RenderingContext" in globalThis && gl instanceof globalThis.WebGL2RenderingContext; isWebGl2 && (this.webGLVersion = 2), attributes && !attributes.stencil && console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly"); const hasuint32 = isWebGl2 || !!gl.getExtension("OES_element_index_uint"); this.supports.uint32Indices = hasuint32, hasuint32 || console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly"); } } ContextSystem.defaultOptions = { /** * {@link PIXI.IRendererOptions.context} * @default null * @memberof PIXI.settings.RENDER_OPTIONS */ context: null, /** * {@link PIXI.IRendererOptions.antialias} * @default false * @memberof PIXI.settings.RENDER_OPTIONS */ antialias: !1, /** * {@link PIXI.IRendererOptions.premultipliedAlpha} * @default true * @memberof PIXI.settings.RENDER_OPTIONS */ premultipliedAlpha: !0, /** * {@link PIXI.IRendererOptions.preserveDrawingBuffer} * @default false * @memberof PIXI.settings.RENDER_OPTIONS */ preserveDrawingBuffer: !1, /** * {@link PIXI.IRendererOptions.powerPreference} * @default default * @memberof PIXI.settings.RENDER_OPTIONS */ powerPreference: "default" }, /** @ignore */ ContextSystem.extension = { type: extensions.ExtensionType.RendererSystem, name: "context" }; extensions.extensions.add(ContextSystem); exports.ContextSystem = ContextSystem; //# sourceMappingURL=ContextSystem.js.map