/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* mat4_inverse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/12/23 20:06:45 by gbrochar #+# #+# */ /* Updated: 2020/12/23 20:26:07 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "mat4.h" #include "scop.h" t_mat4 mat4_inverse(t_mat4 m) { t_mat4 ret; double b00 = m.data[0] * m.data[5] - m.data[1] * m.data[4]; double b01 = m.data[0] * m.data[6] - m.data[2] * m.data[4]; double b02 = m.data[0] * m.data[7] - m.data[3] * m.data[4]; double b03 = m.data[1] * m.data[6] - m.data[2] * m.data[5]; double b04 = m.data[1] * m.data[7] - m.data[3] * m.data[5]; double b05 = m.data[2] * m.data[7] - m.data[3] * m.data[6]; double b06 = m.data[8] * m.data[13] - m.data[9] * m.data[12]; double b07 = m.data[8] * m.data[14] - m.data[10] * m.data[12]; double b08 = m.data[8] * m.data[15] - m.data[11] * m.data[12]; double b09 = m.data[9] * m.data[14] - m.data[10] * m.data[13]; double b10 = m.data[9] * m.data[15] - m.data[11] * m.data[13]; double b11 = m.data[10] * m.data[15] - m.data[11] * m.data[14]; double det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (det - EPSILON < 0 && det + EPSILON > 0) return (mat4_identity()); det = 1.0 / det; ret.data[0] = (m.data[5] * b11 - m.data[6] * b10 + m.data[7] * b09) * det; ret.data[1] = (m.data[2] * b10 - m.data[1] * b11 + m.data[3] * b09) * det; ret.data[2] = (m.data[13] * b05 - m.data[14] * b04 + m.data[15] * b03) * det; ret.data[3] = (m.data[10] * b04 - m.data[9] * b05 + m.data[11] * b03) * det; ret.data[4] = (m.data[6] * b08 - m.data[4] * b11 + m.data[7] * b07) * det; ret.data[5] = (m.data[0] * b11 - m.data[2] * b08 + m.data[3] * b07) * det; ret.data[6] = (m.data[14] * b02 - m.data[12] * b05 + m.data[15] * b01) * det; ret.data[7] = (m.data[8] * b05 - m.data[10] * b02 + m.data[11] * b01) * det; ret.data[8] = (m.data[4] * b10 - m.data[5] * b08 + m.data[7] * b06) * det; ret.data[9] = (m.data[1] * b08 - m.data[0] * b10 + m.data[3] * b06) * det; ret.data[10] = (m.data[12] * b04 - m.data[13] * b02 + m.data[15] * b00) * det; ret.data[11] = (m.data[9] * b02 - m.data[8] * b04 + m.data[11] * b00) * det; ret.data[12] = (m.data[5] * b07 - m.data[4] * b09 + m.data[6] * b06) * det; ret.data[13] = (m.data[0] * b09 - m.data[1] * b07 + m.data[2] * b06) * det; ret.data[14] = (m.data[13] * b01 - m.data[12] * b03 + m.data[14] * b00) * det; ret.data[15] = (m.data[8] * b03 - m.data[9] * b01 + m.data[10] * b00) * det; return (ret); }