Commit: d846f810b2b76987ebd2044c3482e7de8a534ee2
Author: Martin Felke
Date:   Sun Aug 12 14:54:57 2018 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd846f810b2b76987ebd2044c3482e7de8a534ee2

added autohide filtering based on filter object vertex positions

mesh objects now use their verts and a distance, while empties (or other 
non-mesh objects) still
use the maximum of the object size as radius

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

M       release/scripts/startup/bl_operators/presets.py
M       release/scripts/startup/bl_ui/properties_physics_fracture.py
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 24f956b773c..baa33e85f5f 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -715,6 +715,7 @@ class AddPresetFracture(AddPresetBase, Operator):
         "fracture.grid_offset",
         "fracture.grid_spacing",
         "fracture.use_constraint_group",
+        "fracture.autohide_filter_dist",
     ]
 
     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 20efd1f0557..933ae296e4b 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -303,7 +303,10 @@ class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, 
Panel):
     def draw(self, context):
         layout = self.layout
         md = context.fracture
-        layout.prop(md, "autohide_filter_group", text = "Filter Group")
+        col = layout.column()
+        col.prop(md, "autohide_filter_group", text = "Filter Group")
+        if md.autohide_filter_group:
+            col.prop(md, "autohide_filter_dist")
         col = layout.column(align=True)
         col.prop(md, "autohide_dist")
         col.prop(md, "automerge_dist")
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index cd70132c254..4fd719af672 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1824,6 +1824,7 @@ typedef struct FractureModifierData {
        float anim_bind_limit;
        float grid_offset[3];
        float grid_spacing[3];
+       float autohide_filter_dist;
 
        /* flags */
        int refresh;
@@ -1885,7 +1886,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 9a16ecd7755..a4f1ff67e5a 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -1584,5 +1584,13 @@ 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, "autohide_filter_dist", PROP_FLOAT, 
PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "autohide_filter_dist");
+       RNA_def_property_range(prop, 0, FLT_MAX);
+       RNA_def_property_ui_text(prop, "Filter Distance", "Distance between 
verts of filter objects and face centers of object");
+       RNA_def_property_ui_range(prop, 0.0f, FLT_MAX, 0.1f, 3);
+       //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 6dbf8e80ff0..2734622c557 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -273,6 +273,7 @@ static void initData(ModifierData *md)
        zero_v3(fmd->grid_spacing);
        fmd->use_constraint_group = false;
        fmd->activate_broken = false;
+       fmd->autohide_filter_dist = 0.1f;
 }
 
 //XXX TODO, freeing functionality should be in BKE too
@@ -1929,6 +1930,8 @@ static void copyData(ModifierData *md, ModifierData 
*target)
 
        trmd->use_constraint_group = rmd->use_constraint_group;
        trmd->activate_broken = rmd->activate_broken;
+
+       trmd->autohide_filter_dist = rmd->autohide_filter_dist;
 }
 
 //XXXX TODO, is BB really useds still ? aint there exact volume calc now ?
@@ -3389,22 +3392,71 @@ static void find_other_face(FractureModifierData *fmd, 
int i, BMesh* bm, Object*
                                /*if not in any filter range, delete... else 
keep */
                                Object* obj = go->ob;
                                float f1_loc[3], f2_loc[3];
-                               float radius = MAX3(obj->size[0], obj->size[1], 
obj->size[2]);
+
+                               float radius = fmd->autohide_filter_dist;
 
                                /* TODO XXX watch out if go->ob is parented to 
ob (Transformation error ?) */
                                mul_v3_m4v3(f1_loc, ob->obmat, f_centr);
                                mul_v3_m4v3(f2_loc, ob->obmat, f_centr_other);
                                radius = radius * radius;
 
-                               if ((len_squared_v3v3(f1_loc, obj->loc) < 
radius) &&
-                                       (len_squared_v3v3(f2_loc, obj->loc) < 
radius))
+                               if (obj->type == OB_MESH)
                                {
-                                       in_filter = true;
-                                       break;
+                                       //use geometry of meshes
+                                       MVert* mvert = NULL, *mv = NULL;
+                                       DerivedMesh *dm = obj->derivedFinal;
+                                       bool final = true;
+                                       int totvert, v;
+
+                                       if (!dm) {
+                                               dm = CDDM_from_mesh(obj->data);
+                                               final = false;
+                                       }
+
+                                       mvert = dm->getVertArray(dm);
+                                       totvert = dm->getNumVerts(dm);
+
+                                       for (v = 0, mv = mvert; v < totvert; 
v++, mv++)
+                                       {
+                                               float loc[3];
+                                               mul_v3_m4v3(loc, obj->obmat, 
mv->co);
+
+                                               if ((len_squared_v3v3(f1_loc, 
loc) < radius) &&
+                                                       
(len_squared_v3v3(f2_loc, loc) < radius))
+                                               {
+                                                       in_filter = true;
+                                                       break;
+                                               }
+                                               else
+                                               {
+                                                       in_filter = false;
+                                               }
+                                       }
+
+                                       if (!final && dm)
+                                       {
+                                               dm->needsFree = 1;
+                                               dm->release(dm);
+                                               dm = NULL;
+                                       }
+
+                                       if (in_filter)
+                                               break;
                                }
-                               else
-                               {
-                                       in_filter = false;
+                               else {
+                                       //override with object size here, makes 
more sense
+                                       radius = MAX3(obj->size[0], 
obj->size[1], obj->size[2]);
+
+                                       if ((len_squared_v3v3(f1_loc, obj->loc) 
< radius) &&
+                                               (len_squared_v3v3(f2_loc, 
obj->loc) < radius))
+                                       {
+                                               in_filter = true;
+                                               break;
+                                       }
+                                       else
+                                       {
+                                               in_filter = false;
+                                       }
                                }
                        }
                }

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

Reply via email to