{"version":3,"file":"RenderGroupSystem.mjs","sources":["../../../src/scene/container/RenderGroupSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../extensions/Extensions';\nimport { Matrix } from '../../maths/matrix/Matrix';\nimport { buildInstructions } from './utils/buildInstructions';\nimport { clearList } from './utils/clearList';\nimport { collectRenderGroups } from './utils/collectRenderGroups';\nimport { executeInstructions } from './utils/executeInstructions';\nimport { updateRenderGroupTransforms } from './utils/updateRenderGroupTransforms';\nimport { validateRenderables } from './utils/validateRenderables';\n\nimport type { WebGPURenderer } from '../../rendering/renderers/gpu/WebGPURenderer';\nimport type { System } from '../../rendering/renderers/shared/system/System';\nimport type { Renderer } from '../../rendering/renderers/types';\nimport type { Container } from './Container';\nimport type { RenderGroup } from './RenderGroup';\n\nconst tempMatrix = new Matrix();\n\n/**\n * The view system manages the main canvas that is attached to the DOM.\n * This main role is to deal with how the holding the view reference and dealing with how it is resized.\n * @memberof rendering\n */\nexport class RenderGroupSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n            ExtensionType.WebGPUSystem,\n            ExtensionType.CanvasSystem,\n        ],\n        name: 'renderGroup',\n    } as const;\n\n    private readonly _renderer: Renderer;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n    }\n\n    protected render({ container, transform }: {container: Container, transform: Matrix}): void\n    {\n        container.isRenderGroup = true;\n\n        const parent = container.parent;\n        const renderGroupParent = container.renderGroup.renderGroupParent;\n\n        container.parent = null;\n        container.renderGroup.renderGroupParent = null;\n\n        const renderer = this._renderer;\n\n        // collect all the renderGroups in the scene and then render them one by one..\n        const renderGroups = collectRenderGroups(container.renderGroup, []);\n\n        let originalLocalTransform: Matrix = tempMatrix;\n\n        if (transform)\n        {\n            originalLocalTransform = originalLocalTransform.copyFrom(container.renderGroup.localTransform);\n            container.renderGroup.localTransform.copyFrom(transform);\n        }\n\n        const renderPipes = (renderer as WebGPURenderer).renderPipes;\n\n        for (let i = 0; i < renderGroups.length; i++)\n        {\n            const renderGroup = renderGroups[i];\n\n            renderGroup.runOnRender();\n\n            renderGroup.instructionSet.renderPipes = renderPipes;\n\n            if (!renderGroup.structureDidChange)\n            {\n                // phase 1 - validate all the renderables\n                validateRenderables(renderGroup, renderPipes);\n            }\n            else\n            {\n                clearList(renderGroup.childrenRenderablesToUpdate.list, 0);\n            }\n\n            // phase 2 - update all the transforms\n            // including updating the renderables..\n            updateRenderGroupTransforms(renderGroup);\n\n            if (renderGroup.structureDidChange)\n            {\n                renderGroup.structureDidChange = false;\n\n                // build the renderables\n                buildInstructions(renderGroup, renderer);\n            }\n            else\n            {\n                // update remaining renderables\n                updateRenderables(renderGroup);\n            }\n\n            // reset the renderables to update\n            renderGroup.childrenRenderablesToUpdate.index = 0;\n\n            // upload all the things!\n            renderer.renderPipes.batch.upload(renderGroup.instructionSet);\n        }\n\n        renderer.globalUniforms.start({\n            worldTransformMatrix: transform ? container.renderGroup.localTransform : container.renderGroup.worldTransform,\n            worldColor: container.renderGroup.worldColorAlpha,\n\n        });\n\n        executeInstructions(container.renderGroup, renderPipes);\n\n        // TODO need to add some events / runners for things like this to hook up to\n        if (renderPipes.uniformBatch)\n        {\n            renderPipes.uniformBatch.renderEnd();\n        }\n\n        if (transform)\n        {\n            container.renderGroup.localTransform.copyFrom(originalLocalTransform);\n        }\n\n        container.parent = parent;\n        container.renderGroup.renderGroupParent = renderGroupParent;\n    }\n\n    public destroy()\n    {\n        (this._renderer as null) = null;\n    }\n}\n\nfunction updateRenderables(renderGroup: RenderGroup)\n{\n    const { list, index } = renderGroup.childrenRenderablesToUpdate;\n\n    for (let i = 0; i < index; i++)\n    {\n        const container = list[i];\n\n        if (container.didViewUpdate)\n        {\n            renderGroup.updateRenderable(container);\n        }\n    }\n\n    clearList(list, index);\n}\n\n"],"names":[],"mappings":"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"}