[Bf-blender-cvs] [0d81fdc9132] refactor-mesh-hide-generic: Always save with legacy mesh format
Hans Goudey
noreply at git.blender.org
Wed Jul 20 19:26:15 CEST 2022
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. @@
More information about the Bf-blender-cvs
mailing list