diff options
author | Cody Winchester <CodyWinch> | 2020-02-12 14:38:43 +0300 |
---|---|---|
committer | Bastien Montagne <b.mont29@gmail.com> | 2020-02-12 14:43:02 +0300 |
commit | cc085e228de70563ed0b6870d23ef3bb531c4798 (patch) | |
tree | 8fa049420283d4ce8842d7ecb3833aa5ccf11cb0 | |
parent | 24b5d5aa61682d44376d28097fc0a8f9c5c397bb (diff) |
Modifiers: Vertex Weight Modifiers add invert vgroup option
Adds the invert vgroup mask option to the Vertex Weight modifiers.
These 3 modifiers share the same functions so they needed to be modified at the same time. They are all setup the same with the invert vgroup option being added. I had to add a flag to the Mix modifier but the others I use the existing flags.
Differential Revision: https://developer.blender.org/D6819
8 files changed, 47 insertions, 9 deletions
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 996d6add629..9128173754c 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -1269,7 +1269,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): if not md.mask_texture: split = layout.split(factor=0.4) split.label(text="Vertex Group Mask:") - split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="") + row = split.row(align=True) + row.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="") + row.prop(md, "invert_mask_vertex_group", text="", icon='ARROW_LEFTRIGHT') if not md.mask_vertex_group: split = layout.split(factor=0.4) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 1b0b3d9e08e..82237a10d23 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1387,7 +1387,8 @@ typedef struct WeightVGEditModifierData { /* WeightVGEdit flags. */ enum { - /* (1 << 0), (1 << 1) and (1 << 2) are free for future use! */ + /* (1 << 0) and (1 << 1) are free for future use! */ + MOD_WVG_EDIT_INVERT_VGROUP_MASK = (1 << 2), /** Add vertices with higher weight than threshold to vgroup. */ MOD_WVG_EDIT_ADD2VG = (1 << 3), /** Remove vertices with lower weight than threshold from vgroup. */ @@ -1430,8 +1431,10 @@ typedef struct WeightVGMixModifierData { /** Name of the UV map. MAX_CUSTOMDATA_LAYER_NAME. */ char mask_tex_uvlayer_name[64]; + char flag; + /* Padding... */ - char _pad1[4]; + char _pad1[3]; } WeightVGMixModifierData; /* How second vgroup's weights affect first ones. */ @@ -1466,6 +1469,11 @@ enum { MOD_WVG_SET_AND = 5, }; +/* WeightVGMix->flag */ +enum { + MOD_WVG_MIX_INVERT_VGROUP_MASK = (1 << 0), +}; + typedef struct WeightVGProximityModifierData { ModifierData modifier; @@ -1522,6 +1530,7 @@ enum { MOD_WVG_PROXIMITY_GEOM_EDGES = (1 << 1), /* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */ MOD_WVG_PROXIMITY_GEOM_FACES = (1 << 2), + MOD_WVG_PROXIMITY_INVERT_VGROUP_MASK = (1 << 3), }; /* Defines common to all WeightVG modifiers. */ diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 65963798e08..eb88f4523ab 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -4810,6 +4810,11 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) srna, "rna_WeightVGEditModifier_mask_defgrp_name_set", "rna_WeightVGEditModifier_mask_tex_uvlayer_name_set"); + + prop = RNA_def_property(srna, "invert_mask_vertex_group", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_INVERT_VGROUP_MASK); + RNA_def_property_ui_text(prop, "Invert", "Invert vertex group mask influence"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_weightvgmix(BlenderRNA *brna) @@ -4902,6 +4907,11 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) srna, "rna_WeightVGMixModifier_mask_defgrp_name_set", "rna_WeightVGMixModifier_mask_tex_uvlayer_name_set"); + + prop = RNA_def_property(srna, "invert_mask_vertex_group", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WVG_MIX_INVERT_VGROUP_MASK); + RNA_def_property_ui_text(prop, "Invert", "Invert vertex group mask influence"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) @@ -5008,6 +5018,12 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) srna, "rna_WeightVGProximityModifier_mask_defgrp_name_set", "rna_WeightVGProximityModifier_mask_tex_uvlayer_name_set"); + + prop = RNA_def_property(srna, "invert_mask_vertex_group", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna( + prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_INVERT_VGROUP_MASK); + RNA_def_property_ui_text(prop, "Invert", "Invert vertex group mask influence"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_remesh(BlenderRNA *brna) diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 4ff07b21ef4..c63065eec40 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -130,7 +130,8 @@ void weightvg_do_mask(const ModifierEvalContext *ctx, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, - const char *tex_uvlayer_name) + const char *tex_uvlayer_name, + const bool invert_vgroup_mask) { int ref_didx; int i; @@ -230,7 +231,9 @@ void weightvg_do_mask(const ModifierEvalContext *ctx, /* For each weight (vertex), make the mix between org and new weights. */ for (i = 0; i < num; i++) { int idx = indices ? indices[i] : i; - const float f = defvert_find_weight(&dvert[idx], ref_didx) * fact; + const float f = invert_vgroup_mask ? + 1.0f - defvert_find_weight(&dvert[idx], ref_didx) * fact : + defvert_find_weight(&dvert[idx], ref_didx) * fact; org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0f - f)); /* If that vertex is not in ref vgroup, assume null factor, and hence do nothing! */ } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index 08967b7400d..cb327397785 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -69,7 +69,8 @@ void weightvg_do_mask(const ModifierEvalContext *ctx, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, - const char *tex_uvlayer_name); + const char *tex_uvlayer_name, + bool invert_vgroup_mask); void weightvg_update_vg(struct MDeformVert *dvert, int defgrp_idx, diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 462830867cc..e05484a1ec4 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -167,6 +167,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes float *org_w; /* Array original weights. */ float *new_w; /* Array new weights. */ int i; + const bool invert_vgroup_mask = (wmd->edit_flags & MOD_WVG_EDIT_INVERT_VGROUP_MASK) != 0; /* Flags. */ const bool do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0; @@ -259,7 +260,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, - wmd->mask_tex_uvlayer_name); + wmd->mask_tex_uvlayer_name, + invert_vgroup_mask); /* Update/add/remove from vgroup. */ weightvg_update_vg(dvert, diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 774ce321358..71feaccef45 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -218,6 +218,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes int *tidx, *indices = NULL; int numIdx = 0; int i; + const bool invert_vgroup_mask = (wmd->flag & MOD_WVG_MIX_INVERT_VGROUP_MASK) != 0; /* Flags. */ #if 0 const bool do_prev = (wmd->modifier.mode & eModifierMode_DoWeightPreview) != 0; @@ -393,7 +394,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, - wmd->mask_tex_uvlayer_name); + wmd->mask_tex_uvlayer_name, + invert_vgroup_mask); /* Update (add to) vgroup. * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup. diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 4f9719552fe..56156a07f61 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -411,6 +411,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes int *tidx, *indices = NULL; int numIdx = 0; int i; + const bool invert_vgroup_mask = (wmd->proximity_flags & MOD_WVG_PROXIMITY_INVERT_VGROUP_MASK) != + 0; /* Flags. */ #if 0 const bool do_prev = (wmd->modifier.mode & eModifierMode_DoWeightPreview) != 0; @@ -575,7 +577,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, - wmd->mask_tex_uvlayer_name); + wmd->mask_tex_uvlayer_name, + invert_vgroup_mask); /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_index, dw, numIdx, indices, org_w, false, 0.0f, false, 0.0f); |