From c97b11a6e997b8a03cb80006e7019a0e7a4c35f0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 6 May 2015 11:48:31 -0700 Subject: [PATCH] no ownership of kinematic objects on collision --- libraries/physics/src/PhysicsEngine.cpp | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 4b90866ce7..dc17e50972 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -253,11 +253,15 @@ void PhysicsEngine::doOwnershipInfection(const btCollisionObject* objectA, const ObjectMotionState* a = static_cast(objectA->getUserPointer()); ObjectMotionState* b = static_cast(objectB->getUserPointer()); - if (b && ((a && !objectA->isStaticOrKinematicObject()) || (objectA == characterObject))) { + if (b && ((a && !objectA->isStaticObject()) || (objectA == characterObject))) { + // NOTE: we might own the simulation of a kinematic object (A) + // but we don't claim ownership of kinematic objects (B) based on collisions here. if (!objectB->isStaticOrKinematicObject()) { b->bump(); } - } else if (a && ((b && !objectB->isStaticOrKinematicObject()) || (objectB == characterObject))) { + } else if (a && ((b && !objectB->isStaticObject()) || (objectB == characterObject))) { + // SIMILARLY: we might own the simulation of a kinematic object (B) + // but we don't claim ownership of kinematic objects (A) based on collisions here. if (!objectA->isStaticOrKinematicObject()) { a->bump(); } @@ -377,16 +381,20 @@ void PhysicsEngine::bump(ObjectMotionState* motionState) { const btCollisionObject* objectA = static_cast(contactManifold->getBody0()); const btCollisionObject* objectB = static_cast(contactManifold->getBody1()); if (objectB == object) { - ObjectMotionState* motionStateA = static_cast(objectA->getUserPointer()); - if (motionStateA) { - motionStateA->bump(); - objectA->setActivationState(ACTIVE_TAG); + if (!objectA->isStaticOrKinematicObject()) { + ObjectMotionState* motionStateA = static_cast(objectA->getUserPointer()); + if (motionStateA) { + motionStateA->bump(); + objectA->setActivationState(ACTIVE_TAG); + } } } else if (objectA == object) { - ObjectMotionState* motionStateB = static_cast(objectB->getUserPointer()); - if (motionStateB) { - motionStateB->bump(); - objectB->setActivationState(ACTIVE_TAG); + if (!objectB->isStaticOrKinematicObject()) { + ObjectMotionState* motionStateB = static_cast(objectB->getUserPointer()); + if (motionStateB) { + motionStateB->bump(); + objectB->setActivationState(ACTIVE_TAG); + } } } }