Commit: c2ec9481464f0e3130a2c8a60ef0882f0852f34f Author: Hans Goudey Date: Mon Sep 5 13:46:57 2022 -0500 Branches: refactor-mesh-selection-generic https://developer.blender.org/rBc2ec9481464f0e3130a2c8a60ef0882f0852f34f
Merge branch 'master' into refactor-mesh-selection-generic =================================================================== =================================================================== diff --cc source/blender/blenkernel/intern/mesh.cc index caeb1da57d9,c0379c50de4..348bf210706 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@@ -253,16 -248,17 +248,22 @@@ static void mesh_blend_write(BlendWrite else { Set<std::string> names_to_skip; if (!BLO_write_is_undo(writer)) { - BKE_mesh_legacy_convert_hide_layers_to_flags(mesh); + BKE_mesh_legacy_convert_selection_layers_to_flags(mesh); BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh); /* When converting to the old mesh format, don't save redundant attributes. */ - names_to_skip.add_multiple_new({".hide_vert", ".hide_edge", ".hide_poly"}); + names_to_skip.add_multiple_new({".hide_vert", + ".hide_edge", + ".hide_poly", + ".selection_vert", + ".selection_edge", + ".selection_poly"}); + + /* Set deprecated mesh data pointers for forward compatibility. */ + mesh->mvert = const_cast<MVert *>(mesh->vertices().data()); + mesh->medge = const_cast<MEdge *>(mesh->edges().data()); + mesh->mpoly = const_cast<MPoly *>(mesh->polygons().data()); + mesh->mloop = const_cast<MLoop *>(mesh->loops().data()); } CustomData_blend_write_prepare(mesh->vdata, vert_layers, names_to_skip); diff --cc source/blender/blenkernel/intern/mesh_evaluate.cc index 2294cb1c4af,7e52b96cc92..cbef8e1cd64 --- a/source/blender/blenkernel/intern/mesh_evaluate.cc +++ b/source/blender/blenkernel/intern/mesh_evaluate.cc @@@ -878,30 -907,14 +876,30 @@@ static void mesh_flush_select_from_vert void BKE_mesh_flush_select_from_verts(Mesh *me) { - const blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*me); + using namespace blender::bke; + MutableAttributeAccessor attributes = mesh_attributes_for_write(*me); + const VArray<bool> selection_vert = attributes.lookup_or_default<bool>( + ".selection_vert", ATTR_DOMAIN_POINT, false); + if (selection_vert.is_single() && !selection_vert.get_internal_single()) { + attributes.remove(".selection_edge"); + attributes.remove(".selection_poly"); + return; + } + SpanAttributeWriter<bool> selection_edge = attributes.lookup_or_add_for_write_only_span<bool>( + ".selection_edge", ATTR_DOMAIN_EDGE); + SpanAttributeWriter<bool> selection_poly = attributes.lookup_or_add_for_write_only_span<bool>( + ".selection_poly", ATTR_DOMAIN_FACE); mesh_flush_select_from_verts( - {me->medge, me->totedge}, - {me->mpoly, me->totpoly}, - {me->mloop, me->totloop}, - me->vertices(), ++ me->edges(), ++ me->polygons(), + me->loops(), attributes.lookup_or_default<bool>(".hide_edge", ATTR_DOMAIN_EDGE, false), attributes.lookup_or_default<bool>(".hide_poly", ATTR_DOMAIN_FACE, false), - me->edges_for_write(), - me->polygons_for_write()); + selection_vert, + selection_edge.span, + selection_poly.span); + selection_edge.finish(); + selection_poly.finish(); } /** \} */ diff --cc source/blender/blenkernel/intern/object_deform.c index cf93c7b72fd,4c59b4a5210..99bc1fec5bd --- a/source/blender/blenkernel/intern/object_deform.c +++ b/source/blender/blenkernel/intern/object_deform.c @@@ -165,15 -162,15 +162,15 @@@ bool BKE_object_defgroup_clear(Object * } } else { - if (me->dvert) { - const bool *selection_vert = (const bool *)CustomData_get_layer_named( + if (BKE_mesh_deform_verts(me)) { - const MVert *mv; ++ const const bool *selection_vert = (const bool *)CustomData_get_layer_named( + &me->vdata, CD_PROP_BOOL, ".selection_vert"); int i; - dv = me->dvert; - mv = BKE_mesh_vertices(me); + dv = BKE_mesh_deform_verts_for_write(me); - for (i = 0; i < me->totvert; i++, mv++, dv++) { - if (dv->dw && (!use_selection || (mv->flag & SELECT))) { + for (i = 0; i < me->totvert; i++, dv++) { + if (dv->dw && (!use_selection || (selection_vert && selection_vert[i]))) { MDeformWeight *dw = BKE_defvert_find_index(dv, def_nr); BKE_defvert_remove_group(dv, dw); /* dw can be NULL */ changed = true; diff --cc source/blender/blenkernel/intern/subdiv_converter_mesh.c index c8693123363,f908e1af4ac..aa4bfbe1517 --- a/source/blender/blenkernel/intern/subdiv_converter_mesh.c +++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.c @@@ -205,10 -209,9 +209,10 @@@ static void precalc_uv_layer(const Open mesh->totloop, sizeof(int), "loop uv vertex index"); } UvVertMap *uv_vert_map = BKE_mesh_uv_vert_map_create( - mpoly, + storage->polys, (const bool *)CustomData_get_layer_named(&mesh->pdata, CD_PROP_BOOL, ".hide_poly"), + (const bool *)CustomData_get_layer_named(&mesh->pdata, CD_PROP_BOOL, ".selection_poly"), - mloop, + storage->loops, mloopuv, num_poly, num_vert, diff --cc source/blender/blenkernel/intern/subdiv_mesh.cc index 1ed01a91588,c222fc46800..400c020fb7d --- a/source/blender/blenkernel/intern/subdiv_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_mesh.cc @@@ -1113,9 -1096,11 +1096,9 @@@ static void subdiv_mesh_vertex_of_loose subdiv_mesh_vertex_of_loose_edge_interpolate(ctx, coarse_edge, u, subdiv_vertex_index); } /* Interpolate coordinate. */ - MVert *subdiv_vertex = &subdiv_mvert[subdiv_vertex_index]; + MVert *subdiv_vertex = &ctx->subdiv_verts[subdiv_vertex_index]; BKE_subdiv_mesh_interpolate_position_on_edge( coarse_mesh, coarse_edge, is_simple, u, subdiv_vertex->co); - /* Reset flags and such. */ - subdiv_vertex->flag = 0; /* TODO(sergey): This matches old behavior, but we can as well interpolate * it. Maybe even using vertex varying attributes. */ subdiv_vertex->bweight = 0.0f; diff --cc source/blender/bmesh/intern/bmesh_mesh_convert.cc index 884fbc189ac,0190f91250b..555c60f710d --- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc @@@ -1266,11 -1222,7 +1263,9 @@@ void BM_mesh_bm_to_me(Main *bmain, BMes convert_bmesh_hide_flags_to_mesh_attributes( *bm, need_hide_vert, need_hide_edge, need_hide_poly, *me); + convert_bmesh_selection_flags_to_mesh_attributes( + *bm, need_selection_vert, need_selection_edge, need_selection_poly, *me); - BKE_mesh_update_customdata_pointers(me, false); - { me->totselect = BLI_listbase_count(&(bm->selected)); diff --cc source/blender/draw/intern/draw_cache_impl_subdivision.cc index 01522929cc7,9882ebf66f0..57879c90083 --- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc +++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc @@@ -673,12 -675,13 +675,13 @@@ static void draw_subdiv_cache_extra_coa Mesh *mesh, uint32_t *flags_data) { - for (int i = 0; i < mesh->totpoly; i++) { + const Span<MPoly> polys = mesh->polygons(); + for (const int i : polys.index_range()) { uint32_t flag = 0; - if ((mesh->mpoly[i].flag & ME_SMOOTH) != 0) { + if ((polys[i].flag & ME_SMOOTH) != 0) { flag |= SUBDIV_COARSE_FACE_FLAG_SMOOTH; } - if ((polys[i].flag & ME_FACE_SEL) != 0) { + if (mr->selection_poly && mr->selection_poly[i]) { flag |= SUBDIV_COARSE_FACE_FLAG_SELECT; } if (mr->hide_poly && mr->hide_poly[i]) { diff --cc source/blender/editors/armature/meshlaplacian.c index 2681707ff4f,2b3f8f4c853..1952e2ca3d4 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@@ -666,25 -669,17 +669,25 @@@ void heat_bone_weighting(Object *ob /* (added selectedVerts content for vertex mask, they used to just equal 1) */ if (use_vert_sel) { - for (a = 0, mp = polys; a < me->totpoly; mp++, a++) { - for (j = 0, ml = loops + mp->loopstart; j < mp->totloop; j++, ml++) { - mask[ml->v] = (mesh_verts[ml->v].flag & SELECT) != 0; + const bool *selection_vert = (const bool *)CustomData_get_layer_named( + &me->vdata, CD_PROP_BOOL, ".selection_vert"); + if (selection_vert) { - for (a = 0, mp = me->mpoly; a < me->totpoly; mp++, a++) { - for (j = 0, ml = me->mloop + mp->loopstart; j < mp->totloop; j++, ml++) { ++ for (a = 0, mp = polys; a < me->totpoly; mp++, a++) { ++ for (j = 0, ml = loops + mp->loopstart; j < mp->totloop; j++, ml++) { + mask[ml->v] = selection_vert[ml->v]; + } } } } else if (use_face_sel) { - for (a = 0, mp = polys; a < me->totpoly; mp++, a++) { - if (mp->flag & ME_FACE_SEL) { - for (j = 0, ml = loops + mp->loopstart; j < mp->totloop; j++, ml++) { - mask[ml->v] = 1; + const bool *selection_poly = (const bool *)CustomData_get_layer_named( + &me->pdata, CD_PROP_BOOL, ".selection_poly"); + if (selection_poly) { - for (a = 0, mp = me->mpoly; a < me->totpoly; mp++, a++) { ++ for (a = 0, mp = polys; a < me->totpoly; mp++, a++) { + if (selection_poly[a]) { - for (j = 0, ml = me->mloop + mp->loopstart; j < mp->totloop; j++, ml++) { ++ for (j = 0, ml = loops + mp->loopstart; j < mp->totloop; j++, ml++) { + mask[ml->v] = 1; + } } } } diff --cc source/blender/editors/mesh/editface.cc index 52ff74dddcc,6313c01011e..683dd217b03 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@@ -221,27 -206,28 +224,30 @@@ static void select_linked_tfaces_with_s BLI_bitmap *edge_tag = BLI_BITMAP_NEW(me->totedge, __func__); BLI_bitmap *poly_tag = BLI_BITMAP_NEW(me->totpoly, __func__); + const Span<MEdge> edges = me->edges(); - MutableSpan<MPoly @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs