From 4587643a57bb31a01a1ebc00fe60d7eff3d58d63 Mon Sep 17 00:00:00 2001 From: Tuan N Date: Tue, 14 Mar 2023 10:57:28 +0100 Subject: [PATCH 1/5] Mesh: Remove unneccessary mesh vert copies --- source/blender/blenkernel/intern/displist.cc | 7 +-- source/blender/blenkernel/intern/mball.cc | 7 +-- .../blender/blenkernel/intern/mesh_remap.cc | 63 ++++++++----------- 3 files changed, 29 insertions(+), 48 deletions(-) diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index 6500cf830b2..c7320593bad 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -743,11 +743,8 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph, Mesh *mesh = geometry_set.get_mesh_for_write(); if (mti->type == eModifierTypeType_OnlyDeform) { - int totvert; - float(*vertex_coords)[3] = BKE_mesh_vert_coords_alloc(mesh, &totvert); - mti->deformVerts(md, &mectx_deform, mesh, vertex_coords, totvert); - BKE_mesh_vert_coords_apply(mesh, vertex_coords); - MEM_freeN(vertex_coords); + mti->deformVerts( + md, &mectx_deform, mesh, BKE_mesh_vert_positions_for_write(mesh), mesh->totvert); } else { Mesh *output_mesh = mti->modifyMesh(md, &mectx_apply, mesh); diff --git a/source/blender/blenkernel/intern/mball.cc b/source/blender/blenkernel/intern/mball.cc index 3a5e3104b86..cc30b4c2ee1 100644 --- a/source/blender/blenkernel/intern/mball.cc +++ b/source/blender/blenkernel/intern/mball.cc @@ -685,11 +685,8 @@ void BKE_mball_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob) mesh->totcol = mball->totcol; if (ob->parent && ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) { - int verts_num; - float(*positions)[3] = BKE_mesh_vert_coords_alloc(mesh, &verts_num); - BKE_lattice_deform_coords(ob->parent, ob, positions, verts_num, 0, nullptr, 1.0f); - BKE_mesh_vert_coords_apply(mesh, positions); - MEM_freeN(positions); + BKE_lattice_deform_coords( + ob->parent, ob, BKE_mesh_vert_positions_for_write(mesh), mesh->totvert, 0, nullptr, 1.0f); } ob->runtime.geometry_set_eval = new GeometrySet(GeometrySet::create_with_mesh(mesh)); diff --git a/source/blender/blenkernel/intern/mesh_remap.cc b/source/blender/blenkernel/intern/mesh_remap.cc index 733f649a4d6..9d064cc0c12 100644 --- a/source/blender/blenkernel/intern/mesh_remap.cc +++ b/source/blender/blenkernel/intern/mesh_remap.cc @@ -262,9 +262,8 @@ void BKE_mesh_remap_find_best_match_from_mesh(const float (*vert_positions_dst)[ float best_match = FLT_MAX, match; const int numverts_src = me_src->totvert; - float(*vcos_src)[3] = BKE_mesh_vert_coords_alloc(me_src, nullptr); - - mesh_calc_eigen_matrix(nullptr, (const float(*)[3])vcos_src, numverts_src, mat_src); + const float(*vcos_src)[3] = BKE_mesh_vert_positions(me_src); + mesh_calc_eigen_matrix(nullptr, vcos_src, numverts_src, mat_src); mesh_calc_eigen_matrix(vert_positions_dst, nullptr, numverts_dst, mat_dst); BLI_space_transform_global_from_matrices(r_space_transform, mat_dst, mat_src); @@ -289,8 +288,6 @@ void BKE_mesh_remap_find_best_match_from_mesh(const float (*vert_positions_dst)[ } BLI_space_transform_global_from_matrices(r_space_transform, best_mat_dst, mat_src); - - MEM_freeN(vcos_src); } /** \} */ @@ -516,7 +513,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, } else if (ELEM(mode, MREMAP_MODE_VERT_EDGE_NEAREST, MREMAP_MODE_VERT_EDGEINTERP_NEAREST)) { const blender::Span edges_src = me_src->edges(); - float(*vcos_src)[3] = BKE_mesh_vert_coords_alloc(me_src, nullptr); + const float(*vcos_src)[3] = BKE_mesh_vert_positions(me_src); BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_EDGES, 2); nearest.index = -1; @@ -561,8 +558,6 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, BKE_mesh_remap_item_define_invalid(r_map, i); } } - - MEM_freeN(vcos_src); } else if (ELEM(mode, MREMAP_MODE_VERT_POLY_NEAREST, @@ -570,7 +565,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, MREMAP_MODE_VERT_POLYINTERP_VNORPROJ)) { const blender::Span polys_src = me_src->polys(); const blender::Span loops_src = me_src->loops(); - float(*vcos_src)[3] = BKE_mesh_vert_coords_alloc(me_src, nullptr); + const float(*vcos_src)[3] = BKE_mesh_vert_positions(me_src); const float(*vert_normals_dst)[3] = BKE_mesh_vert_normals_ensure(me_dst); size_t tmp_buff_size = MREMAP_DEFAULT_BUFSIZE; @@ -598,7 +593,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, const MLoopTri *lt = &treedata.looptri[rayhit.index]; const int sources_num = mesh_remap_interp_poly_data_get(polys_src[lt->poly], loops_src, - (const float(*)[3])vcos_src, + vcos_src, rayhit.co, &tmp_buff_size, &vcos, @@ -635,7 +630,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, int index; mesh_remap_interp_poly_data_get(polys_src[lt->poly], loops_src, - (const float(*)[3])vcos_src, + vcos_src, nearest.co, &tmp_buff_size, &vcos, @@ -650,7 +645,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, else if (mode == MREMAP_MODE_VERT_POLYINTERP_NEAREST) { const int sources_num = mesh_remap_interp_poly_data_get(polys_src[lt->poly], loops_src, - (const float(*)[3])vcos_src, + vcos_src, nearest.co, &tmp_buff_size, &vcos, @@ -670,7 +665,6 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, } } - MEM_freeN(vcos_src); MEM_freeN(vcos); MEM_freeN(indices); MEM_freeN(weights); @@ -721,7 +715,7 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, if (mode == MREMAP_MODE_EDGE_VERT_NEAREST) { const int num_verts_src = me_src->totvert; const blender::Span edges_src = me_src->edges(); - float(*vcos_src)[3] = BKE_mesh_vert_coords_alloc(me_src, nullptr); + const float(*vcos_src)[3] = BKE_mesh_vert_positions(me_src); MeshElemMap *vert_to_edge_src_map; int *vert_to_edge_src_map_mem; @@ -840,7 +834,6 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, } } - MEM_freeN(vcos_src); MEM_freeN(v_dst_to_src_map); MEM_freeN(vert_to_edge_src_map); MEM_freeN(vert_to_edge_src_map_mem); @@ -874,7 +867,7 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, const blender::Span edges_src = me_src->edges(); const blender::Span polys_src = me_src->polys(); const blender::Span loops_src = me_src->loops(); - float(*vcos_src)[3] = BKE_mesh_vert_coords_alloc(me_src, nullptr); + const float(*vcos_src)[3] = BKE_mesh_vert_positions(me_src); BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRI, 2); @@ -900,8 +893,8 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, for (; nloops--; ml_src++) { const MEdge *edge_src = &edges_src[ml_src->e]; - float *co1_src = vcos_src[edge_src->v1]; - float *co2_src = vcos_src[edge_src->v2]; + const float *co1_src = vcos_src[edge_src->v1]; + const float *co2_src = vcos_src[edge_src->v2]; float co_src[3]; float dist_sq; @@ -921,8 +914,6 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, BKE_mesh_remap_item_define_invalid(r_map, i); } } - - MEM_freeN(vcos_src); } else if (mode == MREMAP_MODE_EDGE_EDGEINTERP_VNORPROJ) { const int num_rays_min = 5, num_rays_max = 100; @@ -1305,7 +1296,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, const float(*positions_src)[3] = BKE_mesh_vert_positions(me_src); const int num_verts_src = me_src->totvert; - float(*vcos_src)[3] = nullptr; + const float(*vcos_src)[3] = nullptr; const blender::Span edges_src = me_src->edges(); const blender::Span polys_src = me_src->polys(); const blender::Span loops_src = me_src->loops(); @@ -1325,7 +1316,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, size_t islands_res_buff_size = MREMAP_DEFAULT_BUFSIZE; if (!use_from_vert) { - vcos_src = BKE_mesh_vert_coords_alloc(me_src, nullptr); + vcos_src = BKE_mesh_vert_positions(me_src); vcos_interp = static_cast( MEM_mallocN(sizeof(*vcos_interp) * buff_size_interp, __func__)); @@ -2037,7 +2028,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, if (mode == MREMAP_MODE_LOOP_POLY_NEAREST) { mesh_remap_interp_poly_data_get(poly, loops_src, - (const float(*)[3])vcos_src, + vcos_src, hit_co, &buff_size_interp, &vcos_interp, @@ -2056,18 +2047,17 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, &full_weight); } else { - const int sources_num = mesh_remap_interp_poly_data_get( - poly, - loops_src, - (const float(*)[3])vcos_src, - hit_co, - &buff_size_interp, - &vcos_interp, - true, - &indices_interp, - &weights_interp, - true, - nullptr); + const int sources_num = mesh_remap_interp_poly_data_get(poly, + loops_src, + vcos_src, + hit_co, + &buff_size_interp, + &vcos_interp, + true, + &indices_interp, + &weights_interp, + true, + nullptr); mesh_remap_item_define(r_map, lidx_dst, @@ -2109,9 +2099,6 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, BLI_astar_solution_free(&as_solution); } - if (vcos_src) { - MEM_freeN(vcos_src); - } if (vert_to_loop_map_src) { MEM_freeN(vert_to_loop_map_src); } -- 2.30.2 From 176d642e1b23f61f2a237c3736e075e259a963f1 Mon Sep 17 00:00:00 2001 From: Tuan N Date: Tue, 14 Mar 2023 12:01:30 +0100 Subject: [PATCH 2/5] Mesh: Remove unneccessary mesh vert copies --- .../blenkernel/intern/multires_reshape.cc | 7 +------ source/blender/blenkernel/intern/paint.cc | 6 ++---- .../blender/blenkernel/intern/particle_system.c | 13 ++++++------- source/blender/blenkernel/intern/shrinkwrap.cc | 16 +++++++++------- .../modifiers/intern/MOD_weightvgproximity.cc | 3 +-- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/source/blender/blenkernel/intern/multires_reshape.cc b/source/blender/blenkernel/intern/multires_reshape.cc index d4e842dc10c..83511a7cbc6 100644 --- a/source/blender/blenkernel/intern/multires_reshape.cc +++ b/source/blender/blenkernel/intern/multires_reshape.cc @@ -62,13 +62,8 @@ bool multiresModifier_reshapeFromObject(Depsgraph *depsgraph, Object *src_eval = DEG_get_evaluated_object(depsgraph, src); Mesh *src_mesh_eval = mesh_get_eval_final(depsgraph, scene_eval, src_eval, &CD_MASK_BAREMESH); - int num_deformed_verts; - float(*deformed_verts)[3] = BKE_mesh_vert_coords_alloc(src_mesh_eval, &num_deformed_verts); - const bool result = multiresModifier_reshapeFromVertcos( - depsgraph, dst, mmd, deformed_verts, num_deformed_verts); - - MEM_freeN(deformed_verts); + depsgraph, dst, mmd, BKE_mesh_vert_positions(src_mesh_eval), src_mesh_eval->totvert); return result; } diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc index 943f6902868..01c31677e2a 100644 --- a/source/blender/blenkernel/intern/paint.cc +++ b/source/blender/blenkernel/intern/paint.cc @@ -2209,10 +2209,8 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform, bool const bool is_deformed = check_sculpt_object_deformed(ob, true); if (is_deformed && me_eval_deform != nullptr) { - int totvert; - float(*v_cos)[3] = BKE_mesh_vert_coords_alloc(me_eval_deform, &totvert); - BKE_pbvh_vert_coords_apply(pbvh, v_cos, totvert); - MEM_freeN(v_cos); + BKE_pbvh_vert_coords_apply( + pbvh, BKE_mesh_vert_positions(me_eval_deform), me_eval_deform->totvert); } return pbvh; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index a9fc9425ecc..e9fe905eb9c 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3441,7 +3441,6 @@ static void do_hair_dynamics(ParticleSimulationData *sim) EffectorWeights *clmd_effweights; int totpoint; int totedge; - float(*deformedVerts)[3]; bool realloc_roots; if (!psys->clmd) { @@ -3495,12 +3494,12 @@ static void do_hair_dynamics(ParticleSimulationData *sim) psys->clmd->sim_parms->effector_weights = psys->part->effector_weights; BKE_id_copy_ex(NULL, &psys->hair_in_mesh->id, (ID **)&psys->hair_out_mesh, LIB_ID_COPY_LOCALIZE); - deformedVerts = BKE_mesh_vert_coords_alloc(psys->hair_out_mesh, NULL); - clothModifier_do( - psys->clmd, sim->depsgraph, sim->scene, sim->ob, psys->hair_in_mesh, deformedVerts); - BKE_mesh_vert_coords_apply(psys->hair_out_mesh, deformedVerts); - - MEM_freeN(deformedVerts); + clothModifier_do(psys->clmd, + sim->depsgraph, + sim->scene, + sim->ob, + psys->hair_in_mesh, + BKE_mesh_vert_positions_for_write(psys->hair_in_mesh)); /* restore cloth effector weights */ psys->clmd->sim_parms->effector_weights = clmd_effweights; diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc index 92531e10499..cb06c270f56 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.cc +++ b/source/blender/blenkernel/intern/shrinkwrap.cc @@ -1530,7 +1530,6 @@ void BKE_shrinkwrap_mesh_nearest_surface_deform(bContext *C, Object *ob_source, Scene *sce = CTX_data_scene(C); ShrinkwrapModifierData ssmd = {{nullptr}}; ModifierEvalContext ctx = {depsgraph, ob_source, ModifierApplyFlag(0)}; - int totvert; ssmd.target = ob_target; ssmd.shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE; @@ -1538,13 +1537,16 @@ void BKE_shrinkwrap_mesh_nearest_surface_deform(bContext *C, Object *ob_source, ssmd.keepDist = 0.0f; Mesh *src_me = static_cast(ob_source->data); - float(*vertexCos)[3] = BKE_mesh_vert_coords_alloc(src_me, &totvert); - shrinkwrapModifier_deform(&ssmd, &ctx, sce, ob_source, src_me, nullptr, -1, vertexCos, totvert); - - BKE_mesh_vert_coords_apply(src_me, vertexCos); - - MEM_freeN(vertexCos); + shrinkwrapModifier_deform(&ssmd, + &ctx, + sce, + ob_source, + src_me, + nullptr, + -1, + BKE_mesh_vert_positions_for_write(src_me), + src_me->totvert); } void BKE_shrinkwrap_remesh_target_project(Mesh *src_me, Mesh *target_me, Object *ob_target) diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.cc b/source/blender/modifiers/intern/MOD_weightvgproximity.cc index 917311f68d1..d43b0d31921 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.cc +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.cc @@ -516,12 +516,11 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * /* Get our vertex coordinates. */ if (index_num != verts_num) { - float(*tv_cos)[3] = BKE_mesh_vert_coords_alloc(mesh, nullptr); + const float(*tv_cos)[3] = BKE_mesh_vert_positions(mesh); v_cos = static_cast(MEM_malloc_arrayN(index_num, sizeof(float[3]), __func__)); for (i = 0; i < index_num; i++) { copy_v3_v3(v_cos[i], tv_cos[indices[i]]); } - MEM_freeN(tv_cos); } else { v_cos = BKE_mesh_vert_coords_alloc(mesh, nullptr); -- 2.30.2 From 04c034b972528f75a4da342100456a25edf07d4c Mon Sep 17 00:00:00 2001 From: Tuan N Date: Wed, 15 Mar 2023 11:05:14 +0100 Subject: [PATCH 3/5] Tag changed vertex positions --- source/blender/blenkernel/intern/displist.cc | 1 + source/blender/blenkernel/intern/mball.cc | 1 + source/blender/blenkernel/intern/particle_system.c | 1 + source/blender/blenkernel/intern/shrinkwrap.cc | 1 + 4 files changed, 4 insertions(+) diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index c7320593bad..1eb67cc2c4e 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -745,6 +745,7 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph, if (mti->type == eModifierTypeType_OnlyDeform) { mti->deformVerts( md, &mectx_deform, mesh, BKE_mesh_vert_positions_for_write(mesh), mesh->totvert); + BKE_mesh_tag_positions_changed(mesh); } else { Mesh *output_mesh = mti->modifyMesh(md, &mectx_apply, mesh); diff --git a/source/blender/blenkernel/intern/mball.cc b/source/blender/blenkernel/intern/mball.cc index cc30b4c2ee1..978790a1ab7 100644 --- a/source/blender/blenkernel/intern/mball.cc +++ b/source/blender/blenkernel/intern/mball.cc @@ -687,6 +687,7 @@ void BKE_mball_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob) if (ob->parent && ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) { BKE_lattice_deform_coords( ob->parent, ob, BKE_mesh_vert_positions_for_write(mesh), mesh->totvert, 0, nullptr, 1.0f); + BKE_mesh_tag_positions_changed(mesh); } ob->runtime.geometry_set_eval = new GeometrySet(GeometrySet::create_with_mesh(mesh)); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index e9fe905eb9c..6a85de9c0ea 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3500,6 +3500,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim) sim->ob, psys->hair_in_mesh, BKE_mesh_vert_positions_for_write(psys->hair_in_mesh)); + BKE_mesh_tag_positions_changed(psys->hair_in_mesh); /* restore cloth effector weights */ psys->clmd->sim_parms->effector_weights = clmd_effweights; diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc index cb06c270f56..bb9f7dedc53 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.cc +++ b/source/blender/blenkernel/intern/shrinkwrap.cc @@ -1547,6 +1547,7 @@ void BKE_shrinkwrap_mesh_nearest_surface_deform(bContext *C, Object *ob_source, -1, BKE_mesh_vert_positions_for_write(src_me), src_me->totvert); + BKE_mesh_tag_positions_changed(src_me); } void BKE_shrinkwrap_remesh_target_project(Mesh *src_me, Mesh *target_me, Object *ob_target) -- 2.30.2 From 0139d95cc81aa6011ede5b820ae7a1d93c75089f Mon Sep 17 00:00:00 2001 From: Tuan N Date: Wed, 15 Mar 2023 11:07:39 +0100 Subject: [PATCH 4/5] Revert changes to multires_reshape.cc --- source/blender/blenkernel/intern/multires_reshape.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/multires_reshape.cc b/source/blender/blenkernel/intern/multires_reshape.cc index 83511a7cbc6..d4e842dc10c 100644 --- a/source/blender/blenkernel/intern/multires_reshape.cc +++ b/source/blender/blenkernel/intern/multires_reshape.cc @@ -62,8 +62,13 @@ bool multiresModifier_reshapeFromObject(Depsgraph *depsgraph, Object *src_eval = DEG_get_evaluated_object(depsgraph, src); Mesh *src_mesh_eval = mesh_get_eval_final(depsgraph, scene_eval, src_eval, &CD_MASK_BAREMESH); + int num_deformed_verts; + float(*deformed_verts)[3] = BKE_mesh_vert_coords_alloc(src_mesh_eval, &num_deformed_verts); + const bool result = multiresModifier_reshapeFromVertcos( - depsgraph, dst, mmd, BKE_mesh_vert_positions(src_mesh_eval), src_mesh_eval->totvert); + depsgraph, dst, mmd, deformed_verts, num_deformed_verts); + + MEM_freeN(deformed_verts); return result; } -- 2.30.2 From f4f5969e074456e7bc19e182ccf81a7fcc6056eb Mon Sep 17 00:00:00 2001 From: Tuan N Date: Wed, 15 Mar 2023 21:47:22 +0100 Subject: [PATCH 5/5] Revert changes to particle_system.c --- source/blender/blenkernel/intern/particle_system.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 6a85de9c0ea..a9fc9425ecc 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3441,6 +3441,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim) EffectorWeights *clmd_effweights; int totpoint; int totedge; + float(*deformedVerts)[3]; bool realloc_roots; if (!psys->clmd) { @@ -3494,13 +3495,12 @@ static void do_hair_dynamics(ParticleSimulationData *sim) psys->clmd->sim_parms->effector_weights = psys->part->effector_weights; BKE_id_copy_ex(NULL, &psys->hair_in_mesh->id, (ID **)&psys->hair_out_mesh, LIB_ID_COPY_LOCALIZE); - clothModifier_do(psys->clmd, - sim->depsgraph, - sim->scene, - sim->ob, - psys->hair_in_mesh, - BKE_mesh_vert_positions_for_write(psys->hair_in_mesh)); - BKE_mesh_tag_positions_changed(psys->hair_in_mesh); + deformedVerts = BKE_mesh_vert_coords_alloc(psys->hair_out_mesh, NULL); + clothModifier_do( + psys->clmd, sim->depsgraph, sim->scene, sim->ob, psys->hair_in_mesh, deformedVerts); + BKE_mesh_vert_coords_apply(psys->hair_out_mesh, deformedVerts); + + MEM_freeN(deformedVerts); /* restore cloth effector weights */ psys->clmd->sim_parms->effector_weights = clmd_effweights; -- 2.30.2