Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / armature / pose_select.c
index f0dc680..75fd952 100644 (file)
@@ -103,9 +103,9 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
        // XXX: actually, we can probably still get away with no object - at most we have no updates
        if (ELEM(NULL, ob, ob->pose, pchan, pchan->bone))
                return;
-       
+
        arm = ob->data;
-       
+
        /* can only change selection state if bone can be modified */
        if (PBONE_SELECTABLE(arm, pchan->bone)) {
                /* change selection state - activate too if selected */
@@ -117,19 +117,19 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
                        pchan->bone->flag &= ~BONE_SELECTED;
                        arm->act_bone = NULL;
                }
-               
+
                // TODO: select and activate corresponding vgroup?
-               
-               /* tag necessary depsgraph updates 
+
+               /* tag necessary depsgraph updates
                 * (see rna_Bone_select_update() in rna_armature.c for details)
                 */
                if (arm->flag & ARM_HAS_VIZ_DEPS) {
                        DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                }
-               
+
                /* send necessary notifiers */
                WM_main_add_notifier(NC_GEOM | ND_DATA, ob);
-               
+
                /* tag armature for copy-on-write update (since act_bone is in armature not object) */
                DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
        }
@@ -143,7 +143,7 @@ bool ED_armature_pose_select_pick_with_buffer(
 {
        Object *ob = base->object;
        Bone *nearBone;
-       
+
        if (!ob || !ob->pose) return 0;
 
        Object *ob_act = OBACT(view_layer);
@@ -152,11 +152,11 @@ bool ED_armature_pose_select_pick_with_buffer(
        /* Callers happen to already get the active base */
        Base *base_dummy = NULL;
        nearBone = get_bone_from_selectbuffer(&base, 1, obedit != NULL, buffer, hits, 1, do_nearest, &base_dummy);
-       
+
        /* if the bone cannot be affected, don't do anything */
        if ((nearBone) && !(nearBone->flag & BONE_UNSELECTABLE)) {
                bArmature *arm = ob->data;
-               
+
                /* since we do unified select, we don't shift+select a bone if the
                 * armature object was not active yet.
                 * note, special exception for armature mode so we can do multi-select
@@ -205,7 +205,7 @@ bool ED_armature_pose_select_pick_with_buffer(
                                }
                        }
                }
-               
+
                if (ob_act) {
                        /* in weightpaint we select the associated vertex group too */
                        if (ob_act->mode & OB_MODE_WEIGHT_PAINT) {
@@ -214,21 +214,21 @@ bool ED_armature_pose_select_pick_with_buffer(
                                        DEG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
                                }
                        }
-                       /* if there are some dependencies for visualizing armature state 
-                        * (e.g. Mask Modifier in 'Armature' mode), force update 
+                       /* if there are some dependencies for visualizing armature state
+                        * (e.g. Mask Modifier in 'Armature' mode), force update
                         */
                        else if (arm->flag & ARM_HAS_VIZ_DEPS) {
-                               /* NOTE: ob not ob_act here is intentional - it's the source of the 
+                               /* NOTE: ob not ob_act here is intentional - it's the source of the
                                 *       bones being selected  [T37247]
                                 */
                                DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                        }
-                       
+
                        /* tag armature for copy-on-write update (since act_bone is in armature not object) */
                        DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
                }
        }
-       
+
        return nearBone != NULL;
 }
 
@@ -238,12 +238,12 @@ void ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibil
 {
        bArmature *arm = ob->data;
        bPoseChannel *pchan;
-       
+
        /* we call this from outliner too */
        if (ob->pose == NULL) {
                return;
        }
-       
+
        /* Determine if we're selecting or deselecting */
        if (select_mode == SEL_TOGGLE) {
                select_mode = SEL_SELECT;
@@ -256,7 +256,7 @@ void ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibil
                        }
                }
        }
-       
+
        /* Set the flags accordingly */
        for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
                /* ignore the pchan if it isn't visible or if its selection cannot be changed */
@@ -300,9 +300,9 @@ void ED_pose_deselect_all_multi(Object **objects, uint objects_len, int select_m
        for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
                Object *ob_iter = objects[ob_index];
                bArmature *arm = ob_iter->data;
-               
+
                ED_pose_deselect_all(ob_iter, select_mode, ignore_visibility);
-               
+
                /* if there are some dependencies for visualizing armature state
                 * (e.g. Mask Modifier in 'Armature' mode), force update
                 */
@@ -312,7 +312,7 @@ void ED_pose_deselect_all_multi(Object **objects, uint objects_len, int select_m
                         */
                        DEG_id_tag_update(&ob_iter->id, OB_RECALC_DATA);
                }
-               
+
                /* need to tag armature for cow updates, or else selection doesn't update */
                DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
        }
