|
|
@@ -32,7 +32,7 @@ public:
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace)
|
|
|
+ btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace)
|
|
|
{
|
|
|
if (convexResult.m_hitCollisionObject == _me)
|
|
|
return btScalar(1.0);
|
|
|
@@ -71,6 +71,9 @@ PhysicsCharacter::PhysicsCharacter(Node* node, const PhysicsCollisionShape::Defi
|
|
|
{
|
|
|
setMaxSlopeAngle(45.0f);
|
|
|
|
|
|
+ // Set the collision flags on the ghost object to indicate it's a character
|
|
|
+ _ghostObject->setCollisionFlags(_ghostObject->getCollisionFlags() | btCollisionObject::CF_CHARACTER_OBJECT);
|
|
|
+
|
|
|
// Register ourselves as an action on the physics world so we are called back during physics ticks
|
|
|
Game::getInstance()->getPhysicsController()->_world->addAction(this);
|
|
|
}
|
|
|
@@ -452,7 +455,7 @@ void PhysicsCharacter::stepForwardAndStrafe(btCollisionWorld* collisionWorld, fl
|
|
|
{
|
|
|
updateTargetPositionFromCollision(targetPosition, _collisionNormal);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
int maxIter = 10;
|
|
|
|
|
|
while (fraction > btScalar(0.01) && maxIter-- > 0)
|
|
|
@@ -462,23 +465,25 @@ void PhysicsCharacter::stepForwardAndStrafe(btCollisionWorld* collisionWorld, fl
|
|
|
btVector3 sweepDirNegative(_currentPosition - targetPosition);
|
|
|
|
|
|
ClosestNotMeConvexResultCallback callback(_ghostObject, sweepDirNegative, btScalar(0.0));
|
|
|
- callback.m_collisionFilterGroup = btBroadphaseProxy::CharacterFilter;
|
|
|
- callback.m_collisionFilterMask = btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::DefaultFilter;
|
|
|
+ callback.m_collisionFilterGroup = _ghostObject->getBroadphaseHandle()->m_collisionFilterGroup;
|
|
|
+ callback.m_collisionFilterMask = _ghostObject->getBroadphaseHandle()->m_collisionFilterMask;
|
|
|
+ //callback.m_collisionFilterGroup = btBroadphaseProxy::CharacterFilter;
|
|
|
+ //callback.m_collisionFilterMask = btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::DefaultFilter;
|
|
|
|
|
|
- _ghostObject->convexSweepTest(_collisionShape->getShape<btConvexShape>(), start, end, callback, 0.01f/*collisionWorld->getDispatchInfo().m_allowedCcdPenetration*/);
|
|
|
+ _ghostObject->convexSweepTest(static_cast<btConvexShape*>(_collisionShape->getShape()), start, end, callback, 0.0f);//collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
|
|
|
|
|
fraction -= callback.m_closestHitFraction;
|
|
|
|
|
|
if (callback.hasHit())
|
|
|
{
|
|
|
- Vector3 normal(callback.m_hitNormalWorld.x(), callback.m_hitNormalWorld.y(), callback.m_hitNormalWorld.z());
|
|
|
+ /*Vector3 normal(callback.m_hitNormalWorld.x(), callback.m_hitNormalWorld.y(), callback.m_hitNormalWorld.z());
|
|
|
PhysicsCollisionObject* o = Game::getInstance()->getPhysicsController()->getCollisionObject(callback.m_hitCollisionObject);
|
|
|
if (o->getType() == PhysicsCollisionObject::RIGID_BODY && o->isDynamic())
|
|
|
{
|
|
|
PhysicsRigidBody* rb = static_cast<PhysicsRigidBody*>(o);
|
|
|
normal.normalize();
|
|
|
rb->applyImpulse(-normal);
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
updateTargetPositionFromCollision(targetPosition, callback.m_hitNormalWorld);
|
|
|
btVector3 currentDir = targetPosition - _currentPosition;
|
|
|
@@ -516,9 +521,8 @@ void PhysicsCharacter::stepDown(btCollisionWorld* collisionWorld, btScalar time)
|
|
|
btVector3 targetPosition = _currentPosition + _fallVelocity;
|
|
|
|
|
|
// Perform a convex sweep test between current and target position
|
|
|
- btTransform start, end;
|
|
|
- start.setIdentity();
|
|
|
- end.setIdentity();
|
|
|
+ btTransform start = _ghostObject->getWorldTransform();
|
|
|
+ btTransform end = _ghostObject->getWorldTransform();
|
|
|
start.setOrigin(_currentPosition);
|
|
|
end.setOrigin(targetPosition);
|
|
|
|
|
|
@@ -529,7 +533,11 @@ void PhysicsCharacter::stepDown(btCollisionWorld* collisionWorld, btScalar time)
|
|
|
ClosestNotMeConvexResultCallback callback(_ghostObject, btVector3(0, 1, 0), _cosSlopeAngle);
|
|
|
callback.m_collisionFilterGroup = _ghostObject->getBroadphaseHandle()->m_collisionFilterGroup;
|
|
|
callback.m_collisionFilterMask = _ghostObject->getBroadphaseHandle()->m_collisionFilterMask;
|
|
|
- _ghostObject->convexSweepTest(_collisionShape->getShape<btConvexShape>(), start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
|
|
+ //callback.m_collisionFilterGroup = btBroadphaseProxy::CharacterFilter;
|
|
|
+ //callback.m_collisionFilterMask = btBroadphaseProxy::StaticFilter | btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::DefaultFilter;
|
|
|
+
|
|
|
+ _ghostObject->convexSweepTest(static_cast<btConvexShape*>(_collisionShape->getShape()), start, end, callback, 0.0f);//collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
|
|
|
+
|
|
|
if (callback.hasHit())
|
|
|
{
|
|
|
// Collision detected, fix it
|
|
|
@@ -613,7 +621,9 @@ bool PhysicsCharacter::fixCollision(btCollisionWorld* world)
|
|
|
world->getDispatcher()->dispatchAllCollisionPairs(pairCache, world->getDispatchInfo(), world->getDispatcher());
|
|
|
|
|
|
// Store our current world position
|
|
|
- btVector3 currentPosition = _ghostObject->getWorldTransform().getOrigin();
|
|
|
+ Vector3 startPosition;
|
|
|
+ _node->getWorldMatrix().getTranslation(&startPosition);
|
|
|
+ btVector3 currentPosition = BV(startPosition);
|
|
|
|
|
|
// Handle all collisions/overlappign pairs
|
|
|
btScalar maxPenetration = btScalar(0.0);
|
|
|
@@ -663,10 +673,8 @@ bool PhysicsCharacter::fixCollision(btCollisionWorld* world)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Set the new world transformation to apply to fix the collision
|
|
|
- btTransform newTransform = _ghostObject->getWorldTransform();
|
|
|
- newTransform.setOrigin(currentPosition);
|
|
|
- _ghostObject->setWorldTransform(newTransform);
|
|
|
+ // Set the new world transformation to apply to fix the collision
|
|
|
+ _node->translate(Vector3(currentPosition.x(), currentPosition.y(), currentPosition.z()) - startPosition);
|
|
|
|
|
|
return collision;
|
|
|
}
|