Commit: 39330a3e622ba3e6dafdcc91290794f8e4db1c1d Author: Martin Felke Date: Wed Aug 9 22:18:03 2017 +0200 Branches: fracture_modifier https://developer.blender.org/rB39330a3e622ba3e6dafdcc91290794f8e4db1c1d
reworked the trigger system to work in narrowphase of bullet (more exact shapes) =================================================================== M intern/rigidbody/rb_bullet_api.cpp M release/scripts/startup/bl_ui/properties_physics_rigidbody.py M source/blender/blenkernel/intern/rigidbody.c =================================================================== diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp index 1ef84bd92c8..ef6941bd5a5 100644 --- a/intern/rigidbody/rb_bullet_api.cpp +++ b/intern/rigidbody/rb_bullet_api.cpp @@ -723,20 +723,15 @@ struct rbFilterCallback : public btOverlapFilterCallback this->callback = callback; } - virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const + bool check_collision(rbRigidBody* rb0, rbRigidBody* rb1, bool collides) const { - rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)proxy0->m_clientObject)->getUserPointer(); - rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody *)proxy1->m_clientObject)->getUserPointer(); - - bool collides; - collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); if (!rb0 || !rb1) return collides; collides = collides && (rb0->col_groups & rb1->col_groups); if (this->callback != NULL) { int result = 0; +#if 0 //cast ray from centroid of 1 rigidbody to another, do this only for mesh shapes (all other can use standard bbox) int stype0 = rb0->body->getCollisionShape()->getShapeType(); int stype1 = rb1->body->getCollisionShape()->getShapeType(); @@ -806,10 +801,29 @@ struct rbFilterCallback : public btOverlapFilterCallback } collides = collides && (bool)result; +#endif + result = this->callback(rb0->world->blenderWorld, rb0->meshIsland, rb1->meshIsland, rb0->blenderOb, rb1->blenderOb); + collides = collides && (bool)result; } - + return collides; } + + virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const + { + //rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)proxy0->m_clientObject)->getUserPointer(); + //rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody *)proxy1->m_clientObject)->getUserPointer(); + + bool collides; + collides = (proxy0->m_collisionFilterGroup & + (proxy1->m_collisionFilterMask | btBroadphaseProxy::StaticFilter | + btBroadphaseProxy::KinematicFilter)) != 0; + collides = collides && (proxy1->m_collisionFilterGroup & + (proxy0->m_collisionFilterMask | btBroadphaseProxy::StaticFilter | + btBroadphaseProxy::KinematicFilter)); + + return collides; //this->check_collision(rb0, rb1, collides); + } }; static inline void copy_quat_btquat(float quat[4], const btQuaternion &btquat) @@ -892,6 +906,33 @@ static void idCallback(void *userPtr, int* objectId, int* shardId) } } +class CollisionFilterDispatcher : public btCollisionDispatcher +{ + public: + virtual bool needsCollision(const btCollisionObject *body0, const btCollisionObject *body1); + rbFilterCallback *filterCallback; + CollisionFilterDispatcher(btDefaultCollisionConfiguration *configuration, rbFilterCallback* callback); +}; + +CollisionFilterDispatcher::CollisionFilterDispatcher(btDefaultCollisionConfiguration* configuration, rbFilterCallback *callback) + :btCollisionDispatcher(configuration) +{ + this->filterCallback = callback; +} + +bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, const btCollisionObject *body1) +{ + rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)body0)->getUserPointer(); + rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody *)body1)->getUserPointer(); + + if (this->filterCallback) + { + return this->filterCallback->check_collision(rb0, rb1, true); + } + + return true; +} + //yuck, but need a handle for the world somewhere for collision callback... rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void* blenderScene, int (*callback)(void *, void *, void *, void *, void *), void (*contactCallback)(rbContactPoint* cp, void *bworld), void (*idCallbackOut)(void*, void*, int*, int*), @@ -901,13 +942,12 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void* /* collision detection/handling */ world->collisionConfiguration = new btDefaultCollisionConfiguration(); - - world->dispatcher = new btCollisionDispatcher(world->collisionConfiguration); + + world->filterCallback = new rbFilterCallback(callback); + world->dispatcher = new CollisionFilterDispatcher(world->collisionConfiguration, (rbFilterCallback*)world->filterCallback); btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher *)world->dispatcher); world->pairCache = new btDbvtBroadphase(); - - world->filterCallback = new rbFilterCallback(callback); world->pairCache->getOverlappingPairCache()->setOverlapFilterCallback(world->filterCallback); /* constraint solving */ diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py index fd6fa2223df..961fbdc6bf9 100644 --- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py +++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py @@ -81,7 +81,7 @@ class PHYSICS_PT_rigid_body_trigger_advanced(PHYSICS_PT_rigidbody_panel, Panel): row.prop(rbo, "dynamic_trigger") row = layout.row() row.prop(rbo, "plastic_dissolve") - row.prop(rbo, "is_anti_trigger") + row.prop(rbo, "is_anti_trigger", text="Stop Trigger") class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel): bl_label = "Rigid Body Collisions" diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 34705ed569e..a6f010b824e 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -1273,9 +1273,10 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec BKE_rigidbody_validate_sim_shard_shape(mi, ob, true); if (rbo->physics_object) { - if (rebuild == false || mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD) + if (rebuild == false /*|| mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD*/) RB_dworld_remove_body(rbw->physics_world, rbo->physics_object); } + if (!rbo->physics_object || rebuild) { float size[3]; @@ -1349,6 +1350,12 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec } } } + else if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD ) + { + RB_body_deactivate(rbo->physics_object); + RB_body_set_mass(rbo->physics_object, 0.0f); + RB_body_set_kinematic_state(rbo->physics_object, true); + } if (rbw && rbw->physics_world && rbo->physics_object) { @@ -1356,7 +1363,7 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec } rbo->flag &= ~RBO_FLAG_NEEDS_VALIDATE; - rbo->flag &= ~RBO_FLAG_KINEMATIC_REBUILD; + //rbo->flag &= ~RBO_FLAG_KINEMATIC_REBUILD; } @@ -1444,6 +1451,12 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool } } } + else if (rbo->flag & RBO_FLAG_KINEMATIC_REBUILD ) + { + RB_body_deactivate(rbo->physics_object); + RB_body_set_mass(rbo->physics_object, 0.0f); + RB_body_set_kinematic_state(rbo->physics_object, true); + } if (rbw && rbw->physics_world) RB_dworld_add_body(rbw->physics_world, rbo->physics_object, rbo->col_groups, NULL, ob, rbo->meshisland_index); @@ -3539,7 +3552,7 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o /* update rigid body location and rotation for kinematic bodies */ if ((rbo->flag & RBO_FLAG_KINEMATIC && rbo->force_thresh == 0.0f) || (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) { - if (rbo->type == RBO_TYPE_ACTIVE || mi == NULL) + if (((rbo->type == RBO_TYPE_ACTIVE || mi == NULL) && (rbo->flag & RBO_FLAG_KINEMATIC_REBUILD) == 0)) { mul_v3_v3(centr, scale); mul_qt_v3(rot, centr); @@ -3583,12 +3596,15 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o } else if (rbo->flag & RBO_FLAG_KINEMATIC) { - /* do the same here as above, but here we needed the eff_force value to compare against threshold */ - mul_v3_v3(centr, scale); - mul_qt_v3(rot, centr); - add_v3_v3(loc, centr); - RB_body_activate(rbo->physics_object); - RB_body_set_loc_rot(rbo->physics_object, loc, rot); + if ((rbo->flag & RBO_FLAG_KINEMATIC_REBUILD) == 0) + { //XXXXX TODO, maybe this is wrong here + /* do the same here as above, but here we needed the eff_force value to compare against threshold */ + mul_v3_v3(centr, scale); + mul_qt_v3(rot, centr); + add_v3_v3(loc, centr); + RB_body_activate(rbo->physics_object); + RB_body_set_loc_rot(rbo->physics_object, loc, rot); + } } else { @@ -3619,7 +3635,7 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int r return; } - if (rebuild || (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)) { + if (rebuild /*|| (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)*/) { /* World has been rebuilt so rebuild object */ BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true, transfer_speed, size); } @@ -3759,12 +3775,15 @@ void BKE_deactivateRigidbody(RigidBodyOb *rbo) { //make kinematic again (un-trigger) //printf("Untrigger\n"); - if (rbo->physics_object) + //if (rbo->physics_object) { - RB_body_set_kinematic_state(rbo->physics_object, true); - RB_body_set_mass(rbo->physics_object, 0.0f); + //RB_body_set_kinematic_state(rbo->physics_object, true); + //RB_body_set_mass(rbo->physics_object, 0.0f); //rbo->flag |= RBO_FLAG_NEEDS_VALIDATE; - RB_body_deactivate(rbo->physics_object); + //RB_body_deactivate(rbo->physics_object); + rbo->flag |= RBO_FLAG_KINEMATIC; + rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD; + rbo->flag |= RBO_FLAG_NEEDS_VALIDATE; } } @@ -4224,8 +4243,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo } } - if (rebuild || rbsc->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD || - rbsc->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD) { + if (rebuild) { // || rbsc->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD || + //rbsc->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD) { /* World has been rebuilt @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs