{"version":3,"file":"RenderGroupPipe.mjs","sources":["../../../src/scene/container/RenderGroupPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../extensions/Extensions';\nimport { Matrix } from '../../maths/matrix/Matrix';\nimport { BigPool } from '../../utils/pool/PoolGroup';\nimport { BatchableSprite } from '../sprite/BatchableSprite';\nimport { executeInstructions } from './utils/executeInstructions';\n\nimport type { InstructionSet } from '../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { InstructionPipe } from '../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../rendering/renderers/types';\nimport type { RenderGroup } from './RenderGroup';\n\nconst tempMatrix = new Matrix();\n\n/**\n * The RenderGroupPipe is a render pipe for rendering RenderGroups.\n * @internal\n */\nexport class RenderGroupPipe implements InstructionPipe<RenderGroup>\n{\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'renderGroup',\n    } as const;\n\n    private _renderer: Renderer;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public addRenderGroup(renderGroup: RenderGroup, instructionSet: InstructionSet): void\n    {\n        if (renderGroup.isCachedAsTexture)\n        {\n            this._addRenderableCacheAsTexture(renderGroup, instructionSet);\n        }\n        else\n        {\n            this._addRenderableDirect(renderGroup, instructionSet);\n        }\n    }\n\n    public execute(renderGroup: RenderGroup)\n    {\n        if (!renderGroup.isRenderable) return;\n\n        if (renderGroup.isCachedAsTexture)\n        {\n            this._executeCacheAsTexture(renderGroup);\n        }\n        else\n        {\n            this._executeDirect(renderGroup);\n        }\n    }\n\n    public destroy(): void\n    {\n        this._renderer = null;\n    }\n\n    private _addRenderableDirect(renderGroup: RenderGroup, instructionSet: InstructionSet): void\n    {\n        this._renderer.renderPipes.batch.break(instructionSet);\n\n        if (renderGroup._batchableRenderGroup)\n        {\n            BigPool.return(renderGroup._batchableRenderGroup);\n            renderGroup._batchableRenderGroup = null;\n        }\n\n        instructionSet.add(renderGroup);\n    }\n\n    private _addRenderableCacheAsTexture(renderGroup: RenderGroup, instructionSet: InstructionSet): void\n    {\n        const batchableRenderGroup = renderGroup._batchableRenderGroup ??= BigPool.get(BatchableSprite);\n\n        batchableRenderGroup.renderable = renderGroup.root;\n        batchableRenderGroup.transform = renderGroup.root.relativeGroupTransform;\n        batchableRenderGroup.texture = renderGroup.texture;\n        batchableRenderGroup.bounds = renderGroup._textureBounds;\n\n        instructionSet.add(renderGroup);\n\n        this._renderer.renderPipes.blendMode.pushBlendMode(renderGroup, renderGroup.root.groupBlendMode, instructionSet);\n        this._renderer.renderPipes.batch.addToBatch(batchableRenderGroup, instructionSet);\n        this._renderer.renderPipes.blendMode.popBlendMode(instructionSet);\n    }\n\n    private _executeCacheAsTexture(renderGroup: RenderGroup): void\n    {\n        if (renderGroup.textureNeedsUpdate)\n        {\n            renderGroup.textureNeedsUpdate = false;\n\n            const worldTransformMatrix = tempMatrix\n                .identity()\n                .translate(\n                    -renderGroup._textureBounds.x,\n                    -renderGroup._textureBounds.y\n                );\n\n            this._renderer.renderTarget.push(renderGroup.texture, true, null, renderGroup.texture.frame);\n\n            this._renderer.globalUniforms.push({\n                worldTransformMatrix,\n                worldColor: 0xFFFFFFFF,\n                offset: { x: 0, y: 0 },\n            });\n\n            executeInstructions(renderGroup, this._renderer.renderPipes);\n\n            this._renderer.renderTarget.finishRenderPass();\n\n            this._renderer.renderTarget.pop();\n            this._renderer.globalUniforms.pop();\n        }\n\n        renderGroup._batchableRenderGroup._batcher.updateElement(renderGroup._batchableRenderGroup);\n        renderGroup._batchableRenderGroup._batcher.geometry.buffers[0].update();\n    }\n\n    private _executeDirect(renderGroup: RenderGroup): void\n    {\n        this._renderer.globalUniforms.push({\n            worldTransformMatrix: renderGroup.inverseParentTextureTransform,\n            worldColor: renderGroup.worldColorAlpha,\n        });\n\n        executeInstructions(renderGroup, this._renderer.renderPipes);\n\n        this._renderer.globalUniforms.pop();\n    }\n}\n"],"names":[],"mappings":"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"}