[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59893] branches/soc-2013-rigid_body_sim: rigidbody: Improve object de-/activation

Sergej Reich sergej.reich at googlemail.com
Fri Sep 6 19:58:56 CEST 2013


Revision: 59893
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59893
Author:   sergof
Date:     2013-09-06 17:58:56 +0000 (Fri, 06 Sep 2013)
Log Message:
-----------
rigidbody: Improve object de-/activation

Now de don't use bullet's deactivation system.
Instead of activating bodies based on bonding boxes they're now
activated on actual collision.
Also, "Enable Deactivation" has a different meaning now. It's mostly
used to improve performance.
TODO: reflect that in the UI.

Modified Paths:
--------------
    branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h
    branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp
    branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c

Modified: branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h
===================================================================
--- branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h	2013-09-06 17:58:54 UTC (rev 59892)
+++ branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h	2013-09-06 17:58:56 UTC (rev 59893)
@@ -182,6 +182,8 @@
 /* Kinematic State */
 extern void RB_body_set_kinematic_state(rbRigidBody *body, int kinematic);
 
+extern void RB_body_suspend(rbRigidBody *object);
+
 extern void RB_body_set_trigger(rbRigidBody *object, int trigger);
 
 /* RigidBody Interface - Rigid Body Activation States */

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-06 17:58:54 UTC (rev 59892)
+++ branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp	2013-09-06 17:58:56 UTC (rev 59893)
@@ -87,8 +87,11 @@
 };
 struct rbRigidBody {
 	btRigidBody *body;
+	btDiscreteDynamicsWorld *world;
 	int col_groups;
 	bool is_trigger;
+	bool suspended;
+	float saved_mass;
 };
 
 struct rbCollisionShape {
@@ -113,6 +116,23 @@
 	}
 };
 
+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();
+	
+	if (rb1->suspended) {
+		btRigidBody *body = rb1->body;
+		rb1->suspended = false;
+		rb1->world->removeRigidBody(body);
+		RB_body_set_mass(rb1, rb1->saved_mass);
+		rb1->world->addRigidBody(body);
+		body->activate();
+	}
+	
+	dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo);
+}
+
 class rbDebugDraw : public btIDebugDraw {
 private:
 	int debug_mode;
@@ -184,6 +204,7 @@
 	
 	world->dispatcher = new btCollisionDispatcher(world->collisionConfiguration);
 	btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher *)world->dispatcher);
+	((btCollisionDispatcher *)world->dispatcher)->setNearCallback(nearCallback);
 	
 	world->pairCache = new btDbvtBroadphase();
 	
@@ -302,6 +323,7 @@
 {
 	btRigidBody *body = object->body;
 	object->col_groups = col_groups;
+	object->world = world->dynamicsWorld;
 	
 	world->dynamicsWorld->addRigidBody(body);
 }
@@ -383,6 +405,9 @@
 	
 	object->body->setUserPointer(object);
 	
+	object->is_trigger = false;
+	object->suspended = false;
+	
 	return object;
 }
 
@@ -450,9 +475,10 @@
 		btCollisionShape *shape = body->getCollisionShape();
 		shape->calculateLocalInertia(value, localInertia);
 	}
-	
-	body->setMassProps(value, localInertia);
-	body->updateInertiaTensor();
+	if (!object->suspended) {
+		body->setMassProps(value, localInertia);
+		body->updateInertiaTensor();
+	}
 }
 
 
@@ -586,6 +612,8 @@
 
 void RB_body_set_kinematic_state(rbRigidBody *object, int kinematic)
 {
+	if (object->suspended)
+		return;
 	btRigidBody *body = object->body;
 	if (kinematic)
 		body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);

Modified: branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c
===================================================================
--- branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c	2013-09-06 17:58:54 UTC (rev 59892)
+++ branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c	2013-09-06 17:58:56 UTC (rev 59893)
@@ -656,7 +656,7 @@
 		RB_body_set_sleep_thresh(rbo->physics_object, rbo->lin_sleep_thresh, rbo->ang_sleep_thresh);
 		RB_body_set_activation_state(rbo->physics_object, rbo->flag & RBO_FLAG_USE_DEACTIVATION);
 
-		if (rbo->type == RBO_TYPE_PASSIVE || rbo->flag & RBO_FLAG_START_DEACTIVATED)
+		if (rbo->type == RBO_TYPE_PASSIVE)
 			RB_body_deactivate(rbo->physics_object);
 
 
@@ -670,6 +670,8 @@
 		                           (ob->protectflag & OB_LOCK_ROTZ) == 0);
 
 		RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
+		if (rbo->flag & RBO_FLAG_START_DEACTIVATED)
+			RB_body_suspend(rbo->physics_object);
 		RB_body_set_kinematic_state(rbo->physics_object, rbo->flag & RBO_FLAG_KINEMATIC || rbo->flag & RBO_FLAG_DISABLED);
 		RB_body_set_trigger(rbo->physics_object, rbo->flag & RBO_FLAG_TRIGGER);
 	}




More information about the Bf-blender-cvs mailing list