1 | {"version":3,"file":"RenderTexturePool.js","sources":["../../src/renderTexture/RenderTexturePool.ts"],"sourcesContent":["import { MSAA_QUALITY } from '@pixi/constants';\nimport { nextPow2 } from '@pixi/utils';\nimport { BaseRenderTexture } from './BaseRenderTexture';\nimport { RenderTexture } from './RenderTexture';\n\nimport type { ISize } from '@pixi/math';\nimport type { IBaseTextureOptions } from '../textures/BaseTexture';\n\n/**\n * Texture pool, used by FilterSystem and plugins.\n *\n * Stores collection of temporary pow2 or screen-sized renderTextures\n *\n * If you use custom RenderTexturePool for your filters, you can use methods\n * `getFilterTexture` and `returnFilterTexture` same as in\n * @memberof PIXI\n */\nexport class RenderTexturePool\n{\n public textureOptions: IBaseTextureOptions;\n\n /**\n * Allow renderTextures of the same size as screen, not just pow2\n *\n * Automatically sets to true after `setScreenSize`\n * @default false\n */\n public enableFullScreen: boolean;\n texturePool: {[x in string | number]: RenderTexture[]};\n private _pixelsWidth: number;\n private _pixelsHeight: number;\n\n /**\n * @param textureOptions - options that will be passed to BaseRenderTexture constructor\n * @param {PIXI.SCALE_MODES} [textureOptions.scaleMode] - See {@link PIXI.SCALE_MODES} for possible values.\n */\n constructor(textureOptions?: IBaseTextureOptions)\n {\n this.texturePool = {};\n this.textureOptions = textureOptions || {};\n this.enableFullScreen = false;\n\n this._pixelsWidth = 0;\n this._pixelsHeight = 0;\n }\n\n /**\n * Creates texture with params that were specified in pool constructor.\n * @param realWidth - Width of texture in pixels.\n * @param realHeight - Height of texture in pixels.\n * @param multisample - Number of samples of the framebuffer.\n */\n createTexture(realWidth: number, realHeight: number, multisample = MSAA_QUALITY.NONE): RenderTexture\n {\n const baseRenderTexture = new BaseRenderTexture(Object.assign({\n width: realWidth,\n height: realHeight,\n resolution: 1,\n multisample,\n }, this.textureOptions));\n\n return new RenderTexture(baseRenderTexture);\n }\n\n /**\n * Gets a Power-of-Two render texture or fullScreen texture\n * @param minWidth - The minimum width of the render texture.\n * @param minHeight - The minimum height of the render texture.\n * @param resolution - The resolution of the render texture.\n * @param multisample - Number of samples of the render texture.\n * @returns The new render texture.\n */\n getOptimalTexture(minWidth: number, minHeight: number, resolution = 1, multisample = MSAA_QUALITY.NONE): RenderTexture\n {\n let key;\n\n minWidth = Math.ceil((minWidth * resolution) - 1e-6);\n minHeight = Math.ceil((minHeight * resolution) - 1e-6);\n\n if (!this.enableFullScreen || minWidth !== this._pixelsWidth || minHeight !== this._pixelsHeight)\n {\n minWidth = nextPow2(minWidth);\n minHeight = nextPow2(minHeight);\n key = (((minWidth & 0xFFFF) << 16) | (minHeight & 0xFFFF)) >>> 0;\n\n if (multisample > 1)\n {\n key += multisample * 0x100000000;\n }\n }\n else\n {\n key = multisample > 1 ? -multisample : -1;\n }\n\n if (!this.texturePool[key])\n {\n this.texturePool[key] = [];\n }\n\n let renderTexture = this.texturePool[key].pop();\n\n if (!renderTexture)\n {\n renderTexture = this.createTexture(minWidth, minHeight, multisample);\n }\n\n renderTexture.filterPoolKey = key;\n renderTexture.setResolution(resolution);\n\n return renderTexture;\n }\n\n /**\n * Gets extra texture of the same size as input renderTexture\n *\n * `getFilterTexture(input, 0.5)` or `getFilterTexture(0.5, input)`\n * @param input - renderTexture from which size and resolution will be copied\n * @param resolution - override resolution of the renderTexture\n * It overrides, it does not multiply\n * @param multisample - number of samples of the renderTexture\n */\n getFilterTexture(input: RenderTexture, resolution?: number, multisample?: MSAA_QUALITY): RenderTexture\n {\n const filterTexture = this.getOptimalTexture(input.width, input.height, resolution || input.resolution,\n multisample || MSAA_QUALITY.NONE);\n\n filterTexture.filterFrame = input.filterFrame;\n\n return filterTexture;\n }\n\n /**\n * Place a render texture back into the pool.\n * @param renderTexture - The renderTexture to free\n */\n returnTexture(renderTexture: RenderTexture): void\n {\n const key = renderTexture.filterPoolKey;\n\n renderTexture.filterFrame = null;\n this.texturePool[key].push(renderTexture);\n }\n\n /**\n * Alias for returnTexture, to be compliant with FilterSystem interface.\n * @param renderTexture - The renderTexture to free\n */\n returnFilterTexture(renderTexture: RenderTexture): void\n {\n this.returnTexture(renderTexture);\n }\n\n /**\n * Clears the pool.\n * @param destroyTextures - Destroy all stored textures.\n */\n clear(destroyTextures?: boolean): void\n {\n destroyTextures = destroyTextures !== false;\n if (destroyTextures)\n {\n for (const i in this.texturePool)\n {\n const textures = this.texturePool[i];\n\n if (textures)\n {\n for (let j = 0; j < textures.length; j++)\n {\n textures[j].destroy(true);\n }\n }\n }\n }\n\n this.texturePool = {};\n }\n\n /**\n * If screen size was changed, drops all screen-sized textures,\n * sets new screen size, sets `enableFullScreen` to true\n *\n * Size is measured in pixels, `renderer.view` can be passed here, not `renderer.screen`\n * @param size - Initial size of screen.\n */\n setScreenSize(size: ISize): void\n {\n if (size.width === this._pixelsWidth\n && size.height === this._pixelsHeight)\n {\n return;\n }\n\n this.enableFullScreen = size.width > 0 && size.height > 0;\n\n for (const i in this.texturePool)\n {\n if (!(Number(i) < 0))\n {\n continue;\n }\n\n const textures = this.texturePool[i];\n\n if (textures)\n {\n for (let j = 0; j < textures.length; j++)\n {\n textures[j].destroy(true);\n }\n }\n\n this.texturePool[i] = [];\n }\n\n this._pixelsWidth = size.width;\n this._pixelsHeight = size.height;\n }\n\n /**\n * Key that is used to store fullscreen renderTextures in a pool\n * @readonly\n */\n static SCREEN_KEY = -1;\n}\n"],"names":["MSAA_QUALITY","BaseRenderTexture","RenderTexture","nextPow2"],"mappings":"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"} |