linear_sim/constraint/
mod.rs1use 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#[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 pub(crate) fn impulse_a (&self) -> Vector3 <f64> {
66 self.impulse_normal_a + self.impulse_tangent_a
67 }
68 pub(crate) fn impulse_b (&self) -> Vector3 <f64> {
70 self.impulse_normal_b + self.impulse_tangent_b
71 }
72}