Made btCollisionWorld::convexSweepTest and btGhostObject::convexSweepTest consistent. Both have an optional last argument for allowedCcdPenetration.
Bugfix due to recent change in friction in constraint solver.
This commit is contained in:
@@ -71,7 +71,7 @@ void setDefaultSettings()
|
|||||||
{
|
{
|
||||||
viewX = 0.0f;
|
viewX = 0.0f;
|
||||||
viewY = 0.0f;
|
viewY = 0.0f;
|
||||||
framePeriod = 16;//16;//todo: test if this value should be 0
|
framePeriod = 1;//16;//16;//todo: test if this value should be 0
|
||||||
|
|
||||||
width = 800;//640;
|
width = 800;//640;
|
||||||
height = 600;//1024;//480;
|
height = 600;//1024;//480;
|
||||||
|
|||||||
@@ -765,7 +765,7 @@ struct btSingleSweepCallback : public btBroadphaseRayCallback
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback) const
|
void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
|
||||||
{
|
{
|
||||||
|
|
||||||
BT_PROFILE("convexSweepTest");
|
BT_PROFILE("convexSweepTest");
|
||||||
@@ -793,7 +793,7 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
|
|||||||
|
|
||||||
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
|
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
|
||||||
|
|
||||||
btSingleSweepCallback convexCB(castShape,convexFromWorld,convexToWorld,this,resultCallback,getDispatchInfo().m_allowedCcdPenetration);
|
btSingleSweepCallback convexCB(castShape,convexFromWorld,convexToWorld,this,resultCallback,allowedCcdPenetration);
|
||||||
|
|
||||||
m_broadphasePairCache->rayTest(convexFromTrans.getOrigin(),convexToTrans.getOrigin(),convexCB,castShapeAabbMin,castShapeAabbMax);
|
m_broadphasePairCache->rayTest(convexFromTrans.getOrigin(),convexToTrans.getOrigin(),convexCB,castShapeAabbMin,castShapeAabbMax);
|
||||||
|
|
||||||
@@ -819,7 +819,7 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
|
|||||||
collisionObject->getCollisionShape(),
|
collisionObject->getCollisionShape(),
|
||||||
collisionObject->getWorldTransform(),
|
collisionObject->getWorldTransform(),
|
||||||
resultCallback,
|
resultCallback,
|
||||||
getDispatchInfo().m_allowedCcdPenetration);
|
allowedCcdPenetration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ public:
|
|||||||
|
|
||||||
// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
|
// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
|
||||||
// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
|
// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
|
||||||
void convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback) const;
|
void convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = btScalar(0.)) const;
|
||||||
|
|
||||||
|
|
||||||
/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
|
/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ void btPairCachingGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void btGhostObject::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btScalar allowedCcdPenetration, btCollisionWorld::ConvexResultCallback& resultCallback) const
|
void btGhostObject::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
|
||||||
{
|
{
|
||||||
btTransform convexFromTrans,convexToTrans;
|
btTransform convexFromTrans,convexToTrans;
|
||||||
convexFromTrans = convexFromWorld;
|
convexFromTrans = convexFromWorld;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
|
|
||||||
virtual ~btGhostObject();
|
virtual ~btGhostObject();
|
||||||
|
|
||||||
void convexSweepTest(const class btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btScalar allowedCcdPenetration,btCollisionWorld::ConvexResultCallback& resultCallback) const;
|
void convexSweepTest(const class btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = 0.f) const;
|
||||||
|
|
||||||
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
|
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ class btManifoldPoint
|
|||||||
:m_userPersistentData(0),
|
:m_userPersistentData(0),
|
||||||
m_appliedImpulse(0.f),
|
m_appliedImpulse(0.f),
|
||||||
m_lateralFrictionInitialized(false),
|
m_lateralFrictionInitialized(false),
|
||||||
|
m_appliedImpulseLateral1(0.f),
|
||||||
|
m_appliedImpulseLateral2(0.f),
|
||||||
m_lifeTime(0)
|
m_lifeTime(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
|
|||||||
|
|
||||||
if (m_useGhostObjectSweepTest)
|
if (m_useGhostObjectSweepTest)
|
||||||
{
|
{
|
||||||
m_ghostObject->convexSweepTest (m_convexShape, start, end, world->getDispatchInfo().m_allowedCcdPenetration,callback);
|
m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, world->getDispatchInfo().m_allowedCcdPenetration);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -284,10 +284,10 @@ void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* co
|
|||||||
|
|
||||||
if (m_useGhostObjectSweepTest)
|
if (m_useGhostObjectSweepTest)
|
||||||
{
|
{
|
||||||
m_ghostObject->convexSweepTest (m_convexShape, start, end, collisionWorld->getDispatchInfo().m_allowedCcdPenetration,callback);
|
m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
collisionWorld->convexSweepTest (m_convexShape, start, end, callback);
|
collisionWorld->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_convexShape->setMargin(margin);
|
m_convexShape->setMargin(margin);
|
||||||
@@ -359,10 +359,10 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
|
|||||||
|
|
||||||
if (m_useGhostObjectSweepTest)
|
if (m_useGhostObjectSweepTest)
|
||||||
{
|
{
|
||||||
m_ghostObject->convexSweepTest (m_convexShape, start, end, collisionWorld->getDispatchInfo().m_allowedCcdPenetration,callback);
|
m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
collisionWorld->convexSweepTest (m_convexShape, start, end, callback);
|
collisionWorld->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callback.hasHit())
|
if (callback.hasHit())
|
||||||
|
|||||||
@@ -760,7 +760,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
solverConstraint.m_appliedPushImpulse = 0.f;
|
solverConstraint.m_appliedPushImpulse = 0.f;
|
||||||
|
|
||||||
solverConstraint.m_frictionIndex = m_tmpSolverFrictionConstraintPool.size();
|
solverConstraint.m_frictionIndex = m_tmpSolverFrictionConstraintPool.size();
|
||||||
if ((!infoGlobal.m_solverMode & SOLVER_USE_FRICTION_WARMSTARTING) || !cp.m_lateralFrictionInitialized)
|
if (!cp.m_lateralFrictionInitialized)
|
||||||
{
|
{
|
||||||
cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
|
cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
|
||||||
btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
|
btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
|
||||||
@@ -773,16 +773,19 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
|
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
|
||||||
cp.m_lateralFrictionDir2.normalize();//??
|
cp.m_lateralFrictionDir2.normalize();//??
|
||||||
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
||||||
|
cp.m_lateralFrictionInitialized = true;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
//re-calculate friction direction every frame, todo: check if this is really needed
|
//re-calculate friction direction every frame, todo: check if this is really needed
|
||||||
|
|
||||||
btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
|
btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
|
||||||
addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
||||||
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
||||||
|
if (infoGlobal.m_solverMode & SOLVER_USE_FRICTION_WARMSTARTING)
|
||||||
|
{
|
||||||
|
cp.m_lateralFrictionInitialized = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cp.m_lateralFrictionInitialized = true;
|
|
||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
@@ -999,8 +1002,11 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendly(btCollisio
|
|||||||
btManifoldPoint* pt = (btManifoldPoint*) solveManifold.m_originalContactPoint;
|
btManifoldPoint* pt = (btManifoldPoint*) solveManifold.m_originalContactPoint;
|
||||||
btAssert(pt);
|
btAssert(pt);
|
||||||
pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
|
pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
|
||||||
pt->m_appliedImpulseLateral1 = m_tmpSolverFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
|
if (infoGlobal.m_solverMode & SOLVER_USE_FRICTION_WARMSTARTING)
|
||||||
pt->m_appliedImpulseLateral2 = m_tmpSolverFrictionConstraintPool[solveManifold.m_frictionIndex+1].m_appliedImpulse;
|
{
|
||||||
|
pt->m_appliedImpulseLateral1 = m_tmpSolverFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
|
||||||
|
pt->m_appliedImpulseLateral2 = m_tmpSolverFrictionConstraintPool[solveManifold.m_frictionIndex+1].m_appliedImpulse;
|
||||||
|
}
|
||||||
|
|
||||||
//do a callback here?
|
//do a callback here?
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user