UNPKG

25.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"TextureSystem.mjs","sources":["../../src/textures/TextureSystem.ts"],"sourcesContent":["import { MIPMAP_MODES, SAMPLER_TYPES, SCALE_MODES, TYPES, WRAP_MODES } from '@pixi/constants';\nimport { extensions, ExtensionType } from '@pixi/extensions';\nimport { removeItems } from '@pixi/utils';\nimport { BaseTexture } from './BaseTexture';\nimport { GLTexture } from './GLTexture';\nimport { mapTypeAndFormatToInternalFormat } from './utils/mapTypeAndFormatToInternalFormat';\n\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { ISystem } from '../system/ISystem';\nimport type { Texture } from './Texture';\n\n/**\n * System plugin to the renderer to manage textures.\n * @memberof PIXI\n */\nexport class TextureSystem implements ISystem\n{\n /** @ignore */\n static extension: ExtensionMetadata = {\n type: ExtensionType.RendererSystem,\n name: 'texture',\n };\n\n /**\n * Bound textures.\n * @readonly\n */\n public boundTextures: BaseTexture[];\n\n /**\n * List of managed textures.\n * @readonly\n */\n public managedTextures: Array<BaseTexture>;\n\n /** Whether glTexture with int/uint sampler type was uploaded. */\n protected hasIntegerTextures: boolean;\n protected CONTEXT_UID: number;\n protected gl: IRenderingContext;\n protected internalFormats: { [type: number]: { [format: number]: number } };\n protected webGLVersion: number;\n\n /**\n * BaseTexture value that shows that we don't know what is bound.\n * @readonly\n */\n protected unknownTexture: BaseTexture;\n\n /**\n * Did someone temper with textures state? We'll overwrite them when we need to unbind something.\n * @private\n */\n protected _unknownBoundTextures: boolean;\n\n /**\n * Current location.\n * @readonly\n */\n currentLocation: number;\n emptyTextures: {[key: number]: GLTexture};\n private renderer: Renderer;\n\n /**\n * @param renderer - The renderer this system works for.\n */\n constructor(renderer: Renderer)\n {\n this.renderer = renderer;\n\n // TODO set to max textures...\n this.boundTextures = [];\n this.currentLocation = -1;\n this.managedTextures = [];\n\n this._unknownBoundTextures = false;\n this.unknownTexture = new BaseTexture();\n\n this.hasIntegerTextures = false;\n }\n\n /** Sets up the renderer context and necessary buffers. */\n contextChange(): void\n {\n const gl = this.gl = this.renderer.gl;\n\n this.CONTEXT_UID = this.renderer.CONTEXT_UID;\n\n this.webGLVersion = this.renderer.context.webGLVersion;\n\n this.internalFormats = mapTypeAndFormatToInternalFormat(gl);\n\n const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n\n this.boundTextures.length = maxTextures;\n\n for (let i = 0; i < maxTextures; i++)\n {\n this.boundTextures[i] = null;\n }\n\n // TODO move this.. to a nice make empty textures class..\n this.emptyTextures = {};\n\n const emptyTexture2D = new GLTexture(gl.createTexture());\n\n gl.bindTexture(gl.TEXTURE_2D, emptyTexture2D.texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));\n\n this.emptyTextures[gl.TEXTURE_2D] = emptyTexture2D;\n this.emptyTextures[gl.TEXTURE_CUBE_MAP] = new GLTexture(gl.createTexture());\n\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.emptyTextures[gl.TEXTURE_CUBE_MAP].texture);\n\n for (let i = 0; i < 6; i++)\n {\n gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\n for (let i = 0; i < this.boundTextures.length; i++)\n {\n this.bind(null, i);\n }\n }\n\n /**\n * Bind a texture to a specific location\n *\n * If you want to unbind something, please use `unbind(texture)` instead of `bind(null, textureLocation)`\n * @param texture - Texture to bind\n * @param [location=0] - Location to bind at\n */\n bind(texture: Texture | BaseTexture, location = 0): void\n {\n const { gl } = this;\n\n texture = texture?.castToBaseTexture();\n\n // cannot bind partial texture\n // TODO: report a warning\n if (texture?.valid && !texture.parentTextureArray)\n {\n texture.touched = this.renderer.textureGC.count;\n\n const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture);\n\n if (this.boundTextures[location] !== texture)\n {\n if (this.currentLocation !== location)\n {\n this.currentLocation = location;\n gl.activeTexture(gl.TEXTURE0 + location);\n }\n\n gl.bindTexture(texture.target, glTexture.texture);\n }\n\n if (glTexture.dirtyId !== texture.dirtyId)\n {\n if (this.currentLocation !== location)\n {\n this.currentLocation = location;\n gl.activeTexture(gl.TEXTURE0 + location);\n }\n this.updateTexture(texture);\n }\n else if (glTexture.dirtyStyleId !== texture.dirtyStyleId)\n {\n this.updateTextureStyle(texture);\n }\n\n this.boundTextures[location] = texture;\n }\n else\n {\n if (this.currentLocation !== location)\n {\n this.currentLocation = location;\n gl.activeTexture(gl.TEXTURE0 + location);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, this.emptyTextures[gl.TEXTURE_2D].texture);\n this.boundTextures[location] = null;\n }\n }\n\n /** Resets texture location and bound textures Actual `bind(null, i)` calls will be performed at next `unbind()` call */\n reset(): void\n {\n this._unknownBoundTextures = true;\n this.hasIntegerTextures = false;\n this.currentLocation = -1;\n\n for (let i = 0; i < this.boundTextures.length; i++)\n {\n this.boundTextures[i] = this.unknownTexture;\n }\n }\n\n /**\n * Unbind a texture.\n * @param texture - Texture to bind\n */\n unbind(texture?: BaseTexture): void\n {\n const { gl, boundTextures } = this;\n\n if (this._unknownBoundTextures)\n {\n this._unknownBoundTextures = false;\n // someone changed webGL state,\n // we have to be sure that our texture does not appear in multi-texture renderer samplers\n for (let i = 0; i < boundTextures.length; i++)\n {\n if (boundTextures[i] === this.unknownTexture)\n {\n this.bind(null, i);\n }\n }\n }\n\n for (let i = 0; i < boundTextures.length; i++)\n {\n if (boundTextures[i] === texture)\n {\n if (this.currentLocation !== i)\n {\n gl.activeTexture(gl.TEXTURE0 + i);\n this.currentLocation = i;\n }\n\n gl.bindTexture(texture.target, this.emptyTextures[texture.target].texture);\n boundTextures[i] = null;\n }\n }\n }\n\n /**\n * Ensures that current boundTextures all have FLOAT sampler type,\n * see {@link PIXI.SAMPLER_TYPES} for explanation.\n * @param maxTextures - number of locations to check\n */\n ensureSamplerType(maxTextures: number): void\n {\n const { boundTextures, hasIntegerTextures, CONTEXT_UID } = this;\n\n if (!hasIntegerTextures)\n {\n return;\n }\n\n for (let i = maxTextures - 1; i >= 0; --i)\n {\n const tex = boundTextures[i];\n\n if (tex)\n {\n const glTexture = tex._glTextures[CONTEXT_UID];\n\n if (glTexture.samplerType !== SAMPLER_TYPES.FLOAT)\n {\n this.renderer.texture.unbind(tex);\n }\n }\n }\n }\n\n /**\n * Initialize a texture\n * @private\n * @param texture - Texture to initialize\n */\n initTexture(texture: BaseTexture): GLTexture\n {\n const glTexture = new GLTexture(this.gl.createTexture());\n\n // guarantee an update..\n glTexture.dirtyId = -1;\n\n texture._glTextures[this.CONTEXT_UID] = glTexture;\n\n this.managedTextures.push(texture);\n texture.on('dispose', this.destroyTexture, this);\n\n return glTexture;\n }\n\n initTextureType(texture: BaseTexture, glTexture: GLTexture): void\n {\n glTexture.internalFormat = this.internalFormats[texture.type]?.[texture.format] ?? texture.format;\n\n if (this.webGLVersion === 2 && texture.type === TYPES.HALF_FLOAT)\n {\n // TYPES.HALF_FLOAT is WebGL1 HALF_FLOAT_OES\n // we have to convert it to WebGL HALF_FLOAT\n glTexture.type = this.gl.HALF_FLOAT;\n }\n else\n {\n glTexture.type = texture.type;\n }\n }\n\n /**\n * Update a texture\n * @private\n * @param {PIXI.BaseTexture} texture - Texture to initialize\n */\n updateTexture(texture: BaseTexture): void\n {\n const glTexture = texture._glTextures[this.CONTEXT_UID];\n\n if (!glTexture)\n {\n return;\n }\n\n const renderer = this.renderer;\n\n this.initTextureType(texture, glTexture);\n\n if (texture.resource?.upload(renderer, texture, glTexture))\n {\n // texture is uploaded, dont do anything!\n if (glTexture.samplerType !== SAMPLER_TYPES.FLOAT)\n {\n this.hasIntegerTextures = true;\n }\n }\n else\n {\n // default, renderTexture-like logic\n const width = texture.realWidth;\n const height = texture.realHeight;\n const gl = renderer.gl;\n\n if (glTexture.width !== width\n || glTexture.height !== height\n || glTexture.dirtyId < 0)\n {\n glTexture.width = width;\n glTexture.height = height;\n\n gl.texImage2D(texture.target, 0,\n glTexture.internalFormat,\n width,\n height,\n 0,\n texture.format,\n glTexture.type,\n null);\n }\n }\n\n // lets only update what changes..\n if (texture.dirtyStyleId !== glTexture.dirtyStyleId)\n {\n this.updateTextureStyle(texture);\n }\n glTexture.dirtyId = texture.dirtyId;\n }\n\n /**\n * Deletes the texture from WebGL\n * @private\n * @param texture - the texture to destroy\n * @param [skipRemove=false] - Whether to skip removing the texture from the TextureManager.\n */\n destroyTexture(texture: BaseTexture | Texture, skipRemove?: boolean): void\n {\n const { gl } = this;\n\n texture = texture.castToBaseTexture();\n\n if (texture._glTextures[this.CONTEXT_UID])\n {\n this.unbind(texture);\n\n gl.deleteTexture(texture._glTextures[this.CONTEXT_UID].texture);\n texture.off('dispose', this.destroyTexture, this);\n\n delete texture._glTextures[this.CONTEXT_UID];\n\n if (!skipRemove)\n {\n const i = this.managedTextures.indexOf(texture);\n\n if (i !== -1)\n {\n removeItems(this.managedTextures, i, 1);\n }\n }\n }\n }\n\n /**\n * Update texture style such as mipmap flag\n * @private\n * @param {PIXI.BaseTexture} texture - Texture to update\n */\n updateTextureStyle(texture: BaseTexture): void\n {\n const glTexture = texture._glTextures[this.CONTEXT_UID];\n\n if (!glTexture)\n {\n return;\n }\n\n if ((texture.mipmap === MIPMAP_MODES.POW2 || this.webGLVersion !== 2) && !texture.isPowerOfTwo)\n {\n glTexture.mipmap = false;\n }\n else\n {\n glTexture.mipmap = texture.mipmap >= 1;\n }\n\n if (this.webGLVersion !== 2 && !texture.isPowerOfTwo)\n {\n glTexture.wrapMode = WRAP_MODES.CLAMP;\n }\n else\n {\n glTexture.wrapMode = texture.wrapMode;\n }\n\n if (texture.resource?.style(this.renderer, texture, glTexture))\n {\n // style is set, dont do anything!\n }\n else\n {\n this.setStyle(texture, glTexture);\n }\n\n glTexture.dirtyStyleId = texture.dirtyStyleId;\n }\n\n /**\n * Set style for texture\n * @private\n * @param texture - Texture to update\n * @param glTexture\n */\n setStyle(texture: BaseTexture, glTexture: GLTexture): void\n {\n const gl = this.gl;\n\n if (glTexture.mipmap && texture.mipmap !== MIPMAP_MODES.ON_MANUAL)\n {\n gl.generateMipmap(texture.target);\n }\n\n gl.texParameteri(texture.target, gl.TEXTURE_WRAP_S, glTexture.wrapMode);\n gl.texParameteri(texture.target, gl.TEXTURE_WRAP_T, glTexture.wrapMode);\n\n if (glTexture.mipmap)\n {\n /* eslint-disable max-len */\n gl.texParameteri(texture.target, gl.TEXTURE_MIN_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR_MIPMAP_LINEAR : gl.NEAREST_MIPMAP_NEAREST);\n /* eslint-disable max-len */\n\n const anisotropicExt = this.renderer.context.extensions.anisotropicFiltering;\n\n if (anisotropicExt && texture.anisotropicLevel > 0 && texture.scaleMode === SCALE_MODES.LINEAR)\n {\n const level = Math.min(texture.anisotropicLevel, gl.getParameter(anisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT));\n\n gl.texParameterf(texture.target, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, level);\n }\n }\n else\n {\n gl.texParameteri(texture.target, gl.TEXTURE_MIN_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST);\n }\n\n gl.texParameteri(texture.target, gl.TEXTURE_MAG_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST);\n }\n\n destroy(): void\n {\n this.renderer = null;\n }\n}\n\nextensions.add(TextureSystem);\n"],"names":[],"mappings":"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"}
\No newline at end of file