UNPKG

21 kBSource Map (JSON)View Raw
1{"version":3,"file":"ContextSystem.mjs","sources":["../../src/context/ContextSystem.ts"],"sourcesContent":["import { ENV } from '@pixi/constants';\nimport { extensions, ExtensionType } from '@pixi/extensions';\nimport { settings } from '@pixi/settings';\n\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport type { ICanvas } from '@pixi/settings';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { ISystem } from '../system/ISystem';\nimport type { WebGLExtensions } from './WebGLExtensions';\n\nlet CONTEXT_UID_COUNTER = 0;\n\nexport interface ContextSystemOptions\n{\n /**\n * **Deprecated since 7.0.0, use `premultipliedAlpha` and `backgroundAlpha` instead.**\n *\n * Pass-through value for canvas' context attribute `alpha`. This option is for cases where the\n * canvas needs to be opaque, possibly for performance reasons on some older devices.\n * If you want to set transparency, please use `backgroundAlpha`.\n *\n * **WebGL Only:** When set to `'notMultiplied'`, the canvas' context attribute `alpha` will be\n * set to `true` and `premultipliedAlpha` will be to `false`.\n * @deprecated since 7.0.0\n * @memberof PIXI.IRendererOptions\n */\n useContextAlpha?: boolean | 'notMultiplied';\n /**\n * **WebGL Only.** User-provided WebGL rendering context object.\n * @memberof PIXI.IRendererOptions\n */\n context: IRenderingContext | null;\n /**\n * **WebGL Only.** Whether to enable anti-aliasing. This may affect performance.\n * @memberof PIXI.IRendererOptions\n */\n antialias: boolean;\n /**\n * **WebGL Only.** A hint indicating what configuration of GPU is suitable for the WebGL context,\n * can be `'default'`, `'high-performance'` or `'low-power'`.\n * Setting to `'high-performance'` will prioritize rendering performance over power consumption,\n * while setting to `'low-power'` will prioritize power saving over rendering performance.\n * @memberof PIXI.IRendererOptions\n */\n powerPreference: WebGLPowerPreference;\n /**\n * **WebGL Only.** Whether the compositor will assume the drawing buffer contains colors with premultiplied alpha.\n * @memberof PIXI.IRendererOptions\n */\n premultipliedAlpha: boolean;\n /**\n * **WebGL Only.** Whether to enable drawing buffer preservation. If enabled, the drawing buffer will preserve\n * its value until cleared or overwritten. Enable this if you need to call `toDataUrl` on the WebGL context.\n * @memberof PIXI.IRendererOptions\n */\n preserveDrawingBuffer: boolean;\n}\n\nexport interface ISupportDict\n{\n uint32Indices: boolean;\n}\n\n/**\n * System plugin to the renderer to manage the context.\n * @memberof PIXI\n */\nexport class ContextSystem implements ISystem<ContextSystemOptions>\n{\n /** @ignore */\n static defaultOptions: ContextSystemOptions = {\n /**\n * {@link PIXI.IRendererOptions.context}\n * @default null\n * @memberof PIXI.settings.RENDER_OPTIONS\n */\n context: null,\n /**\n * {@link PIXI.IRendererOptions.antialias}\n * @default false\n * @memberof PIXI.settings.RENDER_OPTIONS\n */\n antialias: false,\n /**\n * {@link PIXI.IRendererOptions.premultipliedAlpha}\n * @default true\n * @memberof PIXI.settings.RENDER_OPTIONS\n */\n premultipliedAlpha: true,\n /**\n * {@link PIXI.IRendererOptions.preserveDrawingBuffer}\n * @default false\n * @memberof PIXI.settings.RENDER_OPTIONS\n */\n preserveDrawingBuffer: false,\n /**\n * {@link PIXI.IRendererOptions.powerPreference}\n * @default default\n * @memberof PIXI.settings.RENDER_OPTIONS\n */\n powerPreference: 'default',\n };\n /** @ignore */\n static extension: ExtensionMetadata = {\n type: ExtensionType.RendererSystem,\n name: 'context',\n };\n\n /**\n * Either 1 or 2 to reflect the WebGL version being used.\n * @readonly\n */\n public webGLVersion: number;\n\n /**\n * Features supported by current context.\n * @type {object}\n * @readonly\n * @property {boolean} uint32Indices - Support for 32-bit indices buffer.\n */\n readonly supports: ISupportDict;\n\n preserveDrawingBuffer: boolean;\n powerPreference: WebGLPowerPreference;\n\n /**\n * Pass-thru setting for the canvas' context `alpha` property. This is typically\n * not something you need to fiddle with. If you want transparency, use `backgroundAlpha`.\n * @member {boolean}\n * @deprecated since 7.0.0\n */\n useContextAlpha: boolean | 'notMultiplied';\n\n protected CONTEXT_UID: number;\n protected gl: IRenderingContext;\n\n /**\n * Extensions available.\n * @type {object}\n * @readonly\n * @property {WEBGL_draw_buffers} drawBuffers - WebGL v1 extension\n * @property {WEBGL_depth_texture} depthTexture - WebGL v1 extension\n * @property {OES_texture_float} floatTexture - WebGL v1 extension\n * @property {WEBGL_lose_context} loseContext - WebGL v1 extension\n * @property {OES_vertex_array_object} vertexArrayObject - WebGL v1 extension\n * @property {EXT_texture_filter_anisotropic} anisotropicFiltering - WebGL v1 and v2 extension\n */\n public extensions: WebGLExtensions;\n\n private renderer: Renderer;\n\n /** @param renderer - The renderer this System works for. */\n constructor(renderer: Renderer)\n {\n this.renderer = renderer;\n\n this.webGLVersion = 1;\n this.extensions = {};\n\n this.supports = {\n uint32Indices: false,\n };\n\n // Bind functions\n this.handleContextLost = this.handleContextLost.bind(this);\n this.handleContextRestored = this.handleContextRestored.bind(this);\n }\n\n /**\n * `true` if the context is lost\n * @readonly\n */\n get isLost(): boolean\n {\n return (!this.gl || this.gl.isContextLost());\n }\n\n /**\n * Handles the context change event.\n * @param {WebGLRenderingContext} gl - New WebGL context.\n */\n protected contextChange(gl: IRenderingContext): void\n {\n this.gl = gl;\n this.renderer.gl = gl;\n this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++;\n }\n\n init(options: ContextSystemOptions): void\n {\n /*\n * The options passed in to create a new WebGL context.\n */\n if (options.context)\n {\n this.initFromContext(options.context);\n }\n else\n {\n const alpha = this.renderer.background.alpha < 1;\n const premultipliedAlpha = options.premultipliedAlpha;\n\n this.preserveDrawingBuffer = options.preserveDrawingBuffer;\n this.useContextAlpha = options.useContextAlpha;\n this.powerPreference = options.powerPreference;\n\n this.initFromOptions({\n alpha,\n premultipliedAlpha,\n antialias: options.antialias,\n stencil: true,\n preserveDrawingBuffer: options.preserveDrawingBuffer,\n powerPreference: options.powerPreference,\n });\n }\n }\n\n /**\n * Initializes the context.\n * @protected\n * @param {WebGLRenderingContext} gl - WebGL context\n */\n initFromContext(gl: IRenderingContext): void\n {\n this.gl = gl;\n this.validateContext(gl);\n this.renderer.gl = gl;\n this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++;\n this.renderer.runners.contextChange.emit(gl);\n\n const view = this.renderer.view;\n\n if (view.addEventListener !== undefined)\n {\n view.addEventListener('webglcontextlost', this.handleContextLost, false);\n view.addEventListener('webglcontextrestored', this.handleContextRestored, false);\n }\n }\n\n /**\n * Initialize from context options\n * @protected\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\n * @param {object} options - context attributes\n */\n initFromOptions(options: WebGLContextAttributes): void\n {\n const gl = this.createContext(this.renderer.view, options);\n\n this.initFromContext(gl);\n }\n\n /**\n * Helper class to create a WebGL Context\n * @param canvas - the canvas element that we will get the context from\n * @param options - An options object that gets passed in to the canvas element containing the\n * context attributes\n * @see https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/getContext\n * @returns {WebGLRenderingContext} the WebGL context\n */\n createContext(canvas: ICanvas, options: WebGLContextAttributes): IRenderingContext\n {\n let gl;\n\n if (settings.PREFER_ENV >= ENV.WEBGL2)\n {\n gl = canvas.getContext('webgl2', options);\n }\n\n if (gl)\n {\n this.webGLVersion = 2;\n }\n else\n {\n this.webGLVersion = 1;\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n if (!gl)\n {\n // fail, not able to get a context\n throw new Error('This browser does not support WebGL. Try using the canvas renderer');\n }\n }\n\n this.gl = gl as IRenderingContext;\n\n this.getExtensions();\n\n return this.gl;\n }\n\n /** Auto-populate the {@link PIXI.ContextSystem.extensions extensions}. */\n protected getExtensions(): void\n {\n // time to set up default extensions that Pixi uses.\n const { gl } = this;\n\n const common = {\n loseContext: gl.getExtension('WEBGL_lose_context'),\n anisotropicFiltering: gl.getExtension('EXT_texture_filter_anisotropic'),\n floatTextureLinear: gl.getExtension('OES_texture_float_linear'),\n\n s3tc: gl.getExtension('WEBGL_compressed_texture_s3tc'),\n s3tc_sRGB: gl.getExtension('WEBGL_compressed_texture_s3tc_srgb'), // eslint-disable-line camelcase\n etc: gl.getExtension('WEBGL_compressed_texture_etc'),\n etc1: gl.getExtension('WEBGL_compressed_texture_etc1'),\n pvrtc: gl.getExtension('WEBGL_compressed_texture_pvrtc')\n || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\n atc: gl.getExtension('WEBGL_compressed_texture_atc'),\n astc: gl.getExtension('WEBGL_compressed_texture_astc')\n };\n\n if (this.webGLVersion === 1)\n {\n Object.assign(this.extensions, common, {\n drawBuffers: gl.getExtension('WEBGL_draw_buffers'),\n depthTexture: gl.getExtension('WEBGL_depth_texture'),\n vertexArrayObject: gl.getExtension('OES_vertex_array_object')\n || gl.getExtension('MOZ_OES_vertex_array_object')\n || gl.getExtension('WEBKIT_OES_vertex_array_object'),\n uint32ElementIndex: gl.getExtension('OES_element_index_uint'),\n // Floats and half-floats\n floatTexture: gl.getExtension('OES_texture_float'),\n floatTextureLinear: gl.getExtension('OES_texture_float_linear'),\n textureHalfFloat: gl.getExtension('OES_texture_half_float'),\n textureHalfFloatLinear: gl.getExtension('OES_texture_half_float_linear'),\n });\n }\n else if (this.webGLVersion === 2)\n {\n Object.assign(this.extensions, common, {\n // Floats and half-floats\n colorBufferFloat: gl.getExtension('EXT_color_buffer_float')\n });\n }\n }\n\n /**\n * Handles a lost webgl context\n * @param {WebGLContextEvent} event - The context lost event.\n */\n protected handleContextLost(event: WebGLContextEvent): void\n {\n // Prevent default to be able to restore the context\n event.preventDefault();\n\n // Restore the context after this event has exited\n setTimeout(() =>\n {\n if (this.gl.isContextLost() && this.extensions.loseContext)\n {\n this.extensions.loseContext.restoreContext();\n }\n }, 0);\n }\n\n /** Handles a restored webgl context. */\n protected handleContextRestored(): void\n {\n this.renderer.runners.contextChange.emit(this.gl);\n }\n\n destroy(): void\n {\n const view = this.renderer.view;\n\n this.renderer = null;\n\n // remove listeners\n if (view.removeEventListener !== undefined)\n {\n view.removeEventListener('webglcontextlost', this.handleContextLost);\n view.removeEventListener('webglcontextrestored', this.handleContextRestored);\n }\n\n this.gl.useProgram(null);\n\n if (this.extensions.loseContext)\n {\n this.extensions.loseContext.loseContext();\n }\n }\n\n /** Handle the post-render runner event. */\n protected postrender(): void\n {\n if (this.renderer.objectRenderer.renderingToScreen)\n {\n this.gl.flush();\n }\n }\n\n /**\n * Validate context.\n * @param {WebGLRenderingContext} gl - Render context.\n */\n protected validateContext(gl: IRenderingContext): void\n {\n const attributes = gl.getContextAttributes();\n\n const isWebGl2 = 'WebGL2RenderingContext' in globalThis && gl instanceof globalThis.WebGL2RenderingContext;\n\n if (isWebGl2)\n {\n this.webGLVersion = 2;\n }\n\n // this is going to be fairly simple for now.. but at least we have room to grow!\n if (attributes && !attributes.stencil)\n {\n /* eslint-disable max-len, no-console */\n console.warn('Provided WebGL context does not have a stencil buffer, masks may not render correctly');\n /* eslint-enable max-len, no-console */\n }\n\n const hasuint32 = isWebGl2 || !!(gl as WebGLRenderingContext).getExtension('OES_element_index_uint');\n\n this.supports.uint32Indices = hasuint32;\n\n if (!hasuint32)\n {\n /* eslint-disable max-len, no-console */\n console.warn('Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly');\n /* eslint-enable max-len, no-console */\n }\n }\n}\n\nextensions.add(ContextSystem);\n"],"names":[],"mappings":"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"}
\No newline at end of file