diff options
author | Hans Goudey <h.goudey@me.com> | 2022-07-20 20:26:08 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-07-20 20:26:08 +0300 |
commit | 0d81fdc91321c3b69b32307c40217a449b7b6c72 (patch) | |
tree | 9aebbb60881140926a4d5accfba77a374d5167e4 /source | |
parent | 62e37e3963020fe15c3a13aa15b015bae8d1c2ee (diff) |
Always save with legacy mesh format
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh_legacy_convert.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.cc | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_evaluate.cc | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_legacy_convert.cc | 39 | ||||
-rw-r--r-- | source/blender/blenloader/BLO_read_write.h | 2 | ||||
-rw-r--r-- | source/blender/blenloader/BLO_writefile.h | 1 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 14 | ||||
-rw-r--r-- | source/blender/editors/mesh/editface.cc | 44 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 14 |
9 files changed, 80 insertions, 51 deletions
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, SELECT); } } + /* Remove the hide attribute to reveal all vertices. */ + attributes.remove(".hide_vert"); + BKE_mesh_flush_hidden_from_verts(me); paintvert_flush_flags(ob); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index b796176fb3a..a4d5bed21da 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1719,7 +1719,6 @@ static bool wm_file_write(bContext *C, int fileflags, eBLO_WritePathRemap remap_mode, bool use_save_as_copy, - const bool use_legacy_mesh_format, ReportList *reports) { Main *bmain = CTX_data_main(C); @@ -1831,7 +1830,6 @@ static bool wm_file_write(bContext *C, .remap_mode = remap_mode, .use_save_versions = true, .use_save_as_copy = use_save_as_copy, - .use_legacy_mesh_format = use_legacy_mesh_format, .thumb = thumb, }, reports)) { @@ -3066,8 +3064,6 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) char path[FILE_MAX]; const bool is_save_as = (op->type->invoke == wm_save_as_mainfile_invoke); const bool use_save_as_copy = is_save_as && RNA_boolean_get(op->ptr, "copy"); - const bool use_legacy_mesh_format = is_save_as && - RNA_boolean_get(op->ptr, "use_legacy_mesh_format"); /* We could expose all options to the users however in most cases remapping * existing relative paths is a good default. @@ -3111,8 +3107,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) /* set compression flag */ SET_FLAG_FROM_TEST(fileflags, RNA_boolean_get(op->ptr, "compress"), G_FILE_COMPRESS); - const bool ok = wm_file_write( - C, path, fileflags, remap_mode, use_save_as_copy, use_legacy_mesh_format, op->reports); + const bool ok = wm_file_write(C, path, fileflags, remap_mode, use_save_as_copy, op->reports); if ((op->flag & OP_IS_INVOKE) == 0) { /* OP_IS_INVOKE is set when the operator is called from the GUI. @@ -3203,13 +3198,6 @@ void WM_OT_save_as_mainfile(wmOperatorType *ot) "Save Copy", "Save a copy of the actual working state but does not make saved file active"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); - prop = RNA_def_boolean( - ot->srna, - "use_legacy_mesh_format", - false, - "Legacy Mesh Format", - "Save mesh data with a legacy format that can be read by earlier versions"); - RNA_def_property_flag(prop, PROP_SKIP_SAVE); } static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) |