Skip to content

Commit c9e8ef7

Browse files
committed
Fix some precision issues.
1 parent e0b2ceb commit c9e8ef7

File tree

1 file changed

+66
-60
lines changed

1 file changed

+66
-60
lines changed

src/lib.rs

Lines changed: 66 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,17 +1113,17 @@ impl<T> Mul<T> for Vector3<T>
11131113
}
11141114
}
11151115

1116-
impl<T> Div<T> for Vector3<T>
1117-
where T: Copy + Div<T, Output = T>
1116+
impl Div<Float> for Vector3f
11181117
{
1119-
type Output = Vector3<T>;
1120-
fn div(self, rhs: T) -> Vector3<T>
1121-
where T: Copy + Div<T, Output = T>
1118+
type Output = Vector3f;
1119+
fn div(self, rhs: Float) -> Vector3f
11221120
{
1123-
Vector3::<T> {
1124-
x: self.x / rhs,
1125-
y: self.y / rhs,
1126-
z: self.z / rhs,
1121+
assert_ne!(rhs, 0.0 as Float);
1122+
let inv: Float = 1.0 as Float / rhs;
1123+
Vector3f {
1124+
x: self.x * inv,
1125+
y: self.y * inv,
1126+
z: self.z * inv,
11271127
}
11281128
}
11291129
}
@@ -1236,26 +1236,24 @@ pub fn vec3_abs_dot_vec3<T>(v1: Vector3<T>, v2: Vector3<T>) -> T
12361236

12371237
/// Given two vectors in 3D, the cross product is a vector that is
12381238
/// perpendicular to both of them.
1239-
pub fn vec3_cross<T>(v1: Vector3<T>, v2: Vector3<T>) -> Vector3<T>
1240-
where T: Copy + Sub<T, Output = T> + Mul<T, Output = T>
1239+
pub fn vec3_cross(v1: Vector3f, v2: Vector3f) -> Vector3f
12411240
{
1242-
let v1x: T = v1.x;
1243-
let v1y: T = v1.y;
1244-
let v1z: T = v1.z;
1245-
let v2x: T = v2.x;
1246-
let v2y: T = v2.y;
1247-
let v2z: T = v2.z;
1248-
Vector3::<T> {
1249-
x: (v1y * v2z) - (v1z * v2y),
1250-
y: (v1z * v2x) - (v1x * v2z),
1251-
z: (v1x * v2y) - (v1y * v2x),
1241+
let v1x: f64 = v1.x as f64;
1242+
let v1y: f64 = v1.y as f64;
1243+
let v1z: f64 = v1.z as f64;
1244+
let v2x: f64 = v2.x as f64;
1245+
let v2y: f64 = v2.y as f64;
1246+
let v2z: f64 = v2.z as f64;
1247+
Vector3f {
1248+
x: ((v1y * v2z) - (v1z * v2y)) as Float,
1249+
y: ((v1z * v2x) - (v1x * v2z)) as Float,
1250+
z: ((v1x * v2y) - (v1y * v2x)) as Float,
12521251
}
12531252
}
12541253

12551254
/// Compute a new vector pointing in the same direction but with unit
12561255
/// length.
1257-
pub fn vec3_normalize<T>(v: Vector3<T>) -> Vector3<T>
1258-
where T: num::Float + Copy + Div<T, Output = T>
1256+
pub fn vec3_normalize(v: Vector3f) -> Vector3f
12591257
{
12601258
v / v.length()
12611259
}
@@ -1303,18 +1301,17 @@ pub fn vec3_permute<T>(v: Vector3<T>, x: usize, y: usize, z: usize) -> Vector3<T
13031301
}
13041302

13051303
/// Construct a local coordinate system given only a single 3D vector.
1306-
pub fn vec3_coordinate_system<T>(v1: &Vector3<T>, v2: &mut Vector3<T>, v3: &mut Vector3<T>)
1307-
where T: num::Float
1304+
pub fn vec3_coordinate_system(v1: &Vector3f, v2: &mut Vector3f, v3: &mut Vector3f)
13081305
{
13091306
if v1.x.abs() > v1.y.abs() {
1310-
*v2 = Vector3::<T> {
1307+
*v2 = Vector3f {
13111308
x: -v1.z,
1312-
y: num::Zero::zero(),
1309+
y: 0.0 as Float,
13131310
z: v1.x,
13141311
} / (v1.x * v1.x + v1.z * v1.z).sqrt();
13151312
} else {
1316-
*v2 = Vector3::<T> {
1317-
x: num::Zero::zero(),
1313+
*v2 = Vector3f {
1314+
x: 0.0 as Float,
13181315
y: v1.z,
13191316
z: -v1.y,
13201317
} / (v1.y * v1.y + v1.z * v1.z).sqrt();
@@ -1535,28 +1532,29 @@ impl<T> MulAssign<T> for Point3<T>
15351532
}
15361533
}
15371534

1538-
impl<T> Div<T> for Point3<T>
1539-
where T: Copy + Div<T, Output = T>
1535+
impl Div<Float> for Point3f
15401536
{
1541-
type Output = Point3<T>;
1542-
fn div(self, rhs: T) -> Point3<T>
1543-
where T: Copy + Div<T, Output = T>
1537+
type Output = Point3f;
1538+
fn div(self, rhs: Float) -> Point3f
15441539
{
1545-
Point3::<T> {
1546-
x: self.x / rhs,
1547-
y: self.y / rhs,
1548-
z: self.z / rhs,
1540+
assert_ne!(rhs, 0.0 as Float);
1541+
let inv: Float = 1.0 as Float / rhs;
1542+
Point3f {
1543+
x: self.x * inv,
1544+
y: self.y * inv,
1545+
z: self.z * inv,
15491546
}
15501547
}
15511548
}
15521549

1553-
impl<T> DivAssign<T> for Point3<T>
1554-
where T: Copy + DivAssign
1550+
impl DivAssign<Float> for Point3f
15551551
{
1556-
fn div_assign(&mut self, rhs: T) {
1557-
self.x /= rhs;
1558-
self.y /= rhs;
1559-
self.z /= rhs;
1552+
fn div_assign(&mut self, rhs: Float) {
1553+
assert_ne!(rhs, 0.0 as Float);
1554+
let inv: Float = 1.0 as Float / rhs;
1555+
self.x *= inv;
1556+
self.y *= inv;
1557+
self.z *= inv;
15601558
}
15611559
}
15621560

@@ -2586,10 +2584,11 @@ impl Transform {
25862584
z: zp,
25872585
}
25882586
} else {
2587+
let inv: Float = 1.0 as Float / wp;
25892588
Point3::<Float> {
2590-
x: xp / wp,
2591-
y: yp / wp,
2592-
z: zp / wp,
2589+
x: inv * xp,
2590+
y: inv * yp,
2591+
z: inv * zp,
25932592
}
25942593
}
25952594
}
@@ -2700,15 +2699,21 @@ impl Transform {
27002699
let wp: Float = self.m.m[3][0] * x + self.m.m[3][1] * y + self.m.m[3][2] * z +
27012700
self.m.m[3][3];
27022701
// compute absolute error for transformed point
2703-
let x_abs_sum: Float = self.m.m[0][0].abs() * x + self.m.m[0][1].abs() * y +
2704-
self.m.m[0][2].abs() * z +
2705-
self.m.m[0][3].abs();
2706-
let y_abs_sum: Float = self.m.m[1][0].abs() * x + self.m.m[1][1].abs() * y +
2707-
self.m.m[1][2].abs() * z +
2708-
self.m.m[1][3].abs();
2709-
let z_abs_sum: Float = self.m.m[2][0].abs() * x + self.m.m[2][1].abs() * y +
2710-
self.m.m[2][2].abs() * z +
2711-
self.m.m[2][3].abs();
2702+
let x_abs_sum: Float =
2703+
(self.m.m[0][0] * x).abs() +
2704+
(self.m.m[0][1] * y).abs() +
2705+
(self.m.m[0][2] * z).abs() +
2706+
self.m.m[0][3].abs();
2707+
let y_abs_sum: Float =
2708+
(self.m.m[1][0] * x).abs() +
2709+
(self.m.m[1][1] * y).abs() +
2710+
(self.m.m[1][2] * z).abs() +
2711+
self.m.m[1][3].abs();
2712+
let z_abs_sum: Float =
2713+
(self.m.m[2][0] * x).abs() +
2714+
(self.m.m[2][1] * y).abs() +
2715+
(self.m.m[2][2] * z).abs() +
2716+
self.m.m[2][3].abs();
27122717
*p_error = Vector3::<Float> {
27132718
x: x_abs_sum,
27142719
y: y_abs_sum,
@@ -2721,11 +2726,12 @@ impl Transform {
27212726
y: yp,
27222727
z: zp,
27232728
}
2724-
} else {
2729+
} else {
2730+
let inv: Float = 1.0 as Float / wp;
27252731
Point3::<Float> {
2726-
x: xp / wp,
2727-
y: yp / wp,
2728-
z: zp / wp,
2732+
x: inv * xp,
2733+
y: inv * yp,
2734+
z: inv * zp,
27292735
}
27302736
}
27312737
}

0 commit comments

Comments
 (0)