{"version":3,"file":"Matrix.mjs","sources":["../src/Matrix.ts"],"sourcesContent":["import { PI_2 } from './const';\nimport { Point } from './Point';\n\nimport type { IPointData } from './IPointData';\nimport type { Transform } from './Transform';\n\n/**\n * The PixiJS Matrix as a class makes it a lot faster.\n *\n * Here is a representation of it:\n * ```\n * | a | c | tx|\n * | b | d | ty|\n * | 0 | 0 | 1 |\n * ```\n * @memberof PIXI\n */\nexport class Matrix\n{\n    /** @default 1 */\n    public a: number;\n\n    /** @default 0 */\n    public b: number;\n\n    /** @default 0 */\n    public c: number;\n\n    /** @default 1 */\n    public d: number;\n\n    /** @default 0 */\n    public tx: number;\n\n    /** @default 0 */\n    public ty: number;\n\n    public array: Float32Array | null = null;\n\n    /**\n     * @param a - x scale\n     * @param b - y skew\n     * @param c - x skew\n     * @param d - y scale\n     * @param tx - x translation\n     * @param ty - y translation\n     */\n    constructor(a = 1, b = 0, c = 0, d = 1, tx = 0, ty = 0)\n    {\n        this.a = a;\n        this.b = b;\n        this.c = c;\n        this.d = d;\n        this.tx = tx;\n        this.ty = ty;\n    }\n\n    /**\n     * Creates a Matrix object based on the given array. The Element to Matrix mapping order is as follows:\n     *\n     * a = array[0]\n     * b = array[1]\n     * c = array[3]\n     * d = array[4]\n     * tx = array[2]\n     * ty = array[5]\n     * @param array - The array that the matrix will be populated from.\n     */\n    fromArray(array: number[]): void\n    {\n        this.a = array[0];\n        this.b = array[1];\n        this.c = array[3];\n        this.d = array[4];\n        this.tx = array[2];\n        this.ty = array[5];\n    }\n\n    /**\n     * Sets the matrix properties.\n     * @param a - Matrix component\n     * @param b - Matrix component\n     * @param c - Matrix component\n     * @param d - Matrix component\n     * @param tx - Matrix component\n     * @param ty - Matrix component\n     * @returns This matrix. Good for chaining method calls.\n     */\n    set(a: number, b: number, c: number, d: number, tx: number, ty: number): this\n    {\n        this.a = a;\n        this.b = b;\n        this.c = c;\n        this.d = d;\n        this.tx = tx;\n        this.ty = ty;\n\n        return this;\n    }\n\n    /**\n     * Creates an array from the current Matrix object.\n     * @param transpose - Whether we need to transpose the matrix or not\n     * @param [out=new Float32Array(9)] - If provided the array will be assigned to out\n     * @returns The newly created array which contains the matrix\n     */\n    toArray(transpose: boolean, out?: Float32Array): Float32Array\n    {\n        if (!this.array)\n        {\n            this.array = new Float32Array(9);\n        }\n\n        const array = out || this.array;\n\n        if (transpose)\n        {\n            array[0] = this.a;\n            array[1] = this.b;\n            array[2] = 0;\n            array[3] = this.c;\n            array[4] = this.d;\n            array[5] = 0;\n            array[6] = this.tx;\n            array[7] = this.ty;\n            array[8] = 1;\n        }\n        else\n        {\n            array[0] = this.a;\n            array[1] = this.c;\n            array[2] = this.tx;\n            array[3] = this.b;\n            array[4] = this.d;\n            array[5] = this.ty;\n            array[6] = 0;\n            array[7] = 0;\n            array[8] = 1;\n        }\n\n        return array;\n    }\n\n    /**\n     * Get a new position with the current transformation applied.\n     * Can be used to go from a child's coordinate space to the world coordinate space. (e.g. rendering)\n     * @param pos - The origin\n     * @param {PIXI.Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)\n     * @returns {PIXI.Point} The new point, transformed through this matrix\n     */\n    apply<P extends IPointData = Point>(pos: IPointData, newPos?: P): P\n    {\n        newPos = (newPos || new Point()) as P;\n\n        const x = pos.x;\n        const y = pos.y;\n\n        newPos.x = (this.a * x) + (this.c * y) + this.tx;\n        newPos.y = (this.b * x) + (this.d * y) + this.ty;\n\n        return newPos;\n    }\n\n    /**\n     * Get a new position with the inverse of the current transformation applied.\n     * Can be used to go from the world coordinate space to a child's coordinate space. (e.g. input)\n     * @param pos - The origin\n     * @param {PIXI.Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)\n     * @returns {PIXI.Point} The new point, inverse-transformed through this matrix\n     */\n    applyInverse<P extends IPointData = Point>(pos: IPointData, newPos?: P): P\n    {\n        newPos = (newPos || new Point()) as P;\n\n        const id = 1 / ((this.a * this.d) + (this.c * -this.b));\n\n        const x = pos.x;\n        const y = pos.y;\n\n        newPos.x = (this.d * id * x) + (-this.c * id * y) + (((this.ty * this.c) - (this.tx * this.d)) * id);\n        newPos.y = (this.a * id * y) + (-this.b * id * x) + (((-this.ty * this.a) + (this.tx * this.b)) * id);\n\n        return newPos;\n    }\n\n    /**\n     * Translates the matrix on the x and y.\n     * @param x - How much to translate x by\n     * @param y - How much to translate y by\n     * @returns This matrix. Good for chaining method calls.\n     */\n    translate(x: number, y: number): this\n    {\n        this.tx += x;\n        this.ty += y;\n\n        return this;\n    }\n\n    /**\n     * Applies a scale transformation to the matrix.\n     * @param x - The amount to scale horizontally\n     * @param y - The amount to scale vertically\n     * @returns This matrix. Good for chaining method calls.\n     */\n    scale(x: number, y: number): this\n    {\n        this.a *= x;\n        this.d *= y;\n        this.c *= x;\n        this.b *= y;\n        this.tx *= x;\n        this.ty *= y;\n\n        return this;\n    }\n\n    /**\n     * Applies a rotation transformation to the matrix.\n     * @param angle - The angle in radians.\n     * @returns This matrix. Good for chaining method calls.\n     */\n    rotate(angle: number): this\n    {\n        const cos = Math.cos(angle);\n        const sin = Math.sin(angle);\n\n        const a1 = this.a;\n        const c1 = this.c;\n        const tx1 = this.tx;\n\n        this.a = (a1 * cos) - (this.b * sin);\n        this.b = (a1 * sin) + (this.b * cos);\n        this.c = (c1 * cos) - (this.d * sin);\n        this.d = (c1 * sin) + (this.d * cos);\n        this.tx = (tx1 * cos) - (this.ty * sin);\n        this.ty = (tx1 * sin) + (this.ty * cos);\n\n        return this;\n    }\n\n    /**\n     * Appends the given Matrix to this Matrix.\n     * @param matrix - The matrix to append.\n     * @returns This matrix. Good for chaining method calls.\n     */\n    append(matrix: Matrix): this\n    {\n        const a1 = this.a;\n        const b1 = this.b;\n        const c1 = this.c;\n        const d1 = this.d;\n\n        this.a = (matrix.a * a1) + (matrix.b * c1);\n        this.b = (matrix.a * b1) + (matrix.b * d1);\n        this.c = (matrix.c * a1) + (matrix.d * c1);\n        this.d = (matrix.c * b1) + (matrix.d * d1);\n\n        this.tx = (matrix.tx * a1) + (matrix.ty * c1) + this.tx;\n        this.ty = (matrix.tx * b1) + (matrix.ty * d1) + this.ty;\n\n        return this;\n    }\n\n    /**\n     * Sets the matrix based on all the available properties\n     * @param x - Position on the x axis\n     * @param y - Position on the y axis\n     * @param pivotX - Pivot on the x axis\n     * @param pivotY - Pivot on the y axis\n     * @param scaleX - Scale on the x axis\n     * @param scaleY - Scale on the y axis\n     * @param rotation - Rotation in radians\n     * @param skewX - Skew on the x axis\n     * @param skewY - Skew on the y axis\n     * @returns This matrix. Good for chaining method calls.\n     */\n    setTransform(x: number, y: number, pivotX: number, pivotY: number, scaleX: number,\n        scaleY: number, rotation: number, skewX: number, skewY: number): this\n    {\n        this.a = Math.cos(rotation + skewY) * scaleX;\n        this.b = Math.sin(rotation + skewY) * scaleX;\n        this.c = -Math.sin(rotation - skewX) * scaleY;\n        this.d = Math.cos(rotation - skewX) * scaleY;\n\n        this.tx = x - ((pivotX * this.a) + (pivotY * this.c));\n        this.ty = y - ((pivotX * this.b) + (pivotY * this.d));\n\n        return this;\n    }\n\n    /**\n     * Prepends the given Matrix to this Matrix.\n     * @param matrix - The matrix to prepend\n     * @returns This matrix. Good for chaining method calls.\n     */\n    prepend(matrix: Matrix): this\n    {\n        const tx1 = this.tx;\n\n        if (matrix.a !== 1 || matrix.b !== 0 || matrix.c !== 0 || matrix.d !== 1)\n        {\n            const a1 = this.a;\n            const c1 = this.c;\n\n            this.a = (a1 * matrix.a) + (this.b * matrix.c);\n            this.b = (a1 * matrix.b) + (this.b * matrix.d);\n            this.c = (c1 * matrix.a) + (this.d * matrix.c);\n            this.d = (c1 * matrix.b) + (this.d * matrix.d);\n        }\n\n        this.tx = (tx1 * matrix.a) + (this.ty * matrix.c) + matrix.tx;\n        this.ty = (tx1 * matrix.b) + (this.ty * matrix.d) + matrix.ty;\n\n        return this;\n    }\n\n    /**\n     * Decomposes the matrix (x, y, scaleX, scaleY, and rotation) and sets the properties on to a transform.\n     * @param transform - The transform to apply the properties to.\n     * @returns The transform with the newly applied properties\n     */\n    decompose(transform: Transform): Transform\n    {\n        // sort out rotation / skew..\n        const a = this.a;\n        const b = this.b;\n        const c = this.c;\n        const d = this.d;\n        const pivot = transform.pivot;\n\n        const skewX = -Math.atan2(-c, d);\n        const skewY = Math.atan2(b, a);\n\n        const delta = Math.abs(skewX + skewY);\n\n        if (delta < 0.00001 || Math.abs(PI_2 - delta) < 0.00001)\n        {\n            transform.rotation = skewY;\n            transform.skew.x = transform.skew.y = 0;\n        }\n        else\n        {\n            transform.rotation = 0;\n            transform.skew.x = skewX;\n            transform.skew.y = skewY;\n        }\n\n        // next set scale\n        transform.scale.x = Math.sqrt((a * a) + (b * b));\n        transform.scale.y = Math.sqrt((c * c) + (d * d));\n\n        // next set position\n        transform.position.x = this.tx + ((pivot.x * a) + (pivot.y * c));\n        transform.position.y = this.ty + ((pivot.x * b) + (pivot.y * d));\n\n        return transform;\n    }\n\n    /**\n     * Inverts this matrix\n     * @returns This matrix. Good for chaining method calls.\n     */\n    invert(): this\n    {\n        const a1 = this.a;\n        const b1 = this.b;\n        const c1 = this.c;\n        const d1 = this.d;\n        const tx1 = this.tx;\n        const n = (a1 * d1) - (b1 * c1);\n\n        this.a = d1 / n;\n        this.b = -b1 / n;\n        this.c = -c1 / n;\n        this.d = a1 / n;\n        this.tx = ((c1 * this.ty) - (d1 * tx1)) / n;\n        this.ty = -((a1 * this.ty) - (b1 * tx1)) / n;\n\n        return this;\n    }\n\n    /**\n     * Resets this Matrix to an identity (default) matrix.\n     * @returns This matrix. Good for chaining method calls.\n     */\n    identity(): this\n    {\n        this.a = 1;\n        this.b = 0;\n        this.c = 0;\n        this.d = 1;\n        this.tx = 0;\n        this.ty = 0;\n\n        return this;\n    }\n\n    /**\n     * Creates a new Matrix object with the same values as this one.\n     * @returns A copy of this matrix. Good for chaining method calls.\n     */\n    clone(): Matrix\n    {\n        const matrix = new Matrix();\n\n        matrix.a = this.a;\n        matrix.b = this.b;\n        matrix.c = this.c;\n        matrix.d = this.d;\n        matrix.tx = this.tx;\n        matrix.ty = this.ty;\n\n        return matrix;\n    }\n\n    /**\n     * Changes the values of the given matrix to be the same as the ones in this matrix\n     * @param matrix - The matrix to copy to.\n     * @returns The matrix given in parameter with its values updated.\n     */\n    copyTo(matrix: Matrix): Matrix\n    {\n        matrix.a = this.a;\n        matrix.b = this.b;\n        matrix.c = this.c;\n        matrix.d = this.d;\n        matrix.tx = this.tx;\n        matrix.ty = this.ty;\n\n        return matrix;\n    }\n\n    /**\n     * Changes the values of the matrix to be the same as the ones in given matrix\n     * @param {PIXI.Matrix} matrix - The matrix to copy from.\n     * @returns {PIXI.Matrix} this\n     */\n    copyFrom(matrix: Matrix): this\n    {\n        this.a = matrix.a;\n        this.b = matrix.b;\n        this.c = matrix.c;\n        this.d = matrix.d;\n        this.tx = matrix.tx;\n        this.ty = matrix.ty;\n\n        return this;\n    }\n\n    // #if _DEBUG\n    toString(): string\n    {\n        return `[pixijs/math:Matrix a=${this.a} b=${this.b} c=${this.c} d=${this.d} tx=${this.tx} ty=${this.ty}]`;\n    }\n    // #endif\n\n    /**\n     * A default (identity) matrix\n     * @readonly\n     */\n    static get IDENTITY(): Matrix\n    {\n        return new Matrix();\n    }\n\n    /**\n     * A temp matrix\n     * @readonly\n     */\n    static get TEMP_MATRIX(): Matrix\n    {\n        return new Matrix();\n    }\n}\n"],"names":[],"mappings":"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"}