@@ -323,16 +323,16 @@ void ED_pose_deselect_all_multi(Object **objects, uint objects_len, int select_m
 static void selectconnected_posebonechildren(Object *ob, Bone *bone, int extend)
 {
        Bone *curBone;
-       
+
        /* stop when unconnected child is encountered, or when unselectable bone is encountered */
        if (!(bone->flag & BONE_CONNECTED) || (bone->flag & BONE_UNSELECTABLE))
                return;
-       
+
        if (extend)
                bone->flag &= ~BONE_SELECTED;
        else
                bone->flag |= BONE_SELECTED;
-       
+
        for (curBone = bone->childbase.first; curBone; curBone = curBone->next)
                selectconnected_posebonechildren(ob, curBone, extend);
 }
@@ -353,7 +353,7 @@ static int pose_select_connected_invoke(bContext *C, wmOperator *op, const wmEve
                return OPERATOR_CANCELLED;
 
        bArmature *arm = base->object->data;
-       
+
        /* Select parents */
        for (curBone = bone; curBone; curBone = next) {
                /* ignore bone if cannot be selected */
@@ -362,7 +362,7 @@ static int pose_select_connected_invoke(bContext *C, wmOperator *op, const wmEve
                                curBone->flag &= ~BONE_SELECTED;
                        else
                                curBone->flag |= BONE_SELECTED;
-                       
+
                        if (curBone->flag & BONE_CONNECTED)
                                next = curBone->parent;
                        else
@@ -371,19 +371,19 @@ static int pose_select_connected_invoke(bContext *C, wmOperator *op, const wmEve
                else
                        next = NULL;
        }
-       
+
        /* Select children */
        for (curBone = bone->childbase.first; curBone; curBone = next)
                selectconnected_posebonechildren(base->object, curBone, extend);
-       
+
        /* updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, base->object);
-       
+
        if (arm->flag & ARM_HAS_VIZ_DEPS) {
                /* mask modifier ('armature' mode), etc. */
                DEG_id_tag_update(&base->object->id, OB_RECALC_DATA);
        }
-       
+
        /* need to tag armature for cow updates, or else selection doesn't update */
        DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
 
@@ -401,15 +401,15 @@ void POSE_OT_select_linked(wmOperatorType *ot)
        ot->name = "Select Connected";
        ot->idname = "POSE_OT_select_linked";
        ot->description = "Select bones related to selected ones by parent/child relationships";
-       
+
        /* callbacks */
        /* leave 'exec' unset */
        ot->invoke = pose_select_connected_invoke;
        ot->poll = pose_select_linked_poll;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-       
+
        /* props */
        RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
 }
@@ -419,7 +419,7 @@ void POSE_OT_select_linked(wmOperatorType *ot)
 static int pose_de_select_all_exec(bContext *C, wmOperator *op)
 {
        int action = RNA_enum_get(op->ptr, "action");
-       
+
        Scene *scene = CTX_data_scene(C);
        int multipaint = scene->toolsettings->multipaint;
 
@@ -428,7 +428,7 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
        }
 
        Object *ob_prev = NULL;
-       
+
        /*      Set the flags */
        CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
        {
@@ -458,14 +458,14 @@ void POSE_OT_select_all(wmOperatorType *ot)
        ot->name = "(De)select All";
        ot->idname = "POSE_OT_select_all";
        ot->description = "Toggle selection status of all bones";
-       
+
        /* api callbacks */
        ot->exec = pose_de_select_all_exec;
        ot->poll = ED_operator_posemode;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-       
+
        WM_operator_properties_select_all(ot);
 }
 
@@ -546,10 +546,10 @@ static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op
                                const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
                                ListBase targets = {NULL, NULL};
                                bConstraintTarget *ct;
-                               
+
                                if (cti && cti->get_constraint_targets) {
                                        cti->get_constraint_targets(con, &targets);
-                                       
+
                                        for (ct = targets.first; ct; ct = ct->next) {
                                                if ((ct->tar == ob) && (ct->subtarget[0])) {
                                                        bPoseChannel *pchanc = BKE_pose_channel_find_name(ob->pose, ct->subtarget);
@@ -571,7 +571,7 @@ static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op
                                                        }
                                                }
                                        }
-                                       
+
                                        if (cti->flush_constraint_targets)
                                                cti->flush_constraint_targets(con, &targets, 1);
                                }
@@ -579,10 +579,10 @@ static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op
                }
        }
        CTX_DATA_END;
-       
+
        if (!found)
                return OPERATOR_CANCELLED;
