Skip to main content

linear_sim/constraint/
mod.rs

1//! Simulation constraint entities
2
3use either::Either;
4use enum_dispatch::enum_dispatch;
5
6#[cfg(feature = "derive_serdes")]
7use serde::{Deserialize, Serialize};
8
9use crate::object;
10use crate::math::*;
11
12pub mod contact;
13pub mod distance;
14pub use self::contact::Contact;
15pub use self::distance::Distance;
16
17pub(crate) mod island;
18pub(crate) mod manager;
19pub(crate) use self::island::Island;
20pub(crate) use self::manager::Manager;
21
22/// Constraint interface trait
23#[enum_dispatch]
24pub(crate) trait Constraint {
25  fn constrain_velocity (&self,
26    object_a         : Either <&object::Static, &mut object::Dynamic>,
27    object_b         : &mut object::Dynamic,
28    pseudovelocity_a : Option <Vector3 <f64>>,
29    pseudovelocity_b : Vector3 <f64>
30  ) -> Option <Impulses>;
31
32  fn constrain_position (&mut self,
33    t_reverse        : f64,
34    object_a         : Either <&object::Static, &mut object::Dynamic>,
35    object_b         : &mut object::Dynamic,
36    pseudovelocity_a : Option <&mut Vector3 <f64>>,
37    pseudovelocity_b : &mut Vector3 <f64>
38  ) -> Option <PostImpulses>;
39}
40
41#[cfg_attr(feature = "derive_serdes", derive(Deserialize, Serialize))]
42#[derive(Clone, Debug, PartialEq)]
43#[enum_dispatch(Constraint)]
44pub enum Variant {
45  Contact  (Contact),
46  Distance (Distance)
47}
48
49#[derive(Debug, Default)]
50pub(crate) struct Impulses {
51  pub impulse_normal_a  : Vector3 <f64>,
52  pub impulse_normal_b  : Vector3 <f64>,
53  pub impulse_tangent_a : Vector3 <f64>,
54  pub impulse_tangent_b : Vector3 <f64>
55}
56
57#[derive(Debug, Default)]
58pub(crate) struct PostImpulses {
59  pub pseudo_impulse_a : Vector3 <f64>,
60  pub pseudo_impulse_b : Vector3 <f64>
61}
62
63impl Impulses {
64  /// Combined normal + tangent impulse
65  pub(crate) fn impulse_a (&self) -> Vector3 <f64> {
66    self.impulse_normal_a + self.impulse_tangent_a
67  }
68  /// Combined normal + tangent impulse
69  pub(crate) fn impulse_b (&self) -> Vector3 <f64> {
70    self.impulse_normal_b + self.impulse_tangent_b
71  }
72}