Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/armature/armature_relations.c')
-rw-r--r--source/blender/editors/armature/armature_relations.c236
1 files changed, 118 insertions, 118 deletions
diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c
index 3c272d52d1c..95c8b1d5460 100644
--- a/source/blender/editors/armature/armature_relations.c
+++ b/source/blender/editors/armature/armature_relations.c
@@ -107,7 +107,7 @@ static void joined_armature_fix_links_constraints(
bActionConstraint *data = con->data;
if (data->act) {
- BKE_action_fix_paths_rename(&tarArm->id, data->act, "pose.bones[",
+ BKE_action_fix_paths_rename(&tarArm->id, data->act, "pose.bones[",
pchan->name, curbone->name, 0, 0, false);
}
}
@@ -119,7 +119,7 @@ static void joined_armature_fix_links_constraints(
typedef struct tJoinArmature_AdtFixData {
Object *srcArm;
Object *tarArm;
-
+
GHash *names_map;
} tJoinArmature_AdtFixData;
@@ -132,34 +132,34 @@ static void joined_armature_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data
tJoinArmature_AdtFixData *afd = (tJoinArmature_AdtFixData *)user_data;
ID *src_id = &afd->srcArm->id;
ID *dst_id = &afd->tarArm->id;
-
+
GHashIterator gh_iter;
-
+
/* Fix paths - If this is the target object, it will have some "dirty" paths */
if ((id == src_id) && strstr(fcu->rna_path, "pose.bones[")) {
GHASH_ITER(gh_iter, afd->names_map) {
const char *old_name = BLI_ghashIterator_getKey(&gh_iter);
const char *new_name = BLI_ghashIterator_getValue(&gh_iter);
-
+
/* only remap if changed; this still means there will be some waste if there aren't many drivers/keys */
if (!STREQ(old_name, new_name) && strstr(fcu->rna_path, old_name)) {
fcu->rna_path = BKE_animsys_fix_rna_path_rename(id, fcu->rna_path, "pose.bones",
old_name, new_name, 0, 0, false);
-
- /* we don't want to apply a second remapping on this driver now,
+
+ /* we don't want to apply a second remapping on this driver now,
* so stop trying names, but keep fixing drivers
*/
break;
}
}
}
-
-
+
+
/* Driver targets */
if (fcu->driver) {
ChannelDriver *driver = fcu->driver;
DriverVar *dvar;
-
+
/* Fix driver references to invalid ID's */
for (dvar = driver->variables.first; dvar; dvar = dvar->next) {
/* only change the used targets, since the others will need fixing manually anyway */
@@ -168,7 +168,7 @@ static void joined_armature_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data
/* change the ID's used... */
if (dtar->id == src_id) {
dtar->id = dst_id;
-
+
/* also check on the subtarget...
* XXX: We duplicate the logic from drivers_path_rename_fix() here, with our own
* little twists so that we know that it isn't going to clobber the wrong data
@@ -177,7 +177,7 @@ static void joined_armature_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data
GHASH_ITER(gh_iter, afd->names_map) {
const char *old_name = BLI_ghashIterator_getKey(&gh_iter);
const char *new_name = BLI_ghashIterator_getValue(&gh_iter);
-
+
/* only remap if changed */
if (!STREQ(old_name, new_name)) {
if ((dtar->rna_path) && strstr(dtar->rna_path, old_name)) {
@@ -207,7 +207,7 @@ static void joined_armature_fix_links(Main *bmain, Object *tarArm, Object *srcAr
Object *ob;
bPose *pose;
bPoseChannel *pchant;
-
+
/* let's go through all objects in database */
for (ob = bmain->object.first; ob; ob = ob->id.next) {
/* do some object-type specific things */
@@ -217,12 +217,12 @@ static void joined_armature_fix_links(Main *bmain, Object *tarArm, Object *srcAr
joined_armature_fix_links_constraints(tarArm, srcArm, pchan, curbone, &pchant->constraints);
}
}
-
+
/* fix object-level constraints */
if (ob != srcArm) {
joined_armature_fix_links_constraints(tarArm, srcArm, pchan, curbone, &ob->constraints);
}
-
+
/* See if an object is parented to this armature */
if (ob->parent && (ob->parent == srcArm)) {
/* Is object parented to a bone of this src armature? */
@@ -232,7 +232,7 @@ static void joined_armature_fix_links(Main *bmain, Object *tarArm, Object *srcAr
BLI_strncpy(ob->parsubstr, curbone->name, sizeof(ob->parsubstr));
}
}
-
+
/* make tar armature be new parent */
ob->parent = tarArm;
}
@@ -251,13 +251,13 @@ int join_armature_exec(bContext *C, wmOperator *op)
EditBone *curbone;
float mat[4][4], oimat[4][4];
bool ok = false;
-
+
/* Ensure we're not in editmode and that the active object is an armature*/
if (!ob || ob->type != OB_ARMATURE)
return OPERATOR_CANCELLED;
if (!arm || arm->edbo)
return OPERATOR_CANCELLED;
-
+
CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
{
if (base->object == ob) {
@@ -275,7 +275,7 @@ int join_armature_exec(bContext *C, wmOperator *op)
/* Get editbones of active armature to add editbones to */
ED_armature_to_edit(arm);
-
+
/* get pose of active object and move it out of posemode */
pose = ob->pose;
ob->mode &= ~OB_MODE_POSE;
@@ -285,36 +285,36 @@ int join_armature_exec(bContext *C, wmOperator *op)
if ((base->object->type == OB_ARMATURE) && (base->object != ob)) {
tJoinArmature_AdtFixData afd = {NULL};
bArmature *curarm = base->object->data;
-
+
/* we assume that each armature datablock is only used in a single place */
BLI_assert(ob->data != base->object->data);
-
+
/* init callback data for fixing up AnimData links later */
afd.srcArm = base->object;
afd.tarArm = ob;
afd.names_map = BLI_ghash_str_new("join_armature_adt_fix");
-
+
/* Make a list of editbones in current armature */
ED_armature_to_edit(base->object->data);
-
+
/* Get Pose of current armature */
opose = base->object->pose;
base->object->mode &= ~OB_MODE_POSE;
//BASACT->flag &= ~OB_MODE_POSE;
-
+
/* Find the difference matrix */
invert_m4_m4(oimat, ob->obmat);
mul_m4_m4m4(mat, oimat, base->object->obmat);
-
+
/* Copy bones and posechannels from the object to the edit armature */
for (pchan = opose->chanbase.first; pchan; pchan = pchann) {
pchann = pchan->next;
curbone = ED_armature_ebone_find_name(curarm->edbo, pchan->name);
-
+
/* Get new name */
ED_armature_ebone_unique_name(arm->edbo, curbone->name, NULL);
BLI_ghash_insert(afd.names_map, BLI_strdup(pchan->name), curbone->name);
-
+
/* Transform the bone */
{
float premat[4][4];
@@ -322,48 +322,48 @@ int join_armature_exec(bContext *C, wmOperator *op)
float difmat[4][4];
float imat[4][4];
float temp[3][3];
-
+
/* Get the premat */
ED_armature_ebone_to_mat3(curbone, temp);
-
+
unit_m4(premat); /* mul_m4_m3m4 only sets 3x3 part */
mul_m4_m3m4(premat, temp, mat);
-
+
mul_m4_v3(mat, curbone->head);
mul_m4_v3(mat, curbone->tail);
-
+
/* Get the postmat */
ED_armature_ebone_to_mat3(curbone, temp);
copy_m4_m3(postmat, temp);
-
+
/* Find the roll */
invert_m4_m4(imat, premat);
mul_m4_m4m4(difmat, imat, postmat);
-
+
curbone->roll -= atan2f(difmat[2][0], difmat[2][2]);
}
-
+
/* Fix Constraints and Other Links to this Bone and Armature */
joined_armature_fix_links(bmain, ob, base->object, pchan, curbone);
-
+
/* Rename pchan */
BLI_strncpy(pchan->name, curbone->name, sizeof(pchan->name));
-
+
/* Jump Ship! */
BLI_remlink(curarm->edbo, curbone);
BLI_addtail(arm->edbo, curbone);
-
+
BLI_remlink(&opose->chanbase, pchan);
BLI_addtail(&pose->chanbase, pchan);
BKE_pose_channels_hash_free(opose);
BKE_pose_channels_hash_free(pose);
}
-
+
/* Fix all the drivers (and animation data) */
BKE_fcurves_main_cb(bmain, joined_armature_fix_animdata_cb, &afd);
BLI_ghash_free(afd.names_map, MEM_freeN, NULL);
-
- /* Only copy over animdata now, after all the remapping has been done,
+
+ /* Only copy over animdata now, after all the remapping has been done,
* so that we don't have to worry about ambiguities re which armature
* a bone came from!
*/
@@ -377,7 +377,7 @@ int join_armature_exec(bContext *C, wmOperator *op)
BKE_animdata_merge_copy(&ob->id, &base->object->id, ADT_MERGECOPY_KEEP_DST, false);
}
}
-
+
if (curarm->adt) {
if (arm->adt == NULL) {
/* no animdata, so just use a copy of the whole thing */
@@ -388,20 +388,20 @@ int join_armature_exec(bContext *C, wmOperator *op)
BKE_animdata_merge_copy(&arm->id, &curarm->id, ADT_MERGECOPY_KEEP_DST, false);
}
}
-
+
/* Free the old object data */
ED_base_object_free_and_unlink(bmain, scene, base);
}
}
CTX_DATA_END;
-
+
DAG_relations_tag_update(bmain); /* because we removed object(s) */
ED_armature_from_edit(arm);
ED_armature_edit_free(arm);
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
-
+
return OPERATOR_FINISHED;
}
@@ -414,11 +414,11 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
bPoseChannel *pchan;
bConstraint *con;
ListBase *opchans, *npchans;
-
+
/* get reference to list of bones in original and new armatures */
opchans = &origArm->pose->chanbase;
npchans = &newArm->pose->chanbase;
-
+
/* let's go through all objects in database */
for (ob = G.main->object.first; ob; ob = ob->id.next) {
/* do some object-type specific things */
@@ -428,11 +428,11 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
ListBase targets = {NULL, NULL};
bConstraintTarget *ct;
-
+
/* constraint targets */
if (cti && cti->get_constraint_targets) {
cti->get_constraint_targets(con, &targets);
-
+
for (ct = targets.first; ct; ct = ct->next) {
/* any targets which point to original armature are redirected to the new one only if:
* - the target isn't origArm/newArm itself
@@ -459,18 +459,18 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
}
}
}
-
+
/* fix object-level constraints */
if (ob != origArm) {
for (con = ob->constraints.first; con; con = con->next) {
const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
ListBase targets = {NULL, NULL};
bConstraintTarget *ct;
-
+
/* constraint targets */
if (cti && cti->get_constraint_targets) {
cti->get_constraint_targets(con, &targets);
-
+
for (ct = targets.first; ct; ct = ct->next) {
/* any targets which point to original armature are redirected to the new one only if:
* - the target isn't origArm/newArm itself
@@ -489,14 +489,14 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
}
}
}
-
+
if (cti->flush_constraint_targets) {
cti->flush_constraint_targets(con, &targets, 0);
}
}
}
}
-
+
/* See if an object is parented to this armature */
if (ob->parent && (ob->parent == origArm)) {
/* Is object parented to a bone of this src armature? */
@@ -509,31 +509,31 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
}
}
-/* Helper function for armature separating - remove certain bones from the given armature
+/* Helper function for armature separating - remove certain bones from the given armature
* sel: remove selected bones from the armature, otherwise the unselected bones are removed
* (ob is not in editmode)
*/
-static void separate_armature_bones(Object *ob, short sel)
+static void separate_armature_bones(Object *ob, short sel)
{
bArmature *arm = (bArmature *)ob->data;
bPoseChannel *pchan, *pchann;
EditBone *curbone;
-
+
/* make local set of editbones to manipulate here */
ED_armature_to_edit(arm);
-
+
/* go through pose-channels, checking if a bone should be removed */
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchann) {
pchann = pchan->next;
curbone = ED_armature_ebone_find_name(arm->edbo, pchan->name);
-
+
/* check if bone needs to be removed */
if ( (sel && (curbone->flag & BONE_SELECTED)) ||
(!sel && !(curbone->flag & BONE_SELECTED)) )
{
EditBone *ebo;
bPoseChannel *pchn;
-
+
/* clear the bone->parent var of any bone that had this as its parent */
for (ebo = arm->edbo->first; ebo; ebo = ebo->next) {
if (ebo->parent == curbone) {
@@ -542,23 +542,23 @@ static void separate_armature_bones(Object *ob, short sel)
ebo->flag &= ~BONE_CONNECTED;
}
}
-
+
/* clear the pchan->parent var of any pchan that had this as its parent */
for (pchn = ob->pose->chanbase.first; pchn; pchn = pchn->next) {
if (pchn->parent == pchan)
pchn->parent = NULL;
}
-
+
/* free any of the extra-data this pchan might have */
BKE_pose_channel_free(pchan);
BKE_pose_channels_hash_free(ob->pose);
-
+
/* get rid of unneeded bone */
bone_free(arm, curbone);
BLI_freelinkN(&ob->pose->chanbase, pchan);
}
}
-
+
/* exit editmode (recalculates pchans too) */
ED_armature_from_edit(ob->data);
ED_armature_edit_free(ob->data);
@@ -572,14 +572,14 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
Object *obedit = CTX_data_edit_object(C);
Object *oldob, *newob;
Base *oldbase, *newbase;
-
+
/* sanity checks */
if (obedit == NULL)
return OPERATOR_CANCELLED;
-
+
/* set wait cursor in case this takes a while */
WM_cursor_wait(1);
-
+
/* we are going to do this as follows (unlike every other instance of separate):
* 1. exit editmode +posemode for active armature/base. Take note of what this is.
* 2. duplicate base - BASACT is the new one now
@@ -596,41 +596,41 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
else base->flag &= ~SELECT;
}
CTX_DATA_END;
-
+
/* 1) store starting settings and exit editmode */
oldob = obedit;
oldbase = BASACT;
oldob->mode &= ~OB_MODE_POSE;
//oldbase->flag &= ~OB_POSEMODE;
-
+
ED_armature_from_edit(obedit->data);
ED_armature_edit_free(obedit->data);
-
+
/* 2) duplicate base */
newbase = ED_object_add_duplicate(bmain, scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
DAG_relations_tag_update(bmain);
newob = newbase->object;
newbase->flag &= ~SELECT;
-
-
+
+
/* 3) remove bones that shouldn't still be around on both armatures */
separate_armature_bones(oldob, 1);
separate_armature_bones(newob, 0);
-
-
+
+
/* 4) fix links before depsgraph flushes */ // err... or after?
separated_armature_fix_links(oldob, newob);
-
+
DAG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
DAG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
-
-
+
+
/* 5) restore original conditions */
obedit = oldob;
-
+
ED_armature_to_edit(obedit->data);
-
+
/* parents tips remain selected when connected children are removed. */
ED_armature_edit_deselect_all(obedit);
@@ -638,10 +638,10 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
-
+
/* recalc/redraw + cleanup */
WM_cursor_wait(0);
-
+
return OPERATOR_FINISHED;
}
@@ -651,12 +651,12 @@ void ARMATURE_OT_separate(wmOperatorType *ot)
ot->name = "Separate Bones";
ot->idname = "ARMATURE_OT_separate";
ot->description = "Isolate selected bones into a separate armature";
-
+
/* callbacks */
ot->invoke = WM_operator_confirm;
ot->exec = separate_armature_exec;
ot->poll = ED_operator_editarmature;
-
+
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
@@ -680,13 +680,13 @@ static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBo
{
EditBone *ebone;
float offset[3];
-
+
if ((selbone->parent) && (selbone->flag & BONE_CONNECTED))
selbone->parent->flag &= ~(BONE_TIPSEL);
-
+
/* make actbone the parent of selbone */
selbone->parent = actbone;
-
+
/* in actbone tree we cannot have a loop */
for (ebone = actbone->parent; ebone; ebone = ebone->parent) {
if (ebone->parent == selbone) {
@@ -694,21 +694,21 @@ static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBo
ebone->flag &= ~BONE_CONNECTED;
}
}
-
+
if (mode == ARM_PAR_CONNECT) {
/* Connected: Child bones will be moved to the parent tip */
selbone->flag |= BONE_CONNECTED;
sub_v3_v3v3(offset, actbone->tail, selbone->head);
-
+
copy_v3_v3(selbone->head, actbone->tail);
selbone->rad_head = actbone->rad_tail;
-
+
add_v3_v3(selbone->tail, offset);
-
+
/* offset for all its children */
for (ebone = edbo->first; ebone; ebone = ebone->next) {
EditBone *par;
-
+
for (par = ebone->parent; par; par = par->parent) {
if (par == selbone) {
add_v3_v3(ebone->head, offset);
@@ -731,14 +731,14 @@ static const EnumPropertyItem prop_editarm_make_parent_types[] = {
{0, NULL, 0, NULL, NULL}
};
-static int armature_parent_set_exec(bContext *C, wmOperator *op)
+static int armature_parent_set_exec(bContext *C, wmOperator *op)
{
Object *ob = CTX_data_edit_object(C);
bArmature *arm = (bArmature *)ob->data;
EditBone *actbone = CTX_data_active_bone(C);
EditBone *actmirb = NULL;
short val = RNA_enum_get(op->ptr, "type");
-
+
/* there must be an active bone */
if (actbone == NULL) {
BKE_report(op->reports, RPT_ERROR, "Operation requires an active bone");
@@ -746,27 +746,27 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
}
else if (arm->flag & ARM_MIRROR_EDIT) {
/* For X-Axis Mirror Editing option, we may need a mirror copy of actbone
- * - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone
+ * - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone
* (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R").
* This is useful for arm-chains, for example parenting lower arm to upper arm
* - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent")
* then just use actbone. Useful when doing upper arm to spine.
*/
actmirb = ED_armature_ebone_get_mirrored(arm->edbo, actbone);
- if (actmirb == NULL)
+ if (actmirb == NULL)
actmirb = actbone;
}
-
- /* if there is only 1 selected bone, we assume that that is the active bone,
+
+ /* if there is only 1 selected bone, we assume that that is the active bone,
* since a user will need to have clicked on a bone (thus selecting it) to make it active
*/
if (CTX_DATA_COUNT(C, selected_editable_bones) <= 1) {
/* When only the active bone is selected, and it has a parent,
- * connect it to the parent, as that is the only possible outcome.
+ * connect it to the parent, as that is the only possible outcome.
*/
if (actbone->parent) {
bone_connect_to_existing_parent(actbone);
-
+
if ((arm->flag & ARM_MIRROR_EDIT) && (actmirb->parent))
bone_connect_to_existing_parent(actmirb);
}
@@ -775,16 +775,16 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
/* Parent 'selected' bones to the active one
* - the context iterator contains both selected bones and their mirrored copies,
* so we assume that unselected bones are mirrored copies of some selected bone
- * - since the active one (and/or its mirror) will also be selected, we also need
+ * - since the active one (and/or its mirror) will also be selected, we also need
* to check that we are not trying to operate on them, since such an operation
* would cause errors
*/
-
+
/* parent selected bones to the active one */
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
if (ELEM(ebone, actbone, actmirb) == 0) {
- if (ebone->flag & BONE_SELECTED)
+ if (ebone->flag & BONE_SELECTED)
bone_connect_to_new_parent(arm->edbo, ebone, actbone, val);
else
bone_connect_to_new_parent(arm->edbo, ebone, actmirb, val);
@@ -792,11 +792,11 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
}
-
+
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
-
+
return OPERATOR_FINISHED;
}
@@ -806,7 +806,7 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), const
uiPopupMenu *pup = UI_popup_menu_begin(C, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Make Parent"), ICON_NONE);
uiLayout *layout = UI_popup_menu_layout(pup);
int allchildbones = 0;
-
+
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
if (ebone != actbone) {
@@ -816,13 +816,13 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), const
CTX_DATA_END;
uiItemEnumO(layout, "ARMATURE_OT_parent_set", NULL, 0, "type", ARM_PAR_CONNECT);
-
+
/* ob becomes parent, make the associated menus */
if (allchildbones)
uiItemEnumO(layout, "ARMATURE_OT_parent_set", NULL, 0, "type", ARM_PAR_OFFSET);
-
+
UI_popup_menu_end(C, pup);
-
+
return OPERATOR_INTERFACE;
}
@@ -832,15 +832,15 @@ void ARMATURE_OT_parent_set(wmOperatorType *ot)
ot->name = "Make Parent";
ot->idname = "ARMATURE_OT_parent_set";
ot->description = "Set the active bone as the parent of the selected bones";
-
+
/* api callbacks */
ot->invoke = armature_parent_set_invoke;
ot->exec = armature_parent_set_exec;
ot->poll = ED_operator_editarmature;
-
+
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
+
RNA_def_enum(ot->srna, "type", prop_editarm_make_parent_types, 0, "ParentType", "Type of parenting");
}
@@ -858,28 +858,28 @@ static void editbone_clear_parent(EditBone *ebone, int mode)
/* for nice selection */
ebone->parent->flag &= ~(BONE_TIPSEL);
}
-
+
if (mode == 1) ebone->parent = NULL;
ebone->flag &= ~BONE_CONNECTED;
}
-static int armature_parent_clear_exec(bContext *C, wmOperator *op)
+static int armature_parent_clear_exec(bContext *C, wmOperator *op)
{
Object *ob = CTX_data_edit_object(C);
bArmature *arm = (bArmature *)ob->data;
int val = RNA_enum_get(op->ptr, "type");
-
+
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
editbone_clear_parent(ebone, val);
}
CTX_DATA_END;
-
+
ED_armature_edit_sync_selection(arm->edbo);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
-
+
return OPERATOR_FINISHED;
}
@@ -889,15 +889,15 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
ot->name = "Clear Parent";
ot->idname = "ARMATURE_OT_parent_clear";
ot->description = "Remove the parent-child relationship between selected bones and their parents";
-
+
/* api callbacks */
ot->invoke = WM_menu_invoke;
ot->exec = armature_parent_clear_exec;
ot->poll = ED_operator_editarmature;
-
+
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
+
ot->prop = RNA_def_enum(ot->srna, "type", prop_editarm_clear_parent_types, 0, "ClearType", "What way to clear parenting");
}