{"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
(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
(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 /**\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\nif (process.env.DEBUG)\n{\n Matrix.prototype.toString = function toString(): string\n {\n return `[@pixi/math:Matrix a=${this.a} b=${this.b} c=${this.c} d=${this.d} tx=${this.tx} ty=${this.ty}]`;\n };\n}\n"],"names":[],"mappings":"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"}