Commit: 4eb44b86100be814ed2a21699435cf76cc5e1600
Author: Martin Felke
Date:   Tue Feb 13 18:07:41 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB4eb44b86100be814ed2a21699435cf76cc5e1600

another implementation attempt for external constraints

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

M       release/scripts/startup/bl_operators/presets.py
M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_fracture.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_operators/presets.py 
b/release/scripts/startup/bl_operators/presets.py
index 41e3a6f42c6..46821910176 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -712,6 +712,7 @@ class AddPresetFracture(AddPresetBase, Operator):
         "fracture.use_animated_mesh_rotation",
         "fracture.grid_offset",
         "fracture.grid_spacing",
+        "fracture.use_constraint_group",
     ]
 
     preset_subdir = "fracture"
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 7be6be4b345..561a0f2d564 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -163,6 +163,7 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
                 col.prop(md, "cutter_axis")
             col.prop(md, "extra_group")
             col.prop(md, "dm_group")
+            col.prop(md, "use_constraint_group")
             col.prop(md, "cutter_group")
             if (md.cutter_group):
                 col.prop(md, "keep_cutter_shards")
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index e6a9e3f7a11..9012b236005 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4119,6 +4119,11 @@ static bool 
check_constraint_island(FractureModifierData* fmd, MeshIsland *mi1,
 
        }
 
+       if (fmd)
+       {
+               return !(fmd->dm_group && fmd->use_constraint_collision);
+       }
+
        return true;
 }
 
@@ -4229,10 +4234,12 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                validOb = validOb || ((mi1 && (mi1->rigidbody->flag & 
RBO_FLAG_KINEMATIC) == 0)) || ((ob2->rigidbody_object->flag & 
RBO_FLAG_KINEMATIC) == 0);
                validOb = validOb || ((mi1 && (mi1->rigidbody->flag & 
RBO_FLAG_KINEMATIC) == 0)) || ((mi2 && mi2->rigidbody->flag & 
RBO_FLAG_KINEMATIC) == 0);
 
