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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs