rendered paste bodyvoid matrix_inverse(matrix b, matrix a)
{
int i, j, i2, j2, pr;
vector r;
matrix aa;
matrix_copy(aa, a);
matrix_identity(b);
for(j = 0; j < 4; j++)
{
pr = -1;
for(i = 0; i < 4; i++)
if(aa[i][j] != 0.0)
{
for(j2 = 0; j2 < j; j2++)
if(aa[i][j2] != 0.0) break;
if(j2 != j) continue;
pr = i;
break;
}
if(pr < 0) fprintf(stderr, "No row found without a zero in column %d!\n", 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(aa[i2][i] != 0.0)
{
vector_swap(aa[i], aa[i2]);
vector_swap(b[i], b[i2]);
}
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]);
}
}