-       
+
        return OPERATOR_FINISHED;
 }
 
@@ -592,11 +592,11 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
        ot->name = "Select Constraint Target";
        ot->idname = "POSE_OT_select_constraint_target";
        ot->description = "Select bones used as targets for the currently selected bones";
-       
+
        /* api callbacks */
        ot->exec = pose_select_constraint_target_exec;
        ot->poll = ED_operator_posemode;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
@@ -611,7 +611,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
        int direction = RNA_enum_get(op->ptr, "direction");
        const bool add_to_sel = RNA_boolean_get(op->ptr, "extend");
        bool changed = false;
-       
+
        pchan_act = BKE_pose_channel_active(ob);
        if (pchan_act == NULL) {
                return OPERATOR_CANCELLED;
@@ -668,10 +668,10 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
        if (changed == false) {
                return OPERATOR_CANCELLED;
        }
-       
+
        /* updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
-       
+
        if (arm->flag & ARM_HAS_VIZ_DEPS) {
                /* mask modifier ('armature' mode), etc. */
                DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -690,19 +690,19 @@ void POSE_OT_select_hierarchy(wmOperatorType *ot)
                {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""},
                {0, NULL, 0, NULL, NULL}
        };
-       
+
        /* identifiers */
        ot->name = "Select Hierarchy";
        ot->idname = "POSE_OT_select_hierarchy";
        ot->description = "Select immediate parent/children of selected bones";
-       
+
        /* api callbacks */
        ot->exec = pose_select_hierarchy_exec;
        ot->poll = ED_operator_posemode;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-       
+
        /* props */
        ot->prop = RNA_def_enum(ot->srna, "direction", direction_items, BONE_SELECT_PARENT, "Direction", "");
        RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend the selection");
@@ -724,22 +724,22 @@ static bool pose_select_same_group(bContext *C, Object *ob, bool extend)
        char *group_flags;
        int numGroups = 0;
        bool changed = false, tagged = false;
-       
+
        /* sanity checks */
        if (ELEM(NULL, ob, pose, arm))
                return 0;
-               
+
        /* count the number of groups */
        numGroups = BLI_listbase_count(&pose->agroups);
        if (numGroups == 0)
                return 0;
-               
-       /* alloc a small array to keep track of the groups to use 
+
+       /* alloc a small array to keep track of the groups to use
         *  - each cell stores on/off state for whether group should be used
         *      - size is (numGroups + 1), since (index = 0) is used for no-group
         */
        group_flags = MEM_callocN(numGroups + 1, "pose_select_same_group");
-       
+
        CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
        {
                /* keep track of group as group to use later? */
@@ -747,13 +747,13 @@ static bool pose_select_same_group(bContext *C, Object *ob, bool extend)
                        group_flags[pchan->agrp_index] = 1;
                        tagged = true;
                }
-               
+
                /* deselect all bones before selecting new ones? */
                if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0)
                        pchan->bone->flag &= ~BONE_SELECTED;
        }
        CTX_DATA_END;
-       
+
        /* small optimization: only loop through bones a second time if there are any groups tagged */
        if (tagged) {
                /* only if group matches (and is not selected or current bone) */
@@ -769,10 +769,10 @@ static bool pose_select_same_group(bContext *C, Object *ob, bool extend)
                }
                CTX_DATA_END;
        }
-       
+
        /* free temp info */
        MEM_freeN(group_flags);
-       
+
        return changed;
 }
 
@@ -782,25 +782,25 @@ static bool pose_select_same_layer(bContext *C, Object *ob, bool extend)
        bArmature *arm = (ob) ? ob->data : NULL;
        bool changed = false;
        int layers = 0;
-       
+
        if (ELEM(NULL, ob, pose, arm))
                return 0;
-       
+
        /* figure out what bones are selected */
        CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
        {
                /* keep track of layers to use later? */
                if (pchan->bone->flag & BONE_SELECTED)
                        layers |= pchan->bone->layer;
-                       
+
                /* deselect all bones before selecting new ones? */
                if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0)
                        pchan->bone->flag &= ~BONE_SELECTED;
        }
        CTX_DATA_END;
-       if (layers == 0) 
+       if (layers == 0)
                return 0;
-               
+
        /* select bones that are on same layers as layers flag */
        CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
        {
@@ -811,7 +811,7 @@ static bool pose_select_same_layer(bContext *C, Object *ob, bool extend)
                }
        }
        CTX_DATA_END;
-       
+
        return changed;
 }
 
