{"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 { 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 * @memberof rendering\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    public readonly managedTextures: TextureSource[] = [];\n\n    private readonly _renderer: WebGLRenderer;\n\n    private _glTextures: Record<number, GlTexture> = Object.create(null);\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    // 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    }\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._glTextures = Object.create(null);\n        this._glSamplers = Object.create(null);\n        this._boundSamplers = Object.create(null);\n\n        for (let i = 0; i < 16; i++)\n        {\n            this.bind(Texture.EMPTY, i);\n        }\n    }\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._touched = this._renderer.textureGC.count;\n\n        if (this._boundTextures[location] !== source)\n        {\n            this._boundTextures[location] = source;\n            this._activateLocation(location);\n\n            source = 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        this._glTextures[source.uid] = glTexture;\n\n        if (!this.managedTextures.includes(source))\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('destroy', this.onSourceDestroy, this);\n            source.on('unload', this.onSourceUnload, this);\n            source.on('updateMipmaps', this.onUpdateMipmaps, this);\n\n            this.managedTextures.push(source);\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): void\n    {\n        const glTexture = this._glTextures[source.uid];\n\n        if (!glTexture) return;\n\n        this.unbind(source);\n        this._glTextures[source.uid] = null;\n\n        this._gl.deleteTexture(glTexture.texture);\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        if (this._uploads[source.uploadMethodId])\n        {\n            this._uploads[source.uploadMethodId].upload(source, glTexture, gl, this._renderer.context.webGLVersion);\n        }\n        else\n        {\n            // eslint-disable-next-line max-len\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, source.pixelWidth, source.pixelHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\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    protected onSourceDestroy(source: TextureSource): void\n    {\n        source.off('destroy', this.onSourceDestroy, this);\n        source.off('update', this.onSourceUpdate, this);\n        source.off('resize', this.onSourceUpdate, this);\n        source.off('unload', this.onSourceUnload, this);\n        source.off('styleChange', this.onStyleChange, this);\n        source.off('updateMipmaps', this.onUpdateMipmaps, this);\n\n        this.managedTextures.splice(this.managedTextures.indexOf(source), 1);\n\n        this.onSourceUnload(source);\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        return this._glTextures[source.uid] || 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\n            .slice()\n            .forEach((source) => this.onSourceDestroy(source));\n\n        (this.managedTextures as null) = null;\n\n        (this._renderer as null) = null;\n    }\n}\n\n"],"names":[],"mappings":"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"}