[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