Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-07-20 20:26:08 +0300
committerHans Goudey <h.goudey@me.com>2022-07-20 20:26:08 +0300
commit0d81fdc91321c3b69b32307c40217a449b7b6c72 (patch)
tree9aebbb60881140926a4d5accfba77a374d5167e4
parent62e37e3963020fe15c3a13aa15b015bae8d1c2ee (diff)
Always save with legacy mesh format
-rw-r--r--source/blender/blenkernel/BKE_mesh_legacy_convert.h8
-rw-r--r--source/blender/blenkernel/intern/mesh.cc6
-rw-r--r--source/blender/blenkernel/intern/mesh_evaluate.cc3
-rw-r--r--source/blender/blenkernel/intern/mesh_legacy_convert.cc39
-rw-r--r--source/blender/blenloader/BLO_read_write.h2
-rw-r--r--source/blender/blenloader/BLO_writefile.h1
-rw-r--r--source/blender/blenloader/intern/writefile.c14
-rw-r--r--source/blender/editors/mesh/editface.cc44
-rw-r--r--source/blender/windowmanager/intern/wm_files.c14
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))