Fix T94974: Invalid normals in edit mode

Normal layers currently aren't stored in the undo step
mesh storage, since they are not stored in files at all.
However, the edit mesh expects normals to be fully
calculated, and does not keep track of a dirty state.
This patch updates the normals in the BMesh created
by loading an undo step.

Another option would be calculating the normals on
the undo mesh first, which might be better if Mesh
normal calculation is faster than BMesh calculation,
but the preferred method to access vertex normals fails
in this case, because the mesh runtime mutexes are not
initialized for undo-state meshes.

Differential Revision: https://developer.blender.org/D13859
This commit is contained in:
Hans Goudey 2022-01-21 16:14:00 -06:00
parent 68aa35ae74
commit d590e223da
Notes: blender-bot 2023-02-14 01:07:44 +01:00
Referenced by commit e88d966737, BMesh: merge normal and tessellation calculation on undo
Referenced by issue #94974, Incorrect normals in edit mode (especially after undo)
1 changed files with 6 additions and 2 deletions

View File

@ -687,11 +687,15 @@ static void undomesh_to_editmesh(UndoMesh *um, Object *ob, BMEditMesh *em, Key *
.active_shapekey = um->shapenr,
}));
/* Normals should not be stored in the undo mesh, so recalculate them. The edit
* mesh is expected to have valid normals and there is no tracked dirty state. */
BLI_assert(BKE_mesh_vertex_normals_are_dirty(&um->me));
BM_mesh_normals_update(bm);
em_tmp = BKE_editmesh_create(bm);
*em = *em_tmp;
/* Calculate face normals and tessellation at once since it's multi-threaded.
* The vertex normals are stored in the undo-mesh, so this doesn't need to be updated. */
/* Calculate face normals and tessellation at once since it's multi-threaded. */
BKE_editmesh_looptri_calc_ex(em,
&(const struct BMeshCalcTessellation_Params){
.face_normals = true,