@@ -1113,17 +1113,17 @@ impl<T> Mul<T> for Vector3<T>
1113
1113
}
1114
1114
}
1115
1115
1116
- impl < T > Div < T > for Vector3 < T >
1117
- where T : Copy + Div < T , Output = T >
1116
+ impl Div < Float > for Vector3f
1118
1117
{
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
1122
1120
{
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,
1127
1127
}
1128
1128
}
1129
1129
}
@@ -1236,26 +1236,24 @@ pub fn vec3_abs_dot_vec3<T>(v1: Vector3<T>, v2: Vector3<T>) -> T
1236
1236
1237
1237
/// Given two vectors in 3D, the cross product is a vector that is
1238
1238
/// 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
1241
1240
{
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 ,
1252
1251
}
1253
1252
}
1254
1253
1255
1254
/// Compute a new vector pointing in the same direction but with unit
1256
1255
/// 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
1259
1257
{
1260
1258
v / v. length ( )
1261
1259
}
@@ -1303,18 +1301,17 @@ pub fn vec3_permute<T>(v: Vector3<T>, x: usize, y: usize, z: usize) -> Vector3<T
1303
1301
}
1304
1302
1305
1303
/// 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 )
1308
1305
{
1309
1306
if v1. x . abs ( ) > v1. y . abs ( ) {
1310
- * v2 = Vector3 :: < T > {
1307
+ * v2 = Vector3f {
1311
1308
x : -v1. z ,
1312
- y : num :: Zero :: zero ( ) ,
1309
+ y : 0.0 as Float ,
1313
1310
z : v1. x ,
1314
1311
} / ( v1. x * v1. x + v1. z * v1. z ) . sqrt ( ) ;
1315
1312
} else {
1316
- * v2 = Vector3 :: < T > {
1317
- x : num :: Zero :: zero ( ) ,
1313
+ * v2 = Vector3f {
1314
+ x : 0.0 as Float ,
1318
1315
y : v1. z ,
1319
1316
z : -v1. y ,
1320
1317
} / ( v1. y * v1. y + v1. z * v1. z ) . sqrt ( ) ;
@@ -1535,28 +1532,29 @@ impl<T> MulAssign<T> for Point3<T>
1535
1532
}
1536
1533
}
1537
1534
1538
- impl < T > Div < T > for Point3 < T >
1539
- where T : Copy + Div < T , Output = T >
1535
+ impl Div < Float > for Point3f
1540
1536
{
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
1544
1539
{
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,
1549
1546
}
1550
1547
}
1551
1548
}
1552
1549
1553
- impl < T > DivAssign < T > for Point3 < T >
1554
- where T : Copy + DivAssign
1550
+ impl DivAssign < Float > for Point3f
1555
1551
{
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;
1560
1558
}
1561
1559
}
1562
1560
@@ -2586,10 +2584,11 @@ impl Transform {
2586
2584
z : zp,
2587
2585
}
2588
2586
} else {
2587
+ let inv: Float = 1.0 as Float / wp;
2589
2588
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 ,
2593
2592
}
2594
2593
}
2595
2594
}
@@ -2700,15 +2699,21 @@ impl Transform {
2700
2699
let wp: Float = self . m . m [ 3 ] [ 0 ] * x + self . m . m [ 3 ] [ 1 ] * y + self . m . m [ 3 ] [ 2 ] * z +
2701
2700
self . m . m [ 3 ] [ 3 ] ;
2702
2701
// 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 ( ) ;
2712
2717
* p_error = Vector3 :: < Float > {
2713
2718
x : x_abs_sum,
2714
2719
y : y_abs_sum,
@@ -2721,11 +2726,12 @@ impl Transform {
2721
2726
y : yp,
2722
2727
z : zp,
2723
2728
}
2724
- } else {
2729
+ } else {
2730
+ let inv: Float = 1.0 as Float / wp;
2725
2731
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 ,
2729
2735
}
2730
2736
}
2731
2737
}
0 commit comments