UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 26.6 kB
{"version":3,"file":"GlTextureSystem.mjs","sources":["../../../../../src/rendering/renderers/gl/texture/GlTextureSystem.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { ExtensionType } from '../../../../extensions/Extensions';\nimport { GCManagedHash } from '../../../../utils/data/GCManagedHash';\nimport { Texture } from '../../shared/texture/Texture';\nimport { GlTexture } from './GlTexture';\nimport { glUploadBufferImageResource } from './uploaders/glUploadBufferImageResource';\nimport { glUploadCompressedTextureResource } from './uploaders/glUploadCompressedTextureResource';\nimport { glUploadImageResource } from './uploaders/glUploadImageResource';\nimport { glUploadVideoResource } from './uploaders/glUploadVideoResource';\nimport { applyStyleParams } from './utils/applyStyleParams';\nimport { mapFormatToGlFormat } from './utils/mapFormatToGlFormat';\nimport { mapFormatToGlInternalFormat } from './utils/mapFormatToGlInternalFormat';\nimport { mapFormatToGlType } from './utils/mapFormatToGlType';\nimport { unpremultiplyAlpha } from './utils/unpremultiplyAlpha';\n\nimport type { ICanvas } from '../../../../environment/canvas/ICanvas';\nimport type { System } from '../../shared/system/System';\nimport type { CanvasGenerator, GetPixelsOutput } from '../../shared/texture/GenerateCanvas';\nimport type { TextureSource } from '../../shared/texture/sources/TextureSource';\nimport type { BindableTexture } from '../../shared/texture/Texture';\nimport type { TextureStyle } from '../../shared/texture/TextureStyle';\nimport type { GlRenderingContext } from '../context/GlRenderingContext';\nimport type { WebGLRenderer } from '../WebGLRenderer';\nimport type { GLTextureUploader } from './uploaders/GLTextureUploader';\n\nconst BYTES_PER_PIXEL = 4;\n\n/**\n * The system for managing textures in WebGL.\n * @category rendering\n * @advanced\n */\nexport class GlTextureSystem implements System, CanvasGenerator\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ],\n name: 'texture',\n } as const;\n\n private readonly _renderer: WebGLRenderer;\n private readonly _managedTextures: GCManagedHash<TextureSource>;\n /**\n * @deprecated since 8.15.0\n */\n public get managedTextures(): Readonly<TextureSource[]> { return Object.values(this._managedTextures.items); }\n\n private _glSamplers: Record<string, WebGLSampler> = Object.create(null);\n\n private _boundTextures: TextureSource[] = [];\n private _activeTextureLocation = -1;\n\n private _boundSamplers: Record<number, WebGLSampler> = Object.create(null);\n\n private readonly _uploads: Record<string, GLTextureUploader> = {\n image: glUploadImageResource,\n buffer: glUploadBufferImageResource,\n video: glUploadVideoResource,\n compressed: glUploadCompressedTextureResource,\n };\n\n private _gl: GlRenderingContext;\n private _mapFormatToInternalFormat: Record<string, number>;\n private _mapFormatToType: Record<string, number>;\n private _mapFormatToFormat: Record<string, number>;\n\n private _premultiplyAlpha = false;\n\n // TODO - separate samplers will be a cool thing to add, but not right now!\n private readonly _useSeparateSamplers = false;\n\n constructor(renderer: WebGLRenderer)\n {\n this._renderer = renderer;\n this._managedTextures = new GCManagedHash({\n renderer,\n type: 'resource',\n onUnload: this.onSourceUnload.bind(this),\n name: 'glTexture'\n });\n }\n\n protected contextChange(gl: GlRenderingContext): void\n {\n this._gl = gl;\n\n if (!this._mapFormatToInternalFormat)\n {\n this._mapFormatToInternalFormat = mapFormatToGlInternalFormat(gl, this._renderer.context.extensions);\n\n this._mapFormatToType = mapFormatToGlType(gl);\n this._mapFormatToFormat = mapFormatToGlFormat(gl);\n }\n\n this._managedTextures.removeAll(true);\n\n this._glSamplers = Object.create(null);\n this._boundSamplers = Object.create(null);\n this._premultiplyAlpha = false;\n\n for (let i = 0; i < 16; i++)\n {\n this.bind(Texture.EMPTY, i);\n }\n }\n\n /**\n * Initializes a texture source, if it has already been initialized nothing will happen.\n * @param source - The texture source to initialize.\n * @returns The initialized texture source.\n */\n public initSource(source: TextureSource)\n {\n this.bind(source);\n }\n\n public bind(texture: BindableTexture, location = 0)\n {\n const source = texture.source;\n\n if (texture)\n {\n this.bindSource(source, location);\n\n if (this._useSeparateSamplers)\n {\n this._bindSampler(source.style, location);\n }\n }\n else\n {\n this.bindSource(null, location);\n\n if (this._useSeparateSamplers)\n {\n this._bindSampler(null, location);\n }\n }\n }\n\n public bindSource(source: TextureSource, location = 0): void\n {\n const gl = this._gl;\n\n source._gcLastUsed = this._renderer.gc.now;\n\n if (this._boundTextures[location] !== source)\n {\n this._boundTextures[location] = source;\n this._activateLocation(location);\n\n source ||= Texture.EMPTY.source;\n\n // bind texture and source!\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, glTexture.texture);\n }\n }\n\n private _bindSampler(style: TextureStyle, location = 0): void\n {\n const gl = this._gl;\n\n if (!style)\n {\n this._boundSamplers[location] = null;\n gl.bindSampler(location, null);\n\n return;\n }\n\n const sampler = this._getGlSampler(style);\n\n if (this._boundSamplers[location] !== sampler)\n {\n this._boundSamplers[location] = sampler;\n gl.bindSampler(location, sampler);\n }\n }\n\n public unbind(texture: BindableTexture): void\n {\n const source = texture.source;\n const boundTextures = this._boundTextures;\n const gl = this._gl;\n\n for (let i = 0; i < boundTextures.length; i++)\n {\n if (boundTextures[i] === source)\n {\n this._activateLocation(i);\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, null);\n boundTextures[i] = null;\n }\n }\n }\n\n private _activateLocation(location: number): void\n {\n if (this._activeTextureLocation !== location)\n {\n this._activeTextureLocation = location;\n this._gl.activeTexture(this._gl.TEXTURE0 + location);\n }\n }\n\n private _initSource(source: TextureSource): GlTexture\n {\n const gl = this._gl;\n\n const glTexture = new GlTexture(gl.createTexture());\n\n glTexture.type = this._mapFormatToType[source.format];\n glTexture.internalFormat = this._mapFormatToInternalFormat[source.format];\n glTexture.format = this._mapFormatToFormat[source.format];\n\n if (source.autoGenerateMipmaps && (this._renderer.context.supports.nonPowOf2mipmaps || source.isPowerOfTwo))\n {\n const biggestDimension = Math.max(source.width, source.height);\n\n source.mipLevelCount = Math.floor(Math.log2(biggestDimension)) + 1;\n }\n\n source._gpuData[this._renderer.uid] = glTexture;\n\n const added = this._managedTextures.add(source);\n\n if (added)\n {\n source.on('update', this.onSourceUpdate, this);\n source.on('resize', this.onSourceUpdate, this);\n source.on('styleChange', this.onStyleChange, this);\n source.on('updateMipmaps', this.onUpdateMipmaps, this);\n }\n\n this.onSourceUpdate(source);\n this.updateStyle(source, false);\n\n return glTexture;\n }\n\n protected onStyleChange(source: TextureSource): void\n {\n this.updateStyle(source, false);\n }\n\n protected updateStyle(source: TextureSource, firstCreation: boolean): void\n {\n const gl = this._gl;\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n\n this._boundTextures[this._activeTextureLocation] = source;\n\n applyStyleParams(\n source.style,\n gl,\n source.mipLevelCount > 1,\n this._renderer.context.extensions.anisotropicFiltering,\n 'texParameteri',\n gl.TEXTURE_2D,\n // will force a clamp to edge if the texture is not a power of two\n !this._renderer.context.supports.nonPowOf2wrapping && !source.isPowerOfTwo,\n firstCreation,\n );\n }\n\n protected onSourceUnload(source: TextureSource, contextLost = false): void\n {\n const glTexture = source._gpuData[this._renderer.uid] as GlTexture;\n\n if (!glTexture) return;\n\n if (!contextLost)\n {\n this.unbind(source);\n this._gl.deleteTexture(glTexture.texture);\n }\n source.off('update', this.onSourceUpdate, this);\n source.off('resize', this.onSourceUpdate, this);\n source.off('styleChange', this.onStyleChange, this);\n source.off('updateMipmaps', this.onUpdateMipmaps, this);\n }\n\n protected onSourceUpdate(source: TextureSource): void\n {\n const gl = this._gl;\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n\n this._boundTextures[this._activeTextureLocation] = source;\n\n const premultipliedAlpha = source.alphaMode === 'premultiply-alpha-on-upload';\n\n if (this._premultiplyAlpha !== premultipliedAlpha)\n {\n this._premultiplyAlpha = premultipliedAlpha;\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha);\n }\n\n if (this._uploads[source.uploadMethodId])\n {\n this._uploads[source.uploadMethodId].upload(source, glTexture, gl, this._renderer.context.webGLVersion);\n }\n else\n {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n glTexture.internalFormat,\n source.pixelWidth,\n source.pixelHeight,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n }\n\n if (source.autoGenerateMipmaps && source.mipLevelCount > 1)\n {\n this.onUpdateMipmaps(source, false);\n }\n }\n\n protected onUpdateMipmaps(source: TextureSource, bind = true): void\n {\n if (bind) this.bindSource(source, 0);\n\n const glTexture = this.getGlSource(source);\n\n this._gl.generateMipmap(glTexture.target);\n }\n\n private _initSampler(style: TextureStyle): WebGLSampler\n {\n const gl = this._gl;\n\n const glSampler = this._gl.createSampler();\n\n this._glSamplers[style._resourceId] = glSampler;\n\n applyStyleParams(\n style,\n gl,\n this._boundTextures[this._activeTextureLocation].mipLevelCount > 1,\n this._renderer.context.extensions.anisotropicFiltering,\n 'samplerParameteri',\n glSampler,\n false,\n true,\n );\n\n return this._glSamplers[style._resourceId];\n }\n\n private _getGlSampler(sampler: TextureStyle): WebGLSampler\n {\n return this._glSamplers[sampler._resourceId] || this._initSampler(sampler);\n }\n\n public getGlSource(source: TextureSource): GlTexture\n {\n source._gcLastUsed = this._renderer.gc.now;\n\n return source._gpuData[this._renderer.uid] as GlTexture || this._initSource(source);\n }\n\n public generateCanvas(texture: Texture): ICanvas\n {\n const { pixels, width, height } = this.getPixels(texture);\n\n const canvas = DOMAdapter.get().createCanvas();\n\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n\n if (ctx)\n {\n const imageData = ctx.createImageData(width, height);\n\n imageData.data.set(pixels);\n ctx.putImageData(imageData, 0, 0);\n }\n\n return canvas;\n }\n\n public getPixels(texture: Texture): GetPixelsOutput\n {\n const resolution = texture.source.resolution;\n const frame = texture.frame;\n\n const width = Math.max(Math.round(frame.width * resolution), 1);\n const height = Math.max(Math.round(frame.height * resolution), 1);\n const pixels = new Uint8Array(BYTES_PER_PIXEL * width * height);\n\n const renderer = this._renderer;\n\n const renderTarget = renderer.renderTarget.getRenderTarget(texture);\n const glRenterTarget = renderer.renderTarget.getGpuRenderTarget(renderTarget);\n\n const gl = renderer.gl;\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, glRenterTarget.resolveTargetFramebuffer);\n\n gl.readPixels(\n Math.round(frame.x * resolution),\n Math.round(frame.y * resolution),\n width,\n height,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n pixels\n );\n\n // if (texture.source.premultiplyAlpha > 0)\n // TODO - premultiplied alpha does not exist right now, need to add that back in!\n // eslint-disable-next-line no-constant-condition\n if (false)\n {\n unpremultiplyAlpha(pixels);\n }\n\n return { pixels: new Uint8ClampedArray(pixels.buffer), width, height };\n }\n\n public destroy(): void\n {\n // we copy the array as the array with a slice as onSourceDestroy\n // will remove the source from the real managedTextures array\n this._managedTextures.destroy();\n this._glSamplers = null;\n this._boundTextures = null;\n this._boundSamplers = null;\n this._mapFormatToInternalFormat = null;\n this._mapFormatToType = null;\n this._mapFormatToFormat = null;\n (this._uploads as null) = null;\n (this._renderer as null) = null;\n }\n\n public resetState(): void\n {\n this._activeTextureLocation = -1;\n this._boundTextures.fill(Texture.EMPTY.source);\n this._boundSamplers = Object.create(null);\n\n const gl = this._gl;\n\n this._premultiplyAlpha = false;\n\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this._premultiplyAlpha);\n }\n}\n\n"],"names":[],"mappings":"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"}