{"version":3,"file":"Matrix.mjs","sources":["../../../src/maths/matrix/Matrix.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { PI_2 } from '../misc/const';\nimport { Point } from '../point/Point';\n\nimport type { PointData } from '../point/PointData';\n\ninterface TransformableObject\n{\n position: PointData;\n scale: PointData;\n pivot: PointData;\n skew: PointData;\n rotation: number;\n}\n\n/**\n * A fast matrix for 2D transformations.\n * ```js\n * | a | c | tx|\n * | b | d | ty|\n * | 0 | 0 | 1 |\n * ```\n * @memberof maths\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 /** An array of the current matrix. Only populated when `toArray` is called */\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 public 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 public 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 public 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 {Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)\n * @returns {Point} The new point, transformed through this matrix\n */\n public apply

(pos: PointData, 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 {Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)\n * @returns {Point} The new point, inverse-transformed through this matrix\n */\n public applyInverse

(pos: PointData, newPos?: P): P\n {\n newPos = (newPos || new Point()) as P;\n\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const tx = this.tx;\n const ty = this.ty;\n\n const id = 1 / ((a * d) + (c * -b));\n\n const x = pos.x;\n const y = pos.y;\n\n newPos.x = (d * id * x) + (-c * id * y) + (((ty * c) - (tx * d)) * id);\n newPos.y = (a * id * y) + (-b * id * x) + (((-ty * a) + (tx * 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 public 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 public 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 public 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 public 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 * Appends two matrix's and sets the result to this matrix. AB = A * B\n * @param a - The matrix to append.\n * @param b - The matrix to append.\n * @returns This matrix. Good for chaining method calls.\n */\n public appendFrom(a: Matrix, b: Matrix): this\n {\n const a1 = a.a;\n const b1 = a.b;\n const c1 = a.c;\n const d1 = a.d;\n const tx = a.tx;\n const ty = a.ty;\n\n const a2 = b.a;\n const b2 = b.b;\n const c2 = b.c;\n const d2 = b.d;\n\n this.a = (a1 * a2) + (b1 * c2);\n this.b = (a1 * b2) + (b1 * d2);\n this.c = (c1 * a2) + (d1 * c2);\n this.d = (c1 * b2) + (d1 * d2);\n this.tx = (tx * a2) + (ty * c2) + b.tx;\n this.ty = (tx * b2) + (ty * d2) + b.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 public 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 public 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 public decompose(transform: TransformableObject): TransformableObject\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 public 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 /** Checks if this matrix is an identity matrix */\n public isIdentity(): boolean\n {\n return this.a === 1 && this.b === 0 && this.c === 0 && this.d === 1 && this.tx === 0 && this.ty === 0;\n }\n\n /**\n * Resets this Matrix to an identity (default) matrix.\n * @returns This matrix. Good for chaining method calls.\n */\n public 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 public 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 public 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 matrix - The matrix to copy from.\n * @returns this\n */\n public 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 * check to see if two matrices are the same\n * @param matrix - The matrix to compare to.\n */\n public equals(matrix: Matrix)\n {\n return matrix.a === this.a && matrix.b === this.b\n && matrix.c === this.c && matrix.d === this.d\n && matrix.tx === this.tx && matrix.ty === this.ty;\n }\n\n // #if _DEBUG\n public toString(): string\n {\n return `[pixi.js: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 *\n * This is a shared object, if you want to modify it consider creating a new `Matrix`\n * @readonly\n */\n static get IDENTITY(): Readonly\n {\n return identityMatrix.identity();\n }\n\n /**\n * A static Matrix that can be used to avoid creating new objects.\n * Will always ensure the matrix is reset to identity when requested.\n * Use this object for fast but temporary calculations, as it may be mutated later on.\n * This is a different object to the `IDENTITY` object and so can be modified without changing `IDENTITY`.\n * @readonly\n */\n static get shared(): Matrix\n {\n return tempMatrix.identity();\n }\n}\n\nconst tempMatrix = new Matrix();\nconst identityMatrix = new Matrix();\n"],"names":[],"mappings":"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"}