Fix T91444: Edge Loop Preview fails with two Mirror Modifiers

The mirror modifiers merge option caused unnecessary re-ordering
to the vertex array with original vertices merging into their copies.

While this wasn't an error, it meant creating a 1:1 mapping from input
vertices to their final output wasn't reliable (when looping over
vertices first to last) as is done in
BKE_editmesh_vert_coords_when_deformed.

As merging in either direction is supported, keep the source meshes
vertices in-order since it allows the vertex coordinates to be extracted.
This commit is contained in:
Campbell Barton 2021-11-12 18:07:07 +11:00
parent f133c6b094
commit 1a7757b0bc
Notes: blender-bot 2023-02-14 10:11:54 +01:00
Referenced by commit e6cd4761e7, Fix T93321: Modified Mirror modifier behavior break some other tools like bound SurfaceDeform.
Referenced by issue #95541, Regression: Broken vertex weight with mirror modifier
Referenced by issue #93321, Blender 3.0 splash screen scene will rendered incorrectly
Referenced by issue #91444, Edge Loop Preview fails with two Mirror Modifiers
1 changed files with 12 additions and 5 deletions

View File

@ -260,10 +260,16 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd,
mul_m4_v3(mtx, mv->co);
if (do_vtargetmap) {
/* compare location of the original and mirrored vertex, to see if they
* should be mapped for merging */
/* Compare location of the original and mirrored vertex,
* to see if they should be mapped for merging.
*
* Always merge from the copied into the original vertices so it's possible to
* generate a 1:1 mapping by scanning vertices from the beginning of the array
* as is done in #BKE_editmesh_vert_coords_when_deformed. Without this,
* the coordinates returned will sometimes point to the copied vertex locations, see: T91444.
*/
if (UNLIKELY(len_squared_v3v3(mv_prev->co, mv->co) < tolerance_sq)) {
*vtmap_a = maxVerts + i;
*vtmap_b = i;
tot_vtargetmap++;
/* average location */
@ -271,10 +277,11 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd,
copy_v3_v3(mv_prev->co, mv->co);
}
else {
*vtmap_a = -1;
*vtmap_b = -1;
}
*vtmap_b = -1; /* fill here to avoid 2x loops */
/* Fill here to avoid 2x loops. */
*vtmap_a = -1;
vtmap_a++;
vtmap_b++;