[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