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:
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)
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue