diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.cc b/source/blender/editors/sculpt_paint/sculpt_transform.cc index bd22a6fba3b..c6f58eff7ff 100644 --- a/source/blender/editors/sculpt_paint/sculpt_transform.cc +++ b/source/blender/editors/sculpt_paint/sculpt_transform.cc @@ -165,6 +165,26 @@ BLI_NOINLINE static void calc_symm_area_transform_translations( } } +BLI_NOINLINE static void filter_translations_with_symmetry(const Span positions, + const ePaintSymmetryFlags symm, + const MutableSpan translations) +{ + if ((symm & (PAINT_SYMM_X | PAINT_SYMM_Y | PAINT_SYMM_Z)) == 0) { + return; + } + for (const int i : positions.index_range()) { + if ((symm & PAINT_SYMM_X) && (std::abs(positions[i].x) < transform_mirror_max_distance_eps)) { + translations[i].x = 0.0f; + } + if ((symm & PAINT_SYMM_Y) && (std::abs(positions[i].y) < transform_mirror_max_distance_eps)) { + translations[i].y = 0.0f; + } + if ((symm & PAINT_SYMM_Z) && (std::abs(positions[i].z) < transform_mirror_max_distance_eps)) { + translations[i].z = 0.0f; + } + } +} + static void transform_node_mesh(const Sculpt &sd, const std::array &transform_mats, const Span positions_eval, @@ -185,9 +205,11 @@ static void transform_node_mesh(const Sculpt &sd, tls.translations.reinitialize(verts.size()); const MutableSpan translations = tls.translations; calc_symm_area_transform_translations(orig_data.positions, transform_mats, translations); - scale_translations(translations, factors); + const ePaintSymmetryFlags symm = SCULPT_mesh_symmetry_xyz_get(object); + filter_translations_with_symmetry(orig_data.positions, symm, translations); + write_translations(sd, object, positions_eval, verts, translations, positions_orig); } @@ -216,6 +238,9 @@ static void transform_node_grids(const Sculpt &sd, scale_translations(translations, factors); + const ePaintSymmetryFlags symm = SCULPT_mesh_symmetry_xyz_get(object); + filter_translations_with_symmetry(orig_data.positions, symm, translations); + clip_and_lock_translations(sd, ss, orig_data.positions, translations); apply_translations(translations, grids, subdiv_ccg); } @@ -244,6 +269,9 @@ static void transform_node_bmesh(const Sculpt &sd, scale_translations(translations, factors); + const ePaintSymmetryFlags symm = SCULPT_mesh_symmetry_xyz_get(object); + filter_translations_with_symmetry(orig_positions, symm, translations); + clip_and_lock_translations(sd, ss, orig_positions, translations); apply_translations(translations, verts); }