import mat3 from '../glmatrix/mat3';
/**
* @constructor
* @alias clay.Matrix3
*/
var Matrix3 = function () {
/**
* Storage of Matrix3
* @name array
* @type {Float32Array}
* @memberOf clay.Matrix3#
*/
this.array = mat3.create();
/**
* @name _dirty
* @type {boolean}
* @memberOf clay.Matrix3#
*/
this._dirty = true;
};
Matrix3.prototype = {
constructor: Matrix3,
/**
* Set components from array
* @param {Float32Array|number[]} arr
*/
setArray: function (arr) {
for (var i = 0; i < this.array.length; i++) {
this.array[i] = arr[i];
}
this._dirty = true;
return this;
},
/**
* Calculate the adjugate of self, in-place
* @return {clay.Matrix3}
*/
adjoint: function () {
mat3.adjoint(this.array, this.array);
this._dirty = true;
return this;
},
/**
* Clone a new Matrix3
* @return {clay.Matrix3}
*/
clone: function () {
return (new Matrix3()).copy(this);
},
/**
* Copy from b
* @param {clay.Matrix3} b
* @return {clay.Matrix3}
*/
copy: function (b) {
mat3.copy(this.array, b.array);
this._dirty = true;
return this;
},
/**
* Calculate matrix determinant
* @return {number}
*/
determinant: function () {
return mat3.determinant(this.array);
},
/**
* Copy the values from Matrix2d a
* @param {clay.Matrix2d} a
* @return {clay.Matrix3}
*/
fromMat2d: function (a) {
mat3.fromMat2d(this.array, a.array);
this._dirty = true;
return this;
},
/**
* Copies the upper-left 3x3 values of Matrix4
* @param {clay.Matrix4} a
* @return {clay.Matrix3}
*/
fromMat4: function (a) {
mat3.fromMat4(this.array, a.array);
this._dirty = true;
return this;
},
/**
* Calculates a rotation matrix from the given quaternion
* @param {clay.Quaternion} q
* @return {clay.Matrix3}
*/
fromQuat: function (q) {
mat3.fromQuat(this.array, q.array);
this._dirty = true;
return this;
},
/**
* Set to a identity matrix
* @return {clay.Matrix3}
*/
identity: function () {
mat3.identity(this.array);
this._dirty = true;
return this;
},
/**
* Invert self
* @return {clay.Matrix3}
*/
invert: function () {
mat3.invert(this.array, this.array);
this._dirty = true;
return this;
},
/**
* Alias for mutiply
* @param {clay.Matrix3} b
* @return {clay.Matrix3}
*/
mul: function (b) {
mat3.mul(this.array, this.array, b.array);
this._dirty = true;
return this;
},
/**
* Alias for multiplyLeft
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
mulLeft: function (a) {
mat3.mul(this.array, a.array, this.array);
this._dirty = true;
return this;
},
/**
* Multiply self and b
* @param {clay.Matrix3} b
* @return {clay.Matrix3}
*/
multiply: function (b) {
mat3.multiply(this.array, this.array, b.array);
this._dirty = true;
return this;
},
/**
* Multiply a and self, a is on the left
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
multiplyLeft: function (a) {
mat3.multiply(this.array, a.array, this.array);
this._dirty = true;
return this;
},
/**
* Rotate self by a given radian
* @param {number} rad
* @return {clay.Matrix3}
*/
rotate: function (rad) {
mat3.rotate(this.array, this.array, rad);
this._dirty = true;
return this;
},
/**
* Scale self by s
* @param {clay.Vector2} s
* @return {clay.Matrix3}
*/
scale: function (v) {
mat3.scale(this.array, this.array, v.array);
this._dirty = true;
return this;
},
/**
* Translate self by v
* @param {clay.Vector2} v
* @return {clay.Matrix3}
*/
translate: function (v) {
mat3.translate(this.array, this.array, v.array);
this._dirty = true;
return this;
},
/**
* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix
* @param {clay.Matrix4} a
*/
normalFromMat4: function (a) {
mat3.normalFromMat4(this.array, a.array);
this._dirty = true;
return this;
},
/**
* Transpose self, in-place.
* @return {clay.Matrix2}
*/
transpose: function () {
mat3.transpose(this.array, this.array);
this._dirty = true;
return this;
},
toString: function () {
return '[' + Array.prototype.join.call(this.array, ',') + ']';
},
toArray: function () {
return Array.prototype.slice.call(this.array);
}
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
Matrix3.adjoint = function (out, a) {
mat3.adjoint(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
Matrix3.copy = function (out, a) {
mat3.copy(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} a
* @return {number}
*/
Matrix3.determinant = function (a) {
return mat3.determinant(a.array);
};
/**
* @param {clay.Matrix3} out
* @return {clay.Matrix3}
*/
Matrix3.identity = function (out) {
mat3.identity(out.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
Matrix3.invert = function (out, a) {
mat3.invert(out.array, a.array);
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @param {clay.Matrix3} b
* @return {clay.Matrix3}
*/
Matrix3.mul = function (out, a, b) {
mat3.mul(out.array, a.array, b.array);
out._dirty = true;
return out;
};
/**
* @function
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @param {clay.Matrix3} b
* @return {clay.Matrix3}
*/
Matrix3.multiply = Matrix3.mul;
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix2d} a
* @return {clay.Matrix3}
*/
Matrix3.fromMat2d = function (out, a) {
mat3.fromMat2d(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix4} a
* @return {clay.Matrix3}
*/
Matrix3.fromMat4 = function (out, a) {
mat3.fromMat4(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Quaternion} a
* @return {clay.Matrix3}
*/
Matrix3.fromQuat = function (out, q) {
mat3.fromQuat(out.array, q.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix4} a
* @return {clay.Matrix3}
*/
Matrix3.normalFromMat4 = function (out, a) {
mat3.normalFromMat4(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @param {number} rad
* @return {clay.Matrix3}
*/
Matrix3.rotate = function (out, a, rad) {
mat3.rotate(out.array, a.array, rad);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @param {clay.Vector2} v
* @return {clay.Matrix3}
*/
Matrix3.scale = function (out, a, v) {
mat3.scale(out.array, a.array, v.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @return {clay.Matrix3}
*/
Matrix3.transpose = function (out, a) {
mat3.transpose(out.array, a.array);
out._dirty = true;
return out;
};
/**
* @param {clay.Matrix3} out
* @param {clay.Matrix3} a
* @param {clay.Vector2} v
* @return {clay.Matrix3}
*/
Matrix3.translate = function (out, a, v) {
mat3.translate(out.array, a.array, v.array);
out._dirty = true;
return out;
};
export default Matrix3;