Modifier: mask threshold option
authorCampbell Barton <ideasman42@gmail.com>
Mon, 29 Oct 2018 02:01:48 +0000 (13:01 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 29 Oct 2018 02:03:28 +0000 (13:03 +1100)
D3834 by @Allosteric

release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_mask.c

index 1a80a160ea5b488b9aa05c93f4f0a6804068d2f8..23ab644cba16e5ebcbecf422c97de0e75ec64666 100644 (file)
@@ -523,6 +523,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             sub.active = bool(md.vertex_group)
             sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
 
+        col = layout.column()
+        col.prop(md, "threshold")
+
     def MESH_DEFORM(self, layout, ob, md):
         split = layout.split()
 
index ad5f3768b933eda34c31fdc038a3f5a149547acc..2adf4a02d22a7745ea391169060a31f8fbdbdd73 100644 (file)
@@ -192,8 +192,9 @@ typedef struct MaskModifierData {
        struct Object *ob_arm;  /* armature to use to in place of hardcoded vgroup */
        char vgroup[64];        /* name of vertex group to use to mask, MAX_VGROUP_NAME */
 
-       int mode;               /* using armature or hardcoded vgroup */
-       int flag;               /* flags for various things */
+       short mode;               /* using armature or hardcoded vgroup */
+       short flag;               /* flags for various things */
+       float threshold;
 } MaskModifierData;
 
 /* Mask Modifier -> mode */
index 1a05b6e5e003b69e563364369d48e26f838b6804..f9b848744d65b4fb1d2c14741171ca07e1472c99 100644 (file)
@@ -3267,6 +3267,13 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MASK_INV);
        RNA_def_property_ui_text(prop, "Invert", "Use vertices that are not part of region defined");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_FACTOR);
+       RNA_def_property_float_sdna(prop, NULL, "threshold");
+       RNA_def_property_range(prop, 0.0, 1.0);
+       RNA_def_property_ui_range(prop, 0, 1, 0.1, 3);
+       RNA_def_property_ui_text(prop, "Threshold", "Weights over this threshold remain");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_simpledeform(BlenderRNA *brna)
index 93332fb0455dc0e5951e8f545553232320239b68..5246f8cd35aff6c5a37ee09007fa44513b7db624 100644 (file)
@@ -196,7 +196,7 @@ static DerivedMesh *applyModifier(
                        for (j = 0; j < dv->totweight; j++, dw++) {
                                if (dw->def_nr < defbase_tot) {
                                        if (bone_select_array[dw->def_nr]) {
-                                               if (dw->weight != 0.0f) {
+                                               if (dw->weight > mmd->threshold) {
                                                        found = true;
                                                        break;
                                                }
@@ -228,7 +228,7 @@ static DerivedMesh *applyModifier(
 
                /* add vertices which exist in vertexgroup into ghash for filtering */
                for (i = 0, dv = dvert; i < maxVerts; i++, dv++) {
-                       const bool found = defvert_find_weight(dv, defgrp_index) != 0.0f;
+                       const bool found = defvert_find_weight(dv, defgrp_index) > mmd->threshold;
                        if (found_test != found) {
                                continue;
                        }