Commit: 0d81fdc91321c3b69b32307c40217a449b7b6c72 Author: Hans Goudey Date: Wed Jul 20 12:26:08 2022 -0500 Branches: refactor-mesh-hide-generic https://developer.blender.org/rB0d81fdc91321c3b69b32307c40217a449b7b6c72
Always save with legacy mesh format =================================================================== M source/blender/blenkernel/BKE_mesh_legacy_convert.h M source/blender/blenkernel/intern/mesh.cc M source/blender/blenkernel/intern/mesh_evaluate.cc M source/blender/blenkernel/intern/mesh_legacy_convert.cc M source/blender/blenloader/BLO_read_write.h M source/blender/blenloader/BLO_writefile.h M source/blender/blenloader/intern/writefile.c M source/blender/editors/mesh/editface.cc M source/blender/windowmanager/intern/wm_files.c =================================================================== diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h index 6b625e8a6b5..276b3146b06 100644 --- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h +++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h @@ -17,7 +17,15 @@ struct CustomData; struct Mesh; struct MFace; +/** + * Convert the new hidden element attributes to the old flag format for writing. + */ void BKE_mesh_legacy_convert_hide_layers_to_flags(struct Mesh *mesh); +/** + * Convert the old hide flags (#ME_HIDE) to the new hidden element attribute for reading. + * Only add the attributes when there are any elements in each domain hidden. + */ +void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh); /** * Recreate #MFace Tessellation. diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index ae5d2f179a1..bc9f29572bd 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -251,9 +251,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address CustomData_blend_write_prepare(mesh->pdata, poly_layers); } - if (BLO_write_use_legacy_mesh_format(writer)) { - BKE_mesh_legacy_convert_hide_layers_to_flags(mesh); - } + BKE_mesh_legacy_convert_hide_layers_to_flags(mesh); BLO_write_id_struct(writer, Mesh, id_address, &mesh->id); BKE_id_blend_write(writer, &mesh->id); @@ -331,6 +329,8 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) } } + BKE_mesh_legacy_convert_flags_to_hide_layers(mesh); + /* We don't expect to load normals from files, since they are derived data. */ BKE_mesh_normals_tag_dirty(mesh); BKE_mesh_assert_normals_dirty_or_calculated(mesh); diff --git a/source/blender/blenkernel/intern/mesh_evaluate.cc b/source/blender/blenkernel/intern/mesh_evaluate.cc index 5f55213e259..65fdd3235c4 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.cc +++ b/source/blender/blenkernel/intern/mesh_evaluate.cc @@ -903,8 +903,7 @@ static void mesh_flush_select_from_verts(const Span<MVert> verts, void BKE_mesh_flush_select_from_verts(Mesh *me) { - blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*me); - + const blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*me); mesh_flush_select_from_verts( {me->mvert, me->totvert}, {me->mloop, me->totloop}, diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index e30db1f445f..f67bb81f3d0 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -877,7 +877,7 @@ void BKE_mesh_add_mface_layers(CustomData *fdata, CustomData *ldata, int total) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Conversion to Legacy Hidden Flags +/** \name Hide Attribute and Legacy Flag Conversion * \{ */ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh) @@ -908,4 +908,41 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh) } } +void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh) +{ + using namespace blender; + using namespace blender::bke; + MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh); + + const Span<MVert> verts(mesh->mvert, mesh->totvert); + if (std::any_of( + verts.begin(), verts.end(), [](const MVert &vert) { return vert.flag & ME_HIDE; })) { + SpanAttributeWriter<bool> hide_vert = attributes.lookup_or_add_for_write_only_span<bool>( + ".hide_vert", ATTR_DOMAIN_POINT); + for (const int i : verts.index_range()) { + hide_vert.span[i] = verts[i].flag & ME_HIDE; + } + } + + const Span<MEdge> edges(mesh->medge, mesh->totedge); + if (std::any_of( + edges.begin(), edges.end(), [](const MEdge &edge) { return edge.flag & ME_HIDE; })) { + SpanAttributeWriter<bool> hide_edge = attributes.lookup_or_add_for_write_only_span<bool>( + ".hide_edge", ATTR_DOMAIN_EDGE); + for (const int i : edges.index_range()) { + hide_edge.span[i] = edges[i].flag & ME_HIDE; + } + } + + const Span<MPoly> polys(mesh->mpoly, mesh->totpoly); + if (std::any_of( + polys.begin(), polys.end(), [](const MPoly &poly) { return poly.flag & ME_HIDE; })) { + SpanAttributeWriter<bool> hide_face = attributes.lookup_or_add_for_write_only_span<bool>( + ".hide_face", ATTR_DOMAIN_FACE); + for (const int i : polys.index_range()) { + hide_face.span[i] = polys[i].flag & ME_HIDE; + } + } +} + /** \} */ diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h index 5d0bb8231d1..536c3989aff 100644 --- a/source/blender/blenloader/BLO_read_write.h +++ b/source/blender/blenloader/BLO_read_write.h @@ -181,8 +181,6 @@ void BLO_write_string(BlendWriter *writer, const char *data_ptr); */ bool BLO_write_is_undo(BlendWriter *writer); -bool BLO_write_use_legacy_mesh_format(const BlendWriter *writer); - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h index a2c2c036f5a..93f1ea5090f 100644 --- a/source/blender/blenloader/BLO_writefile.h +++ b/source/blender/blenloader/BLO_writefile.h @@ -44,7 +44,6 @@ struct BlendFileWriteParams { uint use_save_versions : 1; /** On write, restore paths after editing them (see #BLO_WRITE_PATH_REMAP_RELATIVE). */ uint use_save_as_copy : 1; - uint use_legacy_mesh_format : 1; uint use_userdef : 1; const struct BlendThumbnail *thumb; }; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index e34abbd32ec..68171f26a66 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -422,8 +422,6 @@ typedef struct { /** When true, write to #WriteData.current, could also call 'is_undo'. */ bool use_memfile; - bool use_legacy_mesh_format; - /** * Wrap writing, so we can use zstd or * other compression types later, see: G_FILE_COMPRESS @@ -1085,7 +1083,6 @@ static bool write_file_handle(Main *mainvar, MemFile *current, int write_flags, bool use_userdef, - const bool use_legacy_mesh_format, const BlendThumbnail *thumb) { BHead bhead; @@ -1096,7 +1093,6 @@ static bool write_file_handle(Main *mainvar, blo_split_main(&mainlist, mainvar); wd = mywrite_begin(ww, compare, current); - wd->use_legacy_mesh_format = use_legacy_mesh_format; BlendWriter writer = {wd}; sprintf(buf, @@ -1436,8 +1432,7 @@ bool BLO_write_file(Main *mainvar, } /* actual file writing */ - const bool err = write_file_handle( - mainvar, &ww, NULL, NULL, write_flags, use_userdef, params->use_legacy_mesh_format, thumb); + const bool err = write_file_handle(mainvar, &ww, NULL, NULL, write_flags, use_userdef, thumb); ww.close(&ww); @@ -1481,7 +1476,7 @@ bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int w bool use_userdef = false; const bool err = write_file_handle( - mainvar, NULL, compare, current, write_flags, use_userdef, false, NULL); + mainvar, NULL, compare, current, write_flags, use_userdef, NULL); return (err == 0); } @@ -1610,9 +1605,4 @@ bool BLO_write_is_undo(BlendWriter *writer) return writer->wd->use_memfile; } -bool BLO_write_use_legacy_mesh_format(const BlendWriter *writer) -{ - return writer->wd->use_legacy_mesh_format; -} - /** \} */ diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index aadc9155bfd..35aa729d7a5 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -624,23 +624,27 @@ void paintvert_select_ungrouped(Object *ob, bool extend, bool flush_flags) void paintvert_hide(bContext *C, Object *ob, const bool unselected) { - Mesh *const me = BKE_mesh_from_object(ob); - + using namespace blender; + Mesh *me = BKE_mesh_from_object(ob); if (me == NULL || me->totvert == 0) { return; } - for (int i = 0; i < me->totvert; i++) { - MVert *const mvert = &me->mvert[i]; - - if ((mvert->flag & ME_HIDE) == 0) { - if (((mvert->flag & SELECT) == 0) == unselected) { - mvert->flag |= ME_HIDE; + bke::MutableAttributeAccessor attributes = bke::mesh_attributes_for_write(*me); + bke::SpanAttributeWriter<bool> hide_vert = attributes.lookup_or_add_for_write_span<bool>( + ".hide_vert", ATTR_DOMAIN_POINT); + MutableSpan<MVert> vertices(me->mvert, me->totvert); + + for (const int i : vertices.index_range()) { + MVert &vert = vertices[i]; + if (!hide_vert.span[i]) { + if (((vert.flag & SELECT) == 0) == unselected) { + hide_vert.span[i] = true; } } - if (mvert->flag & ME_HIDE) { - mvert->flag &= ~SELECT; + if (hide_vert.span[i]) { + vert.flag &= ~SELECT; } } @@ -652,21 +656,27 @@ void paintvert_hide(bContext *C, Object *ob, const bool unselected) void paintvert_reveal(bContext *C, Object *ob, const bool select) { - Mesh *const me = BKE_mesh_from_object(ob); - + using namespace blender; + Mesh *me = BKE_mesh_from_object(ob); if (me == NULL || me->totvert == 0) { return; } - for (int i = 0; i < me->totvert; i++) { - MVert *const mvert = &me->mvert[i]; + bke::MutableAttributeAccessor attributes = bke::mesh_attributes_for_write(*me); + const VArray<bool> hide_vert = attributes.lookup_or_default<bool>( + ".hide_vert", ATTR_DOMAIN_POINT, false); + MutableSpan<MVert> vertices(me->mvert, me->totvert); - if (mvert->flag & ME_HIDE) { - SET_FLAG_FROM_TEST(mvert->flag, select, SELECT); - mvert->flag &= ~ME_HIDE; + for (const int i : vertices.index_range()) { + MVert &vert = vertices[i]; + if (hide_vert[i]) { + SET_FLAG_FROM_TEST(vert.flag, select, @@ 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