diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-30 12:34:08 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-30 13:04:06 +0300 |
commit | 72f4ac99c70b02e095cc9a71d501d6b1dc85ac3e (patch) | |
tree | 940c598d4efb2246eb7b523840e2b7337a59bc1b /source/blender/modifiers/intern/MOD_surfacedeform.c | |
parent | e55c1a9b5a089f3c688a0b47cba363cb0d6f92d0 (diff) |
Cleanup/fix wrong modifiers targets handling in COW context.
Modifiers stack only get COW/evaluated IDs, so no need to go auery again
DEG for those. Further more, now unified handling of EditBMesh case (was
done on case-by-case basis in a few modifiers, not all for some reason).
We are still missing the ability to get final and cage deformed meshes
when in Edit mode though, this is to be defined/implemented in depsgraph.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_surfacedeform.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_surfacedeform.c | 35 |
1 files changed, 5 insertions, 30 deletions
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index f03ae73e2bb..c75f317e3bc 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -1041,33 +1041,6 @@ static bool surfacedeformBind( return data.success == 1; } -static Mesh *surfacedeform_get_mesh(Depsgraph *depsgraph, SurfaceDeformModifierData *smd, bool *r_needsfree) -{ - Mesh *mesh; - - /* Handle target mesh both in and out of edit mode */ - if (smd->target->mode & OB_MODE_EDIT) { - BMEditMesh *em = BKE_editmesh_from_object(smd->target); - mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); - *r_needsfree = true; - } - else { - ModifierEvalContext ctx = { - .depsgraph = depsgraph, - .flag = smd->modifier.mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0, - }; - mesh = BKE_modifier_get_evaluated_mesh_from_object(&ctx, smd->target); - *r_needsfree = false; - } - - if (!mesh) { - mesh = get_mesh(smd->target, NULL, NULL, NULL, false, false); - *r_needsfree = true; - } - - return mesh; -} - static void deformVert( void *__restrict userdata, const int index, @@ -1127,7 +1100,7 @@ static void deformVert( static void surfacedeformModifier_do( ModifierData *md, - const ModifierEvalContext *ctx, + const ModifierEvalContext *UNUSED(ctx), float (*vertexCos)[3], unsigned int numverts, Object *ob) { SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; @@ -1141,7 +1114,7 @@ static void surfacedeformModifier_do( return; } - target = surfacedeform_get_mesh(ctx->depsgraph, smd, &free_target); + target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(smd->target, &free_target); if (!target) { modifier_setError(md, "No valid target mesh"); return; @@ -1200,7 +1173,9 @@ static void surfacedeformModifier_do( MEM_freeN(data.targetCos); } - if (free_target) BKE_id_free(NULL, target); + if (target != NULL && free_target) { + BKE_id_free(NULL, target); + } } static void deformVerts( |