[Bf-blender-cvs] [13f28798de5] master: Fix T57583: Assert when moving object parented to curve vertex

Sergey Sharybin noreply at git.blender.org
Tue Feb 19 15:56:03 CET 2019


Commit: 13f28798de5d501ed8867bbc0d7a25ca6f1dbe9b
Author: Sergey Sharybin
Date:   Tue Feb 19 15:53:10 2019 +0100
Branches: master
https://developer.blender.org/rB13f28798de5d501ed8867bbc0d7a25ca6f1dbe9b

Fix T57583: Assert when moving object parented to curve vertex

Can not reliably evaluate object's transform from the original one.

Still not ideal, see the comment in the code.

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

M	source/blender/editors/transform/transform_conversions.c

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

diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 95a6844abd3..65229606e39 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -5782,13 +5782,26 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
 	if (t->mode == TFM_DUMMY)
 		skip_invert = true;
 
+	/* NOTE: This is not relaly following copy-on-write design and we shoud not
+	 * be re-evaluating the evaluated object. But as the comment above mentioned
+	 * this is part of a hack.
+	 * More proper solution would be to make a shallwe copy of the object  and
+	 * evaluate that, and access matrix of that evaluated copy of tje object.
+	 * Might be more tricky as it sounds, if some logic later on accesses the
+	 * object matrix via td->ob->obmat. */
+	Object *object_eval = DEG_get_evaluated_object(t->depsgraph, ob);
 	if (skip_invert == false && constinv == false) {
 		ob->transflag |= OB_NO_CONSTRAINTS;  /* BKE_object_where_is_calc checks this */
-		BKE_object_where_is_calc(t->depsgraph, t->scene, ob);
+		BKE_object_where_is_calc(t->depsgraph, t->scene, object_eval);
 		ob->transflag &= ~OB_NO_CONSTRAINTS;
 	}
-	else
-		BKE_object_where_is_calc(t->depsgraph, t->scene, ob);
+	else {
+		BKE_object_where_is_calc(t->depsgraph, t->scene, object_eval);
+	}
+	/* Copy enwely evaluated fields to the original object, similar to how
+	 * active dependency graph will do it. */
+	copy_m4_m4(ob->obmat, object_eval->obmat);
+	ob->transflag = object_eval->transflag;
 
 	td->ob = ob;



More information about the Bf-blender-cvs mailing list