Commit: fa9b05149c2ca3915a4fb2670c87a648d927336c Author: Sebastian Parborg Date: Fri Apr 2 14:44:26 2021 +0200 Branches: master https://developer.blender.org/rBfa9b05149c2ca3915a4fb2670c87a648d927336c
Fix T84520: Make the different weight paint code paths exclusive to each other Before this change, 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. Reviewed By: Sybren Differential Revision: http://developer.blender.org/D10426 =================================================================== M release/scripts/startup/bl_ui/space_view3d.py M release/scripts/startup/bl_ui/space_view3d_toolbar.py M source/blender/draw/intern/draw_cache_impl_mesh.c M source/blender/editors/object/object_vgroup.c M source/blender/editors/sculpt_paint/paint_vertex.c M source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c M source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c M source/blender/makesdna/DNA_mesh_defaults.h M source/blender/makesdna/DNA_mesh_types.h M source/blender/makesrna/intern/rna_mesh.c M source/blender/makesrna/intern/rna_object.c =================================================================== diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index e68f006ccc1..ab20bce1756 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -161,9 +161,9 @@ class VIEW3D_HT_tool_header(Header): elif mode_string in {'EDIT_MESH', 'PAINT_WEIGHT', 'SCULPT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}: # Mesh Modes, Use Mesh Symmetry row, sub = row_for_mirror() - sub.prop(context.object.data, "use_mirror_x", text="X", toggle=True) - sub.prop(context.object.data, "use_mirror_y", text="Y", toggle=True) - sub.prop(context.object.data, "use_mirror_z", text="Z", toggle=True) + sub.prop(context.object, "use_mesh_mirror_x", text="X", toggle=True) + sub.prop(context.object, "use_mesh_mirror_y", text="Y", toggle=True) + sub.prop(context.object, "use_mesh_mirror_z", text="Z", toggle=True) if mode_string == 'EDIT_MESH': tool_settings = context.tool_settings layout.prop(tool_settings, "use_mesh_automerge", text="") diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 831fc06eda5..ab012a6f2ef 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -123,13 +123,15 @@ class View3DPanel: # **************** standard tool clusters ****************** # Used by vertex & weight paint -def draw_vpaint_symmetry(layout, vpaint, mesh): +def draw_vpaint_symmetry(layout, vpaint, obj): col = layout.column() row = col.row(heading="Mirror", align=True) - row.prop(mesh, "use_mirror_x", text="X", toggle=True) - row.prop(mesh, "use_mirror_y", text="Y", toggle=True) - row.prop(mesh, "use_mirror_z", text="Z", toggle=True) + row.prop(obj, "use_mesh_mirror_x", text="X", toggle=True) + row.prop(obj, "use_mesh_mirror_y", text="Y", toggle=True) + row.prop(obj, "use_mesh_mirror_z", text="Z", toggle=True) + col = layout.column() + col.active = not obj.data.use_mirror_vertex_groups col.prop(vpaint, "radial_symmetry", text="Radial") @@ -977,12 +979,12 @@ class VIEW3D_PT_tools_weightpaint_symmetry(Panel, View3DPaintPanel): wpaint = tool_settings.weight_paint mesh = context.object.data - draw_vpaint_symmetry(layout, wpaint, mesh) + layout.prop(mesh, 'use_mirror_vertex_groups') - col = layout.column(align=True) - col.prop(mesh, 'use_mirror_vertex_group_x', text="Vertex Group X") - row = col.row() - row.active = mesh.use_mirror_vertex_group_x + draw_vpaint_symmetry(layout, wpaint, context.object) + + row = layout.row() + row.active = mesh.use_mirror_vertex_groups row.prop(mesh, "use_mirror_topology") @@ -1057,7 +1059,7 @@ class VIEW3D_PT_tools_vertexpaint_symmetry(Panel, View3DPaintPanel): tool_settings = context.tool_settings vpaint = tool_settings.vertex_paint - draw_vpaint_symmetry(layout, vpaint, context.object.data) + draw_vpaint_symmetry(layout, vpaint, context.object) class VIEW3D_PT_tools_vertexpaint_symmetry_for_topbar(Panel): diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 04bfb667d24..f11fd0f3906 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -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_USING_MIRROR_X_VERTEX_GROUPS(me)) { BKE_object_defgroup_mirror_selection(ob, wstate->defgroup_len, wstate->defgroup_sel, diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 2296e158cc8..5f81f9afe4f 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -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_USING_MIRROR_X_VERTEX_GROUPS(me)) { BKE_object_defgroup_mirror_selection(ob, defbase_tot, mask, mask, &sel_count); } } diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index fc52f6fea7c..f634e6ad026 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -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_USING_MIRROR_X_VERTEX_GROUPS(me)) { 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_USING_MIRROR_X_VERTEX_GROUPS(me)) { 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_USING_MIRROR_X_VERTEX_GROUPS(me)) { BKE_object_defgroup_mirror_selection( ob, defbase_tot, defbase_sel, defbase_sel, &defbase_tot_sel); } @@ -2191,7 +2191,7 @@ 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_USING_MIRROR_X_VERTEX_GROUPS(me); BKE_pbvh_parallel_range_settings(&settings, use_threading, totnode); switch ((eBrushWeightPaintTool)brush->weightpaint_tool) { @@ -2322,6 +2322,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++) { diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c index 8277b485578..0fafd3589fe 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c @@ -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_USING_MIRROR_X_VERTEX_GROUPS(me)) { 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_USING_MIRROR_X_VERTEX_GROUPS(me)) { 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 */ diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c index a8ba87ac483..d6a118bbd59 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c @@ -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_USING_MIRROR_X_VERTEX_GROUPS(me)) { int mirror = ED_wpaint_mirror_vgroup_ensure(ob, ob->actdef - 1); if (vgroup_index) { vgroup_index->mirror = mirror; diff --git a/source/blender/makesdna/DNA_mesh_defaults.h b/source/blender/makesdna/DNA_mesh_defaults.h index 8326db66049..889f92eec95 100644 --- a/source/blender/makesdna/DNA_mesh_defaults.h +++ b/source/blender/makesdna/DNA_mesh_defaults.h @@ -37,6 +37,7 @@ .face_sets_color_seed = 0, \ .face_sets_color_default = 1, \ .flag = ME_REMESH_FIX_POLES | ME_REMESH_REPROJECT_VOLUME, \ + .editflag = ME_EDIT_MIRROR_VERTEX_GROUPS \ } /** \} */ diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h i @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
