20 #ifdef BT_USE_DOUBLE_PRECISION
21 #define btCollisionObjectData btCollisionObjectDoubleData
23 #define btCollisionObjectData btCollisionObjectFloatData
46 #ifdef DEBUG_PERSISTENCY
48 void btPersistentManifold::DebugPersistency()
54 printf(
"m_pointCache[%d].m_userPersistentData = %x\n", i, m_pointCache[i].m_userPersistentData);
64 #ifdef DEBUG_PERSISTENCY
69 if (m_pointCache[i].m_userPersistentData == oldPtr)
73 printf(
"error in clearUserCache\n");
85 #ifdef DEBUG_PERSISTENCY
108 return btMax(
btMax(tmp0.length2(), tmp1.length2()), tmp2.length2());
116 int maxPenetrationIndex = -1;
117 #define KEEP_DEEPEST_POINT 1
118 #ifdef KEEP_DEEPEST_POINT
120 for (
int i = 0; i < 4; i++)
122 if (m_pointCache[i].getDistance() < maxPenetration)
124 maxPenetrationIndex = i;
125 maxPenetration = m_pointCache[i].getDistance();
134 if (maxPenetrationIndex != 0)
137 btVector3 b0 = m_pointCache[3].m_localPointA - m_pointCache[2].m_localPointA;
139 res0 =
cross.length2();
141 if (maxPenetrationIndex != 1)
144 btVector3 b1 = m_pointCache[3].m_localPointA - m_pointCache[2].m_localPointA;
146 res1 =
cross.length2();
149 if (maxPenetrationIndex != 2)
152 btVector3 b2 = m_pointCache[3].m_localPointA - m_pointCache[1].m_localPointA;
154 res2 =
cross.length2();
157 if (maxPenetrationIndex != 3)
160 btVector3 b3 = m_pointCache[2].m_localPointA - m_pointCache[1].m_localPointA;
162 res3 =
cross.length2();
167 if (maxPenetrationIndex != 0)
172 if (maxPenetrationIndex != 1)
177 if (maxPenetrationIndex != 2)
182 if (maxPenetrationIndex != 3)
187 btVector4 maxvec(res0, res1, res2, res3);
196 int nearestPoint = -1;
197 for (
int i = 0; i <
size; i++)
202 const btScalar distToManiPoint = diffA.dot(diffA);
203 if (distToManiPoint < shortestDist)
205 shortestDist = distToManiPoint;
222 #if MANIFOLD_CACHE_SIZE >= 4
237 btAssert(m_pointCache[insertIndex].m_userPersistentData == 0);
238 m_pointCache[insertIndex] = newPoint;
250 #ifdef DEBUG_PERSISTENCY
251 printf(
"refreshContactPoints posA = (%f,%f,%f) posB = (%f,%f,%f)\n",
252 trA.getOrigin().getX(),
253 trA.getOrigin().getY(),
254 trA.getOrigin().getZ(),
255 trB.getOrigin().getX(),
256 trB.getOrigin().getY(),
257 trB.getOrigin().getZ());
260 for (i = getNumContacts() - 1; i >= 0; i--)
271 btVector3 projectedDifference, projectedPoint;
286 distance2d = projectedDifference.dot(projectedDifference);
295 (*gContactProcessedCallback)(manifoldPoint, (
void*)
m_body0, (
void*)
m_body1);
299 #ifdef DEBUG_PERSISTENCY
316 dataOut->m_contactBreakingThreshold = manifold->getContactBreakingThreshold();
317 dataOut->m_contactProcessingThreshold = manifold->getContactProcessingThreshold();
318 dataOut->m_numCachedPoints = manifold->getNumContacts();
319 dataOut->m_companionIdA = manifold->m_companionIdA;
320 dataOut->m_companionIdB = manifold->m_companionIdB;
321 dataOut->m_index1a = manifold->m_index1a;
322 dataOut->m_objectType = manifold->m_objectType;
328 dataOut->m_pointCachePrevRHS[i] = pt.
m_prevRHS;
331 pt.
m_localPointA.serialize(dataOut->m_pointCacheLocalPointA[i]);
332 pt.
m_localPointB.serialize(dataOut->m_pointCacheLocalPointB[i]);
337 dataOut->m_pointCacheLifeTime[i] = pt.
m_lifeTime;
342 dataOut->m_pointCacheIndex0[i] = pt.
m_index0;
343 dataOut->m_pointCacheIndex1[i] = pt.
m_index1;
344 dataOut->m_pointCachePartId0[i] = pt.
m_partId0;
345 dataOut->m_pointCachePartId1[i] = pt.
m_partId1;
btScalar m_contactProcessingThreshold
virtual btScalar getContactBreakingThreshold(btScalar defaultContactThresholdFactor) const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const T & btMax(const T &a, const T &b)
bool gContactCalcArea3Points
#define btCollisionObjectData
ContactEndedCallback gContactEndedCallback
static btScalar calcArea4Points(const btVector3 &p0, const btVector3 &p1, const btVector3 &p2, const btVector3 &p3)
ContactStartedCallback gContactStartedCallback
ContactProcessedCallback gContactProcessedCallback
ContactDestroyedCallback gContactDestroyedCallback
btScalar gContactBreakingThreshold
maximum contact breaking and merging threshold
bool validContactDistance(const btManifoldPoint &pt) const
const btCollisionObject * m_body0
this two body pointers can point to the physics rigidbody class.
void(* ContactEndedCallback)(btPersistentManifold *const &manifold)
int getCacheEntry(const btManifoldPoint &newPoint) const
const btCollisionObject * m_body1
btScalar m_contactBreakingThreshold
void deSerialize(const struct btPersistentManifoldDoubleData *manifoldDataPtr)
void refreshContactPoints(const btTransform &trA, const btTransform &trB)
calculated new worldspace coordinates and depth, and reject points that exceed the collision margin
int sortCachedPoints(const btManifoldPoint &pt)
sort cached points so most isolated points come first
void removeContactPoint(int index)
void(* ContactStartedCallback)(btPersistentManifold *const &manifold)
bool(* ContactDestroyedCallback)(void *userPersistentData)
void clearUserCache(btManifoldPoint &pt)
int addManifoldPoint(const btManifoldPoint &newPoint, bool isPredictive=false)
#define btPersistentManifoldDataName
#define btPersistentManifoldData
@ BT_PERSISTENT_MANIFOLD_TYPE
#define MANIFOLD_CACHE_SIZE
bool(* ContactProcessedCallback)(btManifoldPoint &cp, void *body0, void *body1)
SIMD_FORCE_INLINE int getNumContacts() const
unsigned calculateSerializeBufferSize() const
virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
Data buffer MUST be 16 byte aligned.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
btScalar m_combinedSpinningFriction
btScalar m_combinedRollingFriction
btScalar getDistance() const
btScalar m_combinedContactStiffness1
btScalar m_combinedRestitution
btVector3 m_lateralFrictionDir2
btVector3 m_positionWorldOnA
m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity
btScalar m_combinedContactDamping1
btScalar m_appliedImpulseLateral2
btScalar m_appliedImpulse
void * m_userPersistentData
btScalar m_appliedImpulseLateral1
btVector3 m_normalWorldOnB
btScalar m_combinedFriction
btVector3 m_positionWorldOnB
btScalar m_contactMotion2
btVector3 m_lateralFrictionDir1
btScalar m_contactMotion1
virtual void * getUniquePointer(void *oldPtr)=0
SIMD_FORCE_INLINE int closestAxis4() const
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
double m_pointCachePrevRHS[4]
int m_pointCachePartId0[4]
btVector3DoubleData m_pointCacheLateralFrictionDir1[4]
btVector3DoubleData m_pointCachePositionWorldOnB[4]
double m_contactProcessingThreshold
double m_pointCacheCombinedRollingFriction[4]
double m_contactBreakingThreshold
int m_pointCacheContactPointFlags[4]
double m_pointCacheDistance[4]
int m_pointCacheLifeTime[4]
btVector3DoubleData m_pointCacheLocalPointB[4]
double m_pointCacheAppliedImpulseLateral2[4]
double m_pointCacheCombinedContactDamping1[4]
btVector3DoubleData m_pointCachePositionWorldOnA[4]
double m_pointCacheAppliedImpulseLateral1[4]
double m_pointCacheContactMotion2[4]
double m_pointCacheCombinedContactStiffness1[4]
int m_pointCacheIndex0[4]
double m_pointCacheContactERP[4]
double m_pointCacheContactMotion1[4]
btVector3DoubleData m_pointCacheNormalWorldOnB[4]
double m_pointCacheContactCFM[4]
btVector3DoubleData m_pointCacheLateralFrictionDir2[4]
double m_pointCacheAppliedImpulse[4]
int m_pointCachePartId1[4]
double m_pointCacheCombinedRestitution[4]
double m_pointCacheFrictionCFM[4]
double m_pointCacheCombinedSpinningFriction[4]
int m_pointCacheIndex1[4]
double m_pointCacheCombinedFriction[4]
btVector3DoubleData m_pointCacheLocalPointA[4]
int m_pointCachePartId0[4]
float m_pointCacheDistance[4]
float m_pointCacheAppliedImpulse[4]
float m_pointCacheAppliedImpulseLateral1[4]
btVector3FloatData m_pointCacheNormalWorldOnB[4]
float m_pointCacheContactERP[4]
int m_pointCacheIndex0[4]
int m_pointCacheLifeTime[4]
float m_pointCacheCombinedContactDamping1[4]
float m_pointCacheContactMotion2[4]
float m_pointCacheCombinedFriction[4]
btVector3FloatData m_pointCacheLocalPointB[4]
float m_contactBreakingThreshold
float m_pointCacheCombinedContactStiffness1[4]
float m_pointCacheFrictionCFM[4]
int m_pointCacheIndex1[4]
float m_pointCacheContactMotion1[4]
int m_pointCacheContactPointFlags[4]
float m_pointCacheCombinedRollingFriction[4]
float m_pointCacheAppliedImpulseLateral2[4]
btVector3FloatData m_pointCachePositionWorldOnB[4]
float m_pointCachePrevRHS[4]
float m_pointCacheCombinedRestitution[4]
float m_pointCacheContactCFM[4]
btVector3FloatData m_pointCacheLocalPointA[4]
float m_pointCacheCombinedSpinningFriction[4]
btVector3FloatData m_pointCachePositionWorldOnA[4]
btVector3FloatData m_pointCacheLateralFrictionDir1[4]
float m_contactProcessingThreshold
int m_pointCachePartId1[4]
btVector3FloatData m_pointCacheLateralFrictionDir2[4]
rudimentary class to provide type info