code cleanup: rename BKE_tessmesh -> BKE_editmesh, rename EditDerivedBMesh.tc ->...
[blender-staging.git] / source / blender / editors / object / object_relations.c
index 58c6959d6f02c8851b0e92d7c1131c5493087a41..5a688d7daf388c5ce59a91627727c4ff5d85478c 100644 (file)
@@ -35,6 +35,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_anim_types.h"
+#include "DNA_armature_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_group_types.h"
@@ -55,6 +56,8 @@
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
 
+#include "BLF_translation.h"
+
 #include "BKE_action.h"
 #include "BKE_animsys.h"
 #include "BKE_armature.h"
@@ -82,7 +85,7 @@
 #include "BKE_scene.h"
 #include "BKE_speaker.h"
 #include "BKE_texture.h"
-#include "BKE_tessmesh.h"
+#include "BKE_editmesh.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -212,7 +215,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
                }
        }
        
-       if (v4 || !((v1 && v2 == 0 && v3 == 0) || (v1 && v2 && v3)) ) {
+       if (v4 || !((v1 && v2 == 0 && v3 == 0) || (v1 && v2 && v3))) {
                BKE_report(op->reports, RPT_ERROR, "Select either 1 or 3 vertices to parent to");
                return OPERATOR_CANCELLED;
        }
@@ -220,7 +223,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
        {
                if (ob != obedit) {
-                       ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                       DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                        par = obedit->parent;
                        
                        while (par) {
@@ -257,7 +260,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
        
-       DAG_scene_sort(bmain, scene);
+       DAG_relations_tag_update(bmain);
 
        WM_event_add_notifier(C, NC_OBJECT, NULL);
 
@@ -283,7 +286,7 @@ void OBJECT_OT_vertex_parent_set(wmOperatorType *ot)
 /********************** Make Proxy Operator *************************/
 
 /* set the object to proxify */
-static int make_proxy_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+static int make_proxy_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
        Scene *scene = CTX_data_scene(C);
        Object *ob = ED_object_active_context(C);
@@ -296,12 +299,12 @@ static int make_proxy_invoke(bContext *C, wmOperator *op, wmEvent *evt)
        if (ob->dup_group && ob->dup_group->id.lib) {
                /* gives menu with list of objects in group */
                //proxy_group_objects_menu(C, op, ob, ob->dup_group);
-               WM_enum_search_invoke(C, op, evt);
+               WM_enum_search_invoke(C, op, event);
                return OPERATOR_CANCELLED;
 
        }
        else if (ob->id.lib) {
-               uiPopupMenu *pup = uiPupMenuBegin(C, "OK?", ICON_QUESTION);
+               uiPopupMenu *pup = uiPupMenuBegin(C, IFACE_("OK?"), ICON_QUESTION);
                uiLayout *layout = uiPupMenuLayout(pup);
                
                /* create operator menu item with relevant properties filled in */
@@ -354,14 +357,14 @@ static int make_proxy_exec(bContext *C, wmOperator *op)
                
                /* remove base, leave user count of object, it gets linked in BKE_object_make_proxy */
                if (gob == NULL) {
-                       BLI_remlink(&scene->base, oldbase);
+                       BKE_scene_base_unlink(scene, oldbase);
                        MEM_freeN(oldbase);
                }
                
                BKE_object_make_proxy(newob, ob, gob);
                
                /* depsgraph flushes are needed for the new data */
-               DAG_scene_sort(bmain, scene);
+               DAG_relations_tag_update(bmain);
                DAG_id_tag_update(&newob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, newob);
        }
@@ -509,14 +512,13 @@ void ED_object_parent_clear(Object *ob, int type)
                break;
        }
        
-       ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+       DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 }
 
 /* note, poll should check for editable scene */
 static int parent_clear_exec(bContext *C, wmOperator *op)
 {
        Main *bmain = CTX_data_main(C);
-       Scene *scene = CTX_data_scene(C);
        int type = RNA_enum_get(op->ptr, "type");
 
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
@@ -525,8 +527,7 @@ static int parent_clear_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
 
-       DAG_scene_sort(bmain, scene);
-       DAG_ids_flush_update(bmain, 0);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
        WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
        return OPERATOR_FINISHED;
@@ -548,7 +549,7 @@ void OBJECT_OT_parent_clear(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
        
-       ot->prop = RNA_def_enum(ot->srna, "type", prop_clear_parent_types, 0, "Type", "");
+       ot->prop = RNA_def_enum(ot->srna, "type", prop_clear_parent_types, CLEAR_PARENT_ALL, "Type", "");
 }
 
 /* ******************** Make Parent Operator *********************** */
@@ -578,6 +579,7 @@ EnumPropertyItem prop_make_parent_types[] = {
        {PAR_ARMATURE_AUTO, "ARMATURE_AUTO", 0, "   With Automatic Weights", ""},
        {PAR_ARMATURE_ENVELOPE, "ARMATURE_ENVELOPE", 0, "   With Envelope Weights", ""},
        {PAR_BONE, "BONE", 0, "Bone", ""},
+       {PAR_BONE_RELATIVE, "BONE_RELATIVE", 0, "Bone Relative", ""},
        {PAR_CURVE, "CURVE", 0, "Curve Deform", ""},
        {PAR_FOLLOW, "FOLLOW", 0, "Follow Path", ""},
        {PAR_PATH_CONST, "PATH_CONST", 0, "Path Constraint", ""},
@@ -593,7 +595,7 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
        bPoseChannel *pchan = NULL;
        int pararm = ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO);
        
-       par->recalc |= OB_RECALC_OB;
+       DAG_id_tag_update(&par->id, OB_RECALC_OB);
        
        /* preconditions */
        if (partype == PAR_FOLLOW || partype == PAR_PATH_CONST) {
@@ -606,8 +608,10 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
                                cu->flag |= CU_PATH | CU_FOLLOW;
                                BKE_displist_make_curveTypes(scene, par, 0);  /* force creation of path data */
                        }
-                       else cu->flag |= CU_FOLLOW;
-                       
+                       else {
+                               cu->flag |= CU_FOLLOW;
+                       }
+
                        /* if follow, add F-Curve for ctime (i.e. "eval_time") so that path-follow works */
                        if (partype == PAR_FOLLOW) {
                                /* get or create F-Curve */
@@ -624,7 +628,7 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
                                partype = PAR_OBJECT;
                }
        }
-       else if (partype == PAR_BONE) {
+       else if (ELEM(partype, PAR_BONE, PAR_BONE_RELATIVE)) {
                pchan = BKE_pose_channel_active(par);
                
                if (pchan == NULL) {
@@ -643,8 +647,8 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
 
                        /* apply transformation of previous parenting */
                        if (keep_transform) {
-                                /* was removed because of bug [#23577],
-                                 * but this can be handy in some cases too [#32616], so make optional */
+                               /* was removed because of bug [#23577],
+                                * but this can be handy in some cases too [#32616], so make optional */
                                BKE_object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
                        }
 
@@ -705,8 +709,16 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
                                        }
                                }
                        }
-                       else if (partype == PAR_BONE)
+                       else if (partype == PAR_BONE) {
+                               ob->partype = PARBONE;  /* note, dna define, not operator property */
+                               if (pchan->bone)
+                                       pchan->bone->flag &= ~BONE_RELATIVE_PARENTING;
+                       }
+                       else if (partype == PAR_BONE_RELATIVE) {
                                ob->partype = PARBONE;  /* note, dna define, not operator property */
+                               if (pchan->bone)
+                                       pchan->bone->flag |= BONE_RELATIVE_PARENTING;
+                       }
                        else
                                ob->partype = PAROBJECT;  /* note, dna define, not operator property */
                        
@@ -716,12 +728,12 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
                                bFollowPathConstraint *data;
                                float cmat[4][4], vec[3];
                                
-                               con = add_ob_constraint(ob, "AutoPath", CONSTRAINT_TYPE_FOLLOWPATH);
+                               con = BKE_add_ob_constraint(ob, "AutoPath", CONSTRAINT_TYPE_FOLLOWPATH);
                                
                                data = con->data;
                                data->tar = par;
                                
-                               get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra);
+                               BKE_get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra);
                                sub_v3_v3v3(vec, ob->obmat[3], cmat[3]);
                                
                                ob->loc[0] = vec[0];
