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/blenkernel/intern/modifier.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/blenkernel/intern/modifier.c')
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 111968ba018..86563ab797d 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -60,6 +60,7 @@ #include "BKE_appdir.h" #include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" #include "BKE_idcode.h" #include "BKE_key.h" #include "BKE_library.h" @@ -1212,13 +1213,26 @@ struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData * } } -/** Get evaluated mesh for other object, which is used as an operand for the modifier, - * i.e. second operand for boolean modifier. +/** + * Get evaluated mesh for other evaluated object, which is used as an operand for the modifier, + * e.g. second operand for boolean modifier. + * Note thqt modifiers in stack always get fully evaluated COW ID pointers, never original ones. Makes things simpler. */ -Mesh *BKE_modifier_get_evaluated_mesh_from_object(const ModifierEvalContext *ctx, Object *ob) +Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, bool *r_free_mesh) { - /* Note: we do not care about RENDER setting here, since we get data from despgraph - * (and render depsgraph shall be different from realtime one) - */ - return BKE_object_get_evaluated_mesh(ctx->depsgraph, ob); + Mesh *me; + + 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. */ + BMEditMesh *em = BKE_editmesh_from_object(ob_eval); + me = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + *r_free_mesh = true; + } + else { + me = ob_eval->runtime.mesh_eval; + *r_free_mesh = false; + } + + return me; } |