UNPKG

38.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"FilterSystem.js","sources":["../../src/filters/FilterSystem.ts"],"sourcesContent":["import { RenderTexturePool } from '../renderTexture/RenderTexturePool';\nimport { Quad } from '../utils/Quad';\nimport { QuadUv } from '../utils/QuadUv';\nimport { Rectangle, Matrix, Point } from '@pixi/math';\nimport { UniformGroup } from '../shader/UniformGroup';\nimport { DRAW_MODES, CLEAR_MODES, MSAA_QUALITY } from '@pixi/constants';\nimport { FilterState } from './FilterState';\n\nimport type { ISystem } from '../system/ISystem';\nimport type { Filter } from './Filter';\nimport type { IFilterTarget } from './IFilterTarget';\nimport type { ISpriteMaskTarget } from './spriteMask/SpriteMaskFilter';\nimport type { RenderTexture } from '../renderTexture/RenderTexture';\nimport type { Renderer } from '../Renderer';\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport { extensions, ExtensionType } from '@pixi/extensions';\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 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":["Point","Matrix","RenderTexturePool","Quad","QuadUv","Rectangle","UniformGroup","FilterState","CLEAR_MODES","DRAW_MODES","MSAA_QUALITY","ExtensionType","extensions"],"mappings":"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"}
\No newline at end of file