@@ -750,7 +762,7 @@ int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object
                                invert_m4_m4(ob->parentinv, workob.obmat);
                        }
                        
-                       ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
+                       DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
                }
        }
 
@@ -779,8 +791,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
        if (!ok)
                return OPERATOR_CANCELLED;
 
-       DAG_scene_sort(bmain, scene);
-       DAG_ids_flush_update(bmain, 0);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
        WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
 
@@ -788,10 +799,10 @@ static int parent_set_exec(bContext *C, wmOperator *op)
 }
 
 
-static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
+static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
 {
        Object *ob = ED_object_active_context(C);
-       uiPopupMenu *pup = uiPupMenuBegin(C, "Set Parent To", ICON_NONE);
+       uiPopupMenu *pup = uiPupMenuBegin(C, IFACE_("Set Parent To"), ICON_NONE);
        uiLayout *layout = uiPupMenuLayout(pup);
 
        wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_parent_set", TRUE);
@@ -800,11 +811,12 @@ static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSE
 #if 0
        uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_OBJECT);
 #else
-       opptr = uiItemFullO_ptr(layout, ot, "Object", ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       opptr = uiItemFullO_ptr(layout, ot, IFACE_("Object"), ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
        RNA_enum_set(&opptr, "type", PAR_OBJECT);
        RNA_boolean_set(&opptr, "keep_transform", FALSE);
 
-       opptr = uiItemFullO_ptr(layout, ot, "Object (Keep Transform)", ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       opptr = uiItemFullO_ptr(layout, ot, IFACE_("Object (Keep Transform)"), ICON_NONE, NULL, WM_OP_EXEC_DEFAULT,
+                               UI_ITEM_O_RETURN_PROPS);
        RNA_enum_set(&opptr, "type", PAR_OBJECT);
        RNA_boolean_set(&opptr, "keep_transform", TRUE);
 #endif
@@ -815,6 +827,7 @@ static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSE
                uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_ARMATURE_ENVELOPE);
                uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_ARMATURE_AUTO);
                uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_BONE);
