aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/solver_vel.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamics/solver/solver_vel.rs')
-rw-r--r--src/dynamics/solver/solver_vel.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/dynamics/solver/solver_vel.rs b/src/dynamics/solver/solver_vel.rs
new file mode 100644
index 0000000..48c76b8
--- /dev/null
+++ b/src/dynamics/solver/solver_vel.rs
@@ -0,0 +1,59 @@
+use crate::math::{AngVector, Vector, SPATIAL_DIM};
+use crate::utils::SimdRealCopy;
+use na::{DVectorView, DVectorViewMut, Scalar};
+use std::ops::{AddAssign, Sub};
+
+#[derive(Copy, Clone, Debug, Default)]
+#[repr(C)]
+//#[repr(align(64))]
+pub struct SolverVel<N: Scalar + Copy> {
+ // The linear velocity of a solver body.
+ pub linear: Vector<N>,
+ // The angular velocity, multiplied by the inverse sqrt angular inertia, of a solver body.
+ pub angular: AngVector<N>,
+}
+
+impl<N: Scalar + Copy> SolverVel<N> {
+ pub fn as_slice(&self) -> &[N; SPATIAL_DIM] {
+ unsafe { std::mem::transmute(self) }
+ }
+
+ pub fn as_mut_slice(&mut self) -> &mut [N; SPATIAL_DIM] {
+ unsafe { std::mem::transmute(self) }
+ }
+
+ pub fn as_vector_slice(&self) -> DVectorView<N> {
+ DVectorView::from_slice(&self.as_slice()[..], SPATIAL_DIM)
+ }
+
+ pub fn as_vector_slice_mut(&mut self) -> DVectorViewMut<N> {
+ DVectorViewMut::from_slice(&mut self.as_mut_slice()[..], SPATIAL_DIM)
+ }
+}
+
+impl<N: SimdRealCopy> SolverVel<N> {
+ pub fn zero() -> Self {
+ Self {
+ linear: na::zero(),
+ angular: na::zero(),
+ }
+ }
+}
+
+impl<N: SimdRealCopy> AddAssign for SolverVel<N> {
+ fn add_assign(&mut self, rhs: Self) {
+ self.linear += rhs.linear;
+ self.angular += rhs.angular;
+ }
+}
+
+impl<N: SimdRealCopy> Sub for SolverVel<N> {
+ type Output = Self;
+
+ fn sub(self, rhs: Self) -> Self {
+ SolverVel {
+ linear: self.linear - rhs.linear,
+ angular: self.angular - rhs.angular,
+ }
+ }
+}