@@ -819,11 +819,11 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
 {
        KeyingSet *ks = ANIM_scene_get_active_keyingset(CTX_data_scene(C));
        KS_Path *ksp;
-       
+
        bArmature *arm = (ob) ? ob->data : NULL;
        bPose *pose = (ob) ? ob->pose : NULL;
        bool changed = false;
-       
+
        /* sanity checks: validate Keying Set and object */
        if (ks == NULL) {
                BKE_report(reports, RPT_ERROR, "No active Keying Set to use");
@@ -832,7 +832,7 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
        else if (ANIM_validate_keyingset(C, NULL, ks) != 0) {
                if (ks->paths.first == NULL) {
                        if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) {
-                               BKE_report(reports, RPT_ERROR, 
+                               BKE_report(reports, RPT_ERROR,
                                           "Use another Keying Set, as the active one depends on the currently "
                                           "selected items or cannot find any targets due to unsuitable context");
                        }
@@ -842,10 +842,10 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
                }
                return false;
        }
-               
+
        if (ELEM(NULL, ob, pose, arm))
                return false;
-               
+
        /* if not extending selection, deselect all selected first */
        if (extend == false) {
                CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
@@ -855,8 +855,8 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
                }
                CTX_DATA_END;
        }
-               
-       /* iterate over elements in the Keying Set, setting selection depending on whether 
+
+       /* iterate over elements in the Keying Set, setting selection depending on whether
         * that bone is visible or not...
         */
        for (ksp = ks->paths.first; ksp; ksp = ksp->next) {
@@ -864,10 +864,10 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
                if ((ksp->id == &ob->id) && (ksp->rna_path != NULL)) {
                        if (strstr(ksp->rna_path, "bones")) {
                                char *boneName = BLI_str_quoted_substrN(ksp->rna_path, "bones[");
-                               
+
                                if (boneName) {
                                        bPoseChannel *pchan = BKE_pose_channel_find_name(pose, boneName);
-                                       
+
                                        if (pchan) {
                                                /* select if bone is visible and can be affected */
                                                if (PBONE_SELECTABLE(arm, pchan->bone)) {
@@ -875,14 +875,14 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
                                                        changed = true;
                                                }
                                        }
-                                       
+
                                        /* free temp memory */
                                        MEM_freeN(boneName);
                                }
                        }
                }
        }
-       
+
        return changed;
 }
 
@@ -893,41 +893,41 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
        const ePose_SelectSame_Mode type = RNA_enum_get(op->ptr, "type");
        const bool extend = RNA_boolean_get(op->ptr, "extend");
        bool changed = false;
-       
+
        /* sanity check */
        if (ob->pose == NULL)
                return OPERATOR_CANCELLED;
-               
+
        /* selection types */
        switch (type) {
                case POSE_SEL_SAME_LAYER: /* layer */
                        changed = pose_select_same_layer(C, ob, extend);
                        break;
-               
+
                case POSE_SEL_SAME_GROUP: /* group */
                        changed = pose_select_same_group(C, ob, extend);
                        break;
-                       
+
                case POSE_SEL_SAME_KEYINGSET: /* Keying Set */
                        changed = pose_select_same_keyingset(C, op->reports, ob, extend);
                        break;
-               
+
                default:
                        printf("pose_select_grouped() - Unknown selection type %u\n", type);
                        break;
        }
-       
+
        /* notifiers for updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
-       
+
        if (arm->flag & ARM_HAS_VIZ_DEPS) {
                /* mask modifier ('armature' mode), etc. */
                DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        }
-       
+
        /* need to tag armature for cow updates, or else selection doesn't update */
        DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
-       
+
        /* report done status */
        if (changed)
                return OPERATOR_FINISHED;
@@ -948,15 +948,15 @@ void POSE_OT_select_grouped(wmOperatorType *ot)
        ot->name = "Select Grouped";
        ot->description = "Select all visible bones grouped by similar properties";
        ot->idname = "POSE_OT_select_grouped";
-       
+
        /* api callbacks */
        ot->invoke = WM_menu_invoke;
        ot->exec = pose_select_grouped_exec;
        ot->poll = ED_operator_posemode;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-       
+
        /* properties */
        RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
        ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
@@ -1022,7 +1022,7 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
                }
 
                WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
-               
+
                /* need to tag armature for cow updates, or else selection doesn't update */
                DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
        }
@@ -1037,11 +1037,11 @@ void POSE_OT_select_mirror(wmOperatorType *ot)
        ot->name = "Flip Active/Selected Bone";
        ot->idname = "POSE_OT_select_mirror";
        ot->description = "Mirror the bone selection";
-       
+
        /* api callbacks */
        ot->exec = pose_select_mirror_exec;
        ot->poll = ED_operator_posemode;
-       
+
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;