1
1

Compare commits

...

1 Commits

Author SHA1 Message Date
7388e103b7 Make the different weight paint code paths exclusive to each other
Before you could have the new sculpt symmetry code and the older weight
paint symmetry code active at the same time.  This would lead to users
easily trashing their weigh paint data if they were not careful when
switching between modes.

Now the specific weight paint symmetry code is an exclusive toggle so
the user can't accidentally mirror strokes and vertex groups at the same
time.  This also paves the way of supporting Y and Z symmetry in the
future for weight groups mirroring if we decide to add it in the future.
(As the UI part for it is done)

See https://developer.blender.org/D10426
2021-02-18 17:19:26 +01:00
8 changed files with 37 additions and 22 deletions

View File

@@ -127,9 +127,13 @@ def draw_vpaint_symmetry(layout, vpaint, mesh):
col = layout.column()
row = col.row(heading="Mirror", align=True)
row.prop(mesh, "use_mirror_x", text="X", toggle=True)
row = row.row(align=True)
row.active = not mesh.use_mirror_vertex_groups
row.prop(mesh, "use_mirror_y", text="Y", toggle=True)
row.prop(mesh, "use_mirror_z", text="Z", toggle=True)
col = layout.column()
col.active = not mesh.use_mirror_vertex_groups
col.prop(vpaint, "radial_symmetry", text="Radial")
@@ -964,9 +968,9 @@ class VIEW3D_PT_tools_weightpaint_symmetry(Panel, View3DPaintPanel):
draw_vpaint_symmetry(layout, wpaint, mesh)
col = layout.column(align=True)
col.prop(mesh, 'use_mirror_vertex_group_x', text="Vertex Group X")
col.prop(mesh, 'use_mirror_vertex_groups')
row = col.row()
row.active = mesh.use_mirror_vertex_group_x
row.active = mesh.use_mirror_vertex_groups
row.prop(mesh, "use_mirror_topology")

View File

