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; }
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); }