RavEngine
Loading...
Searching...
No Matches
DySolverContact.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef DY_SOLVER_CONTACT_H
30#define DY_SOLVER_CONTACT_H
31
32#include "foundation/PxSimpleTypes.h"
33#include "foundation/PxVec3.h"
34#include "PxvConfig.h"
35#include "foundation/PxVecMath.h"
36
37namespace physx
38{
39
40using namespace aos;
41
42namespace Sc
43{
44 class ShapeInteraction;
45}
50namespace Dy
51{
52
54{
55 enum DySolverContactFlags
56 {
57 eHAS_FORCE_THRESHOLDS = 0x1
58 };
59
60 PxU8 type; //Note: mType should be first as the solver expects a type in the first byte.
61 PxU8 flags;
62 PxU8 numNormalConstr;
63 PxU8 numFrictionConstr; //4
64
65 PxReal angDom0; //8
66 PxReal angDom1; //12
67 PxReal invMass0; //16
68
69 Vec4V staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W; //32
70 //KS - minAppliedImpulseForFrictionW is non-zero only for articulations. This is a workaround for a case in articulations where
71 //the impulse is propagated such that many links do not apply friction because their normal forces were corrected by the solver in a previous
72 //link. This results in some links sliding unnaturally. This occurs with prismatic or revolute joints where the impulse propagation one one link
73 //resolves the normal constraint on all links
74 Vec4V normal_minAppliedImpulseForFrictionW; //48
75
76
77 PxReal invMass1; //52
78 PxU32 broken; //56
79 PxU8* frictionBrokenWritebackByte; //60 64
80 Sc::ShapeInteraction* shapeInteraction; //64 72
81#if PX_P64_FAMILY
82 PxU32 pad[2]; //64 80
83#endif // PX_X64
84
85
86 PX_FORCE_INLINE void setStaticFriction(const FloatV f) {staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W=V4SetX(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W,f);}
87 PX_FORCE_INLINE void setDynamicFriction(const FloatV f) {staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W=V4SetY(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W,f);}
88 PX_FORCE_INLINE void setDominance0(const FloatV f) {staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W=V4SetZ(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W,f);}
89 PX_FORCE_INLINE void setDominance1(const FloatV f) {staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W=V4SetW(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W,f);}
90
91 PX_FORCE_INLINE FloatV getStaticFriction() const {return V4GetX(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
92 PX_FORCE_INLINE FloatV getDynamicFriction() const {return V4GetY(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
93 PX_FORCE_INLINE FloatV getDominance0() const {return V4GetZ(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
94 PX_FORCE_INLINE FloatV getDominance1() const {return V4GetW(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
95
96 PX_FORCE_INLINE void setStaticFriction(PxF32 f) {V4WriteX(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W, f);}
97 PX_FORCE_INLINE void setDynamicFriction(PxF32 f) {V4WriteY(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W, f);}
98 PX_FORCE_INLINE void setDominance0(PxF32 f) {V4WriteZ(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W, f);}
99 PX_FORCE_INLINE void setDominance1(PxF32 f) {V4WriteW(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W, f);}
100
101 PX_FORCE_INLINE PxF32 getStaticFrictionPxF32() const {return V4ReadX(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
102 PX_FORCE_INLINE PxF32 getDynamicFrictionPxF32() const {return V4ReadY(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
103 PX_FORCE_INLINE PxF32 getDominance0PxF32() const {return V4ReadZ(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
104 PX_FORCE_INLINE PxF32 getDominance1PxF32() const {return V4ReadW(staticFrictionX_dynamicFrictionY_dominance0Z_dominance1W);}
105};
106
107#if !PX_P64_FAMILY
109#else
111#endif
112
117{
118 Vec4V raXn_velMultiplierW;
119 Vec4V rbXn_maxImpulseW;
120
121 PxF32 biasedErr;
122 PxF32 unbiasedErr;
123 PxF32 impulseMultiplier;
124 PxU32 pad;
125
126 PX_FORCE_INLINE FloatV getVelMultiplier() const {return V4GetW(raXn_velMultiplierW);}
127 PX_FORCE_INLINE FloatV getImpulseMultiplier() const { return FLoad(impulseMultiplier); }
128
129 PX_FORCE_INLINE FloatV getBiasedErr() const {return FLoad(biasedErr);}
130 PX_FORCE_INLINE FloatV getMaxImpulse() const {return V4GetW(rbXn_maxImpulseW);}
131
132 PX_FORCE_INLINE Vec3V getRaXn() const {return Vec3V_From_Vec4V(raXn_velMultiplierW);}
133 PX_FORCE_INLINE Vec3V getRbXn() const {return Vec3V_From_Vec4V(rbXn_maxImpulseW);}
134
135 /*PX_FORCE_INLINE void setRaXn(const PxVec3& v) {V4WriteXYZ(raXn_velMultiplierW, v);}
136 PX_FORCE_INLINE void setRbXn(const PxVec3& v) {V4WriteXYZ(rbXn_maxImpulseW, v);}
137 PX_FORCE_INLINE void setVelMultiplier(PxF32 f) {V4WriteW(raXn_velMultiplierW, f);}
138
139 PX_FORCE_INLINE void setBiasedErr(PxF32 f) {biasedErr = f;}
140 PX_FORCE_INLINE void setUnbiasedErr(PxF32 f) {unbiasedErr = f;}
141
142 PX_FORCE_INLINE PxF32 getVelMultiplierPxF32() const {return V4ReadW(raXn_velMultiplierW);}
143 PX_FORCE_INLINE const PxVec3& getRaXnPxVec3() const {return V3ReadXYZ(raXn);}
144 PX_FORCE_INLINE const PxVec3& getRbXnPxVec3() const {return V3ReadXYZ(rbXn);}
145 PX_FORCE_INLINE PxF32 getBiasedErrPxF32() const {return biasedErr;}*/
146};
147
148
150
155{
156 Vec3V linDeltaVA;
157 Vec3V angDeltaVA;
158 Vec3V linDeltaVB;
159 Vec3V angDeltaVB;
160};
161
163
164
169{
170 Vec4V normalXYZ_appliedForceW; //16
171 Vec4V raXnXYZ_velMultiplierW; //32
172 Vec4V rbXnXYZ_biasW; //48
173 PxReal targetVel; //52
174 PxU32 mPad[3]; //64
175
176 PX_FORCE_INLINE void setAppliedForce(const FloatV f) {normalXYZ_appliedForceW=V4SetW(normalXYZ_appliedForceW,f);}
177 PX_FORCE_INLINE void setVelMultiplier(const FloatV f) {raXnXYZ_velMultiplierW=V4SetW(raXnXYZ_velMultiplierW,f);}
178 PX_FORCE_INLINE void setBias(const FloatV f) {rbXnXYZ_biasW=V4SetW(rbXnXYZ_biasW,f);}
179
180 PX_FORCE_INLINE FloatV getAppliedForce() const {return V4GetW(normalXYZ_appliedForceW);}
181 PX_FORCE_INLINE FloatV getVelMultiplier() const {return V4GetW(raXnXYZ_velMultiplierW);}
182 PX_FORCE_INLINE FloatV getBias() const {return V4GetW(rbXnXYZ_biasW);}
183
184 PX_FORCE_INLINE Vec3V getNormal() const {return Vec3V_From_Vec4V(normalXYZ_appliedForceW);}
185 PX_FORCE_INLINE Vec3V getRaXn() const {return Vec3V_From_Vec4V(raXnXYZ_velMultiplierW);}
186 PX_FORCE_INLINE Vec3V getRbXn() const {return Vec3V_From_Vec4V(rbXnXYZ_biasW);}
187
188 PX_FORCE_INLINE void setNormal(const PxVec3& v) {V4WriteXYZ(normalXYZ_appliedForceW, v);}
189 PX_FORCE_INLINE void setRaXn(const PxVec3& v) {V4WriteXYZ(raXnXYZ_velMultiplierW, v);}
190 PX_FORCE_INLINE void setRbXn(const PxVec3& v) {V4WriteXYZ(rbXnXYZ_biasW, v);}
191
192 PX_FORCE_INLINE const PxVec3& getNormalPxVec3() const {return V4ReadXYZ(normalXYZ_appliedForceW);}
193 PX_FORCE_INLINE const PxVec3& getRaXnPxVec3() const {return V4ReadXYZ(raXnXYZ_velMultiplierW);}
194 PX_FORCE_INLINE const PxVec3& getRbXnPxVec3() const {return V4ReadXYZ(rbXnXYZ_biasW);}
195
196 PX_FORCE_INLINE void setAppliedForce(PxF32 f) {V4WriteW(normalXYZ_appliedForceW, f);}
197 PX_FORCE_INLINE void setVelMultiplier(PxF32 f) {V4WriteW(raXnXYZ_velMultiplierW, f);}
198 PX_FORCE_INLINE void setBias(PxF32 f) {V4WriteW(rbXnXYZ_biasW, f);}
199
200 PX_FORCE_INLINE PxF32 getAppliedForcePxF32() const {return V4ReadW(normalXYZ_appliedForceW);}
201 PX_FORCE_INLINE PxF32 getVelMultiplierPxF32() const {return V4ReadW(raXnXYZ_velMultiplierW);}
202 PX_FORCE_INLINE PxF32 getBiasPxF32() const {return V4ReadW(rbXnXYZ_biasW);}
203
204};
205
207
212{
213 Vec3V linDeltaVA;
214 Vec3V angDeltaVA;
215 Vec3V linDeltaVB;
216 Vec3V angDeltaVB;
217};
219
220}
221
222}
223
224#endif
3 Element vector class.
Definition PxVec3.h:50
Definition ScShapeInteraction.h:54
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_COMPILE_TIME_ASSERT(exp)
Definition PxPreprocessor.h:428
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
A single extended articulation friction constraint for the solver.
Definition DySolverContact.h:212
A single friction constraint for the solver.
Definition DySolverContact.h:169
Definition DySolverContact.h:54
A single extended articulation contact point for the solver.
Definition DySolverContact.h:155
A single rigid body contact point for the solver.
Definition DySolverContact.h:117
Definition PxVecMathAoSScalar.h:52
Definition PxVecMathAoSScalar.h:77
Definition PxVecMathAoSScalar.h:65