/**
* Multiplies the two matrices.
*
* @param {mat4} out - receiving matrix
* @param {mat4} a - first operand
* @param {mat4} b - second operand
* @returns {mat4} out
* @alias module:modeling/maths/mat4.multiply
*/
const multiply = (out, a, b) => {
const a00 = a[0]
const a01 = a[1]
const a02 = a[2]
const a03 = a[3]
const a10 = a[4]
const a11 = a[5]
const a12 = a[6]
const a13 = a[7]
const a20 = a[8]
const a21 = a[9]
const a22 = a[10]
const a23 = a[11]
const a30 = a[12]
const a31 = a[13]
const a32 = a[14]
const a33 = a[15]
// Cache only the current line of the second matrix
let b0 = b[0]
let b1 = b[1]
let b2 = b[2]
let b3 = b[3]
out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30
out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31
out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32
out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33
b0 = b[4]
b1 = b[5]
b2 = b[6]
b3 = b[7]
out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30
out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31
out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32
out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33
b0 = b[8]
b1 = b[9]
b2 = b[10]
b3 = b[11]
out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30
out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31
out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32
out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33
b0 = b[12]
b1 = b[13]
b2 = b[14]
b3 = b[15]
out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30
out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31
out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32
out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33
return out
}
module.exports = multiply