diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-12-25 05:02:13 +0300 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-12-25 05:02:13 +0300 |
commit | e820cdf6a0ab757cd83ffafd0ea04d736c3faa63 (patch) | |
tree | c412336bc8dcee4fad535e46205ddffd905ac37e | |
parent | 0e094ffcab8ae40ce06584c02292102d53ece77d (diff) |
fixing some issues: force needs to wake up objects, property sensor issue, island activation issue
6 files changed, 48 insertions, 23 deletions
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp index 3f51e9ec0a6..5a642643eed 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp @@ -271,41 +271,50 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, int islandId; - //update the sleeping state for bodies, if all are sleeping + //solve the constraint for each islands, if there are contacts/constraints for (int startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex) { int islandId = getUnionFind().getElement(startIslandIndex).m_id; - for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++) + bool islandSleeping = false; + + for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++) { + int i = getUnionFind().getElement(endIslandIndex).m_sz; + btCollisionObject* colObj0 = collisionObjects[i]; + if (!colObj0->isActive()) + islandSleeping = true; } - //find the accompanying contact manifold for this islandId - int numIslandManifolds = 0; - btPersistentManifold** startManifold = 0; - - if (startManifoldIndex<numManifolds) + if (!islandSleeping) { - int curIslandId = getIslandId(islandmanifold[startManifoldIndex]); - if (curIslandId == islandId) + //find the accompanying contact manifold for this islandId + int numIslandManifolds = 0; + btPersistentManifold** startManifold = 0; + + if (startManifoldIndex<numManifolds) { - startManifold = &islandmanifold[startManifoldIndex]; - - for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(islandmanifold[endManifoldIndex]));endManifoldIndex++) + int curIslandId = getIslandId(islandmanifold[startManifoldIndex]); + if (curIslandId == islandId) { + startManifold = &islandmanifold[startManifoldIndex]; + + for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(islandmanifold[endManifoldIndex]));endManifoldIndex++) + { + } + /// Process the actual simulation, only if not sleeping/deactivated + numIslandManifolds = endManifoldIndex-startManifoldIndex; } - /// Process the actual simulation, only if not sleeping/deactivated - numIslandManifolds = endManifoldIndex-startManifoldIndex; - } - } + } - callback->ProcessIsland(startManifold,numIslandManifolds, islandId); + callback->ProcessIsland(startManifold,numIslandManifolds, islandId); - if (numIslandManifolds) - { - startManifoldIndex = endManifoldIndex; + if (numIslandManifolds) + { + startManifoldIndex = endManifoldIndex; + } } } } diff --git a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h index 79469c03c29..3a66ebbec22 100644 --- a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h +++ b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h @@ -68,8 +68,10 @@ class btAlignedObjectArray SIMD_FORCE_INLINE void deallocate() { - if(m_data) + if(m_data) { m_allocator.deallocate(m_data); + m_data = 0; + } } diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp index 979ce51ab5e..09332b870c9 100644 --- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp +++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp @@ -268,7 +268,7 @@ bool SCA_PropertySensor::CheckPropertyCondition() m_recentresult=result; } else { - m_recentresult=true; + m_recentresult=result;//true; } return result; } diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp index 67f4fb69e72..a01673f569f 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp @@ -90,7 +90,8 @@ bool KX_NetworkMessageSensor::Evaluate(CValue* event) bool result = false; bool WasUp = m_IsUp; - m_IsUp = false; +// m_IsUp = false; + if (m_BodyList) { m_BodyList->Release(); m_BodyList = NULL; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 3ddac72618d..d3eb4db6f35 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -379,6 +379,10 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque { btVector3 torque(torqueX,torqueY,torqueZ); btTransform xform = m_body->getCenterOfMassTransform(); + if (torque.length2() > (SIMD_EPSILON*SIMD_EPSILON)) + { + m_body->activate(); + } if (local) { torque = xform.getBasis()*torque; @@ -389,6 +393,13 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque void CcdPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bool local) { btVector3 force(forceX,forceY,forceZ); + + if (force.length2() > (SIMD_EPSILON*SIMD_EPSILON)) + { + m_body->activate(); + } + + btTransform xform = m_body->getCenterOfMassTransform(); if (local) { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 57fe533825e..bb6b62c7edc 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -653,6 +653,8 @@ void CcdPhysicsEnvironment::removeConstraint(int constraintId) btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); if (constraint->getUserConstraintId() == constraintId) { + constraint->getRigidBodyA().activate(); + constraint->getRigidBodyB().activate(); m_dynamicsWorld->removeConstraint(constraint); break; } |