function mat4() { return [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] } function orthographic(pLeft, pRight, pBottom, pTop) { const lResult = mat4(); lResult[0] = 2.0 / (pRight - pLeft); lResult[5] = 2.0 / (pTop - pBottom); lResult[10] = 1.0; lResult[12] = -(pRight + pLeft) / (pRight - pLeft); lResult[13] = -(pTop + pBottom) / (pTop - pBottom); return lResult; } function translateMatrix(m, x, y, z) { m = [...m]; m[12] += x; m[13] += y; m[14] += z; return m; } function rotateMatrix2d(m, angle) { m = [...m]; m[0] = Math.cos(angle); m[1] = -Math.sin(angle); m[4] = Math.sin(angle); m[5] = Math.cos(angle); return m; } function scaleMatrix(m, x, y, z) { m = [...m]; m[0] = m[0] * x; m[5] = m[5] * y; m[10] = m[10] * z; return m; } function multMat4ByVec2(matrix, vec) { var lInnerVec = {...vec}; lInnerVec.z = 0.0; lInnerVec.w = 1.0; return { x: lInnerVec.x * matrix[0] + lInnerVec.y * matrix[4] + lInnerVec.z * matrix[8] + lInnerVec.w * matrix[12], y: lInnerVec.x * matrix[1] + lInnerVec.y * matrix[5] + lInnerVec.z * matrix[9] + lInnerVec.w * matrix[13] }; } function multMat4ByVec4(matrix, vec) { return { x: vec.x * matrix[0] + vec.y * matrix[4] + vec.z * matrix[8] + vec.w * matrix[12], y: vec.x * matrix[1] + vec.y * matrix[5] + vec.z * matrix[9] + vec.w * matrix[13], z: vec.x * matrix[2] + vec.y * matrix[6] + vec.z * matrix[10] + vec.w * matrix[14], w: vec.x * matrix[3] + vec.y * matrix[7] + vec.z * matrix[11] + vec.w * matrix[15] }; }