From a92bdfe0c917d28c82c1cdd120f9985a1b7d6f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ziobro?= <> Date: Tue, 2 Feb 2016 00:28:34 +0100 Subject: Armature select similar: children, immediate-children en sibligns selection. Reviewed By: brecht Differential Revision: https://developer.blender.org/D1750 --- source/blender/editors/armature/armature_select.c | 68 ++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'source/blender/editors/armature/armature_select.c') diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c index efbf8a439a1..f4771f6bd3a 100644 --- a/source/blender/editors/armature/armature_select.c +++ b/source/blender/editors/armature/armature_select.c @@ -744,7 +744,10 @@ enum { SIMEDBONE_DIRECTION, SIMEDBONE_PREFIX, SIMEDBONE_SUFFIX, - SIMEDBONE_LAYER + SIMEDBONE_LAYER, + SIMEDBONE_CHILDREN, + SIMEDBONE_CHILDREN_IMMEDIATE, + SIMEDBONE_SIBLINGS }; static EnumPropertyItem prop_similar_types[] = { @@ -753,6 +756,9 @@ static EnumPropertyItem prop_similar_types[] = { {SIMEDBONE_PREFIX, "PREFIX", 0, "Prefix", ""}, {SIMEDBONE_SUFFIX, "SUFFIX", 0, "Suffix", ""}, {SIMEDBONE_LAYER, "LAYER", 0, "Layer", ""}, + {SIMEDBONE_CHILDREN, "CHILDREN", 0, "Children", ""}, + {SIMEDBONE_CHILDREN_IMMEDIATE, "CHILDREN_IMMEDIATE", 0, "Immediate children", ""}, + {SIMEDBONE_SIBLINGS, "SIBLINGS", 0, "Siblings", ""}, {0, NULL, 0, NULL, NULL} }; @@ -855,6 +861,57 @@ static void select_similar_suffix(bArmature *arm, EditBone *ebone_act) } } +static void is_ancestor(EditBone * bone, EditBone * ancestor) +{ + if(bone->temp.ebone == ancestor || bone->temp.ebone == NULL) + return; + + if(bone->temp.ebone->temp.ebone != NULL && bone->temp.ebone->temp.ebone != ancestor) + is_ancestor(bone->temp.ebone, ancestor); + + bone->temp.ebone = bone->temp.ebone->temp.ebone; +} + +static void select_similar_children(bArmature *arm, EditBone *ebone_act) +{ + EditBone *ebone_iter; + + for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) { + ebone_iter->temp.ebone = ebone_iter->parent; + } + + for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next){ + is_ancestor(ebone_iter, ebone_act); + + if(ebone_iter->temp.ebone == ebone_act && EBONE_SELECTABLE(arm, ebone_iter)) + ED_armature_ebone_select_set(ebone_iter, true); + } +} + +static void select_similar_children_immediate(bArmature *arm, EditBone *ebone_act) +{ + EditBone *ebone_iter; + for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) { + if(ebone_iter->parent == ebone_act && EBONE_SELECTABLE(arm, ebone_iter)) { + ED_armature_ebone_select_set(ebone_iter, true); + } + } +} + +static void select_similar_siblings(bArmature *arm, EditBone *ebone_act) +{ + EditBone *ebone_iter; + + if(ebone_act->parent == NULL) + return; + + for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) { + if(ebone_iter->parent == ebone_act->parent && EBONE_SELECTABLE(arm, ebone_iter)) { + ED_armature_ebone_select_set(ebone_iter, true); + } + } +} + static int armature_select_similar_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); @@ -887,6 +944,15 @@ static int armature_select_similar_exec(bContext *C, wmOperator *op) case SIMEDBONE_LAYER: select_similar_layer(arm, ebone_act); break; + case SIMEDBONE_CHILDREN: + select_similar_children(arm, ebone_act); + break; + case SIMEDBONE_CHILDREN_IMMEDIATE: + select_similar_children_immediate(arm, ebone_act); + break; + case SIMEDBONE_SIBLINGS: + select_similar_siblings(arm, ebone_act); + break; } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); -- cgit v1.2.3