@@ -397,7 +397,7 @@ static void drw_mesh_weight_state_extract(Object *ob,
wstate->flags |= DRW_MESH_WEIGHT_STATE_MULTIPAINT |
(ts->auto_normalize ? DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE : 0);
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
BKE_object_defgroup_mirror_selection(ob,
wstate->defgroup_len,
wstate->defgroup_sel,

View File

@@ -1751,7 +1751,7 @@ static bool *vgroup_selected_get(Object *ob)
/* Mirror the selection if X Mirror is enabled. */
Mesh *me = BKE_mesh_from_object(ob);
if (me && (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) != 0) {
if (me && (me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
BKE_object_defgroup_mirror_selection(ob, defbase_tot, mask, mask, &sel_count);
}
}

View File

@@ -769,8 +769,8 @@ static void do_weight_paint_vertex_single(
MDeformVert *dv_mirr;
MDeformWeight *dw_mirr;
/* from now on we can check if mirrors enabled if this var is -1 and not bother with the flag */
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
/* Check if we should mirror vertex groups (X-axis). */
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
index_mirr = mesh_get_x_mirror_vert(ob, NULL, index, topology);
vgroup_mirr = wpi->mirror.index;
@@ -979,8 +979,8 @@ static void do_weight_paint_vertex_multi(
float curw, curw_real, oldw, neww, change, curw_mirr, change_mirr;
float dw_rel_free, dw_rel_locked;
/* from now on we can check if mirrors enabled if this var is -1 and not bother with the flag */
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
/* Check if we should mirror vertex groups (X-axis). */
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
index_mirr = mesh_get_x_mirror_vert(ob, NULL, index, topology);
if (!ELEM(index_mirr, -1, index)) {
@@ -1629,7 +1629,7 @@ static bool wpaint_stroke_test_start(bContext *C, wmOperator *op, const float mo
int i;
bDeformGroup *dg;
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
BKE_object_defgroup_mirror_selection(
ob, defbase_tot, defbase_sel, defbase_sel, &defbase_tot_sel);
}
@@ -2195,7 +2195,8 @@ static void wpaint_paint_leaves(bContext *C,
/* NOTE: current mirroring code cannot be run in parallel */
TaskParallelSettings settings;
const bool use_threading = ((me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) == 0);
const bool use_threading = !((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) &&
(me->symmetry & ME_SYMMETRY_X));
BKE_pbvh_parallel_range_settings(&settings, use_threading, totnode);
switch ((eBrushWeightPaintTool)brush->weightpaint_tool) {
@@ -2326,6 +2327,13 @@ static void wpaint_do_symmetrical_brush_actions(
cache->symmetry = symm;
if (me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) {
/* We don't do any symmetry strokes when mirroing vertex groups. */
copy_v3_v3(cache->true_last_location, cache->true_location);
cache->is_last_valid = true;
return;
}
/* symm is a bit combination of XYZ - 1 is mirror
* X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */
for (i = 1; i <= symm; i++) {

View File

@@ -235,7 +235,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *even
vc.obact, defbase_tot, &defbase_tot_sel);
if (defbase_tot_sel > 1) {
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
BKE_object_defgroup_mirror_selection(
vc.obact, defbase_tot, defbase_sel, defbase_sel, &defbase_tot_sel);
}
@@ -461,7 +461,7 @@ static bool weight_paint_set(Object *ob, float paintweight)
vgroup_active = ob->actdef - 1;
/* if mirror painting, find the other group */
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
vgroup_mirror = ED_wpaint_mirror_vgroup_ensure(ob, vgroup_active);
}
@@ -489,7 +489,8 @@ static bool weight_paint_set(Object *ob, float paintweight)
dw_prev->weight = dw->weight; /* set the undo weight */
dw->weight = paintweight;
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) { /* x mirror painting */
if (me->symmetry & ME_SYMMETRY_X) {
/* x mirror painting */
int j = mesh_get_x_mirror_vert(ob, NULL, vidx, topology);
if (j >= 0) {
/* copy, not paint again */

View File

@@ -118,7 +118,7 @@ bool ED_wpaint_ensure_data(bContext *C,
}
if (flag & WPAINT_ENSURE_MIRROR) {
if (me->editflag & ME_EDIT_VERTEX_GROUPS_X_SYMMETRY) {
if ((me->editflag & ME_EDIT_MIRROR_VERTEX_GROUPS) && (me->symmetry & ME_SYMMETRY_X)) {
int mirror = ED_wpaint_mirror_vgroup_ensure(ob, ob->actdef - 1);
if (vgroup_index) {
vgroup_index->mirror = mirror;

View File

@@ -263,7 +263,7 @@ enum {
/* me->editflag */
enum {
ME_EDIT_VERTEX_GROUPS_X_SYMMETRY = 1 << 0,
ME_EDIT_MIRROR_VERTEX_GROUPS = 1 << 0,
ME_EDIT_MIRROR_Y = 1 << 1, /* unused so far */
ME_EDIT_MIRROR_Z = 1 << 2, /* unused so far */
@@ -275,9 +275,9 @@ enum {
/* we cant have both flags enabled at once,
* flags defined in DNA_scene_types.h */
#define ME_EDIT_PAINT_SEL_MODE(_me) \
(((_me)->editflag & ME_EDIT_PAINT_FACE_SEL) ? \
SCE_SELECT_FACE : \
((_me)->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX : 0)
(((_me)->editflag & ME_EDIT_PAINT_FACE_SEL) ? SCE_SELECT_FACE : \
((_me)->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX : \
0)
/* me->flag */
enum {

View File

@@ -3289,10 +3289,12 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Z", "Enable symmetry in the Z axis");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop = RNA_def_property(srna, "use_mirror_vertex_group_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_VERTEX_GROUPS_X_SYMMETRY);
RNA_def_property_ui_text(
prop, "Vertex Groups X Symmetry", "Mirror the left/right vertex groups when painting");
prop = RNA_def_property(srna, "use_mirror_vertex_groups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_MIRROR_VERTEX_GROUPS);
RNA_def_property_ui_text(prop,
"Mirror Vertex Groups",
"Mirror the left/right vertex groups when painting. The symmetry axis "
"is determined by the symmetry settings");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
/* End Symmetry */