{"version":3,"file":"FilterSystem.mjs","sources":["../../src/filters/FilterSystem.ts"],"sourcesContent":["import { CLEAR_MODES, DRAW_MODES, MSAA_QUALITY } from '@pixi/constants';\nimport { extensions, ExtensionType } from '@pixi/extensions';\nimport { Matrix, Point, Rectangle } from '@pixi/math';\nimport { RenderTexturePool } from '../renderTexture/RenderTexturePool';\nimport { UniformGroup } from '../shader/UniformGroup';\nimport { Quad } from '../utils/Quad';\nimport { QuadUv } from '../utils/QuadUv';\nimport { FilterState } from './FilterState';\n\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport type { Renderer } from '../Renderer';\nimport type { RenderTexture } from '../renderTexture/RenderTexture';\nimport type { ISystem } from '../system/ISystem';\nimport type { Filter } from './Filter';\nimport type { IFilterTarget } from './IFilterTarget';\nimport type { ISpriteMaskTarget } from './spriteMask/SpriteMaskFilter';\n\nconst tempPoints = [new Point(), new Point(), new Point(), new Point()];\nconst tempMatrix = new Matrix();\n\n/**\n * System plugin to the renderer to manage filters.\n *\n * ## Pipeline\n *\n * The FilterSystem executes the filtering pipeline by rendering the display-object into a texture, applying its\n * [filters]{@link PIXI.Filter} in series, and the last filter outputs into the final render-target.\n *\n * The filter-frame is the rectangle in world space being filtered, and those contents are mapped into\n * `(0, 0, filterFrame.width, filterFrame.height)` into the filter render-texture. The filter-frame is also called\n * the source-frame, as it is used to bind the filter render-textures. The last filter outputs to the `filterFrame`\n * in the final render-target.\n *\n * ## Usage\n *\n * {@link PIXI.Container#renderAdvanced} is an example of how to use the filter system. It is a 3 step process:\n *\n * **push**: Use {@link PIXI.FilterSystem#push} to push the set of filters to be applied on a filter-target.\n * **render**: Render the contents to be filtered using the renderer. The filter-system will only capture the contents\n *      inside the bounds of the filter-target. NOTE: Using {@link PIXI.Renderer#render} is\n *      illegal during an existing render cycle, and it may reset the filter system.\n * **pop**: Use {@link PIXI.FilterSystem#pop} to pop & execute the filters you initially pushed. It will apply them\n *      serially and output to the bounds of the filter-target.\n * @memberof PIXI\n */\nexport class FilterSystem implements ISystem\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        type: ExtensionType.RendererSystem,\n        name: 'filter',\n    };\n\n    /**\n     * List of filters for the FilterSystem\n     * @member {object[]}\n     */\n    public readonly defaultFilterStack: Array<FilterState>;\n\n    /** A pool for storing filter states, save us creating new ones each tick. */\n    public statePool: Array<FilterState>;\n\n    /** Stores a bunch of POT textures used for filtering. */\n    public texturePool: RenderTexturePool;\n\n    /** Whether to clear output renderTexture in AUTO/BLIT mode. See {@link PIXI.CLEAR_MODES}. */\n    public forceClear: boolean;\n\n    /**\n     * Old padding behavior is to use the max amount instead of sum padding.\n     * Use this flag if you need the old behavior.\n     * @default false\n     */\n    public useMaxPadding: boolean;\n\n    /** A very simple geometry used when drawing a filter effect to the screen. */\n    protected quad: Quad;\n\n    /** Quad UVs */\n    protected quadUv: QuadUv;\n\n    /**\n     * Active state\n     * @member {object}\n     */\n    protected activeState: FilterState;\n\n    /**\n     * This uniform group is attached to filter uniforms when used.\n     * @property {PIXI.Rectangle} outputFrame -\n     * @property {Float32Array} inputSize -\n     * @property {Float32Array} inputPixel -\n     * @property {Float32Array} inputClamp -\n     * @property {number} resolution -\n     * @property {Float32Array} filterArea -\n     * @property {Float32Array} filterClamp -\n     */\n    protected globalUniforms: UniformGroup;\n\n    /** Temporary rect for math. */\n    private tempRect: Rectangle;\n    public 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        this.defaultFilterStack = [{}] as any;\n\n        this.texturePool = new RenderTexturePool();\n\n        this.statePool = [];\n\n        this.quad = new Quad();\n        this.quadUv = new QuadUv();\n        this.tempRect = new Rectangle();\n        this.activeState = {} as any;\n\n        this.globalUniforms = new UniformGroup({\n            outputFrame: new Rectangle(),\n            inputSize: new Float32Array(4),\n            inputPixel: new Float32Array(4),\n            inputClamp: new Float32Array(4),\n            resolution: 1,\n\n            // legacy variables\n            filterArea: new Float32Array(4),\n            filterClamp: new Float32Array(4),\n        }, true);\n\n        this.forceClear = false;\n        this.useMaxPadding = false;\n    }\n\n    init(): void\n    {\n        this.texturePool.setScreenSize(this.renderer.view);\n    }\n\n    /**\n     * Pushes a set of filters to be applied later to the system. This will redirect further rendering into an\n     * input render-texture for the rest of the filtering pipeline.\n     * @param {PIXI.DisplayObject} target - The target of the filter to render.\n     * @param filters - The filters to apply.\n     */\n    push(target: IFilterTarget, filters: Array<Filter>): void\n    {\n        const renderer = this.renderer;\n        const filterStack = this.defaultFilterStack;\n        const state = this.statePool.pop() || new FilterState();\n        const renderTextureSystem = this.renderer.renderTexture;\n\n        let resolution = filters[0].resolution;\n        let multisample = filters[0].multisample;\n        let padding = filters[0].padding;\n        let autoFit = filters[0].autoFit;\n        // We don't know whether it's a legacy filter until it was bound for the first time,\n        // therefore we have to assume that it is if legacy is undefined.\n        let legacy = filters[0].legacy ?? true;\n\n        for (let i = 1; i < filters.length; i++)\n        {\n            const filter = filters[i];\n\n            // let's use the lowest resolution\n            resolution = Math.min(resolution, filter.resolution);\n            // let's use the lowest number of samples\n            multisample = Math.min(multisample, filter.multisample);\n            // figure out the padding required for filters\n            padding = this.useMaxPadding\n                // old behavior: use largest amount of padding!\n                ? Math.max(padding, filter.padding)\n                // new behavior: sum the padding\n                : padding + filter.padding;\n            // only auto fit if all filters are autofit\n            autoFit = autoFit && filter.autoFit;\n\n            legacy = legacy || (filter.legacy ?? true);\n        }\n\n        if (filterStack.length === 1)\n        {\n            this.defaultFilterStack[0].renderTexture = renderTextureSystem.current;\n        }\n\n        filterStack.push(state);\n\n        state.resolution = resolution;\n        state.multisample = multisample;\n\n        state.legacy = legacy;\n\n        state.target = target;\n        state.sourceFrame.copyFrom(target.filterArea || target.getBounds(true));\n\n        state.sourceFrame.pad(padding);\n\n        const sourceFrameProjected = this.tempRect.copyFrom(renderTextureSystem.sourceFrame);\n\n        // Project source frame into world space (if projection is applied)\n        if (renderer.projection.transform)\n        {\n            this.transformAABB(\n                tempMatrix.copyFrom(renderer.projection.transform).invert(),\n                sourceFrameProjected\n            );\n        }\n\n        if (autoFit)\n        {\n            state.sourceFrame.fit(sourceFrameProjected);\n\n            if (state.sourceFrame.width <= 0 || state.sourceFrame.height <= 0)\n            {\n                state.sourceFrame.width = 0;\n                state.sourceFrame.height = 0;\n            }\n        }\n        else if (!state.sourceFrame.intersects(sourceFrameProjected))\n        {\n            state.sourceFrame.width = 0;\n            state.sourceFrame.height = 0;\n        }\n\n        // Round sourceFrame in screen space based on render-texture.\n        this.roundFrame(\n            state.sourceFrame,\n            renderTextureSystem.current ? renderTextureSystem.current.resolution : renderer.resolution,\n            renderTextureSystem.sourceFrame,\n            renderTextureSystem.destinationFrame,\n            renderer.projection.transform,\n        );\n\n        state.renderTexture = this.getOptimalFilterTexture(state.sourceFrame.width, state.sourceFrame.height,\n            resolution, multisample);\n        state.filters = filters;\n\n        state.destinationFrame.width = state.renderTexture.width;\n        state.destinationFrame.height = state.renderTexture.height;\n\n        const destinationFrame = this.tempRect;\n\n        destinationFrame.x = 0;\n        destinationFrame.y = 0;\n        destinationFrame.width = state.sourceFrame.width;\n        destinationFrame.height = state.sourceFrame.height;\n\n        state.renderTexture.filterFrame = state.sourceFrame;\n        state.bindingSourceFrame.copyFrom(renderTextureSystem.sourceFrame);\n        state.bindingDestinationFrame.copyFrom(renderTextureSystem.destinationFrame);\n\n        state.transform = renderer.projection.transform;\n        renderer.projection.transform = null;\n        renderTextureSystem.bind(state.renderTexture, state.sourceFrame, destinationFrame);\n        renderer.framebuffer.clear(0, 0, 0, 0);\n    }\n\n    /** Pops off the filter and applies it. */\n    pop(): void\n    {\n        const filterStack = this.defaultFilterStack;\n        const state = filterStack.pop();\n        const filters = state.filters;\n\n        this.activeState = state;\n\n        const globalUniforms = this.globalUniforms.uniforms;\n\n        globalUniforms.outputFrame = state.sourceFrame;\n        globalUniforms.resolution = state.resolution;\n\n        const inputSize = globalUniforms.inputSize;\n        const inputPixel = globalUniforms.inputPixel;\n        const inputClamp = globalUniforms.inputClamp;\n\n        inputSize[0] = state.destinationFrame.width;\n        inputSize[1] = state.destinationFrame.height;\n        inputSize[2] = 1.0 / inputSize[0];\n        inputSize[3] = 1.0 / inputSize[1];\n\n        inputPixel[0] = Math.round(inputSize[0] * state.resolution);\n        inputPixel[1] = Math.round(inputSize[1] * state.resolution);\n        inputPixel[2] = 1.0 / inputPixel[0];\n        inputPixel[3] = 1.0 / inputPixel[1];\n\n        inputClamp[0] = 0.5 * inputPixel[2];\n        inputClamp[1] = 0.5 * inputPixel[3];\n        inputClamp[2] = (state.sourceFrame.width * inputSize[2]) - (0.5 * inputPixel[2]);\n        inputClamp[3] = (state.sourceFrame.height * inputSize[3]) - (0.5 * inputPixel[3]);\n\n        // only update the rect if its legacy..\n        if (state.legacy)\n        {\n            const filterArea = globalUniforms.filterArea;\n\n            filterArea[0] = state.destinationFrame.width;\n            filterArea[1] = state.destinationFrame.height;\n            filterArea[2] = state.sourceFrame.x;\n            filterArea[3] = state.sourceFrame.y;\n\n            globalUniforms.filterClamp = globalUniforms.inputClamp;\n        }\n\n        this.globalUniforms.update();\n\n        const lastState = filterStack[filterStack.length - 1];\n\n        this.renderer.framebuffer.blit();\n\n        if (filters.length === 1)\n        {\n            filters[0].apply(this, state.renderTexture, lastState.renderTexture, CLEAR_MODES.BLEND, state);\n\n            this.returnFilterTexture(state.renderTexture);\n        }\n        else\n        {\n            let flip = state.renderTexture;\n            let flop = this.getOptimalFilterTexture(\n                flip.width,\n                flip.height,\n                state.resolution\n            );\n\n            flop.filterFrame = flip.filterFrame;\n\n            let i = 0;\n\n            for (i = 0; i < filters.length - 1; ++i)\n            {\n                if (i === 1 && state.multisample > 1)\n                {\n                    flop = this.getOptimalFilterTexture(\n                        flip.width,\n                        flip.height,\n                        state.resolution\n                    );\n\n                    flop.filterFrame = flip.filterFrame;\n                }\n\n                filters[i].apply(this, flip, flop, CLEAR_MODES.CLEAR, state);\n\n                const t = flip;\n\n                flip = flop;\n                flop = t;\n            }\n\n            filters[i].apply(this, flip, lastState.renderTexture, CLEAR_MODES.BLEND, state);\n\n            if (i > 1 && state.multisample > 1)\n            {\n                this.returnFilterTexture(state.renderTexture);\n            }\n\n            this.returnFilterTexture(flip);\n            this.returnFilterTexture(flop);\n        }\n\n        // lastState.renderTexture is blitted when lastState is popped\n\n        state.clear();\n        this.statePool.push(state);\n    }\n\n    /**\n     * Binds a renderTexture with corresponding `filterFrame`, clears it if mode corresponds.\n     * @param filterTexture - renderTexture to bind, should belong to filter pool or filter stack\n     * @param clearMode - clearMode, by default its CLEAR/YES. See {@link PIXI.CLEAR_MODES}\n     */\n    bindAndClear(filterTexture: RenderTexture, clearMode: CLEAR_MODES = CLEAR_MODES.CLEAR): void\n    {\n        const {\n            renderTexture: renderTextureSystem,\n            state: stateSystem,\n        } = this.renderer;\n\n        if (filterTexture === this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture)\n        {\n            // Restore projection transform if rendering into the output render-target.\n            this.renderer.projection.transform = this.activeState.transform;\n        }\n        else\n        {\n            // Prevent projection within filtering pipeline.\n            this.renderer.projection.transform = null;\n        }\n\n        if (filterTexture?.filterFrame)\n        {\n            const destinationFrame = this.tempRect;\n\n            destinationFrame.x = 0;\n            destinationFrame.y = 0;\n            destinationFrame.width = filterTexture.filterFrame.width;\n            destinationFrame.height = filterTexture.filterFrame.height;\n\n            renderTextureSystem.bind(filterTexture, filterTexture.filterFrame, destinationFrame);\n        }\n        else if (filterTexture !== this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture)\n        {\n            renderTextureSystem.bind(filterTexture);\n        }\n        else\n        {\n            // Restore binding for output render-target.\n            this.renderer.renderTexture.bind(\n                filterTexture,\n                this.activeState.bindingSourceFrame,\n                this.activeState.bindingDestinationFrame\n            );\n        }\n\n        // Clear the texture in BLIT mode if blending is disabled or the forceClear flag is set. The blending\n        // is stored in the 0th bit of the state.\n        const autoClear = (stateSystem.stateId & 1) || this.forceClear;\n\n        if (clearMode === CLEAR_MODES.CLEAR\n            || (clearMode === CLEAR_MODES.BLIT && autoClear))\n        {\n            // Use framebuffer.clear because we want to clear the whole filter texture, not just the filtering\n            // area over which the shaders are run. This is because filters may sampling outside of it (e.g. blur)\n            // instead of clamping their arithmetic.\n            this.renderer.framebuffer.clear(0, 0, 0, 0);\n        }\n    }\n\n    /**\n     * Draws a filter using the default rendering process.\n     *\n     * This should be called only by {@link PIXI.Filter#apply}.\n     * @param filter - The filter to draw.\n     * @param input - The input render target.\n     * @param output - The target to output to.\n     * @param clearMode - Should the output be cleared before rendering to it\n     */\n    applyFilter(filter: Filter, input: RenderTexture, output: RenderTexture, clearMode?: CLEAR_MODES): void\n    {\n        const renderer = this.renderer;\n\n        // Set state before binding, so bindAndClear gets the blend mode.\n        renderer.state.set(filter.state);\n        this.bindAndClear(output, clearMode);\n\n        // set the uniforms..\n        filter.uniforms.uSampler = input;\n        filter.uniforms.filterGlobals = this.globalUniforms;\n\n        // TODO make it so that the order of this does not matter..\n        // because it does at the moment cos of global uniforms.\n        // they need to get resynced\n        renderer.shader.bind(filter);\n\n        // check to see if the filter is a legacy one..\n        filter.legacy = !!filter.program.attributeData.aTextureCoord;\n\n        if (filter.legacy)\n        {\n            this.quadUv.map(input._frame, input.filterFrame);\n\n            renderer.geometry.bind(this.quadUv);\n            renderer.geometry.draw(DRAW_MODES.TRIANGLES);\n        }\n        else\n        {\n            renderer.geometry.bind(this.quad);\n            renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP);\n        }\n    }\n\n    /**\n     * Multiply _input normalized coordinates_ to this matrix to get _sprite texture normalized coordinates_.\n     *\n     * Use `outputMatrix * vTextureCoord` in the shader.\n     * @param outputMatrix - The matrix to output to.\n     * @param {PIXI.Sprite} sprite - The sprite to map to.\n     * @returns The mapped matrix.\n     */\n    calculateSpriteMatrix(outputMatrix: Matrix, sprite: ISpriteMaskTarget): Matrix\n    {\n        const { sourceFrame, destinationFrame } = this.activeState;\n        const { orig } = sprite._texture;\n        const mappedMatrix = outputMatrix.set(destinationFrame.width, 0, 0,\n            destinationFrame.height, sourceFrame.x, sourceFrame.y);\n        const worldTransform = sprite.worldTransform.copyTo(Matrix.TEMP_MATRIX);\n\n        worldTransform.invert();\n        mappedMatrix.prepend(worldTransform);\n        mappedMatrix.scale(1.0 / orig.width, 1.0 / orig.height);\n        mappedMatrix.translate(sprite.anchor.x, sprite.anchor.y);\n\n        return mappedMatrix;\n    }\n\n    /** Destroys this Filter System. */\n    destroy(): void\n    {\n        this.renderer = null;\n\n        // Those textures has to be destroyed by RenderTextureSystem or FramebufferSystem\n        this.texturePool.clear(false);\n    }\n\n    /**\n     * Gets a Power-of-Two render texture or fullScreen texture\n     * @param minWidth - The minimum width of the render texture in real pixels.\n     * @param minHeight - The minimum height of the render texture in real pixels.\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    protected getOptimalFilterTexture(minWidth: number, minHeight: number, resolution = 1,\n        multisample: MSAA_QUALITY = MSAA_QUALITY.NONE): RenderTexture\n    {\n        return this.texturePool.getOptimalTexture(minWidth, minHeight, resolution, multisample);\n    }\n\n    /**\n     * Gets extra render texture to use inside current filter\n     * To be compliant with older filters, you can use params in any order\n     * @param input - renderTexture from which size and resolution will be copied\n     * @param resolution - override resolution of the renderTexture\n     * @param multisample - number of samples of the renderTexture\n     */\n    getFilterTexture(input?: RenderTexture, resolution?: number, multisample?: MSAA_QUALITY): RenderTexture\n    {\n        if (typeof input === 'number')\n        {\n            const swap = input;\n\n            input = resolution as any;\n            resolution = swap;\n        }\n\n        input = input || this.activeState.renderTexture;\n\n        const filterTexture = this.texturePool.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     * Frees a render texture back into the pool.\n     * @param renderTexture - The renderTarget to free\n     */\n    returnFilterTexture(renderTexture: RenderTexture): void\n    {\n        this.texturePool.returnTexture(renderTexture);\n    }\n\n    /** Empties the texture pool. */\n    emptyPool(): void\n    {\n        this.texturePool.clear(true);\n    }\n\n    /** Calls `texturePool.resize()`, affects fullScreen renderTextures. */\n    resize(): void\n    {\n        this.texturePool.setScreenSize(this.renderer.view);\n    }\n\n    /**\n     * @param matrix - first param\n     * @param rect - second param\n     */\n    private transformAABB(matrix: Matrix, rect: Rectangle): void\n    {\n        const lt = tempPoints[0];\n        const lb = tempPoints[1];\n        const rt = tempPoints[2];\n        const rb = tempPoints[3];\n\n        lt.set(rect.left, rect.top);\n        lb.set(rect.left, rect.bottom);\n        rt.set(rect.right, rect.top);\n        rb.set(rect.right, rect.bottom);\n\n        matrix.apply(lt, lt);\n        matrix.apply(lb, lb);\n        matrix.apply(rt, rt);\n        matrix.apply(rb, rb);\n\n        const x0 = Math.min(lt.x, lb.x, rt.x, rb.x);\n        const y0 = Math.min(lt.y, lb.y, rt.y, rb.y);\n        const x1 = Math.max(lt.x, lb.x, rt.x, rb.x);\n        const y1 = Math.max(lt.y, lb.y, rt.y, rb.y);\n\n        rect.x = x0;\n        rect.y = y0;\n        rect.width = x1 - x0;\n        rect.height = y1 - y0;\n    }\n\n    private roundFrame(\n        frame: Rectangle,\n        resolution: number,\n        bindingSourceFrame: Rectangle,\n        bindingDestinationFrame: Rectangle,\n        transform?: Matrix\n    )\n    {\n        if (frame.width <= 0 || frame.height <= 0 || bindingSourceFrame.width <= 0 || bindingSourceFrame.height <= 0)\n        {\n            return;\n        }\n\n        if (transform)\n        {\n            const { a, b, c, d } = transform;\n\n            // Skip if skew/rotation present in matrix, except for multiple of 90° rotation. If rotation\n            // is a multiple of 90°, then either pair of (b,c) or (a,d) will be (0,0).\n            if ((Math.abs(b) > 1e-4 || Math.abs(c) > 1e-4)\n                && (Math.abs(a) > 1e-4 || Math.abs(d) > 1e-4))\n            {\n                return;\n            }\n        }\n\n        transform = transform ? tempMatrix.copyFrom(transform) : tempMatrix.identity();\n\n        // Get forward transform from world space to screen space\n        transform\n            .translate(-bindingSourceFrame.x, -bindingSourceFrame.y)\n            .scale(\n                bindingDestinationFrame.width / bindingSourceFrame.width,\n                bindingDestinationFrame.height / bindingSourceFrame.height)\n            .translate(bindingDestinationFrame.x, bindingDestinationFrame.y);\n\n        // Convert frame to screen space\n        this.transformAABB(transform, frame);\n\n        // Round frame in screen space\n        frame.ceil(resolution);\n\n        // Project back into world space.\n        this.transformAABB(transform.invert(), frame);\n    }\n}\n\nextensions.add(FilterSystem);\n"],"names":[],"mappings":"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"}