diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/shrinkwrap.c | 13 |
3 files changed, 11 insertions, 19 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index dcc55fa2445..d04d413571c 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -426,6 +426,6 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated( struct DerivedMesh *dm); struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object( - struct Object *ob_eval, bool *r_free_mesh); + struct Object *ob_eval, const bool get_cage_mesh); #endif diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 511f5d01461..9e24131ddd3 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -899,23 +899,24 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated( * Get evaluated mesh for other evaluated object, which is used as an operand for the modifier, * e.g. second operand for boolean modifier. * Note that modifiers in stack always get fully evaluated COW ID pointers, never original ones. Makes things simpler. + * + * \param get_cage_mesh Return evaluated mesh with only deforming modifiers applied + * (i.e. mesh topology remains the same as original one, a.k.a. 'cage' mesh). */ -Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, bool *r_free_mesh) +Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, const bool get_cage_mesh) { Mesh *me = NULL; if ((ob_eval->type == OB_MESH) && (ob_eval->mode & OB_MODE_EDIT)) { - /* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh... - * This is TODO in core depsgraph/modifier stack code still. */ + /* In EditMode, evaluated mesh is stored in BMEditMesh, not the object... */ BMEditMesh *em = BKE_editmesh_from_object(ob_eval); if (em != NULL) { /* em might not exist yet in some cases, just after loading a .blend file, see T57878. */ - me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); - *r_free_mesh = true; + me = (get_cage_mesh && em->mesh_eval_cage != NULL) ? em->mesh_eval_cage : em->mesh_eval_final; } } if (me == NULL) { - me = ob_eval->runtime.mesh_eval; - *r_free_mesh = false; + me = (get_cage_mesh && ob_eval->runtime.mesh_deform_eval != NULL) ? ob_eval->runtime.mesh_deform_eval : + ob_eval->runtime.mesh_eval; } return me; diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index e2a4dc6f852..d095320f49d 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -624,7 +624,6 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) /* auxiliary target */ Mesh *auxMesh = NULL; - bool auxMesh_free; ShrinkwrapTreeData *aux_tree = NULL; ShrinkwrapTreeData aux_tree_stack; SpaceTransform local2aux; @@ -654,7 +653,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) } if (calc->aux_target) { - auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->aux_target, &auxMesh_free); + auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->aux_target, false); if (!auxMesh) return; BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->aux_target); @@ -683,9 +682,6 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) if (aux_tree) { BKE_shrinkwrap_free_tree(aux_tree); } - if (auxMesh != NULL && auxMesh_free) { - BKE_id_free(NULL, auxMesh); - } } /* @@ -1285,7 +1281,6 @@ void shrinkwrapModifier_deform( DerivedMesh *ss_mesh = NULL; ShrinkwrapCalcData calc = NULL_ShrinkwrapCalcData; - bool target_free = false; /* remove loop dependencies on derived meshes (TODO should this be done elsewhere?) */ if (smd->target == ob) smd->target = NULL; @@ -1303,7 +1298,7 @@ void shrinkwrapModifier_deform( if (smd->target != NULL) { Object *ob_target = DEG_get_evaluated_object(ctx->depsgraph, smd->target); - calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, &target_free); + calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, false); /* TODO there might be several "bugs" on non-uniform scales matrixs * because it will no longer be nearest surface, not sphere projection @@ -1374,8 +1369,4 @@ void shrinkwrapModifier_deform( /* free memory */ if (ss_mesh) ss_mesh->release(ss_mesh); - - if (target_free && calc.target) { - BKE_id_free(NULL, calc.target); - } } |