1 #ifndef B3_PGS_JACOBI_SOLVER
2 #define B3_PGS_JACOBI_SOLVER
9 #include "b3TypedConstraint.h"
10 #include "b3ContactSolverInfo.h"
11 #include "b3SolverBody.h"
12 #include "b3SolverConstraint.h"
14 struct b3RigidBodyData;
17 class b3PgsJacobiSolver
20 b3AlignedObjectArray<b3SolverBody> m_tmpSolverBodyPool;
21 b3ConstraintArray m_tmpSolverContactConstraintPool;
22 b3ConstraintArray m_tmpSolverNonContactConstraintPool;
23 b3ConstraintArray m_tmpSolverContactFrictionConstraintPool;
24 b3ConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
26 b3AlignedObjectArray<int> m_orderTmpConstraintPool;
27 b3AlignedObjectArray<int> m_orderNonContactConstraintPool;
28 b3AlignedObjectArray<int> m_orderFrictionConstraintPool;
29 b3AlignedObjectArray<b3TypedConstraint::b3ConstraintInfo1> m_tmpConstraintSizesPool;
31 b3AlignedObjectArray<int> m_bodyCount;
32 b3AlignedObjectArray<int> m_bodyCountCheck;
34 b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocities;
35 b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocities;
38 void averageVelocities();
40 int m_maxOverrideNumSolverIterations;
42 int m_numSplitImpulseRecoveries;
44 b3Scalar getContactProcessingThreshold(b3Contact4* contact)
48 void setupFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB,
49 b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
50 b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation,
51 b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
53 void setupRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB,
54 b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
55 b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation,
56 b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
58 b3SolverConstraint& addFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
59 b3SolverConstraint& addRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0, b3Scalar cfmSlip = 0.f);
61 void setupContactConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias,
62 b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, b3ContactPoint& cp,
63 const b3ContactSolverInfo& infoGlobal, b3Vector3& vel, b3Scalar& rel_vel, b3Scalar& relaxation,
64 b3Vector3& rel_pos1, b3Vector3& rel_pos2);
66 void setFrictionConstraintImpulse(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB,
67 b3ContactPoint& cp, const b3ContactSolverInfo& infoGlobal);
69 ///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
70 unsigned long m_btSeed2;
72 b3Scalar restitutionCurve(b3Scalar rel_vel, b3Scalar restitution);
74 void convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias, b3Contact4* manifold, const b3ContactSolverInfo& infoGlobal);
76 void resolveSplitPenetrationSIMD(
77 b3SolverBody& bodyA, b3SolverBody& bodyB,
78 const b3SolverConstraint& contactConstraint);
80 void resolveSplitPenetrationImpulseCacheFriendly(
81 b3SolverBody& bodyA, b3SolverBody& bodyB,
82 const b3SolverConstraint& contactConstraint);
85 int getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies, b3InertiaData* inertias);
86 void initSolverBody(int bodyIndex, b3SolverBody* solverBody, b3RigidBodyData* collisionObject);
88 void resolveSingleConstraintRowGeneric(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
90 void resolveSingleConstraintRowGenericSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
92 void resolveSingleConstraintRowLowerLimit(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
94 void resolveSingleConstraintRowLowerLimitSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
97 virtual b3Scalar solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
99 virtual b3Scalar solveGroupCacheFriendlyIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
100 virtual void solveGroupCacheFriendlySplitImpulseIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
101 b3Scalar solveSingleIteration(int iteration, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
103 virtual b3Scalar solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, const b3ContactSolverInfo& infoGlobal);
106 B3_DECLARE_ALIGNED_ALLOCATOR();
108 b3PgsJacobiSolver(bool usePgs);
109 virtual ~b3PgsJacobiSolver();
111 // void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts);
112 void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts, int numConstraints, b3TypedConstraint** constraints);
114 b3Scalar solveGroup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
116 ///clear internal cached data and reset random seed
117 virtual void reset();
119 unsigned long b3Rand2();
121 int b3RandInt2(int n);
123 void setRandSeed(unsigned long seed)
127 unsigned long getRandSeed() const
133 #endif //B3_PGS_JACOBI_SOLVER