diff options
| author | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-03-17 21:20:18 +0100 |
|---|---|---|
| committer | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-03-17 21:24:28 +0100 |
| commit | ecd308338b189ab569816a38a03e3f8b89669dde (patch) | |
| tree | fa612abff2f23ea6a5ff04c64c07296d9fb065c8 /src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs | |
| parent | da92e5c2837b27433286cf0dd9d887fd44dda254 (diff) | |
| download | rapier-bevy-glam.tar.gz rapier-bevy-glam.tar.bz2 rapier-bevy-glam.zip | |
feat: start experimenting with a glam/bevy versionbevy-glam
Diffstat (limited to 'src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs')
| -rw-r--r-- | src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs | 106 |
1 files changed, 51 insertions, 55 deletions
diff --git a/src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs b/src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs index e184e3d..bbb72bb 100644 --- a/src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs +++ b/src/dynamics/solver/joint_constraint/joint_velocity_constraint.rs @@ -1,14 +1,14 @@ -use crate::dynamics::solver::joint_constraint::JointTwoBodyConstraintHelper; +use crate::dynamics::solver::joint_constraint::JointConstraintHelper; use crate::dynamics::solver::SolverVel; use crate::dynamics::{ GenericJoint, IntegrationParameters, JointAxesMask, JointGraphEdge, JointIndex, }; -use crate::math::{AngVector, AngularInertia, Isometry, Point, Real, Vector, DIM, SPATIAL_DIM}; -use crate::num::Zero; -use crate::utils::{SimdDot, SimdRealCopy}; +use crate::math::*; +use crate::utils::{SimdDot, SimdRealCopy, SimdVec}; #[cfg(feature = "simd-is-enabled")] use { + crate::dynamics::solver::joint_constraint::JointConstraintHelperSimd, crate::math::{SimdReal, SIMD_WIDTH}, na::SimdValue, }; @@ -49,38 +49,34 @@ pub enum WritebackId { // every time. #[derive(Copy, Clone)] pub struct JointSolverBody<N: SimdRealCopy, const LANES: usize> { - pub im: Vector<N>, + pub im: N::Vector, pub sqrt_ii: AngularInertia<N>, - pub world_com: Point<N>, + pub world_com: N::Point, pub solver_vel: [usize; LANES], } impl<N: SimdRealCopy, const LANES: usize> JointSolverBody<N, LANES> { pub fn invalid() -> Self { Self { - im: Vector::zeros(), - sqrt_ii: AngularInertia::zero(), - world_com: Point::origin(), + im: Default::default(), + sqrt_ii: AngularInertia::default(), + world_com: Default::default(), solver_vel: [usize::MAX; LANES], } } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Default)] pub struct JointFixedSolverBody<N: SimdRealCopy> { - pub linvel: Vector<N>, - pub angvel: AngVector<N>, + pub linvel: N::Vector, + pub angvel: N::AngVector, // TODO: is this really needed? - pub world_com: Point<N>, + pub world_com: N::Point, } impl<N: SimdRealCopy> JointFixedSolverBody<N> { pub fn invalid() -> Self { - Self { - linvel: Vector::zeros(), - angvel: AngVector::zero(), - world_com: Point::origin(), - } + Self::default() } } @@ -93,9 +89,9 @@ pub struct JointTwoBodyConstraint<N: SimdRealCopy, const LANES: usize> { pub impulse: N, pub impulse_bounds: [N; 2], - pub lin_jac: Vector<N>, - pub ang_jac1: AngVector<N>, - pub ang_jac2: AngVector<N>, + pub lin_jac: N::Vector, + pub ang_jac1: N::AngVector, + pub ang_jac2: N::AngVector, pub inv_lhs: N, pub rhs: N, @@ -103,8 +99,8 @@ pub struct JointTwoBodyConstraint<N: SimdRealCopy, const LANES: usize> { pub cfm_gain: N, pub cfm_coeff: N, - pub im1: Vector<N>, - pub im2: Vector<N>, + pub im1: N::Vector, + pub im2: N::Vector, pub writeback_id: WritebackId, } @@ -115,7 +111,7 @@ impl<N: SimdRealCopy, const LANES: usize> JointTwoBodyConstraint<N, LANES> { solver_vel1: &mut SolverVel<N>, solver_vel2: &mut SolverVel<N>, ) { - let dlinvel = self.lin_jac.dot(&(solver_vel2.linear - solver_vel1.linear)); + let dlinvel = self.lin_jac.gdot(solver_vel2.linear - solver_vel1.linear); let dangvel = self.ang_jac2.gdot(solver_vel2.angular) - self.ang_jac1.gdot(solver_vel1.angular); @@ -129,9 +125,9 @@ impl<N: SimdRealCopy, const LANES: usize> JointTwoBodyConstraint<N, LANES> { let ang_impulse1 = self.ang_jac1 * delta_impulse; let ang_impulse2 = self.ang_jac2 * delta_impulse; - solver_vel1.linear += lin_impulse.component_mul(&self.im1); + solver_vel1.linear += lin_impulse.component_mul_simd(&self.im1); solver_vel1.angular += ang_impulse1; - solver_vel2.linear -= lin_impulse.component_mul(&self.im2); + solver_vel2.linear -= lin_impulse.component_mul_simd(&self.im2); solver_vel2.angular -= ang_impulse2; } @@ -146,8 +142,8 @@ impl JointTwoBodyConstraint<Real, 1> { joint_id: JointIndex, body1: &JointSolverBody<Real, 1>, body2: &JointSolverBody<Real, 1>, - frame1: &Isometry<Real>, - frame2: &Isometry<Real>, + frame1: &Isometry, + frame2: &Isometry, joint: &GenericJoint, out: &mut [Self], ) -> usize { @@ -168,7 +164,7 @@ impl JointTwoBodyConstraint<Real, 1> { let first_coupled_ang_axis_id = (coupled_axes & JointAxesMask::ANG_AXES.bits()).trailing_zeros() as usize; - let builder = JointTwoBodyConstraintHelper::new( + let builder = JointConstraintHelper::new( frame1, frame2, &body1.world_com, @@ -241,7 +237,7 @@ impl JointTwoBodyConstraint<Real, 1> { // } } - JointTwoBodyConstraintHelper::finalize_constraints(&mut out[start..len]); + JointConstraintHelper::finalize_constraints(&mut out[start..len]); let start = len; for i in DIM..SPATIAL_DIM { @@ -326,7 +322,7 @@ impl JointTwoBodyConstraint<Real, 1> { ); len += 1; } - JointTwoBodyConstraintHelper::finalize_constraints(&mut out[start..len]); + JointConstraintHelper::finalize_constraints(&mut out[start..len]); len } @@ -357,12 +353,12 @@ impl JointTwoBodyConstraint<SimdReal, SIMD_WIDTH> { joint_id: [JointIndex; SIMD_WIDTH], body1: &JointSolverBody<SimdReal, SIMD_WIDTH>, body2: &JointSolverBody<SimdReal, SIMD_WIDTH>, - frame1: &Isometry<SimdReal>, - frame2: &Isometry<SimdReal>, + frame1: &SimdIsometry, + frame2: &SimdIsometry, locked_axes: u8, out: &mut [Self], ) -> usize { - let builder = JointTwoBodyConstraintHelper::new( + let builder = JointConstraintHelperSimd::new( frame1, frame2, &body1.world_com, @@ -393,18 +389,18 @@ impl JointTwoBodyConstraint<SimdReal, SIMD_WIDTH> { } } - JointTwoBodyConstraintHelper::finalize_constraints(&mut out[..len]); + JointConstraintHelperSimd::finalize_constraints(&mut out[..len]); len } pub fn solve(&mut self, solver_vels: &mut [SolverVel<Real>]) { let mut solver_vel1 = SolverVel { - linear: Vector::from(gather![|ii| solver_vels[self.solver_vel1[ii]].linear]), - angular: AngVector::from(gather![|ii| solver_vels[self.solver_vel1[ii]].angular]), + linear: SimdVector::from(gather![|ii| solver_vels[self.solver_vel1[ii]].linear]), + angular: SimdAngVector::from(gather![|ii| solver_vels[self.solver_vel1[ii]].angular]), }; let mut solver_vel2 = SolverVel { - linear: Vector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].linear]), - angular: AngVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].angular]), + linear: SimdVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].linear]), + angular: SimdAngVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].angular]), }; self.solve_generic(&mut solver_vel1, &mut solver_vel2); @@ -440,8 +436,8 @@ pub struct JointOneBodyConstraint<N: SimdRealCopy, const LANES: usize> { pub impulse: N, pub impulse_bounds: [N; 2], - pub lin_jac: Vector<N>, - pub ang_jac2: AngVector<N>, + pub lin_jac: N::Vector, + pub ang_jac2: N::AngVector, pub inv_lhs: N, pub cfm_coeff: N, @@ -449,7 +445,7 @@ pub struct JointOneBodyConstraint<N: SimdRealCopy, const LANES: usize> { pub rhs: N, pub rhs_wo_bias: N, - pub im2: Vector<N>, + pub im2: N::Vector, pub writeback_id: WritebackId, } @@ -459,7 +455,7 @@ impl<N: SimdRealCopy, const LANES: usize> JointOneBodyConstraint<N, LANES> { let dlinvel = solver_vel2.linear; let dangvel = solver_vel2.angular; - let dvel = self.lin_jac.dot(&dlinvel) + self.ang_jac2.gdot(dangvel) + self.rhs; + let dvel = self.lin_jac.gdot(dlinvel) + self.ang_jac2.gdot(dangvel) + self.rhs; let total_impulse = (self.impulse + self.inv_lhs * (dvel - self.cfm_gain * self.impulse)) .simd_clamp(self.impulse_bounds[0], self.impulse_bounds[1]); let delta_impulse = total_impulse - self.impulse; @@ -468,7 +464,7 @@ impl<N: SimdRealCopy, const LANES: usize> JointOneBodyConstraint<N, LANES> { let lin_impulse = self.lin_jac * delta_impulse; let ang_impulse = self.ang_jac2 * delta_impulse; - solver_vel2.linear -= lin_impulse.component_mul(&self.im2); + solver_vel2.linear -= lin_impulse.component_mul_simd(&self.im2); solver_vel2.angular -= ang_impulse; } @@ -483,8 +479,8 @@ impl JointOneBodyConstraint<Real, 1> { joint_id: JointIndex, body1: &JointFixedSolverBody<Real>, body2: &JointSolverBody<Real, 1>, - frame1: &Isometry<Real>, - frame2: &Isometry<Real>, + frame1: &Isometry, + frame2: &Isometry, joint: &GenericJoint, out: &mut [Self], ) -> usize { @@ -505,7 +501,7 @@ impl JointOneBodyConstraint<Real, 1> { let first_coupled_ang_axis_id = (coupled_axes & JointAxesMask::ANG_AXES.bits()).trailing_zeros() as usize; - let builder = JointTwoBodyConstraintHelper::new( + let builder = JointConstraintHelper::new( frame1, frame2, &body1.world_com, @@ -577,7 +573,7 @@ impl JointOneBodyConstraint<Real, 1> { len += 1; } - JointTwoBodyConstraintHelper::finalize_one_body_constraints(&mut out[start..len]); + JointConstraintHelper::finalize_one_body_constraints(&mut out[start..len]); let start = len; for i in DIM..SPATIAL_DIM { @@ -668,7 +664,7 @@ impl JointOneBodyConstraint<Real, 1> { ); len += 1; } - JointTwoBodyConstraintHelper::finalize_one_body_constraints(&mut out[start..len]); + JointConstraintHelper::finalize_one_body_constraints(&mut out[start..len]); len } @@ -696,13 +692,13 @@ impl JointOneBodyConstraint<SimdReal, SIMD_WIDTH> { joint_id: [JointIndex; SIMD_WIDTH], body1: &JointFixedSolverBody<SimdReal>, body2: &JointSolverBody<SimdReal, SIMD_WIDTH>, - frame1: &Isometry<SimdReal>, - frame2: &Isometry<SimdReal>, + frame1: &SimdIsometry, + frame2: &SimdIsometry, locked_axes: u8, out: &mut [Self], ) -> usize { let mut len = 0; - let builder = JointTwoBodyConstraintHelper::new( + let builder = JointConstraintHelperSimd::new( frame1, frame2, &body1.world_com, @@ -737,14 +733,14 @@ impl JointOneBodyConstraint<SimdReal, SIMD_WIDTH> { } } - JointTwoBodyConstraintHelper::finalize_one_body_constraints(&mut out[..len]); + JointConstraintHelperSimd::finalize_one_body_constraints(&mut out[..len]); len } pub fn solve(&mut self, solver_vels: &mut [SolverVel<Real>]) { let mut solver_vel2 = SolverVel { - linear: Vector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].linear]), - angular: AngVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].angular]), + linear: SimdVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].linear]), + angular: SimdAngVector::from(gather![|ii| solver_vels[self.solver_vel2[ii]].angular]), }; self.solve_generic(&mut solver_vel2); |
