diff --git a/source/blender/blenkernel/BKE_editmesh_cache.hh b/source/blender/blenkernel/BKE_editmesh_cache.hh index a6a23c5b5ef..205a1f02b8d 100644 --- a/source/blender/blenkernel/BKE_editmesh_cache.hh +++ b/source/blender/blenkernel/BKE_editmesh_cache.hh @@ -29,10 +29,13 @@ struct EditMeshData { } // namespace blender::bke -void BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMeshData &emd); -void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd); +blender::Span BKE_editmesh_cache_ensure_face_normals( + BMEditMesh &em, blender::bke::EditMeshData &emd); +blender::Span BKE_editmesh_cache_ensure_vert_normals( + BMEditMesh &em, blender::bke::EditMeshData &emd); -void BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, blender::bke::EditMeshData &emd); +blender::Span BKE_editmesh_cache_ensure_face_centers( + BMEditMesh &em, blender::bke::EditMeshData &emd); std::optional> BKE_editmesh_cache_calc_minmax( const BMEditMesh &em, const blender::bke::EditMeshData &emd); diff --git a/source/blender/blenkernel/intern/editmesh_cache.cc b/source/blender/blenkernel/intern/editmesh_cache.cc index aae6de910aa..139988d019c 100644 --- a/source/blender/blenkernel/intern/editmesh_cache.cc +++ b/source/blender/blenkernel/intern/editmesh_cache.cc @@ -17,14 +17,18 @@ #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" /* own include */ +using blender::float3; +using blender::Span; + /* -------------------------------------------------------------------- */ /** \name Ensure Data (derived from coords) * \{ */ -void BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMeshData &emd) +Span BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, + blender::bke::EditMeshData &emd) { if (emd.vert_positions.is_empty() || !emd.face_normals.is_empty()) { - return; + return emd.face_normals; } BMesh *bm = em.bm; @@ -39,28 +43,32 @@ void BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMe BM_face_calc_normal_vcos(bm, efa, emd.face_normals[i], emd.vert_positions); } bm->elem_index_dirty &= ~BM_FACE; + return emd.face_normals; } -void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd) +Span BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, + blender::bke::EditMeshData &emd) { if (emd.vert_positions.is_empty() || !emd.vert_normals.is_empty()) { - return; + return emd.vert_normals; } BMesh *bm = em.bm; /* Calculate vertex normals from face normals. */ - BKE_editmesh_cache_ensure_face_normals(em, emd); + const Span face_normals = BKE_editmesh_cache_ensure_face_normals(em, emd); emd.vert_normals.reinitialize(bm->totvert); BM_mesh_elem_index_ensure(bm, BM_FACE); - BM_verts_calc_normal_vcos(bm, emd.face_normals, emd.vert_positions, emd.vert_normals); + BM_verts_calc_normal_vcos(bm, face_normals, emd.vert_positions, emd.vert_normals); + return emd.vert_normals; } -void BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, blender::bke::EditMeshData &emd) +Span BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, + blender::bke::EditMeshData &emd) { if (!emd.face_centers.is_empty()) { - return; + return emd.face_centers; } BMesh *bm = em.bm; @@ -80,6 +88,7 @@ void BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, blender::bke::EditMe BM_face_calc_center_median_vcos(bm, efa, emd.face_centers[i], emd.vert_positions); } } + return emd.face_centers; } /** \} */ diff --git a/source/blender/blenkernel/intern/mesh_iterators.cc b/source/blender/blenkernel/intern/mesh_iterators.cc index 2f83de87bb6..f824e40dac1 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@ -45,8 +45,7 @@ void BKE_mesh_foreach_mapped_vert( const blender::Span positions = mesh->runtime->edit_data->vert_positions; blender::Span vert_normals; if (flag & MESH_FOREACH_USE_NORMAL) { - BKE_editmesh_cache_ensure_vert_normals(*em, *mesh->runtime->edit_data); - vert_normals = mesh->runtime->edit_data->vert_normals; + vert_normals = BKE_editmesh_cache_ensure_vert_normals(*em, *mesh->runtime->edit_data); } BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { const float *no = (flag & MESH_FOREACH_USE_NORMAL) ? &vert_normals[i].x : nullptr; @@ -236,18 +235,16 @@ void BKE_mesh_foreach_mapped_face_center( if (mesh->runtime->edit_mesh != nullptr && mesh->runtime->edit_data != nullptr) { BMEditMesh *em = mesh->runtime->edit_mesh; BMesh *bm = em->bm; - blender::Span face_centers; - blender::Span face_normals; BMFace *efa; BMIter iter; int i; - BKE_editmesh_cache_ensure_face_centers(*em, *mesh->runtime->edit_data); - face_centers = mesh->runtime->edit_data->face_centers; /* always set */ + const Span face_centers = BKE_editmesh_cache_ensure_face_centers( + *em, *mesh->runtime->edit_data); + Span face_normals; if (flag & MESH_FOREACH_USE_NORMAL) { - BKE_editmesh_cache_ensure_face_normals(*em, *mesh->runtime->edit_data); - face_normals = mesh->runtime->edit_data->face_normals; /* maybe nullptr */ + face_normals = BKE_editmesh_cache_ensure_face_normals(*em, *mesh->runtime->edit_data); } if (!face_normals.is_empty()) { diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc index 685b8cfac80..ad287d4225b 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.cc +++ b/source/blender/blenkernel/intern/mesh_wrapper.cc @@ -165,8 +165,8 @@ Span BKE_mesh_wrapper_face_normals(Mesh *mesh) { switch (mesh->runtime->wrapper_type) { case ME_WRAPPER_TYPE_BMESH: - BKE_editmesh_cache_ensure_face_normals(*mesh->runtime->edit_mesh, *mesh->runtime->edit_data); - return mesh->runtime->edit_data->face_normals; + return BKE_editmesh_cache_ensure_face_normals(*mesh->runtime->edit_mesh, + *mesh->runtime->edit_data); case ME_WRAPPER_TYPE_MDATA: case ME_WRAPPER_TYPE_SUBD: return mesh->face_normals(); @@ -179,10 +179,10 @@ void BKE_mesh_wrapper_tag_positions_changed(Mesh *mesh) { switch (mesh->runtime->wrapper_type) { case ME_WRAPPER_TYPE_BMESH: - if (mesh->runtime->edit_data) { - mesh->runtime->edit_data->vert_normals = {}; - mesh->runtime->edit_data->face_centers = {}; - mesh->runtime->edit_data->face_normals = {}; + if (blender::bke::EditMeshData *edit_data = mesh->runtime->edit_data.get()) { + edit_data->vert_normals = {}; + edit_data->face_centers = {}; + edit_data->face_normals = {}; } break; case ME_WRAPPER_TYPE_MDATA: diff --git a/source/blender/blenkernel/intern/object_dupli.cc b/source/blender/blenkernel/intern/object_dupli.cc index ca1c200216e..e79f744cba6 100644 --- a/source/blender/blenkernel/intern/object_dupli.cc +++ b/source/blender/blenkernel/intern/object_dupli.cc @@ -475,8 +475,7 @@ static const Mesh *mesh_data_from_duplicator_object(Object *ob, if ((emd != nullptr) && !emd->vert_positions.is_empty()) { *r_vert_coords = emd->vert_positions; if (r_vert_normals != nullptr) { - BKE_editmesh_cache_ensure_vert_normals(*em, *emd); - *r_vert_normals = emd->vert_normals; + *r_vert_normals = BKE_editmesh_cache_ensure_vert_normals(*em, *emd); } } } diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index 2f99a514a89..3a09b42ecd0 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -559,16 +559,12 @@ MeshRenderData *mesh_render_data_create(Object *object, /* If there is no distinct cage, hide unmapped edges that can't be selected. */ mr->hide_unmapped_edges = !do_final || editmesh_eval_final == editmesh_eval_cage; - if (mr->edit_data) { - bke::EditMeshData *emd = mr->edit_data; + if (bke::EditMeshData *emd = mr->edit_data) { if (!emd->vert_positions.is_empty()) { - BKE_editmesh_cache_ensure_vert_normals(*mr->edit_bmesh, *emd); - BKE_editmesh_cache_ensure_face_normals(*mr->edit_bmesh, *emd); + mr->bm_vert_coords = mr->edit_data->vert_positions; + mr->bm_vert_normals = BKE_editmesh_cache_ensure_vert_normals(*mr->edit_bmesh, *emd); + mr->bm_face_normals = BKE_editmesh_cache_ensure_face_normals(*mr->edit_bmesh, *emd); } - - mr->bm_vert_coords = mr->edit_data->vert_positions; - mr->bm_vert_normals = mr->edit_data->vert_normals; - mr->bm_face_normals = mr->edit_data->face_normals; } int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;