+               uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_BONE_RELATIVE);
        }
        else if (ob->type == OB_CURVE) {
                uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_CURVE);
@@ -830,20 +843,20 @@ static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSE
        return OPERATOR_CANCELLED;
 }
 
-static int parent_set_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+static bool parent_set_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
 {
        const char *prop_id = RNA_property_identifier(prop);
        int type = RNA_enum_get(ptr, "type");
 
        /* Only show XMirror for PAR_ARMATURE_ENVELOPE and PAR_ARMATURE_AUTO! */
-       if (strcmp(prop_id, "xmirror") == 0) {
+       if (STREQ(prop_id, "xmirror")) {
                if (ELEM(type, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO))
-                       return TRUE;
+                       return true;
                else
-                       return FALSE;
+                       return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static void parent_set_ui(bContext *C, wmOperator *op)
@@ -889,7 +902,7 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op)
        Main *bmain = CTX_data_main(C);
        Object *par = ED_object_active_context(C);
        
-       par->recalc |= OB_RECALC_OB;
+       DAG_id_tag_update(&par->id, OB_RECALC_OB);
        
        /* context iterator */
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
@@ -904,7 +917,7 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op)
                                memset(ob->loc, 0, 3 * sizeof(float));
                                
                                /* set recalc flags */
-                               ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
                                
                                /* set parenting type for object - object only... */
                                ob->parent = par;
@@ -914,8 +927,7 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
        
-       DAG_scene_sort(bmain, CTX_data_scene(C));
-       DAG_ids_flush_update(bmain, 0);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
        
        return OPERATOR_FINISHED;
@@ -941,7 +953,6 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot)
 
 static int object_slow_parent_clear_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
 
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
@@ -951,13 +962,12 @@ static int object_slow_parent_clear_exec(bContext *C, wmOperator *UNUSED(op))
                                ob->partype -= PARSLOW;
                                BKE_object_where_is_calc(scene, ob);
                                ob->partype |= PARSLOW;
