Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-01-05 14:27:49 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-01-05 14:48:12 +0300
commit105d385e4b73f353350a3a1894eb0d9e933130c3 (patch)
tree601a0689e7caeeae235a45dc9f06266ab5a5176a /source/blender/editors/sculpt_paint/sculpt.c
parent724110487721226812a111cb147b85622f2c19e4 (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/sculpt_paint/sculpt.c')
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c40
1 files changed, 5 insertions, 35 deletions
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);