{"version":3,"file":"getGlobalBounds.mjs","sources":["../../../../src/scene/container/bounds/getGlobalBounds.ts"],"sourcesContent":["import { Matrix } from '../../../maths/matrix/Matrix';\nimport { boundsPool, matrixPool } from './utils/matrixAndBoundsPool';\n\nimport type { Renderable } from '../../../rendering/renderers/shared/Renderable';\nimport type { Container } from '../Container';\nimport type { Bounds } from './Bounds';\n\nexport function getGlobalBounds(target: Container, skipUpdateTransform: boolean, bounds: Bounds): Bounds\n{\n    bounds.clear();\n\n    let parentTransform;\n    let pooledMatrix;\n\n    if (target.parent)\n    {\n        if (!skipUpdateTransform)\n        {\n            pooledMatrix = matrixPool.get().identity();\n            parentTransform = updateTransformBackwards(target, pooledMatrix);\n        }\n        else\n        {\n            parentTransform = target.parent.worldTransform;\n        }\n    }\n    else\n    {\n        parentTransform = Matrix.IDENTITY;\n    }\n\n    // then collect them...\n\n    _getGlobalBounds(target, bounds, parentTransform, skipUpdateTransform);\n\n    if (pooledMatrix)\n    {\n        matrixPool.return(pooledMatrix);\n    }\n\n    if (!bounds.isValid)\n    {\n        bounds.set(0, 0, 0, 0);\n    }\n\n    return bounds;\n}\n\nexport function _getGlobalBounds(\n    target: Container,\n    bounds: Bounds,\n    parentTransform: Matrix,\n    skipUpdateTransform: boolean,\n): void\n{\n    if (!target.visible || !target.measurable) return;\n\n    let worldTransform: Matrix;\n\n    if (!skipUpdateTransform)\n    {\n        target.updateLocalTransform();\n\n        worldTransform = matrixPool.get();\n\n        worldTransform.appendFrom(target.localTransform, parentTransform);\n    }\n    else\n    {\n        worldTransform = target.worldTransform;\n    }\n\n    const parentBounds = bounds;\n    const preserveBounds = !!target.effects.length;\n\n    if (preserveBounds)\n    {\n        bounds = boundsPool.get().clear();\n    }\n\n    if (target.boundsArea)\n    {\n        bounds.addRect(target.boundsArea, worldTransform);\n    }\n    else\n    {\n        if ((target as Renderable).addBounds)\n        {\n            // save a copy\n            bounds.matrix = worldTransform;\n\n            (target as Renderable).addBounds(bounds);\n        }\n\n        for (let i = 0; i < target.children.length; i++)\n        {\n            _getGlobalBounds(target.children[i], bounds, worldTransform, skipUpdateTransform);\n        }\n    }\n\n    if (preserveBounds)\n    {\n        for (let i = 0; i < target.effects.length; i++)\n        {\n            target.effects[i].addBounds?.(bounds);\n        }\n\n        parentBounds.addBounds(bounds, Matrix.IDENTITY);\n\n        boundsPool.return(bounds);\n    }\n\n    if (!skipUpdateTransform)\n    {\n        matrixPool.return(worldTransform);\n    }\n}\n\nexport function updateTransformBackwards(target: Container, parentTransform: Matrix)\n{\n    const parent = target.parent;\n\n    if (parent)\n    {\n        updateTransformBackwards(parent, parentTransform);\n\n        parent.updateLocalTransform();\n\n        parentTransform.append(parent.localTransform);\n    }\n\n    return parentTransform;\n}\n"],"names":[],"mappings":"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"}