int mat4_inverse(mat4 &c, const mat4 &a)
{
	real determinant = mat4_determinant(a);
	if (determinant == 0) {
		return -1;
	}

	mat4 adjoint;
	mat4_adjoint(adjoint, a);

	mat4_div_scalar(c, adjoint, determinant);

	return 0;
}
Example #2
0
inline void mat4_inv(const Matrix4 *in, Matrix4 *out) {
    float det = mat4_determinant(in);
    float data[16];
    data[0] = (in->f * in->k * in->p + in->g * in->l * in->n + in->h * in->j * in->o - in->f *
            in->l * in->o - in->g * in->j * in->p - in->h * in->k * in->n) / det,
            data[1] = (in->b * in->l * in->o + in->c * in->j * in->p + in->d * in->k * in->n - in->b *
            in->k * in->p - in->c * in->l * in->n - in->d * in->j * in->o) / det,
            data[2] = (in->b * in->g * in->p + in->c * in->h * in->n + in->d * in->f * in->o - in->b *
            in->h * in->o - in->c * in->f * in->p - in->d * in->g * in->n) / det,
            data[3] = (in->b * in->h * in->k + in->c * in->f * in->l + in->d * in->g * in->j - in->b *
            in->g * in->l - in->c * in->h * in->j - in->d * in->f * in->k) / det,
            data[4] = (in->e * in->l * in->o + in->h * in->k * in->m + in->g * in->i * in->p - in->e *
            in->k * in->p - in->g * in->l * in->m - in->h * in->i * in->o) / det,
            data[5] = (in->a * in->k * in->p + in->c * in->l * in->m + in->d * in->i * in->o - in->a *
            in->l * in->o - in->c * in->i * in->p - in->d * in->k * in->m) / det,
            data[6] = (in->a * in->h * in->o + in->c * in->e * in->p + in->d * in->g * in->m - in->a *
            in->g * in->p - in->c * in->h * in->m - in->d * in->e * in->o) / det,
            data[7] = (in->a * in->g * in->l + in->c * in->h * in->i + in->d * in->e * in->k - in->a *
            in->h * in->k - in->c * in->e * in->l - in->d * in->g * in->i) / det,
            data[8] = (in->e * in->j * in->p + in->f * in->l * in->m + in->h * in->i * in->n - in->e *
            in->l * in->n - in->f * in->i * in->p - in->h * in->j * in->m) / det,
            data[9] = (in->a * in->l * in->n + in->b * in->i * in->p + in->d * in->j * in->m - in->a *
            in->j * in->p - in->b * in->l * in->m - in->d * in->i * in->n) / det,
            data[10] = (in->a * in->f * in->p + in->b * in->h * in->m + in->d * in->e * in->n - in->a *
            in->h * in->n - in->b * in->e * in->p - in->d * in->f * in->m) / det,
            data[11] = (in->a * in->h * in->j + in->b * in->e * in->l + in->d * in->f * in->i - in->a *
            in->f * in->l - in->b * in->h * in->i - in->d * in->e * in->j) / det,
            data[12] = (in->e * in->k * in->n + in->f * in->i * in->o + in->g * in->j * in->m - in->e *
            in->j * in->o - in->f * in->k * in->m - in->g * in->i * in->n) / det,
            data[13] = (in->a * in->j * in->o + in->b * in->k * in->m + in->c * in->i * in->n - in->a *
            in->k * in->n - in->b * in->i * in->o - in->c * in->j * in->m) / det,
            data[14] = (in->a * in->g * in->n + in->b * in->e * in->o + in->c * in->f * in->m - in->a *
            in->f * in->o - in->b * in->g * in->m - in->c * in->e * in->n) / det,
            data[15] = (in->a * in->f * in->k + in->b * in->g * in->i + in->c * in->e * in->j - in->a *
            in->g * in->j - in->b * in->e * in->k - in->c * in->f * in->i) / det;
    memcpy(out, &data, sizeof (float) * 16);
}