Commit: be30a2cd18797a9aa8a5b0db257ccd42bd4058c0
Author: Martin Felke
Date:   Sat Dec 27 13:27:10 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBbe30a2cd18797a9aa8a5b0db257ccd42bd4058c0

added a trigger flag, only rigidbody objects with this flag can trigger other 
objects (which themselves must be animated and have their "triggered" flag 
enabled

===================================================================

M       release/scripts/startup/bl_ui/properties_physics_rigidbody.py
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/makesdna/DNA_rigidbody_types.h
M       source/blender/makesrna/intern/rna_rigidbody.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py 
b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
index 449d905..b9cb0d5 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
@@ -51,6 +51,8 @@ class PHYSICS_PT_rigid_body(PHYSICS_PT_rigidbody_panel, 
Panel):
             if rbo.type == 'ACTIVE':
                 row = layout.row()
                 row.prop(rbo, "use_kinematic_deactivation", text="Triggered")
+                row.prop(rbo, "is_trigger")
+                row = layout.row()
                 row.prop(rbo, "is_ghost")
 
             if rbo.type == 'ACTIVE':
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index e3a9052..25ea922 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1709,12 +1709,12 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                        fmd1 = (FractureModifierData*)modifiers_findByType(ob1, 
eModifierType_Fracture);
                        valid = valid && (fmd1 != NULL);
                        valid = valid && (ob1->rigidbody_object->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
-                       //valid = valid && (ob2->rigidbody_object->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
+                       valid = valid && (ob2->rigidbody_object->flag & 
RBO_FLAG_IS_TRIGGER);
 
-                       valid2 = valid2 && (fmd1 != NULL);
-                       valid2 = valid2 && (fmd1->use_constraints == false);
+                       //valid2 = valid2 && (fmd1 != NULL);
+                       //valid2 = valid2 && (fmd1->use_constraints == false);
 
-                       if (valid || valid2)
+                       if (valid /*|| valid2*/)
                        {
                                for (mi = fmd1->meshIslands.first; mi; mi = 
mi->next)
                                {
@@ -1724,15 +1724,15 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                                                if (rbo->physics_object) {
                                                        activateRigidbody(rbo);
                                                }
-
                                        }
                                }
                        }
                        else if (!fmd1)
                        {
+                               bool valid = ob2->rigidbody_object->flag & 
RBO_FLAG_IS_TRIGGER;
                                RigidBodyOb* rbo = ob1->rigidbody_object;
 
-                               if (rbo)
+                               if (rbo && valid)
                                {
                                        activateRigidbody(rbo);
                                }
@@ -1745,12 +1745,12 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                        fmd2 = (FractureModifierData*)modifiers_findByType(ob2, 
eModifierType_Fracture);
                        valid = valid && (fmd2 != NULL);
                        valid = valid && (ob2->rigidbody_object->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
-                       //valid = valid && (ob1->rigidbody_object->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
+                       valid = valid && (ob1->rigidbody_object->flag & 
RBO_FLAG_IS_TRIGGER);
 
-                       valid2 = valid2 && (fmd2 != NULL);
-                       valid2 = valid2 && (fmd2->use_constraints == false);
+                       //valid2 = valid2 && (fmd2 != NULL);
+                       //valid2 = valid2 && (fmd2->use_constraints == false);
 
-                       if (valid || valid2)
+                       if (valid /* || valid2*/)
                        {
                                for (mi = fmd2->meshIslands.first; mi; mi = 
mi->next)
                                {
@@ -1766,9 +1766,10 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                        }
                        else if (!fmd2)
                        {
+                               bool valid = ob1->rigidbody_object->flag & 
RBO_FLAG_IS_TRIGGER;
                                RigidBodyOb* rbo = ob2->rigidbody_object;
 
-                               if (rbo)
+                               if (rbo && valid)
                                {
                                        activateRigidbody(rbo);
                                }
@@ -3240,6 +3241,11 @@ static void restoreKinematic(RigidBodyWorld *rbw)
                                        }
                                }
                        }
+                       else
+                       {
+                               go->ob->rigidbody_object->flag |= 
RBO_FLAG_KINEMATIC;
+                               go->ob->rigidbody_object->flag |= 
RBO_FLAG_NEEDS_VALIDATE;
+                       }
                }
        }
 }
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h 
b/source/blender/makesdna/DNA_rigidbody_types.h
index faba30b..c3a87c6 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -166,6 +166,8 @@ typedef enum eRigidBodyOb_Flag {
        RBO_FLAG_USE_KINEMATIC_DEACTIVATION = (1 << 9),
        /* ghost flag, do not collide with object (but can activate although) */
        RBO_FLAG_IS_GHOST = (1 << 10),
+       /* trigger flag, trigger kinematic state change on other objects */
+       RBO_FLAG_IS_TRIGGER = (1 << 11),
 } eRigidBodyOb_Flag;
 
 /* RigidBody Collision Shape */
diff --git a/source/blender/makesrna/intern/rna_rigidbody.c 
b/source/blender/makesrna/intern/rna_rigidbody.c
index 0f91dbc..1a27b0f 100644
--- a/source/blender/makesrna/intern/rna_rigidbody.c
+++ b/source/blender/makesrna/intern/rna_rigidbody.c
@@ -1010,6 +1010,11 @@ static void rna_def_rigidbody_object(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_IS_GHOST);
        RNA_def_property_ui_text(prop, "Ghost", "Do not collide with object, 
but can activate other animated objects");
        RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, 
"rna_RigidBodyOb_reset");
+
+       prop = RNA_def_property(srna, "is_trigger", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_IS_TRIGGER);
+       RNA_def_property_ui_text(prop, "Trigger", "Can trigger activation of 
other animated objects, which are set up to be triggered");
+       RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, 
"rna_RigidBodyOb_reset");
        
        /* Physics Parameters */
        prop = RNA_def_property(srna, "mass", PROP_FLOAT, PROP_UNIT_MASS);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to