Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / object / object_constraint.c
index d058880..121a30c 100644 (file)
@@ -53,7 +53,6 @@
 #include "BKE_armature.h"
 #include "BKE_constraint.h"
 #include "BKE_context.h"
-#include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
@@ -62,6 +61,9 @@
 #include "BKE_tracking.h"
 #include "BIK_api.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
 #ifdef WITH_PYTHON
 #include "BPY_extern.h"
 #endif
@@ -596,6 +598,11 @@ static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
                return 0;
        }
 
+       if (ID_IS_STATIC_OVERRIDE(ob)) {
+               CTX_wm_operator_poll_msg_set(C, "Cannot edit constraints comming from static override");
+               return (((bConstraint *)ptr.data)->flag & CONSTRAINT_STATICOVERRIDE_LOCAL) != 0;
+       }
+
        return 1;
 }
 
@@ -775,8 +782,10 @@ void CONSTRAINT_OT_limitdistance_reset(wmOperatorType *ot)
 
 /* ------------- Child-Of Constraint ------------------ */
 
-static void child_get_inverse_matrix(Scene *scene, Object *ob, bConstraint *con, float invmat[4][4], const int owner)
+static void child_get_inverse_matrix(const bContext *C, Scene *scene, Object *ob, bConstraint *con, float invmat[4][4], const int owner)
 {
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
+
        /* nullify inverse matrix first */
        unit_m4(invmat);
 
@@ -802,7 +811,7 @@ static void child_get_inverse_matrix(Scene *scene, Object *ob, bConstraint *con,
                         * to use as baseline ("pmat") to derive delta from. This extra calc saves users
                         * from having pressing "Clear Inverse" first
                         */
-                       BKE_pose_where_is(scene, ob);
+                       BKE_pose_where_is(depsgraph, scene, ob);
                        copy_m4_m4(pmat, pchan->pose_mat);
 
                        /* 2. knock out constraints starting from this one */
@@ -819,7 +828,7 @@ static void child_get_inverse_matrix(Scene *scene, Object *ob, bConstraint *con,
                        }
 
                        /* 3. solve pose without disabled constraints */
-                       BKE_pose_where_is(scene, ob);
+                       BKE_pose_where_is(depsgraph, scene, ob);
 
                        /* 4. determine effect of constraint by removing the newly calculated
                         * pchan->pose_mat from the original pchan->pose_mat, thus determining
@@ -842,7 +851,7 @@ static void child_get_inverse_matrix(Scene *scene, Object *ob, bConstraint *con,
                        }
 
                        /* 6. recalculate pose with new inv-mat applied */
-                       BKE_pose_where_is(scene, ob);
+                       BKE_pose_where_is(depsgraph, scene, ob);
                }
        }
        if (owner == EDIT_CONSTRAINT_OWNER_OBJECT) {
@@ -853,7 +862,7 @@ static void child_get_inverse_matrix(Scene *scene, Object *ob, bConstraint *con,
                        BLI_assert(BLI_findindex(&ob->constraints, con) != -1);
 
                        /* use BKE_object_workob_calc_parent to find inverse - just like for normal parenting */
-                       BKE_object_workob_calc_parent(scene, ob, &workob);
+                       BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob);
                        invert_m4_m4(invmat, workob.obmat);
                }
        }
@@ -875,7 +884,7 @@ static int childof_set_inverse_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       child_get_inverse_matrix(scene, ob, con, data->invmat, owner);
+       child_get_inverse_matrix(C, scene, ob, con, data->invmat, owner);
 
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob);
 
@@ -1097,7 +1106,7 @@ static int objectsolver_set_inverse_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       child_get_inverse_matrix(scene, ob, con, data->invmat, owner);
+       child_get_inverse_matrix(C, scene, ob, con, data->invmat, owner);
 
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob);
 
@@ -1198,9 +1207,9 @@ void ED_object_constraint_update(Main *bmain, Object *ob)
        object_test_constraints(bmain, ob);
 
        if (ob->type == OB_ARMATURE)
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
        else
-               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_OB);
 }
 
 static void object_pose_tag_update(Main *bmain, Object *ob)
@@ -1223,7 +1232,7 @@ void ED_object_constraint_dependency_update(Main *bmain, Object *ob)
        if (ob->pose) {
                object_pose_tag_update(bmain, ob);
        }
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 }
 
 void ED_object_constraint_tag_update(Main *bmain, Object *ob, bConstraint *con)
@@ -1235,9 +1244,14 @@ void ED_object_constraint_tag_update(Main *bmain, Object *ob, bConstraint *con)
        object_test_constraint(bmain, ob, con);
 
        if (ob->type == OB_ARMATURE)
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
        else
-               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_OB);
+
+       /* Do Copy-on-Write tag here too, otherwise constraint
+        * influence/mute buttons in UI have no effect
+        */
+       DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
 }
 
 void ED_object_constraint_dependency_tag_update(Main *bmain, Object *ob, bConstraint *con)
