Armature select similar: children, immediate-children en sibligns selection.
Reviewed By: brecht Differential Revision: https://developer.blender.org/D1750
This commit is contained in:
parent
deef941208
commit
a92bdfe0c9
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue