Modifiers: add invert vgroup weights options to operands of Mix modifier.

Please note that vertices which are in a vgroup are not affected by this
option (which means that affected vertices from 'selection' modes remain
the same). Only the weights of selected vertices get inverted.

Reviewed By: mont29

Differential Revision: https://developer.blender.org/D7811
This commit is contained in:
D. O
2020-05-29 18:52:29 +02:00
committed by Bastien Montagne
parent c93a88413d
commit 907cab45ff
4 changed files with 40 additions and 4 deletions

View File

@@ -1449,7 +1449,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
col.label(text="Vertex Group A:")
col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
row = col.row(align=True)
row.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
row.prop(md, "invert_vertex_group_a", text="", icon='ARROW_LEFTRIGHT')
col.label(text="Default Weight A:")
col.prop(md, "default_weight_a", text="")
@@ -1458,7 +1460,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
col.label(text="Vertex Group B:")
col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
row = col.row(align=True)
row.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
row.prop(md, "invert_vertex_group_b", text="", icon='ARROW_LEFTRIGHT')
col.label(text="Default Weight B:")
col.prop(md, "default_weight_b", text="")

View File

@@ -1505,6 +1505,8 @@ enum {
enum {
MOD_WVG_MIX_INVERT_VGROUP_MASK = (1 << 0),
MOD_WVG_MIX_WEIGHTS_NORMALIZE = (1 << 1),
MOD_WVG_MIX_INVERT_VGROUP_A = (1 << 2),
MOD_WVG_MIX_INVERT_VGROUP_B = (1 << 3),
};
typedef struct WeightVGProximityModifierData {

View File

@@ -5012,6 +5012,16 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_defgrp_name_b_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "invert_vertex_group_a", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WVG_MIX_INVERT_VGROUP_A);
RNA_def_property_ui_text(prop, "Invert Weights A", "Invert the influence of vertex group A");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "invert_vertex_group_b", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WVG_MIX_INVERT_VGROUP_B);
RNA_def_property_ui_text(prop, "Invert Weights B", "Invert the influence of vertex group B");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "default_weight_a", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0.0, 1.0f);
RNA_def_property_ui_range(prop, 0.0, 1.0, 1, -1);

View File

@@ -225,6 +225,16 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
int i;
const bool invert_vgroup_mask = (wmd->flag & MOD_WVG_MIX_INVERT_VGROUP_MASK) != 0;
const bool do_normalize = (wmd->flag & MOD_WVG_MIX_WEIGHTS_NORMALIZE) != 0;
/*
* Note that we only invert the weight values within provided vgroups, the selection based on
* which vertice is affected because it belongs or not to a group remains unchanged.
* In other words, vertices not belonging to a group won't be affected, even though their
* inverted 'virtual' weight would be 1.0f.
*/
const bool invert_vgroup_a = (wmd->flag & MOD_WVG_MIX_INVERT_VGROUP_A) != 0;
const bool invert_vgroup_b = (wmd->flag & MOD_WVG_MIX_INVERT_VGROUP_B) != 0;
/* Flags. */
#if 0
const bool do_prev = (wmd->modifier.mode & eModifierMode_DoWeightPreview) != 0;
@@ -379,8 +389,18 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
/* Mix weights. */
for (i = 0; i < numIdx; i++) {
float weight2;
org_w[i] = dw1[i] ? dw1[i]->weight : wmd->default_weight_a;
weight2 = dw2[i] ? dw2[i]->weight : wmd->default_weight_b;
if (invert_vgroup_a) {
org_w[i] = 1.0f - (dw1[i] ? dw1[i]->weight : wmd->default_weight_a);
}
else {
org_w[i] = dw1[i] ? dw1[i]->weight : wmd->default_weight_a;
}
if (invert_vgroup_b) {
weight2 = 1.0f - (dw2[i] ? dw2[i]->weight : wmd->default_weight_b);
}
else {
weight2 = dw2[i] ? dw2[i]->weight : wmd->default_weight_b;
}
new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode);
}