nalgebra/geometry/
similarity_simba.rs
1use simba::simd::{SimdRealField, SimdValue};
2
3use crate::geometry::{AbstractRotation, Isometry, Similarity};
4
5impl<T: SimdRealField, R, const D: usize> SimdValue for Similarity<T, R, D>
6where
7 T::Element: SimdRealField,
8 R: SimdValue<SimdBool = T::SimdBool> + AbstractRotation<T, D>,
9 R::Element: AbstractRotation<T::Element, D>,
10{
11 type Element = Similarity<T::Element, R::Element, D>;
12 type SimdBool = T::SimdBool;
13
14 #[inline]
15 fn lanes() -> usize {
16 T::lanes()
17 }
18
19 #[inline]
20 fn splat(val: Self::Element) -> Self {
21 let scaling = T::splat(val.scaling());
22 Similarity::from_isometry(Isometry::splat(val.isometry), scaling)
23 }
24
25 #[inline]
26 fn extract(&self, i: usize) -> Self::Element {
27 Similarity::from_isometry(self.isometry.extract(i), self.scaling().extract(i))
28 }
29
30 #[inline]
31 unsafe fn extract_unchecked(&self, i: usize) -> Self::Element {
32 Similarity::from_isometry(
33 self.isometry.extract_unchecked(i),
34 self.scaling().extract_unchecked(i),
35 )
36 }
37
38 #[inline]
39 fn replace(&mut self, i: usize, val: Self::Element) {
40 let mut s = self.scaling();
41 s.replace(i, val.scaling());
42 self.set_scaling(s);
43 self.isometry.replace(i, val.isometry);
44 }
45
46 #[inline]
47 unsafe fn replace_unchecked(&mut self, i: usize, val: Self::Element) {
48 let mut s = self.scaling();
49 s.replace_unchecked(i, val.scaling());
50 self.set_scaling(s);
51 self.isometry.replace_unchecked(i, val.isometry);
52 }
53
54 #[inline]
55 fn select(self, cond: Self::SimdBool, other: Self) -> Self {
56 let scaling = self.scaling().select(cond, other.scaling());
57 Similarity::from_isometry(self.isometry.select(cond, other.isometry), scaling)
58 }
59}