[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60423] branches/soc-2013-rigid_body_sim/ intern/rigidbody/rb_bullet_api.cpp: rigidbody: Only handle activation when collision was detected
Sergej Reich
sergej.reich at googlemail.com
Sun Sep 29 16:24:21 CEST 2013
Revision: 60423
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60423
Author: sergof
Date: 2013-09-29 14:24:20 +0000 (Sun, 29 Sep 2013)
Log Message:
-----------
rigidbody: Only handle activation when collision was detected
Somehow missed to add this before.
Modified Paths:
--------------
branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp
Modified: branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp
===================================================================
--- branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp 2013-09-29 13:57:59 UTC (rev 60422)
+++ branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp 2013-09-29 14:24:20 UTC (rev 60423)
@@ -166,36 +166,62 @@
static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
{
- rbRigidBody *rb0 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy0->m_clientObject)->getUserPointer();
- rbRigidBody *rb1 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy1->m_clientObject)->getUserPointer();
+ btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
+ btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
- if (rb1->suspended) {
- switch(rb1->activation_type) {
- case ACTIVATION_COLLISION:
- activate(rb1);
- break;
- case ACTIVATION_TRIGGER:
- if (rb0->is_trigger) {
- activate(rb1);
- return;
- }
- break;
+ if (dispatcher.needsCollision(colObj0, colObj1)) {
+ btCollisionObjectWrapper obj0Wrap(0, colObj0->getCollisionShape(), colObj0,colObj0->getWorldTransform(), -1, -1);
+ btCollisionObjectWrapper obj1Wrap(0, colObj1->getCollisionShape(), colObj1,colObj1->getWorldTransform(), -1, -1);
+
+
+ //dispatcher will keep algorithms persistent in the collision pair
+ if (!collisionPair.m_algorithm) {
+ collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap, &obj1Wrap);
}
- }
- if (rb0->suspended) {
- switch(rb0->activation_type) {
- case ACTIVATION_COLLISION:
- activate(rb0);
- break;
- case ACTIVATION_TRIGGER:
- if (rb1->is_trigger) {
- activate(rb0);
- return;
+ if (collisionPair.m_algorithm) {
+ btManifoldResult contactPointResult(&obj0Wrap, &obj1Wrap);
+
+ if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) {
+ //discrete collision detection query
+
+ collisionPair.m_algorithm->processCollision(&obj0Wrap, &obj1Wrap, dispatchInfo, &contactPointResult);
}
- break;
+ else {
+ //continuous collision detection query, time of impact (toi)
+ btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0, colObj1, dispatchInfo, &contactPointResult);
+ if (dispatchInfo.m_timeOfImpact > toi)
+ dispatchInfo.m_timeOfImpact = toi;
+
+ }
+ if (contactPointResult.getPersistentManifold() && contactPointResult.getPersistentManifold()->getNumContacts() > 0) {
+ rbRigidBody *rb0 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy0->m_clientObject)->getUserPointer();
+ rbRigidBody *rb1 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy1->m_clientObject)->getUserPointer();
+
+ if (rb1->suspended) {
+ switch(rb1->activation_type) {
+ case ACTIVATION_COLLISION:
+ activate(rb1);
+ break;
+ case ACTIVATION_TRIGGER:
+ if (rb0->is_trigger)
+ activate(rb1);
+ break;
+ }
+ }
+ if (rb0->suspended) {
+ switch(rb0->activation_type) {
+ case ACTIVATION_COLLISION:
+ activate(rb0);
+ break;
+ case ACTIVATION_TRIGGER:
+ if (rb1->is_trigger)
+ activate(rb0);
+ break;
+ }
+ }
+ }
}
}
- dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo);
}
static bool contactAddedCallback(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1)
More information about the Bf-blender-cvs
mailing list