29#ifndef DY_SOLVER_CONSTRAINT_SHARED_H
30#define DY_SOLVER_CONSTRAINT_SHARED_H
32#include "foundation/PxPreprocessor.h"
33#include "foundation/PxVecMath.h"
35#include "DySolverBody.h"
36#include "DySolverContact.h"
37#include "DySolverConstraint1D.h"
38#include "DySolverConstraintDesc.h"
39#include "foundation/PxUtilities.h"
40#include "DyConstraint.h"
41#include "foundation/PxAtomic.h"
49 PX_FORCE_INLINE static FloatV solveDynamicContacts(SolverContactPoint* contacts,
const PxU32 nbContactPoints,
const Vec3VArg contactNormal,
50 const FloatVArg invMassA,
const FloatVArg invMassB,
const FloatVArg angDom0,
const FloatVArg angDom1, Vec3V& linVel0_, Vec3V& angState0_,
51 Vec3V& linVel1_, Vec3V& angState1_, PxF32*
PX_RESTRICT forceBuffer)
53 Vec3V linVel0 = linVel0_;
54 Vec3V angState0 = angState0_;
55 Vec3V linVel1 = linVel1_;
56 Vec3V angState1 = angState1_;
57 FloatV accumulatedNormalImpulse = FZero();
59 const Vec3V delLinVel0 = V3Scale(contactNormal, invMassA);
60 const Vec3V delLinVel1 = V3Scale(contactNormal, invMassB);
62 for(PxU32 i=0;i<nbContactPoints;i++)
64 SolverContactPoint& c = contacts[i];
67 const Vec3V raXn = Vec3V_From_Vec4V(c.raXn_velMultiplierW);
69 const Vec3V rbXn = Vec3V_From_Vec4V(c.rbXn_maxImpulseW);
71 const FloatV appliedForce = FLoad(forceBuffer[i]);
72 const FloatV velMultiplier = c.getVelMultiplier();
73 const FloatV impulseMultiplier = c.getImpulseMultiplier();
77 const FloatV maxImpulse = c.getMaxImpulse();
80 const Vec3V v0 = V3MulAdd(linVel0, contactNormal, V3Mul(angState0, raXn));
81 const Vec3V v1 = V3MulAdd(linVel1, contactNormal, V3Mul(angState1, rbXn));
82 const FloatV normalVel = V3SumElems(V3Sub(v0, v1));
84 const FloatV biasedErr = c.getBiasedErr();
87 const FloatV _deltaF = FMax(FNegScaleSub(normalVel, velMultiplier, biasedErr), FNeg(appliedForce));
88 const FloatV _newForce = FAdd(FMul(impulseMultiplier, appliedForce), _deltaF);
89 const FloatV newForce = FMin(_newForce, maxImpulse);
90 const FloatV deltaF = FSub(newForce, appliedForce);
92 linVel0 = V3ScaleAdd(delLinVel0, deltaF, linVel0);
93 linVel1 = V3NegScaleSub(delLinVel1, deltaF, linVel1);
94 angState0 = V3ScaleAdd(raXn, FMul(deltaF, angDom0), angState0);
95 angState1 = V3NegScaleSub(rbXn, FMul(deltaF, angDom1), angState1);
97 FStore(newForce, &forceBuffer[i]);
99 accumulatedNormalImpulse = FAdd(accumulatedNormalImpulse, newForce);
103 angState0_ = angState0;
105 angState1_ = angState1;
106 return accumulatedNormalImpulse;
109PX_FORCE_INLINE static FloatV solveStaticContacts(SolverContactPoint* contacts,
const PxU32 nbContactPoints,
const Vec3VArg contactNormal,
110 const FloatVArg invMassA,
const FloatVArg angDom0, Vec3V& linVel0_, Vec3V& angState0_, PxF32*
PX_RESTRICT forceBuffer)
112 Vec3V linVel0 = linVel0_;
113 Vec3V angState0 = angState0_;
114 FloatV accumulatedNormalImpulse = FZero();
116 const Vec3V delLinVel0 = V3Scale(contactNormal, invMassA);
118 for(PxU32 i=0;i<nbContactPoints;i++)
120 SolverContactPoint& c = contacts[i];
123 const Vec3V raXn = Vec3V_From_Vec4V(c.raXn_velMultiplierW);
125 const FloatV appliedForce = FLoad(forceBuffer[i]);
126 const FloatV velMultiplier = c.getVelMultiplier();
127 const FloatV impulseMultiplier = c.getImpulseMultiplier();
131 const FloatV maxImpulse = c.getMaxImpulse();
133 const Vec3V v0 = V3MulAdd(linVel0, contactNormal, V3Mul(angState0, raXn));
134 const FloatV normalVel = V3SumElems(v0);
137 const FloatV biasedErr = c.getBiasedErr();
141 const FloatV _deltaF = FMax(FNegScaleSub(normalVel, velMultiplier, biasedErr), FNeg(appliedForce));
142 const FloatV _newForce = FAdd(FMul(appliedForce, impulseMultiplier), _deltaF);
143 const FloatV newForce = FMin(_newForce, maxImpulse);
144 const FloatV deltaF = FSub(newForce, appliedForce);
146 linVel0 = V3ScaleAdd(delLinVel0, deltaF, linVel0);
147 angState0 = V3ScaleAdd(raXn, FMul(deltaF, angDom0), angState0);
149 FStore(newForce, &forceBuffer[i]);
151 accumulatedNormalImpulse = FAdd(accumulatedNormalImpulse, newForce);
155 angState0_ = angState0;
156 return accumulatedNormalImpulse;
159FloatV solveExtContacts(SolverContactPointExt* contacts,
const PxU32 nbContactPoints,
const Vec3VArg contactNormal,
160 Vec3V& linVel0, Vec3V& angVel0,
161 Vec3V& linVel1, Vec3V& angVel1,
162 Vec3V& li0, Vec3V& ai0,
163 Vec3V& li1, Vec3V& ai1,
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PX_FORCE_INLINE void PxPrefetchLine(const void *ptr, uint32_t offset=0)
Definition PxUnixIntrinsics.h:83