1 line
12 KiB
Plaintext
1 line
12 KiB
Plaintext
{"version":3,"file":"AlphaMaskPipe.mjs","sources":["../../../../src/rendering/mask/alpha/AlphaMaskPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { FilterEffect } from '../../../filters/FilterEffect';\nimport { MaskFilter } from '../../../filters/mask/MaskFilter';\nimport { Bounds } from '../../../scene/container/bounds/Bounds';\nimport { getGlobalBounds } from '../../../scene/container/bounds/getGlobalBounds';\nimport { collectAllRenderables } from '../../../scene/container/utils/buildInstructions';\nimport { Sprite } from '../../../scene/sprite/Sprite';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { Texture } from '../../renderers/shared/texture/Texture';\nimport { TexturePool } from '../../renderers/shared/texture/TexturePool';\nimport { RendererType } from '../../renderers/types';\n\nimport type { Container } from '../../../scene/container/Container';\nimport type { Effect } from '../../../scene/container/Effect';\nimport type { PoolItem } from '../../../utils/pool/Pool';\nimport type { Instruction } from '../../renderers/shared/instructions/Instruction';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { RenderTarget } from '../../renderers/shared/renderTarget/RenderTarget';\nimport type { Renderer } from '../../renderers/types';\nimport type { AlphaMask } from './AlphaMask';\n\ntype MaskMode = 'pushMaskBegin' | 'pushMaskEnd' | 'popMaskBegin' | 'popMaskEnd';\n\nconst tempBounds = new Bounds();\n\nclass AlphaMaskEffect extends FilterEffect implements PoolItem\n{\n constructor()\n {\n super();\n\n this.filters = [new MaskFilter({\n sprite: new Sprite(Texture.EMPTY),\n resolution: 'inherit',\n antialias: 'inherit'\n })];\n }\n\n get sprite(): Sprite\n {\n return (this.filters[0] as MaskFilter).sprite;\n }\n\n set sprite(value: Sprite)\n {\n (this.filters[0] as MaskFilter).sprite = value;\n }\n\n public init: () => void;\n}\n\nexport interface AlphaMaskInstruction extends Instruction\n{\n renderPipeId: 'alphaMask',\n action: MaskMode,\n mask: AlphaMask,\n maskedContainer: Container,\n renderMask: boolean,\n}\n\nexport interface AlphaMaskData\n{\n filterEffect: AlphaMaskEffect,\n maskedContainer: Container,\n previousRenderTarget?: RenderTarget,\n filterTexture?: Texture,\n}\n\nexport class AlphaMaskPipe implements InstructionPipe<AlphaMaskInstruction>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLPipes,\n ExtensionType.WebGPUPipes,\n ExtensionType.CanvasPipes,\n ],\n name: 'alphaMask',\n } as const;\n\n private _renderer: Renderer;\n private _activeMaskStage: AlphaMaskData[] = [];\n\n constructor(renderer: Renderer)\n {\n this._renderer = renderer;\n }\n\n public push(mask: Effect, maskedContainer: Container, instructionSet: InstructionSet): void\n {\n const renderer = this._renderer;\n\n renderer.renderPipes.batch.break(instructionSet);\n\n instructionSet.add({\n renderPipeId: 'alphaMask',\n action: 'pushMaskBegin',\n mask,\n canBundle: false,\n maskedContainer\n } as AlphaMaskInstruction);\n\n if ((mask as AlphaMask).renderMaskToTexture)\n {\n const maskContainer = (mask as AlphaMask).mask;\n\n maskContainer.includeInBuild = true;\n\n collectAllRenderables(\n maskContainer,\n instructionSet,\n renderer\n );\n\n maskContainer.includeInBuild = false;\n }\n\n renderer.renderPipes.batch.break(instructionSet);\n\n instructionSet.add({\n renderPipeId: 'alphaMask',\n action: 'pushMaskEnd',\n mask,\n maskedContainer,\n canBundle: false,\n } as AlphaMaskInstruction);\n }\n\n public pop(mask: Effect, _maskedContainer: Container, instructionSet: InstructionSet): void\n {\n const renderer = this._renderer;\n\n renderer.renderPipes.batch.break(instructionSet);\n\n instructionSet.add({\n renderPipeId: 'alphaMask',\n action: 'popMaskEnd',\n mask,\n canBundle: false,\n } as AlphaMaskInstruction);\n }\n\n public execute(instruction: AlphaMaskInstruction)\n {\n const renderer = this._renderer;\n const renderMask = instruction.mask.renderMaskToTexture;\n\n if (instruction.action === 'pushMaskBegin')\n {\n const filterEffect = BigPool.get(AlphaMaskEffect);\n\n if (renderMask)\n {\n instruction.mask.mask.measurable = true;\n\n const bounds = getGlobalBounds(instruction.mask.mask, true, tempBounds);\n\n instruction.mask.mask.measurable = false;\n\n bounds.ceil();\n\n const colorTextureSource = renderer.renderTarget.renderTarget.colorTexture.source;\n const filterTexture = TexturePool.getOptimalTexture(\n bounds.width,\n bounds.height,\n colorTextureSource._resolution,\n colorTextureSource.antialias\n );\n\n renderer.renderTarget.push(filterTexture, true);\n\n renderer.globalUniforms.push({\n offset: bounds,\n worldColor: 0xFFFFFFFF\n });\n\n const sprite = filterEffect.sprite;\n\n sprite.texture = filterTexture;\n\n sprite.worldTransform.tx = bounds.minX;\n sprite.worldTransform.ty = bounds.minY;\n\n this._activeMaskStage.push({\n filterEffect,\n maskedContainer: instruction.maskedContainer,\n filterTexture,\n });\n }\n else\n {\n filterEffect.sprite = instruction.mask.mask as Sprite;\n\n this._activeMaskStage.push({\n filterEffect,\n maskedContainer: instruction.maskedContainer,\n });\n }\n }\n else if (instruction.action === 'pushMaskEnd')\n {\n const maskData = this._activeMaskStage[this._activeMaskStage.length - 1];\n\n if (renderMask)\n {\n // WebGPU blit's automatically, but WebGL does not!\n if (renderer.type === RendererType.WEBGL)\n {\n renderer.renderTarget.finishRenderPass();\n }\n\n renderer.renderTarget.pop();\n renderer.globalUniforms.pop();\n }\n\n renderer.filter.push({\n renderPipeId: 'filter',\n action: 'pushFilter',\n container: maskData.maskedContainer,\n filterEffect: maskData.filterEffect,\n canBundle: false,\n });\n }\n else if (instruction.action === 'popMaskEnd')\n {\n renderer.filter.pop();\n\n const maskData = this._activeMaskStage.pop();\n\n if (renderMask)\n {\n TexturePool.returnTexture(maskData.filterTexture);\n }\n\n BigPool.return(maskData.filterEffect);\n }\n }\n\n public destroy(): void\n {\n this._renderer = null;\n this._activeMaskStage = null;\n }\n}\n"],"names":[],"mappings":"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"} |