Commit: fd395c9a0a2b5cc874e38c6d1236e9ba7e982d30 Author: Hans Goudey Date: Thu Dec 15 17:47:51 2022 -0600 Branches: refactor-mesh-position-generic https://developer.blender.org/rBfd395c9a0a2b5cc874e38c6d1236e9ba7e982d30
Merge branch 'master' into refactor-mesh-position-generic =================================================================== =================================================================== diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h index 97234ccd139,65804e9ac24..a561cf9e8fd --- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h +++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h @@@ -89,13 -85,9 +87,16 @@@ void BKE_mesh_legacy_convert_mpoly_to_m /** Convert from runtime loose edge cache to legacy edge flag. */ void BKE_mesh_legacy_convert_loose_edges_to_flag(struct Mesh *mesh); + void BKE_mesh_legacy_attribute_flags_to_strings(struct Mesh *mesh); + void BKE_mesh_legacy_attribute_strings_to_flags(struct Mesh *mesh); + +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); + +void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh); + #endif /** diff --cc source/blender/blenkernel/intern/mesh.cc index 7672223bd83,6ec171c4bcc..4e783ad428c --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@@ -268,9 -257,21 +272,12 @@@ static void mesh_blend_write(BlendWrite BKE_mesh_legacy_bevel_weight_from_layers(mesh); BKE_mesh_legacy_face_set_from_generic(mesh, poly_layers); BKE_mesh_legacy_edge_crease_from_layers(mesh); + BKE_mesh_legacy_attribute_strings_to_flags(mesh); + mesh->active_color_attribute = nullptr; + mesh->default_color_attribute = nullptr; BKE_mesh_legacy_convert_loose_edges_to_flag(mesh); - /* When converting to the old mesh format, don't save redundant attributes. */ - names_to_skip.add_multiple_new({".hide_vert", - ".hide_edge", - ".hide_poly", - "material_index", - ".select_vert", - ".select_edge", - ".select_poly"}); /* Set deprecated mesh data pointers for forward compatibility. */ - mesh->mvert = const_cast<MVert *>(mesh->verts().data()); mesh->medge = const_cast<MEdge *>(mesh->edges().data()); mesh->mpoly = const_cast<MPoly *>(mesh->polys().data()); mesh->mloop = const_cast<MLoop *>(mesh->loops().data()); diff --cc source/blender/blenkernel/intern/mesh_convert.cc index f66d7c2b69b,7a4c3c0834b..f0442d4b8bf --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@@ -1080,143 -1102,7 +1080,6 @@@ Mesh *BKE_mesh_new_from_object_to_bmain return mesh_in_bmain; } - static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src) - { - KeyBlock *kb; - Key *key = mesh_src->key; - int i; - - if (!mesh_src->key) { - return; - } - - /* ensure we can use mesh vertex count for derived mesh custom data */ - if (mesh_src->totvert != mesh_dest->totvert) { - CLOG_ERROR(&LOG, - "vertex size mismatch (mesh/dm) '%s' (%d != %d)", - mesh_src->id.name + 2, - mesh_src->totvert, - mesh_dest->totvert); - return; - } - - for (i = 0, kb = (KeyBlock *)key->block.first; kb; kb = kb->next, i++) { - int ci; - float *array; - - if (mesh_src->totvert != kb->totelem) { - CLOG_ERROR(&LOG, - "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)", - mesh_src->id.name + 2, - mesh_src->totvert, - kb->name, - kb->totelem); - array = (float *)MEM_calloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__); - } - else { - array = (float *)MEM_malloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__); - memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src->totvert)); - } - - CustomData_add_layer_named( - &mesh_dest->vdata, CD_SHAPEKEY, CD_ASSIGN, array, mesh_dest->totvert, kb->name); - ci = CustomData_get_layer_index_n(&mesh_dest->vdata, CD_SHAPEKEY, i); - - mesh_dest->vdata.layers[ci].uid = kb->uid; - } - } - - Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph, - Scene *scene, - Object *ob_eval, - ModifierData *md_eval, - const bool use_virtual_modifiers, - const bool build_shapekey_layers) - { - Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig : - (Mesh *)ob_eval->data; - const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md_eval->type); - Mesh *result = nullptr; - KeyBlock *kb; - ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH}; - - if (!(md_eval->mode & eModifierMode_Realtime)) { - return result; - } - - if (mti->isDisabled && mti->isDisabled(scene, md_eval, false)) { - return result; - } - - if (build_shapekey_layers && me->key && - (kb = (KeyBlock *)BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) { - MutableSpan<float3> verts = me->positions_for_write(); - BKE_keyblock_convert_to_mesh(kb, reinterpret_cast<float(*)[3]>(verts.data()), me->totvert); - } - - Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE); - int numVerts = 0; - float(*deformedVerts)[3] = nullptr; - - if (use_virtual_modifiers) { - VirtualModifierData virtualModifierData; - for (ModifierData *md_eval_virt = - BKE_modifiers_get_virtual_modifierlist(ob_eval, &virtualModifierData); - md_eval_virt && (md_eval_virt != ob_eval->modifiers.first); - md_eval_virt = md_eval_virt->next) { - if (!BKE_modifier_is_enabled(scene, md_eval_virt, eModifierMode_Realtime)) { - continue; - } - /* All virtual modifiers are deform modifiers. */ - const ModifierTypeInfo *mti_virt = BKE_modifier_get_info((ModifierType)md_eval_virt->type); - BLI_assert(mti_virt->type == eModifierTypeType_OnlyDeform); - if (mti_virt->type != eModifierTypeType_OnlyDeform) { - continue; - } - - if (deformedVerts == nullptr) { - deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts); - } - mti_virt->deformVerts(md_eval_virt, &mectx, mesh_temp, deformedVerts, numVerts); - } - } - - if (mti->type == eModifierTypeType_OnlyDeform) { - if (deformedVerts == nullptr) { - deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts); - } - result = mesh_temp; - mti->deformVerts(md_eval, &mectx, result, deformedVerts, numVerts); - BKE_mesh_vert_coords_apply(result, deformedVerts); - - if (build_shapekey_layers) { - add_shapekey_layers(result, me); - } - } - else { - if (deformedVerts != nullptr) { - BKE_mesh_vert_coords_apply(mesh_temp, deformedVerts); - } - - if (build_shapekey_layers) { - add_shapekey_layers(mesh_temp, me); - } - - result = mti->modifyMesh(md_eval, &mectx, mesh_temp); - ASSERT_IS_VALID_MESH(result); - - if (mesh_temp != result) { - BKE_id_free(nullptr, mesh_temp); - } - } - - if (deformedVerts != nullptr) { - MEM_freeN(deformedVerts); - } - - return result; - } -- static KeyBlock *keyblock_ensure_from_uid(Key &key, const int uid, const StringRefNull name) { if (KeyBlock *kb = BKE_keyblock_find_uid(&key, uid)) { diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc index d3e93484784,a53b0e66924..f106a89c55c --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@@ -938,10 -931,11 +938,11 @@@ int BKE_mesh_mface_index_validate(MFac return nr; } - static int mesh_tessface_calc(CustomData *fdata, + static int mesh_tessface_calc(Mesh &mesh, + CustomData *fdata, CustomData *ldata, CustomData *pdata, - MVert *mvert, + float (*positions)[3], int totface, int totloop, int totpoly) @@@ -1185,10 -1179,11 +1186,11 @@@ void BKE_mesh_tessface_calc(Mesh *mesh) { - mesh->totface = mesh_tessface_calc(&mesh->fdata, + mesh->totface = mesh_tessface_calc(*mesh, + &mesh->fdata, &mesh->ldata, &mesh->pdata, - BKE_mesh_verts_for_write(mesh), + BKE_mesh_positions_for_write(mesh), mesh->totface, mesh->totloop, mesh->totpoly); @@@ -1575,52 -1570,122 +1577,172 @@@ void BKE_mesh_legacy_convert_loose_edge /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Vertex and Position Conversion + * \{ */ + +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; + + const Span<float3> positions = mesh->positions(); + + 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_legacy, positions[i]); + } + }); + + vert_layers_to_write.append(mvert_layer); + return verts.data(); +} + +void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh) +{ + using namespace blender; + using namespace blender::bke; + + const Span<MVer @@ 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