Unmark Mat4 inverse method as unsafe

This commit is contained in:
Brendan Zabarauskas 2012-12-10 10:48:02 +10:00
parent e39f02ccf7
commit c8f3f1919a

View file

@ -1461,7 +1461,7 @@ pub impl<T:Copy Float Sign> Mat4<T>: Matrix<T, Vec4<T>> {
self[0][0] + self[1][1] + self[2][2] + self[3][3] self[0][0] + self[1][1] + self[2][2] + self[3][3]
} }
pure fn inverse(&self) -> Option<Mat4<T>> unsafe { pure fn inverse(&self) -> Option<Mat4<T>> {
let d = self.determinant(); let d = self.determinant();
// let _0 = Number::from(0); // FIXME: Triggers ICE // let _0 = Number::from(0); // FIXME: Triggers ICE
let _0 = cast(0); let _0 = cast(0);
@ -1486,6 +1486,10 @@ pub impl<T:Copy Float Sign> Mat4<T>: Matrix<T, Vec4<T>> {
} }
} }
// We need to use an unsafe block in order to use these inpure
// functions. This *should* be ok because A and I are never
// exposed to the outside world.
unsafe {
// Swap columns i1 and j in A and I to // Swap columns i1 and j in A and I to
// put pivot on diagonal // put pivot on diagonal
A.swap_cols(i1, j); A.swap_cols(i1, j);
@ -1499,11 +1503,14 @@ pub impl<T:Copy Float Sign> Mat4<T>: Matrix<T, Vec4<T>> {
// doing identical ops to I // doing identical ops to I
for uint::range(0, 4) |i| { for uint::range(0, 4) |i| {
if i != j { if i != j {
unsafe {
I.col_mut(i).sub_self_v(&I[j].mul_t(A[i][j])); I.col_mut(i).sub_self_v(&I[j].mul_t(A[i][j]));
A.col_mut(i).sub_self_v(&A[j].mul_t(A[i][j])); A.col_mut(i).sub_self_v(&A[j].mul_t(A[i][j]));
} }
} }
} }
}
}
Some(I) Some(I)
} }
} }