|
1 | 1 | use na::{Matrix3, Matrix4, Orthographic3, Perspective3, Point2, Point3, Vector2, Vector3};
|
2 | 2 |
|
| 3 | +#[cfg(feature = "wide-tests")] |
| 4 | +use na::{Rotation3, SimdValue, Translation3}; |
| 5 | +#[cfg(feature = "wide-tests")] |
| 6 | +use simba::simd::WideF32x4; |
| 7 | + |
3 | 8 | /// See Example 3.4 of "Graphics and Visualization: Principles & Algorithms"
|
4 | 9 | /// by Theoharis, Papaioannou, Platis, Patrikalakis.
|
5 | 10 | #[test]
|
@@ -113,3 +118,49 @@ fn test_orthographic_transform_point3() {
|
113 | 118 | assert_relative_eq!(transformed, orthographic.project_point(&point));
|
114 | 119 | assert_relative_eq!(transformed.coords.push(1.0), multiplied);
|
115 | 120 | }
|
| 121 | + |
| 122 | +#[cfg(feature = "wide-tests")] |
| 123 | +#[test] |
| 124 | +fn test_transform_vector_x4wide() { |
| 125 | + let v1 = Vector3::new(0.0, 1.0, 2.0); |
| 126 | + let v2 = Vector3::new(3.0, 4.0, 5.0); |
| 127 | + let v3 = Vector3::new(6.0, 7.0, 8.0); |
| 128 | + let v4 = Vector3::new(9.0, 10.0, 11.0); |
| 129 | + |
| 130 | + let wide_v = Vector3::new( |
| 131 | + WideF32x4::from_arr([v1.x, v2.x, v3.x, v4.x]), |
| 132 | + WideF32x4::from_arr([v1.y, v2.y, v3.y, v4.y]), |
| 133 | + WideF32x4::from_arr([v1.z, v2.z, v3.z, v4.z]), |
| 134 | + ); |
| 135 | + |
| 136 | + let m1 = Perspective3::new(2.0, 45.0, 1.0, 1000.0).to_homogeneous(); |
| 137 | + let m2 = Orthographic3::from_fov(2.0, 45.0, 1.0, 1000.0).to_homogeneous(); |
| 138 | + let m3 = Rotation3::from_axis_angle(&Vector3::y_axis(), 2.5).to_homogeneous(); |
| 139 | + let m4 = Translation3::new(1.0, 2.0, 3.0).to_homogeneous(); |
| 140 | + |
| 141 | + let wide_m = Matrix4::new( |
| 142 | + WideF32x4::from_arr([m1.m11, m2.m11, m3.m11, m4.m11]), |
| 143 | + WideF32x4::from_arr([m1.m12, m2.m12, m3.m12, m4.m12]), |
| 144 | + WideF32x4::from_arr([m1.m13, m2.m13, m3.m13, m4.m13]), |
| 145 | + WideF32x4::from_arr([m1.m14, m2.m14, m3.m14, m4.m14]), |
| 146 | + WideF32x4::from_arr([m1.m21, m2.m21, m3.m21, m4.m21]), |
| 147 | + WideF32x4::from_arr([m1.m22, m2.m22, m3.m22, m4.m22]), |
| 148 | + WideF32x4::from_arr([m1.m23, m2.m23, m3.m23, m4.m23]), |
| 149 | + WideF32x4::from_arr([m1.m24, m2.m24, m3.m24, m4.m24]), |
| 150 | + WideF32x4::from_arr([m1.m31, m2.m31, m3.m31, m4.m31]), |
| 151 | + WideF32x4::from_arr([m1.m32, m2.m32, m3.m32, m4.m32]), |
| 152 | + WideF32x4::from_arr([m1.m33, m2.m33, m3.m33, m4.m33]), |
| 153 | + WideF32x4::from_arr([m1.m34, m2.m34, m3.m34, m4.m34]), |
| 154 | + WideF32x4::from_arr([m1.m41, m2.m41, m3.m41, m4.m41]), |
| 155 | + WideF32x4::from_arr([m1.m42, m2.m42, m3.m42, m4.m42]), |
| 156 | + WideF32x4::from_arr([m1.m43, m2.m43, m3.m43, m4.m43]), |
| 157 | + WideF32x4::from_arr([m1.m44, m2.m44, m3.m44, m4.m44]), |
| 158 | + ); |
| 159 | + |
| 160 | + let wide_v = wide_m.transform_vector(&wide_v); |
| 161 | + |
| 162 | + assert_eq!(wide_v.extract(0), m1.transform_vector(&v1)); |
| 163 | + assert_eq!(wide_v.extract(1), m2.transform_vector(&v2)); |
| 164 | + assert_eq!(wide_v.extract(2), m3.transform_vector(&v3)); |
| 165 | + assert_eq!(wide_v.extract(3), m4.transform_vector(&v4)); |
| 166 | +} |
0 commit comments