nalgebra/geometry/
similarity_simba.rs1use 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 const LANES: usize = T::LANES;
12 type Element = Similarity<T::Element, R::Element, D>;
13 type SimdBool = T::SimdBool;
14
15 #[inline]
16 fn splat(val: Self::Element) -> Self {
17 let scaling = T::splat(val.scaling());
18 Similarity::from_isometry(Isometry::splat(val.isometry), scaling)
19 }
20
21 #[inline]
22 fn extract(&self, i: usize) -> Self::Element {
23 Similarity::from_isometry(self.isometry.extract(i), self.scaling().extract(i))
24 }
25
26 #[inline]
27 unsafe fn extract_unchecked(&self, i: usize) -> Self::Element {
28 Similarity::from_isometry(
29 self.isometry.extract_unchecked(i),
30 self.scaling().extract_unchecked(i),
31 )
32 }
33
34 #[inline]
35 fn replace(&mut self, i: usize, val: Self::Element) {
36 let mut s = self.scaling();
37 s.replace(i, val.scaling());
38 self.set_scaling(s);
39 self.isometry.replace(i, val.isometry);
40 }
41
42 #[inline]
43 unsafe fn replace_unchecked(&mut self, i: usize, val: Self::Element) {
44 let mut s = self.scaling();
45 s.replace_unchecked(i, val.scaling());
46 self.set_scaling(s);
47 self.isometry.replace_unchecked(i, val.isometry);
48 }
49
50 #[inline]
51 fn select(self, cond: Self::SimdBool, other: Self) -> Self {
52 let scaling = self.scaling().select(cond, other.scaling());
53 Similarity::from_isometry(self.isometry.select(cond, other.isometry), scaling)
54 }
55}