{"version":3,"file":"updateRenderGroupTransforms.mjs","sources":["../../../../src/scene/container/utils/updateRenderGroupTransforms.ts"],"sourcesContent":["import { Container, UPDATE_BLEND, UPDATE_COLOR, UPDATE_VISIBLE } from '../Container';\nimport { clearList } from './clearList';\nimport { mixColors } from './mixColors';\n\nimport type { RenderGroup } from '../RenderGroup';\n\nconst tempContainer = new Container();\nconst UPDATE_BLEND_COLOR_VISIBLE = UPDATE_VISIBLE | UPDATE_COLOR | UPDATE_BLEND;\n\nexport function updateRenderGroupTransforms(renderGroup: RenderGroup, updateChildRenderGroups = false)\n{\n    updateRenderGroupTransform(renderGroup);\n\n    const childrenToUpdate = renderGroup.childrenToUpdate;\n\n    const updateTick = renderGroup.updateTick++;\n\n    for (const j in childrenToUpdate)\n    {\n        const renderGroupDepth = Number(j);\n\n        const childrenAtDepth = childrenToUpdate[j];\n\n        const list = childrenAtDepth.list;\n        const index = childrenAtDepth.index;\n\n        for (let i = 0; i < index; i++)\n        {\n            const child = list[i];\n\n            // check that these things match our layer and depth - if the renderGroup does not match,\n            // the child has been re-parented into another rendergroup since it asked to be updated so we can ignore it here\n            // secondly if the relativeRenderGroupDepth has changed, then the it means it will have been nested at a\n            // different different level in the render group - so we can wait for the update that does in fact match\n            if (child.parentRenderGroup === renderGroup && child.relativeRenderGroupDepth === renderGroupDepth)\n            {\n                updateTransformAndChildren(child, updateTick, 0);\n            }\n        }\n\n        clearList(list, index);\n\n        childrenAtDepth.index = 0;\n    }\n\n    if (updateChildRenderGroups)\n    {\n        for (let i = 0; i < renderGroup.renderGroupChildren.length; i++)\n        {\n            updateRenderGroupTransforms(renderGroup.renderGroupChildren[i], updateChildRenderGroups);\n        }\n    }\n}\n\nexport function updateRenderGroupTransform(renderGroup: RenderGroup)\n{\n    const root = renderGroup.root;\n\n    let worldAlpha;\n\n    if (renderGroup.renderGroupParent)\n    {\n        const renderGroupParent = renderGroup.renderGroupParent;\n\n        renderGroup.worldTransform.appendFrom(\n            root.relativeGroupTransform,\n            renderGroupParent.worldTransform,\n        );\n\n        renderGroup.worldColor = mixColors(\n            root.groupColor,\n            renderGroupParent.worldColor,\n        );\n\n        worldAlpha = root.groupAlpha * renderGroupParent.worldAlpha;\n    }\n    else\n    {\n        renderGroup.worldTransform.copyFrom(root.localTransform);\n        renderGroup.worldColor = root.localColor;\n        worldAlpha = root.localAlpha;\n    }\n\n    // eslint-disable-next-line no-nested-ternary\n    worldAlpha = worldAlpha < 0 ? 0 : (worldAlpha > 1 ? 1 : worldAlpha);\n    renderGroup.worldAlpha = worldAlpha;\n\n    renderGroup.worldColorAlpha = renderGroup.worldColor\n            + (((worldAlpha * 255) | 0) << 24);\n}\n\nexport function updateTransformAndChildren(container: Container, updateTick: number, updateFlags: number)\n{\n    if (updateTick === container.updateTick) return;\n    container.updateTick = updateTick;\n\n    container.didChange = false;\n\n    const localTransform = container.localTransform;\n\n    container.updateLocalTransform();\n\n    const parent = container.parent;\n\n    if ((parent && !parent.renderGroup))\n    {\n        updateFlags = updateFlags | container._updateFlags;\n\n        container.relativeGroupTransform.appendFrom(\n            localTransform,\n            parent.relativeGroupTransform,\n        );\n\n        if (updateFlags & UPDATE_BLEND_COLOR_VISIBLE)\n        {\n            updateColorBlendVisibility(container, parent, updateFlags);\n        }\n    }\n    else\n    {\n        updateFlags = container._updateFlags;\n\n        container.relativeGroupTransform.copyFrom(localTransform);\n\n        if (updateFlags & UPDATE_BLEND_COLOR_VISIBLE)\n        {\n            updateColorBlendVisibility(container, tempContainer, updateFlags);\n        }\n    }\n\n    // don't update children if its a layer..\n    if (!container.renderGroup)\n    {\n        const children = container.children;\n        const length = children.length;\n\n        for (let i = 0; i < length; i++)\n        {\n            updateTransformAndChildren(children[i], updateTick, updateFlags);\n        }\n\n        const renderGroup = container.parentRenderGroup;\n\n        if (container.renderPipeId && !renderGroup.structureDidChange)\n        {\n            renderGroup.updateRenderable(container);\n        }\n    }\n}\n\nfunction updateColorBlendVisibility(\n    container: Container,\n    parent: Container,\n    updateFlags: number,\n): void\n{\n    if (updateFlags & UPDATE_COLOR)\n    {\n        container.groupColor = mixColors(\n            container.localColor,\n            parent.groupColor\n        );\n\n        let groupAlpha = container.localAlpha * parent.groupAlpha;\n\n        // eslint-disable-next-line no-nested-ternary\n        groupAlpha = groupAlpha < 0 ? 0 : (groupAlpha > 1 ? 1 : groupAlpha);\n\n        container.groupAlpha = groupAlpha;\n        container.groupColorAlpha = container.groupColor + (((groupAlpha * 255) | 0) << 24);\n    }\n\n    if (updateFlags & UPDATE_BLEND)\n    {\n        container.groupBlendMode = container.localBlendMode === 'inherit' ? parent.groupBlendMode : container.localBlendMode;\n    }\n\n    if (updateFlags & UPDATE_VISIBLE)\n    {\n        container.globalDisplayStatus = container.localDisplayStatus & parent.globalDisplayStatus;\n    }\n\n    container._updateFlags = 0;\n}\n\n"],"names":[],"mappings":"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"}