Some optimizations in contact solver

This commit is contained in:
Daniel Chappuis 2016-10-17 22:41:33 +02:00
parent 81426293e0
commit 14bfb0aca4
2 changed files with 23 additions and 41 deletions

View File

@ -102,7 +102,7 @@ class ContactManifold {
short int mNormalDirectionId;
/// Number of contacts in the cache
uint mNbContactPoints;
int8 mNbContactPoints;
/// First friction vector of the contact manifold
Vector3 mFrictionVector1;
@ -187,7 +187,7 @@ class ContactManifold {
void clear();
/// Return the number of contact points in the manifold
uint getNbContactPoints() const;
int8 getNbContactPoints() const;
/// Return the first friction vector at the center of the contact manifold
const Vector3& getFrictionVector1() const;
@ -264,7 +264,7 @@ inline short int ContactManifold::getNormalDirectionId() const {
}
// Return the number of contact points in the manifold
inline uint ContactManifold::getNbContactPoints() const {
inline int8 ContactManifold::getNbContactPoints() const {
return mNbContactPoints;
}

View File

@ -119,11 +119,8 @@ class ContactSolver {
*/
struct ContactPointSolver {
/// Accumulated normal impulse
decimal penetrationImpulse;
/// Accumulated split impulse for penetration correction
decimal penetrationSplitImpulse;
/// Pointer to the external contact
ContactPoint* externalContact;
/// Normal vector of the contact
Vector3 normal;
@ -134,41 +131,26 @@ class ContactSolver {
/// Vector from the body 2 center to the contact point
Vector3 r2;
/// Cross product of r1 with 1st friction vector
Vector3 r1CrossT1;
/// Cross product of r1 with 2nd friction vector
Vector3 r1CrossT2;
/// Cross product of r2 with 1st friction vector
Vector3 r2CrossT1;
/// Cross product of r2 with 2nd friction vector
Vector3 r2CrossT2;
/// Cross product of r1 with the contact normal
Vector3 r1CrossN;
/// Cross product of r2 with the contact normal
Vector3 r2CrossN;
/// Penetration depth
decimal penetrationDepth;
/// Velocity restitution bias
decimal restitutionBias;
/// Accumulated normal impulse
decimal penetrationImpulse;
/// Accumulated split impulse for penetration correction
decimal penetrationSplitImpulse;
/// Inverse of the matrix K for the penenetration
decimal inversePenetrationMass;
/// Inverse of the matrix K for the 1st friction
decimal inverseFriction1Mass;
/// Cross product of r1 with the contact normal
Vector3 r1CrossN;
/// Inverse of the matrix K for the 2nd friction
decimal inverseFriction2Mass;
/// Pointer to the external contact
ContactPoint* externalContact;
/// Cross product of r2 with the contact normal
Vector3 r2CrossN;
/// True if the contact was existing last time step
bool isRestingContact;
@ -181,11 +163,14 @@ class ContactSolver {
*/
struct ContactManifoldSolver {
/// Pointer to the external contact manifold
ContactManifold* externalContactManifold;
/// Index of body 1 in the constraint solver
uint indexBody1;
int32 indexBody1;
/// Index of body 2 in the constraint solver
uint indexBody2;
int32 indexBody2;
/// Inverse of the mass of body 1
decimal massInverseBody1;
@ -199,18 +184,12 @@ class ContactSolver {
/// Inverse inertia tensor of body 2
Matrix3x3 inverseInertiaTensorBody2;
/// Number of contact points
short int nbContacts;
/// Mix friction coefficient for the two bodies
decimal frictionCoefficient;
/// Rolling resistance factor between the two bodies
decimal rollingResistanceFactor;
/// Pointer to the external contact manifold
ContactManifold* externalContactManifold;
// - Variables used when friction constraints are apply at the center of the manifold-//
/// Average normal vector of the contact manifold
@ -275,6 +254,9 @@ class ContactSolver {
/// Rolling resistance impulse
Vector3 rollingResistanceImpulse;
/// Number of contact points
int8 nbContacts;
};
// -------------------- Constants --------------------- //