[Bf-blender-cvs] [cfe35802aaa] refactor-mesh-uv-map-generic: Merge branch 'master' into refactor-mesh-uv-map-generic
Hans Goudey
noreply at git.blender.org
Tue Sep 6 04:51:22 CEST 2022
Commit: cfe35802aaa22b6aaf78b840c8b7410e8bef0376
Author: Hans Goudey
Date: Mon Sep 5 21:17:28 2022 -0500
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rBcfe35802aaa22b6aaf78b840c8b7410e8bef0376
Merge branch 'master' into refactor-mesh-uv-map-generic
===================================================================
===================================================================
diff --cc release/scripts/startup/bl_ui/properties_data_mesh.py
index 5b3c4101d59,686d455b6b4..91a3dec8ac8
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@@ -580,8 -580,9 +580,8 @@@ class DATA_PT_mesh_attributes(MeshButto
colliding_names = []
for collection in (
# Built-in names.
- {"position": None, "material_index": None, "shade_smooth": None, "normal": None, "crease": None},
+ {"position": None, "shade_smooth": None, "normal": None, "crease": None},
mesh.attributes,
- mesh.uv_layers,
ob.vertex_groups,
):
for name in collection.keys():
diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 841d7f113aa,11ee86c62a7..cf39132481d
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -44,12 -27,16 +44,22 @@@ void BKE_mesh_legacy_convert_hide_layer
*/
void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh);
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /**
+ * Move material indices from a generic attribute to #MPoly.
+ */
+ void BKE_mesh_legacy_convert_material_indices_to_mpoly(struct Mesh *mesh);
+ /**
+ * Move material indices from the #MPoly struct to a generic attributes.
+ * Only add the attribute when the indices are not all zero.
+ */
+ void BKE_mesh_legacy_convert_mpoly_to_material_indices(struct Mesh *mesh);
+
/**
* Recreate #MFace Tessellation.
*
diff --cc source/blender/blenkernel/intern/fluid.c
index 12d7acd4e88,24c61a792eb..b982f70965a
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@@ -2081,18 -2073,13 +2073,14 @@@ static void emit_from_mesh
Mesh *me = BKE_mesh_copy_for_eval(ffs->mesh, true);
/* Duplicate vertices to modify. */
- if (me->mvert) {
- me->mvert = MEM_dupallocN(me->mvert);
- CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
- }
+ MVert *verts = MEM_dupallocN(BKE_mesh_vertices(me));
- MVert *mvert = me->mvert;
- const MLoop *mloop = me->mloop;
+ const MLoop *mloop = BKE_mesh_loops(me);
const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me);
const int numverts = me->totvert;
- const MDeformVert *dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
+ const MDeformVert *dvert = BKE_mesh_deform_verts(me);
- const MLoopUV *mloopuv = CustomData_get_layer_named(&me->ldata, CD_MLOOPUV, ffs->uvlayer_name);
+ const float(*mloopuv)[2] = CustomData_get_layer_named(
+ &me->ldata, CD_PROP_FLOAT2, ffs->uvlayer_name);
if (ffs->flags & FLUID_FLOW_INITVELOCITY) {
vert_vel = MEM_callocN(sizeof(float[3]) * numverts, "manta_flow_velocity");
diff --cc source/blender/blenkernel/intern/mesh.cc
index 2f32e09e25b,c0379c50de4..3a7a098535a
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -346,7 -344,7 +349,8 @@@ static void mesh_blend_read_data(BlendD
if (!BLO_read_data_is_undo(reader)) {
BKE_mesh_legacy_convert_flags_to_hide_layers(mesh);
+ BKE_mesh_legacy_convert_uvs_to_generic(mesh);
+ BKE_mesh_legacy_convert_mpoly_to_material_indices(mesh);
}
/* We don't expect to load normals from files, since they are derived data. */
@@@ -467,8 -465,12 +471,10 @@@ static int customdata_compare
CustomDataLayer *l1, *l2;
int layer_count1 = 0, layer_count2 = 0, j;
const uint64_t cd_mask_non_generic = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MPOLY |
- CD_MASK_MLOOPUV | CD_MASK_PROP_BYTE_COLOR |
- CD_MASK_MDEFORMVERT;
+ CD_MASK_PROP_BYTE_COLOR | CD_MASK_MDEFORMVERT;
const uint64_t cd_mask_all_attr = CD_MASK_PROP_ALL | cd_mask_non_generic;
+ const Span<MLoop> loops_1 = m1->loops();
+ const Span<MLoop> loops_2 = m2->loops();
for (int i = 0; i < c1->totlayer; i++) {
l1 = &c1->layers[i];
diff --cc source/blender/blenkernel/intern/mesh_convert.cc
index 6c1ae6a9c7a,e56c248e81a..5aff587deec
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -194,8 -193,11 +193,11 @@@ static Mesh *mesh_nurbs_displist_to_mes
MEdge *medge = edges.data();
MPoly *mpoly = polys.data();
MLoop *mloop = loops.data();
+ MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+ SpanAttributeWriter<int> material_indices = attributes.lookup_or_add_for_write_only_span<int>(
+ "material_index", ATTR_DOMAIN_FACE);
- MLoopUV *mloopuv = static_cast<MLoopUV *>(CustomData_add_layer_named(
- &mesh->ldata, CD_MLOOPUV, CD_SET_DEFAULT, nullptr, mesh->totloop, "UVMap"));
+ blender::float2 *mloopuv = static_cast<blender::float2 *>(CustomData_add_layer_named(
+ &mesh->ldata, CD_PROP_FLOAT2, CD_SET_DEFAULT, nullptr, mesh->totloop, "UVMap"));
/* verts and faces */
vertcount = 0;
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 170489e9d9f,c2a4b0176c6..af3c51758b9
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -965,177 -1001,43 +1004,215 @@@ void BKE_mesh_legacy_convert_flags_to_h
}
}
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Material Index Conversion
+ * \{ */
+
+ void BKE_mesh_legacy_convert_material_indices_to_mpoly(Mesh *mesh)
+ {
+ using namespace blender;
+ using namespace blender::bke;
+ const AttributeAccessor attributes = mesh_attributes(*mesh);
+ MutableSpan<MPoly> polys = mesh->polygons_for_write();
+ const VArray<int> material_indices = attributes.lookup_or_default<int>(
+ "material_index", ATTR_DOMAIN_FACE, 0);
+ threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+ for (const int i : range) {
+ polys[i].mat_nr = material_indices[i];
+ }
+ });
+ }
+
+ void BKE_mesh_legacy_convert_mpoly_to_material_indices(Mesh *mesh)
+ {
+ using namespace blender;
+ using namespace blender::bke;
+ MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+ const Span<MPoly> polys = mesh->polygons();
+ if (std::any_of(
+ polys.begin(), polys.end(), [](const MPoly &poly) { return poly.mat_nr != 0; })) {
+ SpanAttributeWriter<int> material_indices = attributes.lookup_or_add_for_write_only_span<int>(
+ "material_index", ATTR_DOMAIN_FACE);
+ threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+ for (const int i : range) {
+ material_indices.span[i] = polys[i].mat_nr;
+ }
+ });
+ material_indices.finish();
+ }
+ }
+
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Generic UV Map Conversion
+ * \{ */
+
+void BKE_mesh_legacy_convert_uvs_to_struct(
+ Mesh *mesh,
+ blender::ResourceScope &temp_mloopuv_for_convert,
+ blender::Vector<CustomDataLayer, 16> &face_corner_layers_to_write)
+{
+ using namespace blender;
+ using namespace blender::bke;
+ const AttributeAccessor attributes = mesh_attributes(*mesh);
+
+ Vector<CustomDataLayer, 16> new_layer_to_write;
+
+ /* Don't write the boolean UV map sublayers which will be written in the legacy #MLoopUV type. */
+ Set<std::string> uv_sublayers_to_skip;
+ for (const CustomDataLayer &layer : face_corner_layers_to_write) {
+ uv_sublayers_to_skip.add_multiple_new({get_uv_map_vert_selection_name(layer.name),
+ get_uv_map_edge_selection_name(layer.name),
+ get_uv_map_pin_name(layer.name)});
+ }
+
+ for (const CustomDataLayer &layer : face_corner_layers_to_write) {
+ if (uv_sublayers_to_skip.contains_as(layer.name)) {
+ continue;
+ }
+ if (layer.type != CD_PROP_FLOAT2) {
+ new_layer_to_write.append(layer);
+ continue;
+ }
+ const Span<float2> coords{static_cast<const float2 *>(layer.data), mesh->totloop};
+ CustomDataLayer mloopuv_layer = layer;
+ mloopuv_layer.type = CD_MLOOPUV;
+ MutableSpan<MLoopUV> mloopuv = temp_mloopuv_for_convert.construct<Array<MLoopUV>>(
+ mesh->totloop);
+ mloopuv_layer.data = mloopuv.data();
+
+ const VArray<bool> vert_selection = attributes.lookup_or_default<bool>(
+ get_uv_map_vert_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
+ const VArray<bool> edge_selection = attributes.lookup_or_default<bool>(
+ get_uv_map_edge_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
+ const VArray<bool> pin = attributes.lookup_or_default<bool>(
+ get_uv_map_pin_name(layer.name), ATTR_DOMAIN_CORNER, false);
+
+ threading::parallel_for(mloopuv.index_range(), 2048, [&](IndexRange range) {
+ for (const int i : range) {
+ copy_v2_v2(mloopuv[i].uv, coords[i]);
+ SET_FLAG_FROM_TEST(mloopuv[i].flag, vert_selection[i], MLOOPUV_VERTSEL);
+ SET_FLAG_FROM_TEST(mloopuv[i].flag, edge_selection[i], MLOOPUV_EDGESEL);
+ SET_FLAG_FROM_TEST(mloopuv[i].flag, pin[i], MLOOPUV_PINNED);
+ }
+ });
+ new_layer_to_write.append(mloopuv_layer);
+ }
+
+ face_corner_layers_to_write = new_layer_to_write;
+ mesh->ldata.totlayer = new_layer_to_write.size();
+ mesh->ldata.maxlayer = mesh->ldata.totlayer;
+}
+
+void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh)
+{
+ using namespace blender;
+ using namespace blender::bke;
+
+ /* Store layer names since they will be removed, used to set the active status of new layers.
+ * Use intermediate #StringRef because the names can be null. */
+ const std::string active_uv = StringRef(
+ CustomData_get_active_layer_name(&mesh->ldata, CD_MLOOPUV));
+ const std::string default_uv = StringRef(
+ CustomData_get_render_layer_name(&mesh->ldata, CD_MLOOPUV));
+
+ Set<std::string> uv_layers_to_convert
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list