shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTextureSystem = function(global, require, module, exports) { var adapter = require("module$node_modules$pixi_DOT_js$lib$environment$adapter"); global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions"); var GCManagedHash = require("module$node_modules$pixi_DOT_js$lib$utils$data$GCManagedHash"), Texture = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$Texture"), GlTexture = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTexture"), glUploadBufferImageResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$uploaders$glUploadBufferImageResource"), glUploadCompressedTextureResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$uploaders$glUploadCompressedTextureResource"), glUploadCubeTextureResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$uploaders$glUploadCubeTextureResource"), glUploadImageResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$uploaders$glUploadImageResource"), glUploadVideoResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$uploaders$glUploadVideoResource"), applyStyleParams = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$applyStyleParams"), mapFormatToGlFormat = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$mapFormatToGlFormat"), mapFormatToGlInternalFormat = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$mapFormatToGlInternalFormat"), mapFormatToGlType = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$mapFormatToGlType"), mapViewDimensionToGlTarget = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$mapViewDimensionToGlTarget"); require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$utils$unpremultiplyAlpha"); "use strict"; const node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTextureSystem$classdecl$var27 = class { constructor(renderer) { this._glSamplers = Object.create(null); this._boundTextures = []; this._activeTextureLocation = -1; this._boundSamplers = Object.create(null); this._useSeparateSamplers = this._premultiplyAlpha = !1; this._renderer = renderer; this._managedTextures = new GCManagedHash.GCManagedHash({renderer, type:"resource", onUnload:this.onSourceUnload.bind(this), name:"glTexture"}); renderer = {image:glUploadImageResource.glUploadImageResource, buffer:glUploadBufferImageResource.glUploadBufferImageResource, video:glUploadVideoResource.glUploadVideoResource, compressed:glUploadCompressedTextureResource.glUploadCompressedTextureResource, ...node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTextureSystem$classdecl$var27.uploadExtensions}; this._uploads = {...renderer, cube:glUploadCubeTextureResource.createGlUploadCubeTextureResource(renderer)}; } get managedTextures() { return Object.values(this._managedTextures.items); } contextChange(gl) { this._gl = gl; this._mapFormatToInternalFormat || (this._mapFormatToInternalFormat = mapFormatToGlInternalFormat.mapFormatToGlInternalFormat(gl, this._renderer.context.extensions), this._mapFormatToType = mapFormatToGlType.mapFormatToGlType(gl), this._mapFormatToFormat = mapFormatToGlFormat.mapFormatToGlFormat(gl), this._mapViewDimensionToGlTarget = mapViewDimensionToGlTarget.mapViewDimensionToGlTarget(gl)); this._managedTextures.removeAll(!0); this._glSamplers = Object.create(null); this._boundSamplers = Object.create(null); this._premultiplyAlpha = !1; for (gl = 0; 16 > gl; gl++) { this.bind(Texture.Texture.EMPTY, gl); } } initSource(source) { this.bind(source); } bind(texture, location = 0) { const source = texture.source; texture ? (this.bindSource(source, location), this._useSeparateSamplers && this._bindSampler(source.style, location)) : (this.bindSource(null, location), this._useSeparateSamplers && this._bindSampler(null, location)); } bindSource(source, location = 0) { const gl = this._gl; source._gcLastUsed = this._renderer.gc.now; this._boundTextures[location] !== source && (this._boundTextures[location] = source, this._activateLocation(location), source || (source = Texture.Texture.EMPTY.source), source = this.getGlSource(source), gl.bindTexture(source.target, source.texture)); } _bindSampler(style, location = 0) { const gl = this._gl; style ? (style = this._getGlSampler(style), this._boundSamplers[location] !== style && (this._boundSamplers[location] = style, gl.bindSampler(location, style))) : (this._boundSamplers[location] = null, gl.bindSampler(location, null)); } unbind(texture) { texture = texture.source; const boundTextures = this._boundTextures, gl = this._gl; for (let i = 0; i < boundTextures.length; i++) { if (boundTextures[i] === texture) { this._activateLocation(i); const glTexture = this.getGlSource(texture); gl.bindTexture(glTexture.target, null); boundTextures[i] = null; } } } _activateLocation(location) { this._activeTextureLocation !== location && (this._activeTextureLocation = location, this._gl.activeTexture(this._gl.TEXTURE0 + location)); } _initSource(source) { const gl = this._gl, glTexture = new GlTexture.GlTexture(gl.createTexture()); glTexture.type = this._mapFormatToType[source.format]; glTexture.internalFormat = this._mapFormatToInternalFormat[source.format]; glTexture.format = this._mapFormatToFormat[source.format]; glTexture.target = this._mapViewDimensionToGlTarget[source.viewDimension]; if (null === glTexture.target) { throw Error(`Unsupported view dimension: ${source.viewDimension} with this webgl version: ${this._renderer.context.webGLVersion}`); } "cube" === source.uploadMethodId && (glTexture.target = gl.TEXTURE_CUBE_MAP); source.autoGenerateMipmaps && (this._renderer.context.supports.nonPowOf2mipmaps || source.isPowerOfTwo) && (source.mipLevelCount = Math.floor(Math.log2(Math.max(source.width, source.height))) + 1); source._gpuData[this._renderer.uid] = glTexture; this._managedTextures.add(source) && (source.on("update", this.onSourceUpdate, this), source.on("resize", this.onSourceUpdate, this), source.on("styleChange", this.onStyleChange, this), source.on("updateMipmaps", this.onUpdateMipmaps, this)); this.onSourceUpdate(source); this.updateStyle(source, !1); return glTexture; } onStyleChange(source) { this.updateStyle(source, !1); } updateStyle(source, firstCreation) { const gl = this._gl, glTexture = this.getGlSource(source); gl.bindTexture(glTexture.target, glTexture.texture); this._boundTextures[this._activeTextureLocation] = source; applyStyleParams.applyStyleParams(source.style, gl, 1 < source.mipLevelCount, this._renderer.context.extensions.anisotropicFiltering, "texParameteri", glTexture.target, !this._renderer.context.supports.nonPowOf2wrapping && !source.isPowerOfTwo, firstCreation); } onSourceUnload(source, contextLost = !1) { const glTexture = source._gpuData[this._renderer.uid]; glTexture && (contextLost || (this.unbind(source), this._gl.deleteTexture(glTexture.texture)), source.off("update", this.onSourceUpdate, this), source.off("resize", this.onSourceUpdate, this), source.off("styleChange", this.onStyleChange, this), source.off("updateMipmaps", this.onUpdateMipmaps, this)); } onSourceUpdate(source) { const gl = this._gl, glTexture = this.getGlSource(source); gl.bindTexture(glTexture.target, glTexture.texture); this._boundTextures[this._activeTextureLocation] = source; const premultipliedAlpha = "premultiply-alpha-on-upload" === source.alphaMode; this._premultiplyAlpha !== premultipliedAlpha && (this._premultiplyAlpha = premultipliedAlpha, gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha)); if (this._uploads[source.uploadMethodId]) { this._uploads[source.uploadMethodId].upload(source, glTexture, gl, this._renderer.context.webGLVersion); } else if (glTexture.target === gl.TEXTURE_2D) { this._initEmptyTexture2D(glTexture, source); } else if (glTexture.target === gl.TEXTURE_2D_ARRAY) { this._initEmptyTexture2DArray(glTexture, source); } else if (glTexture.target === gl.TEXTURE_CUBE_MAP) { this._initEmptyTextureCube(glTexture, source); } else { throw Error("[GlTextureSystem] Unsupported texture target for empty allocation."); } this._applyMipRange(glTexture, source); if (source.autoGenerateMipmaps && 1 < source.mipLevelCount) { this.onUpdateMipmaps(source, !1); } } onUpdateMipmaps(source, bind = !0) { bind && this.bindSource(source, 0); source = this.getGlSource(source); this._gl.generateMipmap(source.target); } _initEmptyTexture2D(glTexture, source) { const gl = this._gl; gl.texImage2D(gl.TEXTURE_2D, 0, glTexture.internalFormat, source.pixelWidth, source.pixelHeight, 0, glTexture.format, glTexture.type, null); let w = Math.max(source.pixelWidth >> 1, 1), h = Math.max(source.pixelHeight >> 1, 1); for (let level = 1; level < source.mipLevelCount; level++) { gl.texImage2D(gl.TEXTURE_2D, level, glTexture.internalFormat, w, h, 0, glTexture.format, glTexture.type, null), w = Math.max(w >> 1, 1), h = Math.max(h >> 1, 1); } } _initEmptyTexture2DArray(glTexture, source) { if (2 !== this._renderer.context.webGLVersion) { throw Error("[GlTextureSystem] TEXTURE_2D_ARRAY requires WebGL2."); } const gl2 = this._gl, depth = Math.max(source.arrayLayerCount | 0, 1); gl2.texImage3D(gl2.TEXTURE_2D_ARRAY, 0, glTexture.internalFormat, source.pixelWidth, source.pixelHeight, depth, 0, glTexture.format, glTexture.type, null); let w = Math.max(source.pixelWidth >> 1, 1), h = Math.max(source.pixelHeight >> 1, 1); for (let level = 1; level < source.mipLevelCount; level++) { gl2.texImage3D(gl2.TEXTURE_2D_ARRAY, level, glTexture.internalFormat, w, h, depth, 0, glTexture.format, glTexture.type, null), w = Math.max(w >> 1, 1), h = Math.max(h >> 1, 1); } } _initEmptyTextureCube(glTexture, source) { const gl = this._gl; for (var face$jscomp$0 = 0; 6 > face$jscomp$0; face$jscomp$0++) { gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face$jscomp$0, 0, glTexture.internalFormat, source.pixelWidth, source.pixelHeight, 0, glTexture.format, glTexture.type, null); } face$jscomp$0 = Math.max(source.pixelWidth >> 1, 1); let h = Math.max(source.pixelHeight >> 1, 1); for (let level = 1; level < source.mipLevelCount; level++) { for (let face = 0; 6 > face; face++) { gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, level, glTexture.internalFormat, face$jscomp$0, h, 0, glTexture.format, glTexture.type, null); } face$jscomp$0 = Math.max(face$jscomp$0 >> 1, 1); h = Math.max(h >> 1, 1); } } _applyMipRange(glTexture, source) { if (2 === this._renderer.context.webGLVersion && !(1 >= source.mipLevelCount)) { var gl = this._gl; source = Math.max((source.mipLevelCount | 0) - 1, 0); gl.texParameteri(glTexture.target, gl.TEXTURE_BASE_LEVEL, 0); gl.texParameteri(glTexture.target, gl.TEXTURE_MAX_LEVEL, source); } } _initSampler(style) { const gl = this._gl, glSampler = this._gl.createSampler(); this._glSamplers[style._resourceId] = glSampler; applyStyleParams.applyStyleParams(style, gl, 1 < this._boundTextures[this._activeTextureLocation].mipLevelCount, this._renderer.context.extensions.anisotropicFiltering, "samplerParameteri", glSampler, !1, !0); return this._glSamplers[style._resourceId]; } _getGlSampler(sampler) { return this._glSamplers[sampler._resourceId] || this._initSampler(sampler); } getGlSource(source) { source._gcLastUsed = this._renderer.gc.now; return source._gpuData[this._renderer.uid] || this._initSource(source); } generateCanvas(texture) { const {pixels, width, height} = this.getPixels(texture); texture = adapter.DOMAdapter.get().createCanvas(); texture.width = width; texture.height = height; const ctx = texture.getContext("2d"); if (ctx) { const imageData = ctx.createImageData(width, height); imageData.data.set(pixels); ctx.putImageData(imageData, 0, 0); } return texture; } getPixels(texture) { const resolution = texture.source.resolution, frame = texture.frame, width = Math.max(Math.round(frame.width * resolution), 1), height = Math.max(Math.round(frame.height * resolution), 1), pixels = new Uint8Array(4 * width * height); var renderer = this._renderer; texture = renderer.renderTarget.getRenderTarget(texture); texture = renderer.renderTarget.getGpuRenderTarget(texture); renderer = renderer.gl; renderer.bindFramebuffer(renderer.FRAMEBUFFER, texture.resolveTargetFramebuffer); renderer.readPixels(Math.round(frame.x * resolution), Math.round(frame.y * resolution), width, height, renderer.RGBA, renderer.UNSIGNED_BYTE, pixels); return {pixels:new Uint8ClampedArray(pixels.buffer), width, height}; } destroy() { this._managedTextures.destroy(); this._renderer = this._uploads = this._mapFormatToFormat = this._mapFormatToType = this._mapFormatToInternalFormat = this._boundSamplers = this._boundTextures = this._glSamplers = null; } resetState() { this._activeTextureLocation = -1; this._boundTextures.fill(Texture.Texture.EMPTY.source); this._boundSamplers = Object.create(null); const gl = this._gl; this._premultiplyAlpha = !1; gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this._premultiplyAlpha); } }; require = node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTextureSystem$classdecl$var27; require.extension = {type:[global.ExtensionType.WebGLSystem], name:"texture"}; require.uploadExtensions = Object.create(null); global.extensions.handleByMap(global.ExtensionType.TextureUploaderWebGL, require.uploadExtensions); exports.GlTextureSystem = require; }; //# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$texture$GlTextureSystem.js.map