20#ifdef BT_USE_DOUBLE_PRECISION
21#define btCollisionObjectData btCollisionObjectDoubleData
23#define btCollisionObjectData btCollisionObjectFloatData
46#ifdef DEBUG_PERSISTENCY
48void btPersistentManifold::DebugPersistency()
54 printf(
"m_pointCache[%d].m_userPersistentData = %x\n", i,
m_pointCache[i].m_userPersistentData);
64#ifdef DEBUG_PERSISTENCY
73 printf(
"error in clearUserCache\n");
85#ifdef DEBUG_PERSISTENCY
116 int maxPenetrationIndex = -1;
117#define KEEP_DEEPEST_POINT 1
118#ifdef KEEP_DEEPEST_POINT
120 for (
int i = 0; i < 4; i++)
124 maxPenetrationIndex = i;
134 if (maxPenetrationIndex != 0)
141 if (maxPenetrationIndex != 1)
149 if (maxPenetrationIndex != 2)
157 if (maxPenetrationIndex != 3)
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++)
203 if (distToManiPoint < shortestDist)
205 shortestDist = distToManiPoint;
222#if MANIFOLD_CACHE_SIZE >= 4
250#ifdef DEBUG_PERSISTENCY
251 printf(
"refreshContactPoints posA = (%f,%f,%f) posB = (%f,%f,%f)\n",
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
321 dataOut->m_index1a = manifold->
m_index1a;
328 dataOut->m_pointCachePrevRHS[i] = pt.
m_prevRHS;
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;
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
const T & btMax(const T &a, const T &b)
bool gContactCalcArea3Points
gContactCalcArea3Points will approximate the convex hull area using 3 points when setting it to false...
#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
void(* ContactEndedCallback)(btPersistentManifold *const &manifold)
void(* ContactStartedCallback)(btPersistentManifold *const &manifold)
bool(* ContactDestroyedCallback)(void *userPersistentData)
#define btPersistentManifoldDataName
#define btPersistentManifoldData
@ BT_PERSISTENT_MANIFOLD_TYPE
#define MANIFOLD_CACHE_SIZE
bool(* ContactProcessedCallback)(btManifoldPoint &cp, void *body0, void *body1)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
ManifoldContactPoint collects and maintains persistent contactpoints.
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
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
const btCollisionObject * m_body1
btScalar m_contactBreakingThreshold
const btManifoldPoint & getContactPoint(int index) const
bool validContactDistance(const btManifoldPoint &pt) const
const char * serialize(const class btPersistentManifold *manifold, void *dataBuffer, class btSerializer *serializer) const
const btCollisionObject * getBody0() const
int getCacheEntry(const btManifoldPoint &newPoint) const
void refreshContactPoints(const btTransform &trA, const btTransform &trB)
calculated new worldspace coordinates and depth, and reject points that exceed the collision margin
int calculateSerializeBufferSize() const
int sortCachedPoints(const btManifoldPoint &pt)
sort cached points so most isolated points come first
const btCollisionObject * getBody1() const
btScalar m_contactProcessingThreshold
void clearUserCache(btManifoldPoint &pt)
void removeContactPoint(int index)
void deSerialize(const struct btPersistentManifoldDoubleData *manifoldDataPtr)
int getNumContacts() const
int addManifoldPoint(const btManifoldPoint &newPoint, bool isPredictive=false)
btScalar getContactBreakingThreshold() const
btScalar getContactProcessingThreshold() const
const btCollisionObject * m_body0
this two body pointers can point to the physics rigidbody class.
btManifoldPoint m_pointCache[MANIFOLD_CACHE_SIZE]
virtual void * getUniquePointer(void *oldPtr)=0
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
void deSerialize(const struct btVector3DoubleData &dataIn)
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
void deSerializeDouble(const struct btVector3DoubleData &dataIn)
btScalar length2() const
Return the length of the vector squared.
const btScalar & getY() const
Return the y value.
void serialize(struct btVector3Data &dataOut) const
const btScalar & getX() const
Return the x value.
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