[Bf-blender-cvs] [a92bdfe] master: Armature select similar: children, immediate-children en sibligns selection.
MichaÅ Ziobro
noreply at git.blender.org
Tue Feb 2 00:41:59 CET 2016
Commit: a92bdfe0c917d28c82c1cdd120f9985a1b7d6f51
Author: Michał Ziobro
Date: Tue Feb 2 00:28:34 2016 +0100
Branches: master
https://developer.blender.org/rBa92bdfe0c917d28c82c1cdd120f9985a1b7d6f51
Armature select similar: children, immediate-children en sibligns selection.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D1750
===================================================================
M 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 efbf8a4..f4771f6 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);
More information about the Bf-blender-cvs
mailing list