diff options
author | Aleksi Juvani <aleksijuvani> | 2022-01-05 18:36:34 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2022-01-11 16:46:52 +0300 |
commit | db9ddb8a453f88321d0b43609f532bc2c729fbcc (patch) | |
tree | f589faec6dfcb35c20edb7bdef21aaccc2c24c23 | |
parent | 1f16b5d7940594a09bf0420389e16d4360893d2a (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
-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 279befbadd4..9ccbcf93b09 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -742,8 +742,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 { @@ -754,6 +756,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 */ @@ -824,7 +827,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]; |