diff options
author | Aleksi Juvani <aleksijuvani> | 2022-01-05 18:36:34 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-01-05 18:53:54 +0300 |
commit | 5dedb39d447bcb51ad0d797aae765667edf5321c (patch) | |
tree | 456f0233aa16c9bd3b5fd6582bb1b874e172b269 /source/blender/editors | |
parent | 1031638c51dd014d27231a9ba39e7089f57b5c77 (diff) |
Fix T54488: hair disconnect/reconnect not working with modifiers
Take the Use Modifier Stack setting into account when connecting hair, and
fix wrong results results when using deforming modifiers also.
Differential Revision: https://developer.blender.org/D13704
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/physics/particle_object.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index 367d72b0ad7..4f571fa6353 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -743,8 +743,10 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, invert_m4_m4(from_imat, from_mat); invert_m4_m4(to_imat, to_mat); - if (target_psmd->mesh_final->runtime.deformed_only) { - /* we don't want to mess up target_psmd->dm when converting to global coordinates below */ + const bool use_dm_final_indices = (target_psys->part->use_modifier_stack && + !target_psmd->mesh_final->runtime.deformed_only); + + if (use_dm_final_indices) { mesh = target_psmd->mesh_final; } else { @@ -755,6 +757,7 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, return false; } /* don't modify the original vertices */ + /* we don't want to mess up target_psmd->dm when converting to global coordinates below */ mesh = (Mesh *)BKE_id_copy_ex(NULL, &mesh->id, NULL, LIB_ID_COPY_LOCALIZE); /* BMESH_ONLY, deform dm may not have tessface */ @@ -825,7 +828,13 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, tpa->foffset = 0.0f; tpa->num = nearest.index; - tpa->num_dmcache = psys_particle_dm_face_lookup(target_mesh, mesh, tpa->num, tpa->fuv, NULL); + if (use_dm_final_indices) { + tpa->num_dmcache = DMCACHE_ISCHILD; + } + else { + tpa->num_dmcache = psys_particle_dm_face_lookup( + target_psmd->mesh_final, target_psmd->mesh_original, tpa->num, tpa->fuv, NULL); + } } else { me = &medge[nearest.index]; |