1use na::{RealField, Unit};
2use ncollide::query::ContactKinematic;
3
4use crate::math::Vector;
5use crate::object::{BodyHandle, BodyPartHandle, BodySet, ColliderHandle};
6use crate::solver::IntegrationParameters;
7
8pub struct GenericNonlinearConstraint<N: RealField + Copy, Handle: BodyHandle> {
10 pub body1: BodyPartHandle<Handle>,
12 pub body2: Option<BodyPartHandle<Handle>>,
14 pub is_angular: bool,
16 pub dim1: usize,
19 pub dim2: usize,
21 pub wj_id1: usize,
23 pub wj_id2: usize,
25 pub rhs: N,
27 pub r: N,
29}
30
31impl<N: RealField + Copy, Handle: BodyHandle> GenericNonlinearConstraint<N, Handle> {
32 pub fn new(
34 body1: BodyPartHandle<Handle>,
35 body2: Option<BodyPartHandle<Handle>>,
36 is_angular: bool,
37 dim1: usize,
38 dim2: usize,
39 wj_id1: usize,
40 wj_id2: usize,
41 rhs: N,
42 r: N,
43 ) -> Self {
44 GenericNonlinearConstraint {
45 body1,
46 body2,
47 is_angular,
48 dim1,
49 dim2,
50 wj_id1,
51 wj_id2,
52 rhs,
53 r,
54 }
55 }
56}
57
58pub trait NonlinearConstraintGenerator<N: RealField + Copy, Handle: BodyHandle> {
60 fn num_position_constraints(&self, bodies: &dyn BodySet<N, Handle = Handle>) -> usize;
62 fn position_constraint(
64 &self,
65 parameters: &IntegrationParameters<N>,
66 i: usize,
67 bodies: &mut dyn BodySet<N, Handle = Handle>,
68 jacobians: &mut [N],
69 ) -> Option<GenericNonlinearConstraint<N, Handle>>;
70}
71
72#[derive(Debug)]
74pub struct NonlinearUnilateralConstraint<
75 N: RealField + Copy,
76 Handle: BodyHandle,
77 CollHandle: ColliderHandle,
78> {
79 pub r: N,
81 pub rhs: N,
83
84 pub ndofs1: usize,
86 pub body1: BodyPartHandle<Handle>,
88 pub collider1: CollHandle,
90
91 pub ndofs2: usize,
93 pub body2: BodyPartHandle<Handle>,
95 pub collider2: CollHandle,
97
98 pub kinematic: ContactKinematic<N>,
100
101 pub normal1: Unit<Vector<N>>,
103 pub normal2: Unit<Vector<N>>,
105}
106
107impl<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle>
108 NonlinearUnilateralConstraint<N, Handle, CollHandle>
109{
110 pub fn new(
112 body1: BodyPartHandle<Handle>,
113 collider1: CollHandle,
114 ndofs1: usize,
115 body2: BodyPartHandle<Handle>,
116 collider2: CollHandle,
117 ndofs2: usize,
118 normal1: Unit<Vector<N>>,
119 normal2: Unit<Vector<N>>,
120 kinematic: ContactKinematic<N>,
121 ) -> Self {
122 let r = N::zero();
123 let rhs = N::zero();
124
125 NonlinearUnilateralConstraint {
126 r,
127 rhs,
128 ndofs1,
129 body1,
130 collider1,
131 ndofs2,
132 body2,
133 collider2,
134 kinematic,
135 normal1,
136 normal2,
137 }
138 }
139}
140
141pub struct MultibodyJointLimitsNonlinearConstraintGenerator;
143
144impl MultibodyJointLimitsNonlinearConstraintGenerator {
145 pub fn new() -> Self {
147 MultibodyJointLimitsNonlinearConstraintGenerator
148 }
149}
150
151impl<N: RealField + Copy, Handle: BodyHandle> NonlinearConstraintGenerator<N, Handle>
152 for MultibodyJointLimitsNonlinearConstraintGenerator
153{
154 fn num_position_constraints(&self, _: &dyn BodySet<N, Handle = Handle>) -> usize {
155 0
156 }
157
158 fn position_constraint(
159 &self,
160 _: &IntegrationParameters<N>,
161 _: usize,
162 _: &mut dyn BodySet<N, Handle = Handle>,
163 _: &mut [N],
164 ) -> Option<GenericNonlinearConstraint<N, Handle>> {
165 None
166 }
167}