-               validOb = validOb && (check_colgroup_ghost(ob1, ob2) && 
((check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, 
mi1)) || (ob1 != ob2)));
+               validOb = validOb && (check_colgroup_ghost(ob1, ob2) && 
((check_constraint_island(fmd1, mi1, mi2) &&
+                         check_constraint_island(fmd2, mi2, mi1)) || ((ob1 != 
ob2) && !(fmd1 && fmd2))));
        }
        else {
-               validOb = (check_colgroup_ghost(ob1, ob2) && 
((check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, 
mi1)) || (ob1 != ob2)));
+               validOb = (check_colgroup_ghost(ob1, ob2) && 
((check_constraint_island(fmd1, mi1, mi2) &&
+                         check_constraint_island(fmd2, mi2, mi1)) || ((ob1 != 
ob2) && !(fmd1 && fmd2))));
        }
 
        return activate ? validOb : check_activate || validOb;
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 627aef36331..8a37e814ca1 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9181,7 +9181,7 @@ static void fix_fracture_image_hack(Main* main)
 
        for (ob = main->object.first; ob; ob = ob->id.next) {
                FractureModifierData *fmd = 
(FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
-               if (fmd && fmd->dm_group) {
+               if (fmd && fmd->dm_group && !fmd->use_constraint_group) {
                        fmd->refresh_images = true;
                        fmd->refresh = true;
                }
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 450ffa30ddf..5d8306ad26e 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1830,6 +1830,7 @@ typedef struct FractureModifierData {
        int use_constraint_collision;
        int use_self_collision;
        int use_animated_mesh;
+       int use_constraint_group;
 
        int shards_to_islands;
        int execute_threaded;
@@ -1872,7 +1873,7 @@ typedef struct FractureModifierData {
        short mat_ofs_intersect;
        short mat_ofs_difference;
 
-       char pad[4];
+       //char pad[4];
 } FractureModifierData;
 
 typedef struct DataTransferModifierData {
diff --git a/source/blender/makesrna/intern/rna_fracture.c 
b/source/blender/makesrna/intern/rna_fracture.c
index 5a44f2d3c0e..f6d817f2b24 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -653,6 +653,14 @@ static void 
rna_FractureModifier_anim_mesh_ob_set(PointerRNA* ptr, PointerRNA va
        rmd->anim_mesh_ob = value.data;
 }
 
+static void rna_FractureModifier_use_constraint_group_set(PointerRNA* ptr, int 
value)
+{
+       FractureModifierData *rmd = (FractureModifierData *)ptr->data;
+       rmd->use_constraint_group = value;
+       //rmd->refresh_constraints = true;
+}
+
+
 static void rna_Modifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), 
PointerRNA *ptr)
 {
        ModifierData* md = ptr->data;
@@ -1548,5 +1556,12 @@ void RNA_def_fracture(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop = RNA_def_property(srna, "use_constraint_group", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "use_constraint_group", 
false);
+       //RNA_def_property_boolean_funcs(prop, NULL, 
"rna_FractureModifier_use_constraint_group_set");
+       RNA_def_property_ui_text(prop, "Constraints Only", "Only manage the 
external constraints in this Fracture Modifier");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
        RNA_api_fracture(brna, srna);
 }
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index f5d5e3e627d..fa479b5772f 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -270,6 +270,7 @@ static void initData(ModifierData *md)
        fmd->anim_bind_limit = 0.0f;
        zero_v3(fmd->grid_offset);
        zero_v3(fmd->grid_spacing);
+       fmd->use_constraint_group = false;
 }
 
 //XXX TODO, freeing functionality should be in BKE too
@@ -1923,6 +1924,8 @@ static void copyData(ModifierData *md, ModifierData 
*target)
        trmd->anim_bind_limit = rmd->anim_bind_limit;
        copy_v3_v3(trmd->grid_offset, rmd->grid_offset);
        copy_v3_v3(trmd->grid_spacing, rmd->grid_spacing);
+
+       trmd->use_constraint_group = rmd->use_constraint_group;
 }
 
 //XXXX TODO, is BB really useds still ? aint there exact volume calc now ?
@@ -2631,7 +2634,72 @@ static void connect_meshislands(FractureModifierData 
*fmd, MeshIsland *mi1, Mesh
        }
 
        if (!con_found && ok) {
-               BKE_meshisland_constraint_create(fmd, mi1, mi2, con_type, 
thresh);
+
+               if (fmd->dm_group && fmd->use_constraint_group) {
+                       //map back to "original" mesh islands and only create 
here if objects differ
+                       int index1 = 
GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->vert_index_map, 
SET_INT_IN_POINTER(mi1->vertex_indices[0])));
+                       int index2 = 
GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->vert_index_map, 
SET_INT_IN_POINTER(mi2->vertex_indices[0])));
+                       bool error = false;
+
+                       if (index1 != index2)
+                       {
+                               //different index in group, different objects
+                               Object *ob1 = NULL, *ob2 = NULL;
+                               FractureModifierData *fmd1 = NULL, *fmd2 = NULL;
+                               MeshIsland *mi_1 = NULL, *mi_2 = NULL;
+                               int i = 0;
+                               int v = 0, v1 = 0, v2 = 0;
+
+                               GroupObject *go;
+                               DerivedMesh *dm;
+
+                               for (go = fmd->dm_group->gobject.first; go; go 
= go->next)
+                               {
+                                       if (i == index1)
+                                       {
+                                               ob1 = go->ob;
+                                               v1 = v;
+                                       }
+
+                                       if (i == index2)
+                                       {
+                                               ob2 = go->ob;
+                                               v2 = v;
+                                       }
+
+                                       i++;
+
+                                       dm = get_object_dm(go->ob);
+                                       if (!dm) {
+                                               error = true;
+                                               break;
+                                       }
+
+                                       v += dm->getNumVerts(dm);
+                               }
+
+                               if (ob1 && ob2 && !error)
+                               {
+                                       fmd1 = 
(FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture);
+                                       fmd2 = 
(FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture);
+
+                                       if (fmd1 && fmd2)
+                                       {
+                                               mi_1 = 
BLI_ghash_lookup(fmd1->vertex_island_map, 
SET_INT_IN_POINTER(mi1->vertex_indices[0] - v1));
+                                               mi_2 = 
BLI_ghash_lookup(fmd2->vertex_island_map, 
SET_INT_IN_POINTER(mi2->vertex_indices[0] - v2));
+
+                                               if (mi_1 && mi_2)
+                                               {
+                                                       
BKE_meshisland_constraint_create(fmd, mi_1, mi_2, con_type, thresh);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       BKE_meshisland_constraint_create(fmd, mi1, mi2, 
con_type, thresh);
+               }
        }
 }
 
@@ -5075,6 +5143,15 @@ static DerivedMesh *do_prefractured(FractureModifierData 
*fmd, Object *ob, Deriv
                final_dm = doSimulate(fmd, ob, clean_dm, clean_dm, NULL, 0);
        }
 
+       if (fmd->dm_group && fmd->use_constraint_group)
+       {
+               //remove collected mesh here
+               final_dm = derivedData;
+
+               //remove own, unnecessary meshislands and rigidbodies
+               free_meshislands(fmd, &fmd->meshIslands, true);
+       }
+
        /* free newly created derivedmeshes only, but keep derivedData and 
final_dm*/
        if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != 
final_dm))
        {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to