From 59f6371a85824b4785db8e2b526c1101a5e30ca7 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 4 Apr 2019 14:42:33 +0200 Subject: Fix T63252: Bind in Mesh Deform Modifier fails A regression since 64c8d72ef1ad. The solution is to force modifier evaluation for an evaluated object, and let it to copy binding data back to original when is being evaluated for binding. Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D4642 --- source/blender/blenkernel/BKE_modifier.h | 10 ++++++++++ source/blender/blenkernel/intern/modifier.c | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index a375ed3044c..9f522c11733 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -403,6 +403,16 @@ void modifier_path_init(char *path, int path_maxlen, const char *name); const char *modifier_path_relbase(struct Main *bmain, struct Object *ob); const char *modifier_path_relbase_from_global(struct Object *ob); +/* Accessors of original/evaluated modifiers. */ + +/* For a given modifier data, get corresponding original one. + * If the modifier data is already original, return it as-is. */ +struct ModifierData *modifier_get_original(struct ModifierData *md); +struct ModifierData *modifier_get_evaluated( + struct Depsgraph* depsgraph, + struct Object *object, + struct ModifierData *md); + /* wrappers for modifier callbacks that ensure valid normals */ struct Mesh *modwrap_applyModifier( diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index fe955ced5f5..8f52e579a91 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -885,3 +885,23 @@ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, con return me; } + +ModifierData *modifier_get_original(ModifierData *md) +{ + if (md->orig_modifier_data == NULL) { + return md; + } + return md->orig_modifier_data; +} + +struct ModifierData *modifier_get_evaluated( + Depsgraph* depsgraph, + Object *object, + ModifierData *md) +{ + Object *object_eval = DEG_get_evaluated_object(depsgraph, object); + if (object_eval == object) { + return md; + } + return modifiers_findByName(object_eval, md->name); +} -- cgit v1.2.3