{"version":3,"file":"RenderGroup.mjs","sources":["../../../src/scene/container/RenderGroup.ts"],"sourcesContent":["import { Matrix } from '../../maths/matrix/Matrix';\nimport { InstructionSet } from '../../rendering/renderers/shared/instructions/InstructionSet';\n\nimport type { Instruction } from '../../rendering/renderers/shared/instructions/Instruction';\nimport type { Container } from './Container';\n\n/**\n * A RenderGroup is a class that is responsible for I generating a set of instructions that are used to render the\n * root container and its children. It also watches for any changes in that container or its children,\n * these changes are analysed and either the instruction set is rebuild or the instructions data is updated.\n * @memberof rendering\n */\nexport class RenderGroup implements Instruction\n{\n    public renderPipeId = 'renderGroup';\n    public root: Container = null;\n\n    public canBundle = false;\n\n    public renderGroupParent: RenderGroup = null;\n    public renderGroupChildren: RenderGroup[] = [];\n\n    public worldTransform: Matrix = new Matrix();\n    public worldColorAlpha = 0xffffffff;\n    public worldColor = 0xffffff;\n    public worldAlpha = 1;\n\n    // these updates are transform changes..\n    public readonly childrenToUpdate: Record<number, { list: Container[]; index: number; }> = Object.create(null);\n    public updateTick = 0;\n\n    // these update are renderable changes..\n    public readonly childrenRenderablesToUpdate: { list: Container[]; index: number; } = { list: [], index: 0 };\n\n    // other\n    public structureDidChange = true;\n\n    public instructionSet: InstructionSet = new InstructionSet();\n\n    private readonly _onRenderContainers: Container[] = [];\n\n    public init(root: Container)\n    {\n        this.root = root;\n\n        if (root._onRender) this.addOnRender(root);\n\n        root.didChange = true;\n\n        const children = root.children;\n\n        for (let i = 0; i < children.length; i++)\n        {\n            this.addChild(children[i]);\n        }\n    }\n\n    public reset()\n    {\n        this.renderGroupChildren.length = 0;\n\n        for (const i in this.childrenToUpdate)\n        {\n            const childrenAtDepth = this.childrenToUpdate[i];\n\n            childrenAtDepth.list.fill(null);\n            childrenAtDepth.index = 0;\n        }\n\n        this.childrenRenderablesToUpdate.index = 0;\n        this.childrenRenderablesToUpdate.list.fill(null);\n\n        this.root = null;\n        this.updateTick = 0;\n        this.structureDidChange = true;\n\n        this._onRenderContainers.length = 0;\n        this.renderGroupParent = null;\n    }\n\n    get localTransform()\n    {\n        return this.root.localTransform;\n    }\n\n    public addRenderGroupChild(renderGroupChild: RenderGroup)\n    {\n        if (renderGroupChild.renderGroupParent)\n        {\n            renderGroupChild.renderGroupParent._removeRenderGroupChild(renderGroupChild);\n        }\n\n        renderGroupChild.renderGroupParent = this;\n\n        this.renderGroupChildren.push(renderGroupChild);\n    }\n\n    private _removeRenderGroupChild(renderGroupChild: RenderGroup)\n    {\n        const index = this.renderGroupChildren.indexOf(renderGroupChild);\n\n        if (index > -1)\n        {\n            this.renderGroupChildren.splice(index, 1);\n        }\n\n        renderGroupChild.renderGroupParent = null;\n    }\n\n    public addChild(child: Container)\n    {\n        this.structureDidChange = true;\n\n        child.parentRenderGroup = this;\n\n        child.updateTick = -1;\n\n        if (child.parent === this.root)\n        {\n            child.relativeRenderGroupDepth = 1;\n        }\n        else\n        {\n            child.relativeRenderGroupDepth = child.parent.relativeRenderGroupDepth + 1;\n        }\n\n        child.didChange = true;\n        this.onChildUpdate(child);\n\n        if (child.renderGroup)\n        {\n            this.addRenderGroupChild(child.renderGroup);\n\n            return;\n        }\n\n        if (child._onRender) this.addOnRender(child);\n\n        const children = child.children;\n\n        for (let i = 0; i < children.length; i++)\n        {\n            this.addChild(children[i]);\n        }\n    }\n\n    public removeChild(child: Container)\n    {\n        // remove all the children...\n        this.structureDidChange = true;\n\n        if (child._onRender)\n        {\n            // Remove the child to the onRender list under the following conditions:\n            // 1. If the child is not a render group.\n            // 2. If the child is a render group root of this render group - which it can't be removed from in this case.\n            if (!child.renderGroup)\n            {\n                this.removeOnRender(child);\n            }\n        }\n\n        child.parentRenderGroup = null;\n\n        if (child.renderGroup)\n        {\n            this._removeRenderGroupChild(child.renderGroup);\n\n            return;\n        }\n\n        const children = child.children;\n\n        for (let i = 0; i < children.length; i++)\n        {\n            this.removeChild(children[i]);\n        }\n    }\n\n    public removeChildren(children: Container[])\n    {\n        for (let i = 0; i < children.length; i++)\n        {\n            this.removeChild(children[i]);\n        }\n    }\n\n    public onChildUpdate(child: Container)\n    {\n        let childrenToUpdate = this.childrenToUpdate[child.relativeRenderGroupDepth];\n\n        if (!childrenToUpdate)\n        {\n            childrenToUpdate = this.childrenToUpdate[child.relativeRenderGroupDepth] = {\n                index: 0,\n                list: [],\n            };\n        }\n\n        childrenToUpdate.list[childrenToUpdate.index++] = child;\n    }\n\n    // SHOULD THIS BE HERE?\n    public updateRenderable(container: Container)\n    {\n        // only update if its visible!\n        if (container.globalDisplayStatus < 0b111) return;\n\n        container.didViewUpdate = false;\n        // actually updates the renderable..\n        this.instructionSet.renderPipes[container.renderPipeId].updateRenderable(container);\n    }\n\n    public onChildViewUpdate(child: Container)\n    {\n        this.childrenRenderablesToUpdate.list[this.childrenRenderablesToUpdate.index++] = child;\n    }\n\n    get isRenderable(): boolean\n    {\n        return (this.root.localDisplayStatus === 0b111 && this.worldAlpha > 0);\n    }\n\n    /**\n     * adding a container to the onRender list will make sure the user function\n     * passed in to the user defined 'onRender` callBack\n     * @param container - the container to add to the onRender list\n     */\n    public addOnRender(container: Container)\n    {\n        this._onRenderContainers.push(container);\n    }\n\n    public removeOnRender(container: Container)\n    {\n        this._onRenderContainers.splice(this._onRenderContainers.indexOf(container), 1);\n    }\n\n    public runOnRender()\n    {\n        for (let i = 0; i < this._onRenderContainers.length; i++)\n        {\n            this._onRenderContainers[i]._onRender();\n        }\n    }\n\n    public destroy()\n    {\n        this.renderGroupParent = null;\n        this.root = null;\n        (this.childrenRenderablesToUpdate as any) = null;\n        (this.childrenToUpdate as any) = null;\n        (this.renderGroupChildren as any) = null;\n        (this._onRenderContainers as any) = null;\n        this.instructionSet = null;\n    }\n\n    public getChildren(out: Container[] = []): Container[]\n    {\n        const children = this.root.children;\n\n        for (let i = 0; i < children.length; i++)\n        {\n            this._getChildren(children[i], out);\n        }\n\n        return out;\n    }\n\n    private _getChildren(container: Container, out: Container[] = []): Container[]\n    {\n        out.push(container);\n\n        if (container.renderGroup) return out;\n\n        const children = container.children;\n\n        for (let i = 0; i < children.length; i++)\n        {\n            this._getChildren(children[i], out);\n        }\n\n        return out;\n    }\n}\n"],"names":[],"mappings":"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"}