Fix T57583: Assert when moving object parented to curve vertex
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 19 Feb 2019 14:53:10 +0000 (15:53 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 19 Feb 2019 14:56:00 +0000 (15:56 +0100)
Can not reliably evaluate object's transform from the original one.

Still not ideal, see the comment in the code.

source/blender/editors/transform/transform_conversions.c

index 95a6844..6522960 100644 (file)
@@ -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;