-                               ob->recalc |= OB_RECALC_OB;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
                        }
                }
        }
        CTX_DATA_END;
 
-       DAG_ids_flush_update(bmain, 0);
        WM_event_add_notifier(C, NC_SCENE, scene);
        
        return OPERATOR_FINISHED;
@@ -984,7 +994,6 @@ void OBJECT_OT_slow_parent_clear(wmOperatorType *ot)
 
 static int object_slow_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
 
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
@@ -992,12 +1001,11 @@ static int object_slow_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
                if (ob->parent)
                        ob->partype |= PARSLOW;
 
-               ob->recalc |= OB_RECALC_OB;
+               DAG_id_tag_update(&ob->id, OB_RECALC_OB);
                
        }
        CTX_DATA_END;
 
-       DAG_ids_flush_update(bmain, 0);
        WM_event_add_notifier(C, NC_SCENE, scene);
        
        return OPERATOR_FINISHED;
@@ -1032,7 +1040,6 @@ static EnumPropertyItem prop_clear_track_types[] = {
 static int object_track_clear_exec(bContext *C, wmOperator *op)
 {
        Main *bmain = CTX_data_main(C);
-       Scene *scene = CTX_data_scene(C);
        int type = RNA_enum_get(op->ptr, "type");
 
        if (CTX_data_edit_object(C)) {
@@ -1045,13 +1052,13 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
                
                /* remove track-object for old track */
                ob->track = NULL;
-               ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+               DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                
                /* also remove all tracking constraints */
                for (con = ob->constraints.last; con; con = pcon) {
                        pcon = con->prev;
                        if (ELEM3(con->type, CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_DAMPTRACK))
-                               remove_constraint(&ob->constraints, con);
+                               BKE_remove_constraint(&ob->constraints, con);
                }
                
                if (type == 1)
@@ -1059,8 +1066,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
 
-       DAG_ids_flush_update(bmain, 0);
-       DAG_scene_sort(bmain, scene);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
 
        return OPERATOR_FINISHED;
@@ -1069,7 +1075,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
 void OBJECT_OT_track_clear(wmOperatorType *ot)
 {
        /* identifiers */
-       ot->name = "Clear track";
+       ot->name = "Clear Track";
        ot->description = "Clear tracking constraint or flag from object";
        ot->idname = "OBJECT_OT_track_clear";
        
@@ -1097,7 +1103,6 @@ static EnumPropertyItem prop_make_track_types[] = {
 static int track_set_exec(bContext *C, wmOperator *op)
 {
        Main *bmain = CTX_data_main(C);
-       Scene *scene = CTX_data_scene(C);
        Object *obact = ED_object_active_context(C);
        
        int type = RNA_enum_get(op->ptr, "type");
@@ -1109,11 +1114,11 @@ static int track_set_exec(bContext *C, wmOperator *op)
                CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
                {
                        if (ob != obact) {
-                               con = add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_DAMPTRACK);
+                               con = BKE_add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_DAMPTRACK);
 
                                data = con->data;
                                data->tar = obact;
-                               ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                                
                                /* Lamp, Camera and Speaker track differently by default */
                                if (ob->type == OB_LAMP || ob->type == OB_CAMERA || ob->type == OB_SPEAKER)
@@ -1129,11 +1134,11 @@ static int track_set_exec(bContext *C, wmOperator *op)
                CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
                {
                        if (ob != obact) {
-                               con = add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_TRACKTO);
+                               con = BKE_add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_TRACKTO);
 
                                data = con->data;
                                data->tar = obact;
-                               ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                                
                                /* Lamp, Camera and Speaker track differently by default */
                                if (ob->type == OB_LAMP || ob->type == OB_CAMERA || ob->type == OB_SPEAKER) {
@@ -1151,11 +1156,11 @@ static int track_set_exec(bContext *C, wmOperator *op)
                CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
                {
                        if (ob != obact) {
-                               con = add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_LOCKTRACK);
+                               con = BKE_add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_LOCKTRACK);
 
                                data = con->data;
                                data->tar = obact;
-                               ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                                
                                /* Lamp, Camera and Speaker track differently by default */
                                if (ob->type == OB_LAMP || ob->type == OB_CAMERA || ob->type == OB_SPEAKER) {
@@ -1167,8 +1172,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
                CTX_DATA_END;
        }
        
-       DAG_scene_sort(bmain, scene);
-       DAG_ids_flush_update(bmain, 0);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
        
        return OPERATOR_FINISHED;
@@ -1225,7 +1229,7 @@ static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
        return lay;
 }
 
-static int move_to_layer_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int move_to_layer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
        View3D *v3d = CTX_wm_view3d(C);
        if (v3d && v3d->localvd) {
@@ -1283,7 +1287,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, scene);
        WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene);
 
-       DAG_scene_sort(bmain, scene);
+       DAG_relations_tag_update(bmain);
 
        return OPERATOR_FINISHED;
 }
@@ -1346,7 +1350,6 @@ Base *ED_object_scene_link(Scene *scene, Object *ob)
 
 static int make_links_scene_exec(bContext *C, wmOperator *op)
 {
-       Main *bmain = CTX_data_main(C);
        Scene *scene_to = BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene"));
 
        if (scene_to == NULL) {
@@ -1370,8 +1373,6 @@ static int make_links_scene_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
 
-       DAG_ids_flush_update(bmain, 0);
-
        /* redraw the 3D view because the object center points are colored differently */
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
 
@@ -1462,7 +1463,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
                                                /* if amount of material indices changed: */
                                                test_object_materials(ob_dst->data);
 
-                                               ob_dst->recalc |= OB_RECALC_DATA;
+                                               DAG_id_tag_update(&ob_dst->id, OB_RECALC_DATA);
                                                break;
                                        case MAKE_LINKS_MATERIALS:
                                                /* new approach, using functions from kernel */
@@ -1485,7 +1486,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
                                                /* now add in the groups from the link nodes */
                                                for (group_node = ob_groups; group_node; group_node = group_node->next) {
                                                        if (ob_dst->dup_group != group_node->link) {
-                                                               add_to_group(group_node->link, ob_dst, scene, base_dst);
+                                                               BKE_group_object_add(group_node->link, ob_dst, scene, base_dst);
                                                        }
                                                        else {
                                                                is_cycle = TRUE;
@@ -1501,7 +1502,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
                                                break;
                                        case MAKE_LINKS_MODIFIERS:
                                                BKE_object_link_modifiers(ob_dst, ob_src);
-                                               ob_dst->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                                               DAG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                                                break;
                                        case MAKE_LINKS_FONTS:
                                        {
@@ -1521,7 +1522,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
                                                cu_dst->vfontbi = cu_src->vfontbi;
                                                id_us_plus((ID *)cu_dst->vfontbi);
 
-                                               ob_dst->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+                                               DAG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                                                break;
                                        }
                                }
@@ -1540,10 +1541,10 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
                }
        }
 
-       DAG_scene_sort(bmain, scene);
-       
-       DAG_ids_flush_update(bmain, 0);
+       DAG_relations_tag_update(bmain);
        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C));
+       WM_event_add_notifier(C, NC_OBJECT, NULL);
+
        return OPERATOR_FINISHED;
 }
 
@@ -1692,7 +1693,7 @@ static void single_obdata_users(Main *bmain, Scene *scene, int flag)
                        id = ob->data;
                        
                        if (id && id->us > 1 && id->lib == NULL) {
-                               ob->recalc = OB_RECALC_DATA;
+                               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
                                
                                BKE_copy_animdata_id_action(id);
                                
@@ -1728,7 +1729,7 @@ static void single_obdata_users(Main *bmain, Scene *scene, int flag)
                                                ob->data = BKE_lattice_copy(ob->data);
                                                break;
                                        case OB_ARMATURE:
-                                               ob->recalc |= OB_RECALC_DATA;
+                                               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
                                                ob->data = BKE_armature_copy(ob->data);
                                                BKE_pose_rebuild(ob, ob->data);
                                                break;
@@ -1764,7 +1765,7 @@ static void single_object_action_users(Scene *scene, int flag)
        for (base = FIRSTBASE; base; base = base->next) {
                ob = base->object;
                if (ob->id.lib == NULL && (flag == 0 || (base->flag & SELECT)) ) {
-                       ob->recalc = OB_RECALC_DATA;
+                       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
                        BKE_copy_animdata_id_action(&ob->id);
                }
        }
@@ -1930,11 +1931,11 @@ static void make_local_makelocalmaterial(Material *ma)
        AnimData *adt;
        int b;
        
-       id_make_local(&ma->id, 0);
+       id_make_local(&ma->id, false);
        
        for (b = 0; b < MAX_MTEX; b++)
                if (ma->mtex[b] && ma->mtex[b]->tex)
-                       id_make_local(&ma->mtex[b]->tex->id, 0);
+                       id_make_local(&ma->mtex[b]->tex->id, false);
        
        adt = BKE_animdata_from_id(&ma->id);
        if (adt) BKE_animdata_make_local(adt);
@@ -1960,7 +1961,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
        int a, b, mode = RNA_enum_get(op->ptr, "type");
        
        if (mode == MAKE_LOCAL_ALL) {
-               BKE_library_make_local(bmain, NULL, 0); /* NULL is all libs */
+               BKE_library_make_local(bmain, NULL, false); /* NULL is all libs */
                WM_event_add_notifier(C, NC_WINDOW, NULL);
                return OPERATOR_FINISHED;
        }
@@ -1970,7 +1971,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
        CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
        {
                if (ob->id.lib)
-                       id_make_local(&ob->id, 0);
+                       id_make_local(&ob->id, false);
        }
        CTX_DATA_END;
        
@@ -1988,7 +1989,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
                id = ob->data;
                        
                if (id && (ELEM(mode, MAKE_LOCAL_SELECT_OBDATA, MAKE_LOCAL_SELECT_OBDATA_MATERIAL))) {
-                       id_make_local(id, 0);
+                       id_make_local(id, false);
                        adt = BKE_animdata_from_id(id);
                        if (adt) BKE_animdata_make_local(adt);
                        
@@ -2004,7 +2005,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
                }
 
                for (psys = ob->particlesystem.first; psys; psys = psys->next)
-                       id_make_local(&psys->part->id, 0);
+                       id_make_local(&psys->part->id, false);
 
                adt = BKE_animdata_from_id(&ob->id);
                if (adt) BKE_animdata_make_local(adt);
@@ -2019,7 +2020,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
 
                                for (b = 0; b < MAX_MTEX; b++)
                                        if (la->mtex[b] && la->mtex[b]->tex)
-                                               id_make_local(&la->mtex[b]->tex->id, 0);
+                                               id_make_local(&la->mtex[b]->tex->id, false);
                        }
                        else {
                                for (a = 0; a < ob->totcol; a++) {
@@ -2132,9 +2133,8 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
        RNA_def_boolean(ot->srna, "animation", 0, "Object Animation", "Make animation data local to each object");
 }
 
-static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
-       Main *bmain = CTX_data_main(C);
        Base *base = ED_view3d_give_base_under_cursor(C, event->mval);
        Material *ma;
        char name[MAX_ID_NAME - 2];
@@ -2146,9 +2146,8 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *even
        
        assign_material(base->object, ma, 1, BKE_MAT_ASSIGN_USERPREF);
        
-       DAG_ids_flush_update(bmain, 0);
        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C));
-       WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING, ma);
+       WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, ma);
        
        return OPERATOR_FINISHED;
 }
@@ -2168,7 +2167,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
        ot->poll = ED_operator_objectmode;
        
        /* flags */
-       ot->flag = OPTYPE_UNDO;
+       ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL;
        
        /* properties */
        RNA_def_string(ot->srna, "name", "Material", MAX_ID_NAME - 2, "Name", "Material name to assign");