@@ -1247,7 +1261,7 @@ void ED_object_constraint_dependency_tag_update(Main *bmain, Object *ob, bConstr
        if (ob->pose) {
                object_pose_tag_update(bmain, ob);
        }
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 }
 
 static int constraint_poll(bContext *C)
@@ -1272,7 +1286,7 @@ static int constraint_delete_exec(bContext *C, wmOperator *UNUSED(op))
                ED_object_constraint_update(bmain, ob); /* needed to set the flags on posebones correctly */
 
                /* relatiols */
-               DAG_relations_tag_update(CTX_data_main(C));
+               DEG_relations_tag_update(CTX_data_main(C));
 
                /* notifiers */
                WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
@@ -1414,12 +1428,12 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
        CTX_DATA_END;
 
        /* force depsgraph to get recalculated since relationships removed */
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 
        /* note, calling BIK_clear_data() isn't needed here */
 
        /* do updates */
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
 
        return OPERATOR_FINISHED;
@@ -1446,12 +1460,12 @@ static int object_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
        {
                BKE_constraints_free(&ob->constraints);
-               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_OB);
        }
        CTX_DATA_END;
 
        /* force depsgraph to get recalculated since relationships removed */
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 
        /* do updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, NULL);
@@ -1499,13 +1513,13 @@ static int pose_constraint_copy_exec(bContext *C, wmOperator *op)
                        chan->constflag |= pchan->constflag;
 
                        BKE_pose_tag_recalc(bmain, ob->pose);
-                       DAG_id_tag_update((ID *)ob, OB_RECALC_DATA);
+                       DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
                }
        }
        BLI_freelistN(&lb);
 
        /* force depsgraph to get recalculated since new relationships added */
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, NULL);
 
@@ -1538,13 +1552,13 @@ static int object_constraint_copy_exec(bContext *C, wmOperator *UNUSED(op))
                /* if we're not handling the object we're copying from, copy all constraints over */
                if (obact != ob) {
                        BKE_constraints_copy(&ob->constraints, &obact->constraints, true);
-                       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+                       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                }
        }
        CTX_DATA_END;
 
        /* force depsgraph to get recalculated since new relationships added */
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 
        /* notifiers for updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_ADDED, NULL);
@@ -1614,11 +1628,6 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
                        only_ob = true;
                        add = false;
                        break;
-
-               /* object only - add here is ok? */
-               case CONSTRAINT_TYPE_RIGIDBODYJOINT:
-                       only_ob = true;
-                       break;
        }
 
        /* if the active Object is Armature, and we can search for bones, do so... */
@@ -1685,14 +1694,15 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
        if ((found == false) && (add)) {
                Main *bmain = CTX_data_main(C);
                Scene *scene = CTX_data_scene(C);
-               Base *base = BASACT, *newbase = NULL;
+               ViewLayer *view_layer = CTX_data_view_layer(C);
+               Base *base = BASACT(view_layer), *newbase = NULL;
                Object *obt;
 
                /* add new target object */
-               obt = BKE_object_add(bmain, scene, OB_EMPTY, NULL);
+               obt = BKE_object_add(bmain, scene, view_layer, OB_EMPTY, NULL);
 
                /* set layers OK */
-               newbase = BASACT;
+               newbase = BASACT(view_layer);
                newbase->lay = base->lay;
                obt->lay = newbase->lay;
 
@@ -1711,8 +1721,8 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
                }
 
                /* restore, BKE_object_add sets active */
-               BASACT = base;
-               base->flag |= SELECT;
+               BASACT(view_layer) = base;
+               base->flag |= BASE_SELECTED;
 
                /* make our new target the new object */
                *tar_ob = obt;
@@ -1746,10 +1756,6 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
        if (type == CONSTRAINT_TYPE_NULL) {
                return OPERATOR_CANCELLED;
        }
-       if ((type == CONSTRAINT_TYPE_RIGIDBODYJOINT) && (list != &ob->constraints)) {
-               BKE_report(op->reports, RPT_ERROR, "Rigid Body Joint constraint can only be added to objects");
-               return OPERATOR_CANCELLED;
-       }
        if ((type == CONSTRAINT_TYPE_KINEMATIC) && ((!pchan) || (list != &pchan->constraints))) {
                BKE_report(op->reports, RPT_ERROR, "IK constraint can only be added to bones");
                return OPERATOR_CANCELLED;
@@ -1820,7 +1826,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
 
 
        /* force depsgraph to get recalculated since new relationships added */
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 
        if ((ob->type == OB_ARMATURE) && (pchan)) {
                BKE_pose_tag_recalc(bmain, ob->pose);  /* sort pose channels */
@@ -1830,10 +1836,10 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
                         * XXX Temp hack until new depsgraph hopefully solves this. */
                        ob->adt->recalc |= ADT_RECALC_ANIM;
                }
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
        }
        else
-               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+               DEG_id_tag_update(&ob->id, OB_RECALC_OB);
 
        /* notifiers for updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_ADDED, ob);
@@ -2073,7 +2079,7 @@ static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
        CTX_DATA_END;
 
        /* refresh depsgraph */
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
 
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);