rendered paste bodyvoid matrix_inverse(matrix b, matrix a)
{
int i, j, i2, pr;
vector r;
matrix aa;
int used[4] = {-1, -1, -1, -1};
matrix_copy(aa, a);
matrix_identity(b);
for(j = 0; j < 4; j++)
{
pr = -1;
for(i = 0; i < 4; i++)
if(used[i] < 0 && aa[i][j] != 0.0)
{
pr = i;
break;
}
if(pr < 0) { fprintf(stderr, "No row found without a zero in column %d!\n", j); return; }
used[pr] = j;
for(i = 0; i < 4; i++)
{
if(i == pr) continue;
vector_scale(r, b[pr], -aa[i][j]/aa[pr][j]);
vector_add(b[i], b[i], r);
vector_scale(r, aa[pr], -aa[i][j]/aa[pr][j]);
vector_add(aa[i], aa[i], r);
}
}
for(i = 0; i < 4; i++)
for(i2 = i+1; i2 < 4; i2++)
if(used[i2] == i)
{
vector_swap(aa[i], aa[i2]);
vector_swap(b[i], b[i2]);
used[i2] = used[i];
}
for(i = 0; i < 4; i++)
{
vector_scale(b[i], b[i], 1.0 / aa[i][i]);
vector_scale(aa[i], aa[i], 1.0 / aa[i][i]);
}
}