[Bf-blender-cvs] [698766cb923] refactor-mesh-position-generic: Fix legacy conversion
Hans Goudey
noreply at git.blender.org
Thu Sep 15 18:44:14 CEST 2022
Commit: 698766cb923b779fb43961a1a5cf859f33112972
Author: Hans Goudey
Date: Thu Sep 15 09:50:09 2022 -0500
Branches: refactor-mesh-position-generic
https://developer.blender.org/rB698766cb923b779fb43961a1a5cf859f33112972
Fix legacy conversion
===================================================================
M source/blender/blenkernel/BKE_mesh_legacy_convert.h
M source/blender/blenkernel/intern/mesh.cc
M source/blender/blenkernel/intern/mesh_legacy_convert.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 3ee7d91415d..b7122585caf 100644
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@ -64,7 +64,7 @@ void BKE_mesh_legacy_convert_material_indices_to_mpoly(struct Mesh *mesh);
void BKE_mesh_legacy_convert_mpoly_to_material_indices(struct Mesh *mesh);
#ifdef __cplusplus
-void BKE_mesh_legacy_convert_positions_to_verts(
+struct MVert *BKE_mesh_legacy_convert_positions_to_verts(
Mesh *mesh,
blender::ResourceScope &temp_arrays_for_convert,
blender::Vector<CustomDataLayer, 16> &vert_layers_to_write);
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index 0a8f717f7d3..2a968567d2a 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -254,7 +254,8 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
Set<std::string> names_to_skip;
if (!BLO_write_is_undo(writer)) {
/* When converting to the old mesh format, don't save redundant attributes. */
- names_to_skip.add_multiple_new({".hide_vert",
+ names_to_skip.add_multiple_new({"position",
+ ".hide_vert",
".hide_edge",
".hide_poly",
"material_index",
@@ -262,8 +263,13 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
".selection_edge",
".selection_poly"});
+ mesh->mvert = BKE_mesh_legacy_convert_positions_to_verts(
+ mesh, temp_arrays_for_legacy_format, vert_layers);
+ BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+ BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
+ BKE_mesh_legacy_bevel_weight_from_layers(mesh);
+
/* Set deprecated mesh data pointers for forward compatibility. */
- mesh->mvert = static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT));
mesh->medge = const_cast<MEdge *>(mesh->edges().data());
mesh->mpoly = const_cast<MPoly *>(mesh->polys().data());
mesh->mloop = const_cast<MLoop *>(mesh->loops().data());
@@ -274,13 +280,6 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
CustomData_blend_write_prepare(mesh->edata, edge_layers, names_to_skip);
CustomData_blend_write_prepare(mesh->ldata, loop_layers, names_to_skip);
CustomData_blend_write_prepare(mesh->pdata, poly_layers, names_to_skip);
-
- if (!BLO_write_is_undo(writer)) {
- BKE_mesh_legacy_convert_positions_to_verts(mesh, temp_arrays_for_legacy_format, vert_layers);
- BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
- BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
- BKE_mesh_legacy_bevel_weight_from_layers(mesh);
- }
}
BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index aee8d1251ad..3b44a2050eb 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -930,8 +930,7 @@ void BKE_mesh_add_mface_layers(CustomData *fdata, CustomData *ldata, int total)
void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
{
using namespace blender;
- MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
if (const float *weights = static_cast<const float *>(
CustomData_get_layer(&mesh->vdata, CD_BWEIGHT))) {
mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
@@ -964,8 +963,7 @@ void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh)
{
using namespace blender;
- const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ const Span<MVert> verts(mesh->mvert, mesh->totvert);
if (mesh->cd_flag & ME_CDFLAG_VERT_BWEIGHT) {
float *weights = static_cast<float *>(
CustomData_add_layer(&mesh->vdata, CD_BWEIGHT, CD_CONSTRUCT, nullptr, verts.size()));
@@ -996,8 +994,7 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
const VArray<bool> hide_vert = attributes.lookup_or_default<bool>(
".hide_vert", ATTR_DOMAIN_POINT, false);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1031,8 +1028,7 @@ void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh)
using namespace blender::bke;
MutableAttributeAccessor attributes = mesh->attributes_for_write();
- const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ 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>(
@@ -1124,8 +1120,7 @@ void BKE_mesh_legacy_convert_selection_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
const VArray<bool> selection_vert = attributes.lookup_or_default<bool>(
".selection_vert", ATTR_DOMAIN_POINT, false);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1159,8 +1154,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
using namespace blender::bke;
MutableAttributeAccessor attributes = mesh->attributes_for_write();
- const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
- mesh->totvert);
+ const Span<MVert> verts(mesh->mvert, mesh->totvert);
if (std::any_of(
verts.begin(), verts.end(), [](const MVert &vert) { return vert.flag & SELECT; })) {
SpanAttributeWriter<bool> selection_vert = attributes.lookup_or_add_for_write_only_span<bool>(
@@ -1206,36 +1200,28 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
/** \name Vertex and Position Conversion
* \{ */
-void BKE_mesh_legacy_convert_positions_to_verts(
+MVert *BKE_mesh_legacy_convert_positions_to_verts(
Mesh *mesh,
blender::ResourceScope &temp_arrays_for_convert,
blender::Vector<CustomDataLayer, 16> &vert_layers_to_write)
{
using namespace blender;
- Vector<CustomDataLayer, 16> new_layer_to_write;
- for (const CustomDataLayer &layer : vert_layers_to_write) {
- if (layer.type != CD_PROP_FLOAT2) {
- new_layer_to_write.append(layer);
- continue;
- }
- const Span<float3> positions{static_cast<const float3 *>(layer.data), mesh->totvert};
- CustomDataLayer mvert_layer = layer;
- mvert_layer.type = CD_MVERT;
- MutableSpan<MVert> verts = temp_arrays_for_convert.construct<Array<MVert>>(mesh->totvert);
- mvert_layer.data = verts.data();
+ const Span<float3> positions = mesh->positions();
- threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
- for (const int i : range) {
- copy_v3_v3(verts[i].co, positions[i]);
- }
- });
- new_layer_to_write.append(mvert_layer);
- }
+ CustomDataLayer mvert_layer{};
+ mvert_layer.type = CD_MVERT;
+ MutableSpan<MVert> verts = temp_arrays_for_convert.construct<Array<MVert>>(mesh->totvert);
+ mvert_layer.data = verts.data();
+
+ threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
+ for (const int i : range) {
+ copy_v3_v3(verts[i].co, positions[i]);
+ }
+ });
- vert_layers_to_write = new_layer_to_write;
- mesh->ldata.totlayer = new_layer_to_write.size();
- mesh->ldata.maxlayer = mesh->ldata.totlayer;
+ vert_layers_to_write.append(mvert_layer);
+ return verts.data();
}
void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh)
More information about the Bf-blender-cvs
mailing list