scop/src/mat4_inverse.c

55 lines
3.1 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* mat4_inverse.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}