diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-01-05 14:27:49 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-01-05 14:48:12 +0300 |
commit | 105d385e4b73f353350a3a1894eb0d9e933130c3 (patch) | |
tree | 601a0689e7caeeae235a45dc9f06266ab5a5176a /source/blender/editors | |
parent | 724110487721226812a111cb147b85622f2c19e4 (diff) |
Fix T84364: Sculpt symmetrize fails with shape keys
Use the BMesh symmetrize operator instead of using the modifier code.
While we could support shape-keys with the existing code used by the
mirror modifier, we'd need to add code-paths for evaluated mesh & bmesh
conversion to handle shape-keys differently just for this one case,
since we want to avoid copying & processing shape-keys layers for
evaluated meshes in general.
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/object/object_remesh.c | 4 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 40 |
2 files changed, 7 insertions, 37 deletions
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index 11be71623d8..058c34fb977 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -773,7 +773,7 @@ static Mesh *remesh_symmetry_bisect(Mesh *mesh, eSymmetryAxes symmetry_axes) zero_v3(plane_no); plane_no[axis] = -1.0f; mesh_bisect_temp = mesh_bisect; - mesh_bisect = BKE_mesh_mirror_bisect_on_mirror_plane( + mesh_bisect = BKE_mesh_mirror_bisect_on_mirror_plane_for_modifier( &mmd, mesh_bisect, axis, plane_co, plane_no); if (mesh_bisect_temp != mesh_bisect) { BKE_id_free(NULL, mesh_bisect_temp); @@ -803,7 +803,7 @@ static Mesh *remesh_symmetry_mirror(Object *ob, Mesh *mesh, eSymmetryAxes symmet mmd.flag = 0; mmd.flag &= MOD_MIR_AXIS_X << i; mesh_mirror_temp = mesh_mirror; - mesh_mirror = BKE_mesh_mirror_apply_mirror_on_axis(&mmd, NULL, ob, mesh_mirror, axis); + mesh_mirror = BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(&mmd, ob, mesh_mirror, axis); if (mesh_mirror_temp != mesh_mirror) { BKE_id_free(NULL, mesh_mirror_temp); } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index f574f21b39d..5a75f4e9cb7 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -8166,10 +8166,12 @@ static bool sculpt_no_multires_poll(bContext *C) static int sculpt_symmetrize_exec(bContext *C, wmOperator *op) { + Main *bmain = CTX_data_main(C); Object *ob = CTX_data_active_object(C); const Sculpt *sd = CTX_data_tool_settings(C)->sculpt; SculptSession *ss = ob->sculpt; PBVH *pbvh = ss->pbvh; + const float dist = RNA_float_get(op->ptr, "merge_tolerance"); if (!pbvh) { return OPERATOR_CANCELLED; @@ -8212,41 +8214,9 @@ static int sculpt_symmetrize_exec(bContext *C, wmOperator *op) /* Mesh Symmetrize. */ ED_sculpt_undo_geometry_begin(ob, "mesh symmetrize"); Mesh *mesh = ob->data; - Mesh *mesh_mirror; - MirrorModifierData mmd = {{0}}; - int axis = 0; - mmd.flag = 0; - mmd.tolerance = RNA_float_get(op->ptr, "merge_tolerance"); - switch (sd->symmetrize_direction) { - case BMO_SYMMETRIZE_NEGATIVE_X: - axis = 0; - mmd.flag |= MOD_MIR_AXIS_X | MOD_MIR_BISECT_AXIS_X | MOD_MIR_BISECT_FLIP_AXIS_X; - break; - case BMO_SYMMETRIZE_NEGATIVE_Y: - axis = 1; - mmd.flag |= MOD_MIR_AXIS_Y | MOD_MIR_BISECT_AXIS_Y | MOD_MIR_BISECT_FLIP_AXIS_Y; - break; - case BMO_SYMMETRIZE_NEGATIVE_Z: - axis = 2; - mmd.flag |= MOD_MIR_AXIS_Z | MOD_MIR_BISECT_AXIS_Z | MOD_MIR_BISECT_FLIP_AXIS_Z; - break; - case BMO_SYMMETRIZE_POSITIVE_X: - axis = 0; - mmd.flag |= MOD_MIR_AXIS_X | MOD_MIR_BISECT_AXIS_X; - break; - case BMO_SYMMETRIZE_POSITIVE_Y: - axis = 1; - mmd.flag |= MOD_MIR_AXIS_Y | MOD_MIR_BISECT_AXIS_Y; - break; - case BMO_SYMMETRIZE_POSITIVE_Z: - axis = 2; - mmd.flag |= MOD_MIR_AXIS_Z | MOD_MIR_BISECT_AXIS_Z; - break; - } - mesh_mirror = BKE_mesh_mirror_apply_mirror_on_axis(&mmd, NULL, ob, mesh, axis); - if (mesh_mirror) { - BKE_mesh_nomain_to_mesh(mesh_mirror, mesh, ob, &CD_MASK_MESH, true); - } + + BKE_mesh_mirror_apply_mirror_on_axis(bmain, mesh, sd->symmetrize_direction, dist); + ED_sculpt_undo_geometry_end(ob); BKE_mesh_calc_normals(ob->data); BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL); |