1 line
24 KiB
Plaintext
1 line
24 KiB
Plaintext
{"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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"} |