[Bf-blender-cvs] [18c3f2a] mesh-transfer-data: "Better" solution to avoid infinite recursion in dependency cycles of DataTransfer modifier cases.

Bastien Montagne noreply at git.blender.org
Sun Nov 16 13:16:21 CET 2014


Commit: 18c3f2a9d0674f163e4403e43b4b0fa3c9b55314
Author: Bastien Montagne
Date:   Sun Nov 16 13:06:40 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB18c3f2a9d0674f163e4403e43b4b0fa3c9b55314

"Better" solution to avoid infinite recursion in dependency cycles of DataTransfer modifier cases.

Note, issue here is that in modifier case, we can't be no more sure to actually get required
datalayers from source dm...

===================================================================

M	source/blender/blenkernel/intern/data_transfer.c
M	source/blender/modifiers/intern/MOD_datatransfer.c

===================================================================

diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c
index f2dccc9..251022d 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -812,7 +812,14 @@ bool BKE_data_transfer_dm(
 
 	/* Get source DM.*/
 	dm_src_mask |= BKE_data_transfer_dttypes_to_cdmask(data_types);
-	dm_src = mesh_get_derived_final(scene, ob_src, dm_src_mask);
+	/* XXX Hack! In case this is being evaluated from dm stack, we cannot compute final dm,
+	 *     can lead to infinite recursion in case of dependency cycles of DataTransfer modifiers...
+	 *     Issue is, this means we cannot be sure to have requested cd layers in source.
+	 */
+	dm_src = dm_dst ? ob_src->derivedFinal : mesh_get_derived_final(scene, ob_src, dm_src_mask);
+	if (!dm_src) {
+		return changed;
+	}
 
 	/* Check all possible data types.
 	 * Note item mappings and dest mix weights are cached. */
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index 78d7980..5fafc7f 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -165,24 +165,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 	SpaceTransform space_transform_data;
 	SpaceTransform *space_transform = (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) ? &space_transform_data : NULL;
 
-	/* We check source object does not have a data transfer mod from our object too,
-	 * cycle dependency here his deadly! */
-	{
-		ModifierData *md_it = dtmd->ob_source->modifiers.first;
-
-		for (; md_it; md_it = md_it->next) {
-			if (md_it->type == md->type) {
-				DataTransferModifierData *dtmd_it = (DataTransferModifierData *) md_it;
-				if (dtmd_it->ob_source && (dtmd_it->ob_source == ob)) {
-					modifier_setError(md, "This modifier does not support cycle dependencies, source object '%s' "
-					                      "already uses this object as data transfer source",
-					                  &dtmd_it->ob_source->id.name[2]);
-					return dm;
-				}
-			}
-		}
-	}
-
 	if (space_transform) {
 		BLI_SPACE_TRANSFORM_SETUP(space_transform, ob, dtmd->ob_source);
 	}




More information about the Bf-blender-cvs mailing list