- DemoApplication, debug text rendering was broken, glLoadIdentity() missing
- copy user data over to child shape - added applied impulse to btManifoldPoint - add ContactProcessedCallback (needs test/demo) - didn't copy over m_additionalDampingFactor into btRigidBody.
This commit is contained in:
@@ -742,12 +742,16 @@ btRigidBody* DemoApplication::localCreateRigidBody(float mass, const btTransform
|
|||||||
#define USE_MOTIONSTATE 1
|
#define USE_MOTIONSTATE 1
|
||||||
#ifdef USE_MOTIONSTATE
|
#ifdef USE_MOTIONSTATE
|
||||||
btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
|
btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
|
||||||
btRigidBody* body = new btRigidBody(btRigidBody::btRigidBodyConstructionInfo(mass,myMotionState,shape,localInertia));
|
|
||||||
|
btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia);
|
||||||
|
|
||||||
|
btRigidBody* body = new btRigidBody(cInfo);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
btRigidBody* body = new btRigidBody(mass,0,shape,localInertia);
|
btRigidBody* body = new btRigidBody(mass,0,shape,localInertia);
|
||||||
body->setWorldTransform(startTransform);
|
body->setWorldTransform(startTransform);
|
||||||
#endif//
|
#endif//
|
||||||
|
|
||||||
m_dynamicsWorld->addRigidBody(body);
|
m_dynamicsWorld->addRigidBody(body);
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
@@ -759,6 +763,7 @@ void DemoApplication::setOrthographicProjection()
|
|||||||
|
|
||||||
// switch to projection mode
|
// switch to projection mode
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
|
||||||
// save previous matrix which contains the
|
// save previous matrix which contains the
|
||||||
//settings for the perspective projection
|
//settings for the perspective projection
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
@@ -766,16 +771,20 @@ void DemoApplication::setOrthographicProjection()
|
|||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
// set a 2D orthographic projection
|
// set a 2D orthographic projection
|
||||||
gluOrtho2D(0, m_glutScreenWidth, 0, m_glutScreenHeight);
|
gluOrtho2D(0, m_glutScreenWidth, 0, m_glutScreenHeight);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
// invert the y axis, down is positive
|
// invert the y axis, down is positive
|
||||||
glScalef(1, -1, 1);
|
glScalef(1, -1, 1);
|
||||||
// mover the origin from the bottom left corner
|
// mover the origin from the bottom left corner
|
||||||
// to the upper left corner
|
// to the upper left corner
|
||||||
glTranslatef(0, -m_glutScreenHeight, 0);
|
glTranslatef(0, -m_glutScreenHeight, 0);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemoApplication::resetPerspectiveProjection()
|
void DemoApplication::resetPerspectiveProjection()
|
||||||
{
|
{
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|||||||
@@ -109,9 +109,12 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
|
|||||||
{
|
{
|
||||||
btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
|
btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
|
||||||
tm.setMargin(m_collisionMarginTriangle);
|
tm.setMargin(m_collisionMarginTriangle);
|
||||||
|
|
||||||
|
|
||||||
btCollisionShape* tmpShape = ob->getCollisionShape();
|
btCollisionShape* tmpShape = ob->getCollisionShape();
|
||||||
|
|
||||||
|
//copy over user pointers to temporary shape
|
||||||
|
tm.setTypedUserInfo(tmpShape->getTypedUserInfo());
|
||||||
|
tm.setUserPointer(tmpShape->getUserPointer());
|
||||||
|
|
||||||
ob->setCollisionShape( &tm );
|
ob->setCollisionShape( &tm );
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class btManifoldPoint
|
|||||||
public:
|
public:
|
||||||
btManifoldPoint()
|
btManifoldPoint()
|
||||||
:m_userPersistentData(0),
|
:m_userPersistentData(0),
|
||||||
|
m_appliedImpulse(0.f),
|
||||||
m_lifeTime(0)
|
m_lifeTime(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -44,6 +45,7 @@ class btManifoldPoint
|
|||||||
m_combinedFriction(btScalar(0.)),
|
m_combinedFriction(btScalar(0.)),
|
||||||
m_combinedRestitution(btScalar(0.)),
|
m_combinedRestitution(btScalar(0.)),
|
||||||
m_userPersistentData(0),
|
m_userPersistentData(0),
|
||||||
|
m_appliedImpulse(0.f),
|
||||||
m_lifeTime(0)
|
m_lifeTime(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -65,6 +67,7 @@ class btManifoldPoint
|
|||||||
|
|
||||||
|
|
||||||
mutable void* m_userPersistentData;
|
mutable void* m_userPersistentData;
|
||||||
|
btScalar m_appliedImpulse;
|
||||||
|
|
||||||
int m_lifeTime;//lifetime of the contactpoint in frames
|
int m_lifeTime;//lifetime of the contactpoint in frames
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
btScalar gContactBreakingThreshold = btScalar(0.02);
|
btScalar gContactBreakingThreshold = btScalar(0.02);
|
||||||
ContactDestroyedCallback gContactDestroyedCallback = 0;
|
ContactDestroyedCallback gContactDestroyedCallback = 0;
|
||||||
|
ContactProcessedCallback gContactProcessedCallback = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -234,6 +235,11 @@ void btPersistentManifold::refreshContactPoints(const btTransform& trA,const btT
|
|||||||
if (distance2d > getContactBreakingThreshold()*getContactBreakingThreshold() )
|
if (distance2d > getContactBreakingThreshold()*getContactBreakingThreshold() )
|
||||||
{
|
{
|
||||||
removeContactPoint(i);
|
removeContactPoint(i);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
//contact point processed callback
|
||||||
|
if (gContactProcessedCallback)
|
||||||
|
(*gContactProcessedCallback)(manifoldPoint,m_body0,m_body1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ struct btCollisionResult;
|
|||||||
extern btScalar gContactBreakingThreshold;
|
extern btScalar gContactBreakingThreshold;
|
||||||
|
|
||||||
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
|
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
|
||||||
|
typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp,void* body0,void* body1);
|
||||||
extern ContactDestroyedCallback gContactDestroyedCallback;
|
extern ContactDestroyedCallback gContactDestroyedCallback;
|
||||||
|
|
||||||
|
|
||||||
@@ -123,6 +124,7 @@ public:
|
|||||||
m_pointCache[index] = m_pointCache[lastUsedIndex];
|
m_pointCache[index] = m_pointCache[lastUsedIndex];
|
||||||
//get rid of duplicated userPersistentData pointer
|
//get rid of duplicated userPersistentData pointer
|
||||||
m_pointCache[lastUsedIndex].m_userPersistentData = 0;
|
m_pointCache[lastUsedIndex].m_userPersistentData = 0;
|
||||||
|
m_pointCache[lastUsedIndex].m_appliedImpulse = 0.f;
|
||||||
m_pointCache[lastUsedIndex].m_lifeTime = 0;
|
m_pointCache[lastUsedIndex].m_lifeTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,12 +138,14 @@ public:
|
|||||||
#define MAINTAIN_PERSISTENCY 1
|
#define MAINTAIN_PERSISTENCY 1
|
||||||
#ifdef MAINTAIN_PERSISTENCY
|
#ifdef MAINTAIN_PERSISTENCY
|
||||||
int lifeTime = m_pointCache[insertIndex].getLifeTime();
|
int lifeTime = m_pointCache[insertIndex].getLifeTime();
|
||||||
|
btScalar appliedImpulse = m_pointCache[insertIndex].m_appliedImpulse;
|
||||||
btAssert(lifeTime>=0);
|
btAssert(lifeTime>=0);
|
||||||
void* cache = m_pointCache[insertIndex].m_userPersistentData;
|
void* cache = m_pointCache[insertIndex].m_userPersistentData;
|
||||||
|
|
||||||
m_pointCache[insertIndex] = newPoint;
|
m_pointCache[insertIndex] = newPoint;
|
||||||
|
|
||||||
m_pointCache[insertIndex].m_userPersistentData = cache;
|
m_pointCache[insertIndex].m_userPersistentData = cache;
|
||||||
|
m_pointCache[insertIndex].m_appliedImpulse = appliedImpulse;
|
||||||
m_pointCache[insertIndex].m_lifeTime = lifeTime;
|
m_pointCache[insertIndex].m_lifeTime = lifeTime;
|
||||||
#else
|
#else
|
||||||
clearUserCache(m_pointCache[insertIndex]);
|
clearUserCache(m_pointCache[insertIndex]);
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ bool MyContactDestroyedCallback(void* userPersistentData)
|
|||||||
|
|
||||||
|
|
||||||
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
|
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
|
||||||
:m_solverMode(SOLVER_RANDMIZE_ORDER | SOLVER_CACHE_FRIENDLY), //not using SOLVER_USE_WARMSTARTING,
|
:m_solverMode(SOLVER_RANDMIZE_ORDER | SOLVER_CACHE_FRIENDLY | SOLVER_USE_WARMSTARTING ),
|
||||||
m_btSeed2(0)
|
m_btSeed2(0)
|
||||||
{
|
{
|
||||||
gContactDestroyedCallback = &MyContactDestroyedCallback;
|
gContactDestroyedCallback = &MyContactDestroyedCallback;
|
||||||
@@ -386,6 +386,7 @@ void btSequentialImpulseConstraintSolver::addFrictionConstraint(const btVector3&
|
|||||||
solverConstraint.m_frictionIndex = frictionIndex;
|
solverConstraint.m_frictionIndex = frictionIndex;
|
||||||
|
|
||||||
solverConstraint.m_friction = cp.m_combinedFriction;
|
solverConstraint.m_friction = cp.m_combinedFriction;
|
||||||
|
solverConstraint.m_originalContactPoint = 0;
|
||||||
|
|
||||||
solverConstraint.m_appliedImpulse = btScalar(0.);
|
solverConstraint.m_appliedImpulse = btScalar(0.);
|
||||||
solverConstraint.m_appliedVelocityImpulse = 0.f;
|
solverConstraint.m_appliedVelocityImpulse = 0.f;
|
||||||
@@ -609,6 +610,8 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
solverConstraint.m_solverBodyIdB = solverBodyIdB;
|
solverConstraint.m_solverBodyIdB = solverBodyIdB;
|
||||||
solverConstraint.m_constraintType = btSolverConstraint::BT_SOLVER_CONTACT_1D;
|
solverConstraint.m_constraintType = btSolverConstraint::BT_SOLVER_CONTACT_1D;
|
||||||
|
|
||||||
|
solverConstraint.m_originalContactPoint = &cp;
|
||||||
|
|
||||||
btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
|
btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
|
||||||
solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0 : btVector3(0,0,0);
|
solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0 : btVector3(0,0,0);
|
||||||
btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
|
btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
|
||||||
@@ -668,7 +671,14 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///warm starting (or zero if disabled)
|
||||||
|
if (m_solverMode & SOLVER_USE_WARMSTARTING)
|
||||||
|
{
|
||||||
|
solverConstraint.m_appliedImpulse = cp.m_appliedImpulse;
|
||||||
|
} else
|
||||||
|
{
|
||||||
solverConstraint.m_appliedImpulse = 0.f;
|
solverConstraint.m_appliedImpulse = 0.f;
|
||||||
|
}
|
||||||
solverConstraint.m_appliedVelocityImpulse = 0.f;
|
solverConstraint.m_appliedVelocityImpulse = 0.f;
|
||||||
|
|
||||||
|
|
||||||
@@ -830,6 +840,20 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int numPoolConstraints = m_tmpSolverConstraintPool.size();
|
||||||
|
int j;
|
||||||
|
for (j=0;j<numPoolConstraints;j++)
|
||||||
|
{
|
||||||
|
|
||||||
|
const btSolverConstraint& solveManifold = m_tmpSolverConstraintPool[j];
|
||||||
|
btManifoldPoint* pt = (btManifoldPoint*) solveManifold.m_originalContactPoint;
|
||||||
|
btAssert(pt);
|
||||||
|
pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
|
||||||
|
//do a callback here?
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0.f;
|
return 0.f;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,9 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverConstraint
|
|||||||
|
|
||||||
int m_constraintType;
|
int m_constraintType;
|
||||||
int m_frictionIndex;
|
int m_frictionIndex;
|
||||||
int m_unusedPadding[2];
|
void* m_originalContactPoint;
|
||||||
|
int m_unusedPadding[1];
|
||||||
|
|
||||||
|
|
||||||
enum btSolverConstraintType
|
enum btSolverConstraintType
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo&
|
|||||||
m_contactSolverType = 0;
|
m_contactSolverType = 0;
|
||||||
m_frictionSolverType = 0;
|
m_frictionSolverType = 0;
|
||||||
m_additionalDamping = constructionInfo.m_additionalDamping;
|
m_additionalDamping = constructionInfo.m_additionalDamping;
|
||||||
|
m_additionalDampingFactor = constructionInfo.m_additionalDampingFactor;
|
||||||
m_additionalLinearDampingThresholdSqr = constructionInfo.m_additionalLinearDampingThresholdSqr;
|
m_additionalLinearDampingThresholdSqr = constructionInfo.m_additionalLinearDampingThresholdSqr;
|
||||||
m_additionalAngularDampingThresholdSqr = constructionInfo.m_additionalAngularDampingThresholdSqr;
|
m_additionalAngularDampingThresholdSqr = constructionInfo.m_additionalAngularDampingThresholdSqr;
|
||||||
m_additionalAngularDampingFactor = constructionInfo.m_additionalAngularDampingFactor;
|
m_additionalAngularDampingFactor = constructionInfo.m_additionalAngularDampingFactor;
|
||||||
|
|||||||
Reference in New Issue
Block a user