{"version":3,"file":"toLocalGlobalMixin.mjs","sources":["../../../../src/scene/container/container-mixins/toLocalGlobalMixin.ts"],"sourcesContent":["import { Point } from '../../../maths/point/Point';\nimport { matrixPool } from '../bounds/utils/matrixAndBoundsPool';\n\nimport type { PointData } from '../../../maths/point/PointData';\nimport type { Container } from '../Container';\n\n/**\n * Interface for a mixin that provides methods to convert between local and global coordinates.\n * This mixin allows you to get the global position of a container,\n * convert a point from local to global coordinates,\n * and convert a point from global to local coordinates.\n *\n * It includes methods to optimize performance by using cached matrices when available.\n * @category scene\n * @advanced\n */\nexport interface ToLocalGlobalMixin\n{\n    /**\n     * Returns the global position of the container, taking into account the container hierarchy.\n     * @example\n     * ```ts\n     * // Basic position check\n     * const globalPos = sprite.getGlobalPosition();\n     * console.log(`Global: (${globalPos.x}, ${globalPos.y})`);\n     *\n     * // Reuse point object\n     * const point = new Point();\n     * sprite.getGlobalPosition(point);\n     *\n     * // Skip transform update for performance\n     * const fastPos = container.getGlobalPosition(undefined, true);\n     * ```\n     * @param {Point} point - The optional point to write the global value to\n     * @param {boolean} skipUpdate - Should we skip the update transform\n     * @returns The updated point\n     * @see {@link Container#toGlobal} For converting specific points\n     * @see {@link Container#toLocal} For converting to local space\n     */\n    getGlobalPosition(point?: Point, skipUpdate?: boolean): Point;\n    /**\n     * Calculates the global position of a point relative to this container.\n     * Takes into account the container hierarchy and transforms.\n     * @example\n     * ```ts\n     * // Basic point conversion\n     * const localPoint = { x: 10, y: 20 };\n     * const globalPoint = container.toGlobal(localPoint);\n     *\n     * // With point reuse\n     * const reusePoint = new Point();\n     * container.toGlobal(localPoint, reusePoint);\n     *\n     * // Performance optimization\n     * const fastPoint = container.toGlobal(\n     *     { x: 50, y: 50 },\n     *     undefined,\n     *     true // Skip transform update\n     * );\n     * ```\n     * @param {PointData} position - The local point to convert\n     * @param {P} point - Optional point to store the result\n     * @param {boolean} skipUpdate - Whether to skip transform updates\n     * @returns The global position\n     * @see {@link Container#toLocal} For reverse conversion\n     * @see {@link Container#getGlobalPosition} For container position\n     */\n    toGlobal<P extends PointData = Point>(position: PointData, point?: P, skipUpdate?: boolean): P;\n    /**\n     * Calculates the local position of the container relative to another point.\n     * Converts coordinates from any coordinate space to this container's local coordinate space.\n     * @example\n     * ```ts\n     * // Basic coordinate conversion\n     * const worldPoint = { x: 100, y: 100 };\n     * const localPos = container.toLocal(worldPoint);\n     *\n     * // Convert from another container\n     * const fromSprite = new Sprite(texture);\n     * fromSprite.position.set(50, 50);\n     * const pointInSprite = { x: 10, y: 10 };\n     * const localPoint = container.toLocal(pointInSprite, fromSprite);\n     *\n     * // With point reuse for performance\n     * const reusePoint = new Point();\n     * container.toLocal(worldPoint, undefined, reusePoint);\n     *\n     * // Skip transform update for static objects\n     * const fastLocal = container.toLocal(\n     *     worldPoint,\n     *     undefined,\n     *     undefined,\n     *     true\n     * );\n     * ```\n     * @param {PointData} position - The world origin to calculate from\n     * @param {Container} from - The Container to calculate the global position from\n     * @param {P} point - A Point object in which to store the value\n     * @param {boolean} skipUpdate - Should we skip the update transform\n     * @returns A point object representing the position in local space\n     * @see {@link Container#toGlobal} For reverse conversion\n     * @see {@link Container#getGlobalPosition} For container position\n     */\n    toLocal<P extends PointData = Point>(position: PointData, from?: Container, point?: P, skipUpdate?: boolean): P;\n}\n\n/** @internal */\nexport const toLocalGlobalMixin: Partial<Container> = {\n    getGlobalPosition(point: Point = new Point(), skipUpdate = false): Point\n    {\n        if (this.parent)\n        {\n            this.parent.toGlobal(this._position, point, skipUpdate);\n        }\n        else\n        {\n            point.x = this._position.x;\n            point.y = this._position.y;\n        }\n\n        return point;\n    },\n\n    toGlobal<P extends PointData = Point>(position: PointData, point?: P, skipUpdate = false): P\n    {\n        const globalMatrix = this.getGlobalTransform(matrixPool.get(), skipUpdate);\n\n        // simply apply the matrix..\n        point = globalMatrix.apply(position, point);\n\n        matrixPool.return(globalMatrix);\n\n        return point;\n    },\n\n    toLocal<P extends PointData = Point>(position: PointData, from?: Container, point?: P, skipUpdate?: boolean): P\n    {\n        if (from)\n        {\n            position = from.toGlobal(position, point, skipUpdate);\n        }\n\n        const globalMatrix = this.getGlobalTransform(matrixPool.get(), skipUpdate);\n\n        // simply apply the matrix..\n        point = globalMatrix.applyInverse(position, point);\n\n        matrixPool.return(globalMatrix);\n\n        return point;\n    }\n} as Container;\n"],"names":[],"mappings":";;;;AA2GO,MAAM,kBAAA,GAAyC;AAAA,EAClD,kBAAkB,KAAA,GAAe,IAAI,KAAA,EAAM,EAAG,aAAa,KAAA,EAC3D;AACI,IAAA,IAAI,KAAK,MAAA,EACT;AACI,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,OAAO,UAAU,CAAA;AAAA,IAC1D,CAAA,MAEA;AACI,MAAA,KAAA,CAAM,CAAA,GAAI,KAAK,SAAA,CAAU,CAAA;AACzB,MAAA,KAAA,CAAM,CAAA,GAAI,KAAK,SAAA,CAAU,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AAAA,EAEA,QAAA,CAAsC,QAAA,EAAqB,KAAA,EAAW,UAAA,GAAa,KAAA,EACnF;AACI,IAAA,MAAM,eAAe,IAAA,CAAK,kBAAA,CAAmB,UAAA,CAAW,GAAA,IAAO,UAAU,CAAA;AAGzE,IAAA,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,QAAA,EAAU,KAAK,CAAA;AAE1C,IAAA,UAAA,CAAW,OAAO,YAAY,CAAA;AAE9B,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AAAA,EAEA,OAAA,CAAqC,QAAA,EAAqB,IAAA,EAAkB,KAAA,EAAW,UAAA,EACvF;AACI,IAAA,IAAI,IAAA,EACJ;AACI,MAAA,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,KAAA,EAAO,UAAU,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,eAAe,IAAA,CAAK,kBAAA,CAAmB,UAAA,CAAW,GAAA,IAAO,UAAU,CAAA;AAGzE,IAAA,KAAA,GAAQ,YAAA,CAAa,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA;AAEjD,IAAA,UAAA,CAAW,OAAO,YAAY,CAAA;AAE9B,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;;"}