diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-06-04 10:39:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-06-04 10:39:04 +0300 |
commit | 95011f6d484b369db92ae13c674a6522d664ea8f (patch) | |
tree | 91ba2719c9f3096fad0f1f768aa7b1c4d79aa32a /source/blender/editors/armature | |
parent | 0911acb5cf49c5ba05b1df045b41697704aa288a (diff) | |
parent | 44505b38df557a5711703613685a1dec9fc2c3d9 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/editors/armature')
17 files changed, 1404 insertions, 1404 deletions
diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c index d80d3d6964c..c1fb1dcf82f 100644 --- a/source/blender/editors/armature/armature_add.c +++ b/source/blender/editors/armature/armature_add.c @@ -66,12 +66,12 @@ EditBone *ED_armature_ebone_add(bArmature *arm, const char *name) { EditBone *bone = MEM_callocN(sizeof(EditBone), "eBone"); - + BLI_strncpy(bone->name, name, sizeof(bone->name)); ED_armature_ebone_unique_name(arm->edbo, bone->name, NULL); - + BLI_addtail(arm->edbo, bone); - + bone->flag |= BONE_TIPSEL; bone->weight = 1.0f; bone->dist = 0.25f; @@ -81,7 +81,7 @@ EditBone *ED_armature_ebone_add(bArmature *arm, const char *name) bone->rad_tail = 0.05f; bone->segments = 1; bone->layer = arm->layer; - + /* Bendy-Bone parameters */ bone->roll1 = 0.0f; bone->roll2 = 0.0f; @@ -103,7 +103,7 @@ EditBone *ED_armature_ebone_add_primitive(Object *obedit_arm, float length, bool EditBone *bone; ED_armature_edit_deselect_all(obedit_arm); - + /* Create a bone */ bone = ED_armature_ebone_add(arm, "Bone"); @@ -134,7 +134,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op)) v3d = CTX_wm_view3d(C); obedit = CTX_data_edit_object(C); arm = obedit->data; - + /* find the active or selected bone */ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone)) { @@ -142,7 +142,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + if (ebone == NULL) { for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone)) { @@ -150,14 +150,14 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - if (ebone == NULL) + if (ebone == NULL) return OPERATOR_CANCELLED; - + to_root = 1; } - + ED_armature_edit_deselect_all(obedit); - + /* we re-use code for mirror editing... */ flipbone = NULL; if (arm->flag & ARM_MIRROR_EDIT) @@ -171,10 +171,10 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op)) SWAP(EditBone *, flipbone, ebone); } } - + newbone = ED_armature_ebone_add(arm, ebone->name); arm->act_edbone = newbone; - + if (to_root) { copy_v3_v3(newbone->head, ebone->head); newbone->rad_head = ebone->rad_tail; @@ -186,28 +186,28 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op)) newbone->parent = ebone; newbone->flag |= BONE_CONNECTED; } - + const View3DCursor *curs = ED_view3d_cursor3d_get(scene, v3d); copy_v3_v3(newbone->tail, curs->location); sub_v3_v3v3(newbone->tail, newbone->tail, obedit->obmat[3]); - + if (a == 1) newbone->tail[0] = -newbone->tail[0]; - + copy_m3_m4(mat, obedit->obmat); invert_m3_m3(imat, mat); mul_m3_v3(imat, newbone->tail); - + newbone->length = len_v3v3(newbone->head, newbone->tail); newbone->rad_tail = newbone->length * 0.05f; newbone->dist = newbone->length * 0.25f; - + } - + ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - + return OPERATOR_FINISHED; } @@ -226,9 +226,9 @@ static int armature_click_extrude_invoke(bContext *C, wmOperator *op, const wmEv scene = CTX_data_scene(C); ar = CTX_wm_region(C); v3d = CTX_wm_view3d(C); - + View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d); - + copy_v3_v3(oldcurs, cursor->location); VECCOPY2D(mval_f, event->mval); @@ -250,12 +250,12 @@ void ARMATURE_OT_click_extrude(wmOperatorType *ot) ot->name = "Click-Extrude"; ot->idname = "ARMATURE_OT_click_extrude"; ot->description = "Create a new bone going from the last selected joint to the mouse position"; - + /* api callbacks */ ot->invoke = armature_click_extrude_invoke; ot->exec = armature_click_extrude_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -266,12 +266,12 @@ void ARMATURE_OT_click_extrude(wmOperatorType *ot) EditBone *add_points_bone(Object *obedit, float head[3], float tail[3]) { EditBone *ebo; - + ebo = ED_armature_ebone_add(obedit->data, "Bone"); - + copy_v3_v3(ebo->head, head); copy_v3_v3(ebo->tail, tail); - + return ebo; } @@ -377,7 +377,7 @@ void updateDuplicateSubtargetObjects(EditBone *dupBone, ListBase *editbones, Obj bPoseChannel *pchan; bConstraint *curcon; ListBase *conlist; - + if ((pchan = BKE_pose_channel_verify(dst_ob->pose, dupBone->name))) { if ((conlist = &pchan->constraints)) { for (curcon = conlist->first; curcon; curcon = curcon->next) { @@ -387,17 +387,17 @@ void updateDuplicateSubtargetObjects(EditBone *dupBone, ListBase *editbones, Obj const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(curcon); ListBase targets = {NULL, NULL}; bConstraintTarget *ct; - + if (cti && cti->get_constraint_targets) { cti->get_constraint_targets(curcon, &targets); - + for (ct = targets.first; ct; ct = ct->next) { if ((ct->tar == src_ob) && (ct->subtarget[0])) { - ct->tar = dst_ob; /* update target */ + ct->tar = dst_ob; /* update target */ oldtarget = get_named_editbone(editbones, ct->subtarget); if (oldtarget) { /* was the subtarget bone duplicated too? If - * so, update the constraint to point at the + * so, update the constraint to point at the * duplicate of the old subtarget. */ if (oldtarget->temp.ebone) { @@ -407,7 +407,7 @@ void updateDuplicateSubtargetObjects(EditBone *dupBone, ListBase *editbones, Obj } } } - + if (cti->flush_constraint_targets) cti->flush_constraint_targets(curcon, &targets, 0); } @@ -426,20 +426,20 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, const char *name, ListBase Object *src_ob, Object *dst_ob) { EditBone *eBone = MEM_mallocN(sizeof(EditBone), "addup_editbone"); - + /* Copy data from old bone to new bone */ memcpy(eBone, curBone, sizeof(EditBone)); - + curBone->temp.ebone = eBone; eBone->temp.ebone = curBone; - + if (name != NULL) { BLI_strncpy(eBone->name, name, sizeof(eBone->name)); } ED_armature_ebone_unique_name(editbones, eBone->name, NULL); BLI_addtail(editbones, eBone); - + /* copy the ID property */ if (curBone->prop) eBone->prop = IDP_CopyProperty(curBone->prop); @@ -449,7 +449,7 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, const char *name, ListBase */ if (src_ob->pose) { bPoseChannel *chanold, *channew; - + chanold = BKE_pose_channel_verify(src_ob->pose, curBone->name); if (chanold) { /* WARNING: this creates a new posechannel, but there will not be an attached bone @@ -462,7 +462,7 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, const char *name, ListBase } } } - + return eBone; } @@ -506,7 +506,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) } } - + /* Find the selected bones and duplicate them as needed */ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) { if (EBONE_VISIBLE(arm, ebone_iter) && @@ -567,7 +567,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) updateDuplicateSubtarget(ebone, arm->edbo, obedit); } } - + /* correct the active bone */ if (arm->act_edbone && arm->act_edbone->temp.ebone) { arm->act_edbone = arm->act_edbone->temp.ebone; @@ -585,7 +585,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) ED_armature_edit_validate_active(arm); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - + return OPERATOR_FINISHED; } @@ -596,11 +596,11 @@ void ARMATURE_OT_duplicate(wmOperatorType *ot) ot->name = "Duplicate Selected Bone(s)"; ot->idname = "ARMATURE_OT_duplicate"; ot->description = "Make copies of the selected bones within the same armature"; - + /* api callbacks */ ot->exec = armature_duplicate_selected_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -846,7 +846,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) } } } - + /* Duplicate the necessary bones */ for (ebone = arm->edbo->first; ((ebone) && (ebone != first)); ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone)) { @@ -864,7 +864,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) do_extrude = 2; } } - + if (do_extrude) { /* we re-use code for mirror editing... */ flipbone = NULL; @@ -879,7 +879,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) if ((flipbone == NULL) && (forked)) flipbone = ebone; } - + for (a = 0; a < 2; a++) { if (a == 1) { if (flipbone == NULL) @@ -888,31 +888,31 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) SWAP(EditBone *, flipbone, ebone); } } - + totbone++; newbone = MEM_callocN(sizeof(EditBone), "extrudebone"); - + if (do_extrude == true) { copy_v3_v3(newbone->head, ebone->tail); copy_v3_v3(newbone->tail, newbone->head); newbone->parent = ebone; - + newbone->flag = ebone->flag & (BONE_TIPSEL | BONE_RELATIVE_PARENTING); // copies it, in case mirrored bone - + if (newbone->parent) newbone->flag |= BONE_CONNECTED; } else { copy_v3_v3(newbone->head, ebone->head); copy_v3_v3(newbone->tail, ebone->head); newbone->parent = ebone->parent; - + newbone->flag = BONE_TIPSEL; - + if (newbone->parent && (ebone->flag & BONE_CONNECTED)) { newbone->flag |= BONE_CONNECTED; } } - + newbone->weight = ebone->weight; newbone->dist = ebone->dist; newbone->xwidth = ebone->xwidth; @@ -921,7 +921,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) newbone->rad_tail = ebone->rad_tail; newbone->segments = 1; newbone->layer = ebone->layer; - + /* Bendy-Bone parameters */ newbone->roll1 = ebone->roll1; newbone->roll2 = ebone->roll2; @@ -936,7 +936,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) BLI_strncpy(newbone->name, ebone->name, sizeof(newbone->name)); - + if (flipbone && forked) { // only set if mirror edit if (strlen(newbone->name) < (MAXBONENAME - 2)) { if (a == 0) strcat(newbone->name, "_L"); @@ -944,18 +944,18 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) } } ED_armature_ebone_unique_name(arm->edbo, newbone->name, NULL); - + /* Add the new bone to the list */ BLI_addtail(arm->edbo, newbone); if (!first) first = newbone; - + /* restore ebone if we were flipping */ if (a == 1 && flipbone) SWAP(EditBone *, flipbone, ebone); } } - + /* Deselect the old bone */ ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); } @@ -986,14 +986,14 @@ void ARMATURE_OT_extrude(wmOperatorType *ot) ot->name = "Extrude"; ot->idname = "ARMATURE_OT_extrude"; ot->description = "Create new bones from the selected joints"; - + /* api callbacks */ ot->exec = armature_extrude_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* props */ RNA_def_boolean(ot->srna, "forked", 0, "Forked", ""); } @@ -1002,16 +1002,16 @@ void ARMATURE_OT_extrude(wmOperatorType *ot) /*op makes a new bone and returns it with its tip selected */ -static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) +static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) { RegionView3D *rv3d = CTX_wm_region_view3d(C); Object *obedit = CTX_data_edit_object(C); EditBone *bone; float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3]; char name[MAXBONENAME]; - + RNA_string_get(op->ptr, "name", name); - + copy_v3_v3(curs, ED_view3d_cursor3d_get(CTX_data_scene(C), CTX_wm_view3d(C))->location); /* Get inverse point for head and orientation for tail */ @@ -1021,18 +1021,18 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) if (rv3d && (U.flag & USER_ADD_VIEWALIGNED)) copy_m3_m4(obmat, rv3d->viewmat); else unit_m3(obmat); - + copy_m3_m4(viewmat, obedit->obmat); mul_m3_m3m3(totmat, obmat, viewmat); invert_m3_m3(imat, totmat); - + ED_armature_edit_deselect_all(obedit); - + /* Create a bone */ bone = ED_armature_ebone_add(obedit->data, name); copy_v3_v3(bone->head, curs); - + if (rv3d && (U.flag & USER_ADD_VIEWALIGNED)) add_v3_v3v3(bone->tail, bone->head, imat[1]); // bone with unit length 1 else @@ -1050,16 +1050,16 @@ void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot) ot->name = "Add Bone"; ot->idname = "ARMATURE_OT_bone_primitive_add"; ot->description = "Add a new bone located at the 3D-Cursor"; - + /* api callbacks */ ot->exec = armature_bone_primitive_add_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + RNA_def_string(ot->srna, "name", "Bone", MAXBONENAME, "Name", "Name of the newly created bone"); - + } /* ********************** Subdivide *******************************/ @@ -1075,10 +1075,10 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op) Object *obedit = CTX_data_edit_object(C); EditBone *newbone, *tbone; int cuts, i; - + /* there may not be a number_cuts property defined (for 'simple' subdivide) */ cuts = RNA_int_get(op->ptr, "number_cuts"); - + /* loop over all editable bones */ // XXX the old code did this in reverse order though! CTX_DATA_BEGIN_WITH_ID(C, EditBone *, ebone, selected_editable_bones, bArmature *, arm) @@ -1087,37 +1087,37 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op) /* compute cut ratio first */ float cutratio = 1.0f / (float)i; float cutratioI = 1.0f - cutratio; - + float val1[3]; float val2[3]; float val3[3]; - + newbone = MEM_mallocN(sizeof(EditBone), "ebone subdiv"); *newbone = *ebone; BLI_addtail(arm->edbo, newbone); - + /* calculate location of newbone->head */ copy_v3_v3(val1, ebone->head); copy_v3_v3(val2, ebone->tail); copy_v3_v3(val3, newbone->head); - + val3[0] = val1[0] * cutratio + val2[0] * cutratioI; val3[1] = val1[1] * cutratio + val2[1] * cutratioI; val3[2] = val1[2] * cutratio + val2[2] * cutratioI; - + copy_v3_v3(newbone->head, val3); copy_v3_v3(newbone->tail, ebone->tail); copy_v3_v3(ebone->tail, newbone->head); - + newbone->rad_head = ((ebone->rad_head * cutratio) + (ebone->rad_tail * cutratioI)); ebone->rad_tail = newbone->rad_head; - + newbone->flag |= BONE_CONNECTED; newbone->prop = NULL; ED_armature_ebone_unique_name(arm->edbo, newbone->name, NULL); - + /* correct parent bones */ for (tbone = arm->edbo->first; tbone; tbone = tbone->next) { if (tbone->parent == ebone) @@ -1127,10 +1127,10 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op) } } CTX_DATA_END; - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - + return OPERATOR_FINISHED; } @@ -1142,14 +1142,14 @@ void ARMATURE_OT_subdivide(wmOperatorType *ot) ot->name = "Subdivide Multi"; ot->idname = "ARMATURE_OT_subdivide"; ot->description = "Break selected bones into chains of smaller bones"; - + /* api callbacks */ ot->exec = armature_subdivide_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* Properties */ prop = RNA_def_int(ot->srna, "number_cuts", 1, 1, 1000, "Number of Cuts", "", 1, 10); /* avoid re-using last var because it can cause _very_ high poly meshes and annoy users (or worse crash) */ diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c index fe0722470cd..9fcf6ad4826 100644 --- a/source/blender/editors/armature/armature_edit.c +++ b/source/blender/editors/armature/armature_edit.c @@ -29,7 +29,7 @@ * \ingroup edarmature */ -#include <assert.h> +#include <assert.h> #include "DNA_armature_types.h" #include "DNA_constraint_types.h" @@ -94,20 +94,20 @@ void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4], const b /* Do the rotations */ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { float tmat[3][3]; - + /* find the current bone's roll matrix */ ED_armature_ebone_to_mat3(ebone, tmat); - + /* transform the roll matrix */ mul_m3_m3m3(tmat, mat3, tmat); - + /* transform the bone */ mul_m4_v3(mat, ebone->head); mul_m4_v3(mat, ebone->tail); /* apply the transformed roll back */ mat3_to_vec_roll(tmat, NULL, &ebone->roll); - + if (do_props) { ebone->rad_head *= scale; ebone->rad_tail *= scale; @@ -181,13 +181,13 @@ void ED_armature_origin_set(Object *ob, float cursor[3], int centermode, int aro mid_v3_v3v3(cent, min, max); } } - + /* Do the adjustments */ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { sub_v3_v3(ebone->head, cent); sub_v3_v3(ebone->tail, cent); } - + /* Turn the list into an armature */ if (is_editmode == false) { ED_armature_from_edit(arm); @@ -292,7 +292,7 @@ static const EnumPropertyItem prop_calc_roll_types[] = { }; -static int armature_calc_roll_exec(bContext *C, wmOperator *op) +static int armature_calc_roll_exec(bContext *C, wmOperator *op) { Object *ob = CTX_data_edit_object(C); eCalcRollTypes type = RNA_enum_get(op->ptr, "type"); @@ -319,12 +319,12 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) View3D *v3d = CTX_wm_view3d(C); /* can be NULL */ float cursor_local[3]; const View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d); - + invert_m4_m4(ob->imat, ob->obmat); copy_v3_v3(cursor_local, cursor->location); mul_m4_v3(ob->imat, cursor_local); - + /* cursor */ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) { @@ -393,7 +393,7 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No region view3d available"); return OPERATOR_CANCELLED; } - + copy_v3_v3(vec, rv3d->viewinv[2]); mul_m3_v3(imat, vec); } @@ -404,7 +404,7 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No active bone set"); return OPERATOR_CANCELLED; } - + ED_armature_ebone_to_mat3(ebone, mat); copy_v3_v3(vec, mat[2]); } @@ -415,9 +415,9 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) mul_m3_v3(imat, vec); normalize_v3(vec); } - + if (axis_flip) negate_v3(vec); - + for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) { /* roll func is a callback which assumes that all is well */ @@ -425,7 +425,7 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) } } } - + if (arm->flag & ARM_MIRROR_EDIT) { for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if ((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) { @@ -436,10 +436,10 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) } } } - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - + return OPERATOR_FINISHED; } @@ -449,12 +449,12 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot) ot->name = "Recalculate Roll"; ot->idname = "ARMATURE_OT_calculate_roll"; ot->description = "Automatically fix alignment of select bones' axes"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = armature_calc_roll_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -521,10 +521,10 @@ void ARMATURE_OT_roll_clear(wmOperatorType *ot) /* temporary data-structure for merge/fill bones */ typedef struct EditBonePoint { struct EditBonePoint *next, *prev; - + EditBone *head_owner; /* EditBone which uses this point as a 'head' point */ EditBone *tail_owner; /* EditBone which uses this point as a 'tail' point */ - + float vec[3]; /* the actual location of the point in local/EditMode space */ } EditBonePoint; @@ -533,11 +533,11 @@ static void chains_find_tips(ListBase *edbo, ListBase *list) { EditBone *curBone, *ebo; LinkData *ld; - + /* note: this is potentially very slow ... there's got to be a better way */ for (curBone = edbo->first; curBone; curBone = curBone->next) { short stop = 0; - + /* is this bone contained within any existing chain? (skip if so) */ for (ld = list->first; ld; ld = ld->next) { for (ebo = ld->data; ebo; ebo = ebo->parent) { @@ -546,12 +546,12 @@ static void chains_find_tips(ListBase *edbo, ListBase *list) break; } } - + if (stop) break; } /* skip current bone if it is part of an existing chain */ if (stop) continue; - + /* is any existing chain part of the chain formed by this bone? */ stop = 0; for (ebo = curBone->parent; ebo; ebo = ebo->parent) { @@ -562,12 +562,12 @@ static void chains_find_tips(ListBase *edbo, ListBase *list) break; } } - + if (stop) break; } /* current bone has already been added to a chain? */ if (stop) continue; - + /* add current bone to a new chain */ ld = MEM_callocN(sizeof(LinkData), "BoneChain"); ld->data = curBone; @@ -582,14 +582,14 @@ static void fill_add_joint(EditBone *ebo, short eb_tail, ListBase *points) EditBonePoint *ebp; float vec[3]; short found = 0; - + if (eb_tail) { copy_v3_v3(vec, ebo->tail); } else { copy_v3_v3(vec, ebo->head); } - + for (ebp = points->first; ebp; ebp = ebp->next) { if (equals_v3v3(ebp->vec, vec)) { if (eb_tail) { @@ -610,11 +610,11 @@ static void fill_add_joint(EditBone *ebo, short eb_tail, ListBase *points) } } } - + /* allocate a new point if no existing point was related */ if (found == 0) { ebp = MEM_callocN(sizeof(EditBonePoint), "EditBonePoint"); - + if (eb_tail) { copy_v3_v3(ebp->vec, ebo->tail); ebp->tail_owner = ebo; @@ -623,7 +623,7 @@ static void fill_add_joint(EditBone *ebo, short eb_tail, ListBase *points) copy_v3_v3(ebp->vec, ebo->head); ebp->head_owner = ebo; } - + BLI_addtail(points, ebp); } } @@ -666,7 +666,7 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) } } CTX_DATA_END; - + /* the number of joints determines how we fill: * 1) between joint and cursor (joint=head, cursor=tail) * 2) between the two joints (order is dependent on active-bone/hierarchy) @@ -699,14 +699,14 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) if (count == 1) { EditBonePoint *ebp; float curs[3]; - + /* Get Points - selected joint */ ebp = points.first; - + /* Get points - cursor (tail) */ invert_m4_m4(obedit->imat, obedit->obmat); mul_v3_m4v3(curs, obedit->imat, ED_view3d_cursor3d_get(scene, v3d)->location); - + /* Create a bone */ newbone = add_points_bone(obedit, ebp->vec, curs); } @@ -714,11 +714,11 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) EditBonePoint *ebp_a, *ebp_b; float head[3], tail[3]; short headtail = 0; - + /* check that the points don't belong to the same bone */ ebp_a = (EditBonePoint *)points.first; ebp_b = ebp_a->next; - + if (((ebp_a->head_owner == ebp_b->tail_owner) && (ebp_a->head_owner != NULL)) || ((ebp_a->tail_owner == ebp_b->head_owner) && (ebp_a->tail_owner != NULL))) { @@ -726,7 +726,7 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) BLI_freelistN(&points); return OPERATOR_CANCELLED; } - + /* find which one should be the 'head' */ if ((ebp_a->head_owner && ebp_b->head_owner) || (ebp_a->tail_owner && ebp_b->tail_owner)) { /* use active, nice predictable */ @@ -759,7 +759,7 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) else if (ebp_b->head_owner) { headtail = 2; } - + /* assign head/tail combinations */ if (headtail == 2) { copy_v3_v3(head, ebp_a->vec); @@ -769,11 +769,11 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) copy_v3_v3(head, ebp_b->vec); copy_v3_v3(tail, ebp_a->vec); } - + /* add new bone and parent it to the appropriate end */ if (headtail) { newbone = add_points_bone(obedit, head, tail); - + /* do parenting (will need to set connected flag too) */ if (headtail == 2) { /* ebp tail or head - tail gets priority */ @@ -808,13 +808,13 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) arm->act_edbone = newbone; newbone->flag |= BONE_TIPSEL; } - + /* updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit); - + /* free points */ BLI_freelistN(&points); - + return OPERATOR_FINISHED; } @@ -824,18 +824,18 @@ void ARMATURE_OT_fill(wmOperatorType *ot) ot->name = "Fill Between Joints"; ot->idname = "ARMATURE_OT_fill"; ot->description = "Add bone between selected joint(s) and/or 3D-Cursor"; - + /* callbacks */ ot->exec = armature_fill_bones_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /* --------------------- */ -/* this function merges between two bones, removes them and those in-between, +/* this function merges between two bones, removes them and those in-between, * and adjusts the parent relationships for those in-between */ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone *endchild, ListBase *chains) @@ -844,7 +844,7 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone EditBone *ebo, *ebone, *newbone; LinkData *chain; float head[3], tail[3]; - + /* check if same bone */ if (start == end) { if (G.debug & G_DEBUG) { @@ -852,7 +852,7 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone printf("\tstart = %s, end = %s\n", start->name, end->name); } } - + /* step 1: add a new bone * - head = head/tail of start (default head) * - tail = head/tail of end (default tail) @@ -876,17 +876,17 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone /* TODO, copy more things to the new bone */ newbone->flag = start->flag & (BONE_HINGE | BONE_NO_DEFORM | BONE_NO_SCALE | BONE_NO_CYCLICOFFSET | BONE_NO_LOCAL_LOCATION | BONE_DONE); - - /* step 2a: reparent any side chains which may be parented to any bone in the chain of bones to merge + + /* step 2a: reparent any side chains which may be parented to any bone in the chain of bones to merge * - potentially several tips for side chains leading to some tree exist... */ for (chain = chains->first; chain; chain = chain->next) { - /* traverse down chain until we hit the bottom or if we run into the tip of the chain of bones we're - * merging (need to stop in this case to avoid corrupting this chain too!) + /* traverse down chain until we hit the bottom or if we run into the tip of the chain of bones we're + * merging (need to stop in this case to avoid corrupting this chain too!) */ for (ebone = chain->data; (ebone) && (ebone != end); ebone = ebone->parent) { short found = 0; - + /* check if this bone is parented to one in the merging chain * ! WATCHIT: must only go check until end of checking chain */ @@ -898,23 +898,23 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone break; } } - + /* carry on to the next tip now */ - if (found) + if (found) break; } } - + /* step 2b: parent child of end to newbone (child from this chain) */ if (endchild) endchild->parent = newbone; - + /* step 3: delete all bones between and including start and end */ for (ebo = end; ebo; ebo = ebone) { ebone = (ebo == start) ? (NULL) : (ebo->parent); bone_free(arm, ebo); } - + newbone->flag |= (BONE_ROOTSEL | BONE_TIPSEL | BONE_SELECTED); ED_armature_edit_sync_selection(arm->edbo); } @@ -925,33 +925,33 @@ static int armature_merge_exec(bContext *C, wmOperator *op) Object *obedit = CTX_data_edit_object(C); bArmature *arm = (obedit) ? obedit->data : NULL; short type = RNA_enum_get(op->ptr, "type"); - + /* sanity checks */ if (ELEM(NULL, obedit, arm)) return OPERATOR_CANCELLED; - + /* for now, there's only really one type of merging that's performed... */ if (type == 1) { /* go down chains, merging bones */ ListBase chains = {NULL, NULL}; LinkData *chain, *nchain; EditBone *ebo; - + armature_tag_select_mirrored(arm); - + /* get chains (ends on chains) */ chains_find_tips(arm->edbo, &chains); if (BLI_listbase_is_empty(&chains)) return OPERATOR_CANCELLED; - + /* each 'chain' is the last bone in the chain (with no children) */ for (chain = chains.first; chain; chain = nchain) { EditBone *bstart = NULL, *bend = NULL; EditBone *bchild = NULL, *child = NULL; - + /* temporarily remove chain from list of chains */ nchain = chain->next; BLI_remlink(&chains, chain); - + /* only consider bones that are visible and selected */ for (ebo = chain->data; ebo; child = ebo, ebo = ebo->parent) { /* check if visible + selected */ @@ -964,37 +964,37 @@ static int armature_merge_exec(bContext *C, wmOperator *op) bend = ebo; bchild = child; } - else + else bstart = ebo; } else { /* chain is broken... merge any continous segments then clear */ if (bstart && bend) bones_merge(obedit, bstart, bend, bchild, &chains); - + bstart = NULL; bend = NULL; bchild = NULL; } } - + /* merge from bstart to bend if something not merged */ if (bstart && bend) bones_merge(obedit, bstart, bend, bchild, &chains); - + /* put back link */ BLI_insertlinkbefore(&chains, nchain, chain); } - + armature_tag_unselect(arm); - + BLI_freelistN(&chains); } - + /* updates */ ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit); - + return OPERATOR_FINISHED; } @@ -1009,15 +1009,15 @@ void ARMATURE_OT_merge(wmOperatorType *ot) ot->name = "Merge Bones"; ot->idname = "ARMATURE_OT_merge"; ot->description = "Merge continuous chains of selected bones"; - + /* callbacks */ ot->invoke = WM_menu_invoke; ot->exec = armature_merge_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_enum(ot->srna, "type", merge_types, 0, "Type", ""); } @@ -1029,41 +1029,41 @@ void ARMATURE_OT_merge(wmOperatorType *ot) * easy to retrieve any hierarchical/chain relationships which are necessary for * this to be done easily. */ - + /* helper to clear BONE_TRANSFORM flags */ static void armature_clear_swap_done_flags(bArmature *arm) { EditBone *ebone; - + for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { ebone->flag &= ~BONE_TRANSFORM; } } -static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) +static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = CTX_data_edit_object(C); bArmature *arm = (bArmature *)ob->data; ListBase chains = {NULL, NULL}; LinkData *chain; - + /* get chains of bones (ends on chains) */ chains_find_tips(arm->edbo, &chains); if (BLI_listbase_is_empty(&chains)) return OPERATOR_CANCELLED; - + /* ensure that mirror bones will also be operated on */ armature_tag_select_mirrored(arm); - - /* clear BONE_TRANSFORM flags + + /* clear BONE_TRANSFORM flags * - used to prevent duplicate/canceling operations from occurring [#34123] * - BONE_DONE cannot be used here as that's already used for mirroring */ armature_clear_swap_done_flags(arm); - + /* loop over chains, only considering selected and visible bones */ for (chain = chains.first; chain; chain = chain->next) { EditBone *ebo, *child = NULL, *parent = NULL; - + /* loop over bones in chain */ for (ebo = chain->data; ebo; ebo = parent) { /* parent is this bone's original parent @@ -1071,14 +1071,14 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) * but the value of ebo->parent may change here... */ parent = ebo->parent; - + /* skip bone if already handled... [#34123] */ if ((ebo->flag & BONE_TRANSFORM) == 0) { /* only if selected and editable */ if (EBONE_VISIBLE(arm, ebo) && EBONE_EDITABLE(ebo)) { /* swap head and tail coordinates */ swap_v3_v3(ebo->head, ebo->tail); - + /* do parent swapping: * - use 'child' as new parent * - connected flag is only set if points are coincidental @@ -1088,44 +1088,44 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) ebo->flag |= BONE_CONNECTED; else ebo->flag &= ~BONE_CONNECTED; - - /* get next bones + + /* get next bones * - child will become the new parent of next bone */ child = ebo; } else { - /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it + /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it * as it will be facing in opposite direction */ if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) { ebo->parent = NULL; ebo->flag &= ~BONE_CONNECTED; } - + /* get next bones - * - child will become new parent of next bone (not swapping occurred, + * - child will become new parent of next bone (not swapping occurred, * so set to NULL to prevent infinite-loop) */ child = NULL; } - + /* tag as done (to prevent double-swaps) */ ebo->flag |= BONE_TRANSFORM; } } } - + /* free chains */ BLI_freelistN(&chains); - + /* clear temp flags */ armature_clear_swap_done_flags(arm); armature_tag_unselect(arm); - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - + return OPERATOR_FINISHED; } @@ -1135,11 +1135,11 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot) ot->name = "Switch Direction"; ot->idname = "ARMATURE_OT_switch_direction"; ot->description = "Change the direction that a chain of bones points in (head <-> tail swap)"; - + /* api callbacks */ ot->exec = armature_switch_direction_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1150,10 +1150,10 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot) static void fix_connected_bone(EditBone *ebone) { float diff[3]; - + if (!(ebone->parent) || !(ebone->flag & BONE_CONNECTED) || equals_v3v3(ebone->parent->tail, ebone->head)) return; - + /* if the parent has moved we translate child's head and tail accordingly */ sub_v3_v3v3(diff, ebone->parent->tail, ebone->head); add_v3_v3(ebone->head, diff); @@ -1164,14 +1164,14 @@ static void fix_connected_bone(EditBone *ebone) static void fix_editbone_connected_children(ListBase *edbo, EditBone *ebone) { EditBone *selbone; - + for (selbone = edbo->first; selbone; selbone = selbone->next) { if ((selbone->parent) && (selbone->parent == ebone) && (selbone->flag & BONE_CONNECTED)) { fix_connected_bone(selbone); fix_editbone_connected_children(edbo, selbone); } } -} +} static void bone_align_to_bone(ListBase *edbo, EditBone *selbone, EditBone *actbone) { @@ -1186,21 +1186,21 @@ static void bone_align_to_bone(ListBase *edbo, EditBone *selbone, EditBone *actb mul_v3_fl(actboneaxis, length); add_v3_v3v3(selbone->tail, selbone->head, actboneaxis); selbone->roll = actbone->roll; - + /* if the bone being aligned has connected descendants they must be moved * according to their parent new position, otherwise they would be left * in an inconsistent state: connected but away from the parent*/ fix_editbone_connected_children(edbo, selbone); } -static int armature_align_bones_exec(bContext *C, wmOperator *op) +static int armature_align_bones_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; int num_selected_bones; - + /* there must be an active bone */ if (actbone == NULL) { BKE_report(op->reports, RPT_ERROR, "Operation requires an active bone"); @@ -1208,28 +1208,28 @@ static int armature_align_bones_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 */ num_selected_bones = CTX_DATA_COUNT(C, selected_editable_bones); if (num_selected_bones <= 1) { /* When only the active bone is selected, and it has a parent, - * align it to the parent, as that is the only possible outcome. + * align it to the parent, as that is the only possible outcome. */ if (actbone->parent) { bone_align_to_bone(arm->edbo, actbone, actbone->parent); - + if ((arm->flag & ARM_MIRROR_EDIT) && (actmirb->parent)) bone_align_to_bone(arm->edbo, actmirb, actmirb->parent); @@ -1240,11 +1240,11 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op) /* Align '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 */ - + /* align selected bones to the active one */ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { @@ -1262,7 +1262,7 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op) /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - + return OPERATOR_FINISHED; } @@ -1272,11 +1272,11 @@ void ARMATURE_OT_align(wmOperatorType *ot) ot->name = "Align Bones"; ot->idname = "ARMATURE_OT_align"; ot->description = "Align selected bones to the active bone (or to their parent)"; - + /* api callbacks */ ot->exec = armature_align_bones_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1388,12 +1388,12 @@ void ARMATURE_OT_delete(wmOperatorType *ot) ot->name = "Delete Selected Bone(s)"; ot->idname = "ARMATURE_OT_delete"; ot->description = "Remove selected bones from the armature"; - + /* api callbacks */ ot->invoke = WM_operator_confirm; ot->exec = armature_delete_selected_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1597,11 +1597,11 @@ void ARMATURE_OT_hide(wmOperatorType *ot) ot->name = "Hide Selected Bones"; ot->idname = "ARMATURE_OT_hide"; ot->description = "Tag selected bones to not be visible in Edit Mode"; - + /* api callbacks */ ot->exec = armature_hide_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -1615,7 +1615,7 @@ static int armature_reveal_exec(bContext *C, wmOperator *op) bArmature *arm = obedit->data; EditBone *ebone; const bool select = RNA_boolean_get(op->ptr, "select"); - + for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { if (arm->layer & ebone->layer) { if (ebone->flag & BONE_HIDDEN_A) { @@ -1640,11 +1640,11 @@ void ARMATURE_OT_reveal(wmOperatorType *ot) ot->name = "Reveal Bones"; ot->idname = "ARMATURE_OT_reveal"; ot->description = "Reveal all bones hidden in Edit Mode"; - + /* api callbacks */ ot->exec = armature_reveal_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index fff85b773e2..1fe729b7c4b 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -146,25 +146,25 @@ void POSE_OT_toggle_bone_selection_overlay(struct wmOperatorType *ot); /* Temporary data linking PoseChannels with the F-Curves they affect */ typedef struct tPChanFCurveLink { struct tPChanFCurveLink *next, *prev; - + ListBase fcurves; /* F-Curves for this PoseChannel (wrapped with LinkData) */ struct bPoseChannel *pchan; /* Pose Channel which data is attached to */ - + char *pchan_path; /* RNA Path to this Pose Channel (needs to be freed when we're done) */ - + float oldloc[3]; /* transform values at start of operator (to be restored before each modal step) */ float oldrot[3]; float oldscale[3]; float oldquat[4]; float oldangle; float oldaxis[3]; - + float roll1, roll2; /* old bbone values (to be restored along with the transform properties) */ float curveInX, curveInY; /* (NOTE: we haven't renamed these this time, as their names are already long enough) */ float curveOutX, curveOutY; float ease1, ease2; float scaleIn, scaleOut; - + struct IDProperty *oldprops; /* copy of custom properties at start of operator (to be restored before each modal step) */ } tPChanFCurveLink; diff --git a/source/blender/editors/armature/armature_naming.c b/source/blender/editors/armature/armature_naming.c index e8d45f72f89..1a5e9e38099 100644 --- a/source/blender/editors/armature/armature_naming.c +++ b/source/blender/editors/armature/armature_naming.c @@ -105,15 +105,15 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char * { bConstraint *curcon; bConstraintTarget *ct; - + for (curcon = conlist->first; curcon; curcon = curcon->next) { const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(curcon); ListBase targets = {NULL, NULL}; - + /* constraint targets */ if (cti && cti->get_constraint_targets) { cti->get_constraint_targets(curcon, &targets); - + for (ct = targets.first; ct; ct = ct->next) { if (ct->tar == ob) { if (STREQ(ct->subtarget, oldname)) { @@ -121,11 +121,11 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char * } } } - + if (cti->flush_constraint_targets) cti->flush_constraint_targets(curcon, &targets, 0); } - + /* action constraints */ if (curcon->type == CONSTRAINT_TYPE_ACTION) { bActionConstraint *actcon = (bActionConstraint *)curcon->data; @@ -142,19 +142,19 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n Object *ob; char newname[MAXBONENAME]; char oldname[MAXBONENAME]; - + /* names better differ! */ if (!STREQLEN(oldnamep, newnamep, MAXBONENAME)) { - + /* we alter newname string... so make copy */ BLI_strncpy(newname, newnamep, MAXBONENAME); /* we use oldname for search... so make copy */ BLI_strncpy(oldname, oldnamep, MAXBONENAME); - + /* now check if we're in editmode, we need to find the unique name */ if (arm->edbo) { EditBone *eBone = ED_armature_ebone_find_name(arm->edbo, oldname); - + if (eBone) { ED_armature_ebone_unique_name(arm->edbo, newname, NULL); BLI_strncpy(eBone->name, newname, MAXBONENAME); @@ -165,7 +165,7 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n } else { Bone *bone = BKE_armature_find_bone_name(arm, oldname); - + if (bone) { unique_bone_name(arm, newname); BLI_strncpy(bone->name, newname, MAXBONENAME); @@ -174,15 +174,15 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n return; } } - + /* do entire dbase - objects */ for (ob = G.main->object.first; ob; ob = ob->id.next) { ModifierData *md; - + /* we have the object using the armature */ if (arm == ob->data) { Object *cob; - + /* Rename the pose channel, if it exists */ if (ob->pose) { bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, oldname); @@ -204,7 +204,7 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n BLI_assert(BKE_pose_channels_is_valid(ob->pose) == true); } - + /* Update any object constraints to use the new bone name */ for (cob = G.main->object.first; cob; cob = cob->id.next) { if (cob->constraints.first) @@ -217,7 +217,7 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n } } } - + /* See if an object is parented to this armature */ if (ob->parent && (ob->parent->data == arm)) { if (ob->partype == PARBONE) { @@ -226,14 +226,14 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n BLI_strncpy(ob->parsubstr, newname, MAXBONENAME); } } - + if (modifiers_usesArmature(ob, arm)) { bDeformGroup *dg = defgroup_find_name(ob, oldname); if (dg) { BLI_strncpy(dg->name, newname, MAXBONENAME); } } - + /* fix modifiers that might be using this name */ for (md = ob->modifiers.first; md; md = md->next) { switch (md->type) { @@ -266,16 +266,16 @@ void ED_armature_bone_rename(bArmature *arm, const char *oldnamep, const char *n } } } - + /* Fix all animdata that may refer to this bone - we can't just do the ones attached to objects, since * other ID-blocks may have drivers referring to this bone [#29822] */ // XXX: the ID here is for armatures, but most bone drivers are actually on the object instead... { - + BKE_animdata_fix_paths_rename_all(&arm->id, "pose.bones", oldname, newname); } - + /* correct view locking */ { bScreen *screen; @@ -377,7 +377,7 @@ static int armature_flip_names_exec(bContext *C, wmOperator *op) ED_armature_bones_flip_names(arm, &bones_names, do_strip_numbers); BLI_freelistN(&bones_names); - + /* since we renamed stuff... */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -397,11 +397,11 @@ void ARMATURE_OT_flip_names(wmOperatorType *ot) ot->name = "Flip Names"; ot->idname = "ARMATURE_OT_flip_names"; ot->description = "Flips (and corrects) the axis suffixes of the names of selected bones"; - + /* api callbacks */ ot->exec = armature_flip_names_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -417,12 +417,12 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op) bArmature *arm; char newname[MAXBONENAME]; short axis = RNA_enum_get(op->ptr, "type"); - + /* paranoia checks */ - if (ELEM(NULL, ob, ob->pose)) + if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; arm = ob->data; - + /* loop through selected bones, auto-naming them */ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { @@ -431,13 +431,13 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op) ED_armature_bone_rename(arm, ebone->name, newname); } CTX_DATA_END; - + /* since we renamed stuff... */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -449,20 +449,20 @@ void ARMATURE_OT_autoside_names(wmOperatorType *ot) {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, {0, NULL, 0, NULL, NULL} }; - + /* identifiers */ ot->name = "AutoName by Axis"; ot->idname = "ARMATURE_OT_autoside_names"; ot->description = "Automatically renames the selected bones according to which side of the target axis they fall on"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = armature_autoside_names_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* settings */ ot->prop = RNA_def_enum(ot->srna, "type", axis_items, 0, "Axis", "Axis tag names with"); } diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index ed79c2c4ab6..cee99c3b8f8 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -46,16 +46,16 @@ void ED_operatortypes_armature(void) { /* EDIT ARMATURE */ WM_operatortype_append(ARMATURE_OT_bone_primitive_add); - + WM_operatortype_append(ARMATURE_OT_align); WM_operatortype_append(ARMATURE_OT_calculate_roll); WM_operatortype_append(ARMATURE_OT_roll_clear); WM_operatortype_append(ARMATURE_OT_switch_direction); WM_operatortype_append(ARMATURE_OT_subdivide); - + WM_operatortype_append(ARMATURE_OT_parent_set); WM_operatortype_append(ARMATURE_OT_parent_clear); - + WM_operatortype_append(ARMATURE_OT_select_all); WM_operatortype_append(ARMATURE_OT_select_mirror); WM_operatortype_append(ARMATURE_OT_select_more); @@ -77,10 +77,10 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_merge); WM_operatortype_append(ARMATURE_OT_separate); WM_operatortype_append(ARMATURE_OT_split); - + WM_operatortype_append(ARMATURE_OT_autoside_names); WM_operatortype_append(ARMATURE_OT_flip_names); - + WM_operatortype_append(ARMATURE_OT_layers_show_all); WM_operatortype_append(ARMATURE_OT_armature_layers); WM_operatortype_append(ARMATURE_OT_bone_layers); @@ -88,19 +88,19 @@ void ED_operatortypes_armature(void) /* POSE */ WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveal); - + WM_operatortype_append(POSE_OT_armature_apply); WM_operatortype_append(POSE_OT_visual_transform_apply); - + WM_operatortype_append(POSE_OT_rot_clear); WM_operatortype_append(POSE_OT_loc_clear); WM_operatortype_append(POSE_OT_scale_clear); WM_operatortype_append(POSE_OT_transforms_clear); WM_operatortype_append(POSE_OT_user_transforms_clear); - + WM_operatortype_append(POSE_OT_copy); WM_operatortype_append(POSE_OT_paste); - + WM_operatortype_append(POSE_OT_select_all); WM_operatortype_append(POSE_OT_select_parent); @@ -109,7 +109,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_select_constraint_target); WM_operatortype_append(POSE_OT_select_grouped); WM_operatortype_append(POSE_OT_select_mirror); - + WM_operatortype_append(POSE_OT_group_add); WM_operatortype_append(POSE_OT_group_remove); WM_operatortype_append(POSE_OT_group_move); @@ -118,38 +118,38 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_group_unassign); WM_operatortype_append(POSE_OT_group_select); WM_operatortype_append(POSE_OT_group_deselect); - + WM_operatortype_append(POSE_OT_paths_calculate); WM_operatortype_append(POSE_OT_paths_update); WM_operatortype_append(POSE_OT_paths_clear); - + WM_operatortype_append(POSE_OT_autoside_names); WM_operatortype_append(POSE_OT_flip_names); - + WM_operatortype_append(POSE_OT_rotation_mode_set); WM_operatortype_append(POSE_OT_quaternions_flip); - + WM_operatortype_append(POSE_OT_bone_layers); WM_operatortype_append(POSE_OT_toggle_bone_selection_overlay); - + WM_operatortype_append(POSE_OT_propagate); - + /* POSELIB */ WM_operatortype_append(POSELIB_OT_browse_interactive); WM_operatortype_append(POSELIB_OT_apply_pose); - + WM_operatortype_append(POSELIB_OT_pose_add); WM_operatortype_append(POSELIB_OT_pose_remove); WM_operatortype_append(POSELIB_OT_pose_rename); WM_operatortype_append(POSELIB_OT_pose_move); - + WM_operatortype_append(POSELIB_OT_new); WM_operatortype_append(POSELIB_OT_unlink); - + WM_operatortype_append(POSELIB_OT_action_sanitize); - + /* POSE SLIDING */ WM_operatortype_append(POSE_OT_push); WM_operatortype_append(POSE_OT_relax); @@ -191,7 +191,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) { wmKeyMap *keymap; wmKeyMapItem *kmi; - + /* Armature ------------------------ */ keymap = WM_keymap_find(keyconf, "Armature", 0, 0); keymap->poll = ED_operator_editarmature; @@ -206,14 +206,14 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_align", AKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_roll_clear", RKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_item(keymap, "ARMATURE_OT_bone_primitive_add", AKEY, KM_PRESS, KM_SHIFT, 0); - + WM_keymap_add_item(keymap, "ARMATURE_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0); - + kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", AKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); @@ -221,14 +221,14 @@ void ED_keymap_armature(wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", false); - + kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); RNA_boolean_set(kmi->ptr, "extend", false); kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); RNA_boolean_set(kmi->ptr, "extend", true); - + kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); RNA_boolean_set(kmi->ptr, "extend", false); @@ -244,7 +244,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_select_linked", LKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_shortest_path_pick", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); - + WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_armature_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_armature_delete", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_dissolve", XKEY, KM_PRESS, KM_CTRL, 0); @@ -255,19 +255,19 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_fill", FKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_merge", MKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_split", YKEY, KM_PRESS, 0, 0); - + WM_keymap_add_item(keymap, "ARMATURE_OT_separate", PKEY, KM_PRESS, 0, 0); - + /* set flags */ WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_toggle", WKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_enable", WKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_disable", WKEY, KM_PRESS, KM_ALT, 0); - + /* armature/bone layers */ WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_bone_layers", MKEY, KM_PRESS, 0, 0); - + /* special transforms: */ /* 1) envelope/b-bone size */ kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); @@ -278,7 +278,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) /* 3) set roll */ kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", RKEY, KM_PRESS, KM_CTRL, 0); RNA_enum_set(kmi->ptr, "mode", TFM_BONE_ROLL); - + /* menus */ WM_keymap_add_menu(keymap, "VIEW3D_MT_armature_specials", WKEY, KM_PRESS, 0, 0); @@ -286,36 +286,36 @@ void ED_keymap_armature(wmKeyConfig *keyconf) /* only set in posemode, by space_view3d listener */ keymap = WM_keymap_find(keyconf, "Pose", 0, 0); keymap->poll = ED_operator_posemode; - + /* set parent and add object are object-based operators, but we make them * available here because it's useful to do in pose mode too */ WM_keymap_add_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); - + kmi = WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "unselected", false); kmi = WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "unselected", true); WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0); - + /* TODO: clear pose */ WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_item(keymap, "POSE_OT_quaternions_flip", FKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_item(keymap, "POSE_OT_rotation_mode_set", RKEY, KM_PRESS, KM_CTRL, 0); - + WM_keymap_add_item(keymap, "POSE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); RNA_boolean_set(kmi->ptr, "flipped", false); kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "flipped", true); - + #ifdef __APPLE__ WM_keymap_add_item(keymap, "POSE_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0); kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0); @@ -337,7 +337,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); RNA_boolean_set(kmi->ptr, "extend", true); - + kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); RNA_boolean_set(kmi->ptr, "extend", false); @@ -348,14 +348,14 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "POSE_OT_select_linked", LKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "POSE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSE_OT_select_mirror", FKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); - + WM_keymap_add_item(keymap, "POSE_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSE_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_ik_add", IKEY, KM_PRESS, /*KM_CTRL|*/ KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSE_OT_ik_clear", IKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); - + WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_group", GKEY, KM_PRESS, KM_CTRL, 0); - + /* set flags */ WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_toggle", WKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_enable", WKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); @@ -366,25 +366,25 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSE_OT_bone_layers", MKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "POSE_OT_toggle_bone_selection_overlay", ZKEY, KM_PRESS, 0, 0); - + /* special transforms: */ /* 1) envelope/b-bone size */ kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE); - + /* keyframes management */ WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0); WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL | KM_SHIFT | KM_ALT, 0); - + /* Pose -> PoseLib ------------- */ /* only set in posemode, by space_view3d listener */ WM_keymap_add_item(keymap, "POSELIB_OT_browse_interactive", LKEY, KM_PRESS, KM_CTRL, 0); - + WM_keymap_add_item(keymap, "POSELIB_OT_pose_add", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSELIB_OT_pose_remove", LKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSELIB_OT_pose_rename", LKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); - + /* Pose -> Pose Sliding ------------- */ /* only set in posemode, by space_view3d listener */ WM_keymap_add_item(keymap, "POSE_OT_push", EKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c index 91f8a8713bc..5d6c383b24b 100644 --- a/source/blender/editors/armature/armature_relations.c +++ b/source/blender/editors/armature/armature_relations.c @@ -110,7 +110,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); } } @@ -122,7 +122,7 @@ static void joined_armature_fix_links_constraints( typedef struct tJoinArmature_AdtFixData { Object *srcArm; Object *tarArm; - + GHash *names_map; } tJoinArmature_AdtFixData; @@ -135,34 +135,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 */ @@ -171,7 +171,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 @@ -180,7 +180,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)) { @@ -210,7 +210,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 */ @@ -220,12 +220,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? */ @@ -235,7 +235,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; } @@ -254,13 +254,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) { @@ -278,7 +278,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; @@ -288,36 +288,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]; @@ -325,48 +325,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! */ @@ -380,7 +380,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 */ @@ -391,20 +391,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_object_base_free_and_unlink(bmain, scene, base->object); } } CTX_DATA_END; - + DEG_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; } @@ -417,11 +417,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 */ @@ -431,11 +431,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 @@ -462,18 +462,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 @@ -492,14 +492,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? */ @@ -512,31 +512,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) { @@ -545,23 +545,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); @@ -576,14 +576,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 @@ -604,16 +604,16 @@ static int separate_armature_exec(bContext *C, wmOperator *op) } } CTX_DATA_END; - + /* 1) store starting settings and exit editmode */ oldob = obedit; oldbase = view_layer->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, view_layer, oldbase, USER_DUP_ARM); /* only duplicate linked armature */ DEG_relations_tag_update(bmain); @@ -625,20 +625,20 @@ static int separate_armature_exec(bContext *C, wmOperator *op) /* 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); - + DEG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */ DEG_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); @@ -646,10 +646,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; } @@ -659,12 +659,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; } @@ -688,13 +688,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) { @@ -702,21 +702,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); @@ -739,14 +739,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"); @@ -754,27 +754,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); } @@ -783,16 +783,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); @@ -800,11 +800,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; } @@ -814,7 +814,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) { @@ -824,13 +824,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; } @@ -840,15 +840,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"); } @@ -866,28 +866,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; } @@ -897,15 +897,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"); } diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c index 65f845ce34c..95acc8ab6ba 100644 --- a/source/blender/editors/armature/armature_select.c +++ b/source/blender/editors/armature/armature_select.c @@ -149,10 +149,10 @@ void *get_bone_from_selectbuffer( short i; bool takeNext = false; int minsel = 0xffffffff, minunsel = 0xffffffff; - + for (i = 0; i < hits; i++) { hitresult = buffer[3 + (i * 4)]; - + if (!(hitresult & BONESEL_NOSEL)) { if (hitresult & BONESEL_ANY) { /* to avoid including objects in selection */ Base *base = NULL; @@ -184,7 +184,7 @@ void *get_bone_from_selectbuffer( data = ebone; } - + if (data) { if (sel) { if (do_nearest) { @@ -225,7 +225,7 @@ void *get_bone_from_selectbuffer( } } } - + if (firstunSel) { *r_base = firstunSel_base; return firstunSel; @@ -249,11 +249,11 @@ void *get_nearest_bone( short hits; ED_view3d_viewcontext_init(C, &vc); - + // rect.xmin = ... mouseco! rect.xmin = rect.xmax = xy[0]; rect.ymin = rect.ymax = xy[1]; - + hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, VIEW3D_SELECT_PICK_NEAREST); *r_base = NULL; @@ -310,7 +310,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); } } - + if (curBone->flag & BONE_CONNECTED) next = curBone->parent; else @@ -339,11 +339,11 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv if (!curBone) bone = NULL; } - + ED_armature_edit_sync_selection(arm->edbo); - + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, base->object); - + return OPERATOR_FINISHED; } @@ -358,15 +358,15 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot) ot->name = "Select Connected"; ot->idname = "ARMATURE_OT_select_linked"; ot->description = "Select bones related to selected ones by parent/child relationships"; - + /* api callbacks */ /* leave 'exec' unset */ ot->invoke = armature_select_linked_invoke; ot->poll = armature_select_linked_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first"); } @@ -505,7 +505,7 @@ cache_end: dep = 1; else if ( (hitresult & BONESEL_TIP) && (ebone->flag & BONE_TIPSEL) == 0) dep = 1; - else + else dep = 2; } else { @@ -638,10 +638,10 @@ bool ED_armature_edit_select_pick(bContext *C, const int mval[2], bool extend, b ED_armature_edit_deselect_all_multi(objects, objects_len); MEM_freeN(objects); } - + /* by definition the non-root connected bones have no root point drawn, * so a root selection needs to be delivered to the parent tip */ - + if (selmask & BONE_SELECTED) { if (nearBone->parent && (nearBone->flag & BONE_CONNECTED)) { /* click in a chain */ @@ -706,9 +706,9 @@ bool ED_armature_edit_select_pick(bContext *C, const int mval[2], bool extend, b else nearBone->flag |= selmask; } - + ED_armature_edit_sync_selection(arm->edbo); - + if (nearBone) { /* then now check for active status */ if (ebone_select_flag(nearBone)) { @@ -748,7 +748,7 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op) } CTX_DATA_END; } - + /* Set the flags */ CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) { @@ -783,7 +783,7 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op) CTX_DATA_END; WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, NULL); - + return OPERATOR_FINISHED; } @@ -793,14 +793,14 @@ void ARMATURE_OT_select_all(wmOperatorType *ot) ot->name = "(De)select All"; ot->idname = "ARMATURE_OT_select_all"; ot->description = "Toggle selection status of all bones"; - + /* api callbacks */ ot->exec = armature_de_select_all_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + WM_operator_properties_select_all(ot); } @@ -1228,7 +1228,7 @@ static int armature_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; - + ob = obedit; arm = (bArmature *)ob->data; @@ -1286,15 +1286,15 @@ static int armature_select_hierarchy_exec(bContext *C, wmOperator *op) changed = true; } } - + if (changed == false) { return OPERATOR_CANCELLED; } ED_armature_edit_sync_selection(arm->edbo); - + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - + return OPERATOR_FINISHED; } @@ -1305,16 +1305,16 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot) {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""}, {0, NULL, 0, NULL, NULL} }; - + /* identifiers */ ot->name = "Select Hierarchy"; ot->idname = "ARMATURE_OT_select_hierarchy"; ot->description = "Select immediate parent/children of selected bones"; - + /* api callbacks */ ot->exec = armature_select_hierarchy_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c index 1722cbd5c5c..463e00957e6 100644 --- a/source/blender/editors/armature/armature_skinning.c +++ b/source/blender/editors/armature/armature_skinning.c @@ -71,7 +71,7 @@ static int bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap) * This function performs 2 functions: * * a) It returns 1 if the bone is skinnable. - * If we loop over all bones with this + * If we loop over all bones with this * function, we can count the number of * skinnable bones. * b) If the pointer data is non null, @@ -96,10 +96,10 @@ static int bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap) segments = bone->segments; else segments = 1; - + if (data->list != NULL) { hbone = (Bone ***) &data->list; - + for (a = 0; a < segments; a++) { **hbone = bone; ++*hbone; @@ -111,10 +111,10 @@ static int bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap) return 0; } -static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)) +static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)) { /* This group creates a vertex group to ob that has the - * same name as bone (provided the bone is skinnable). + * same name as bone (provided the bone is skinnable). * If such a vertex group already exist the routine exits. */ if (!(bone->flag & BONE_NO_DEFORM)) { @@ -126,7 +126,7 @@ static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)) return 0; } -static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) +static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) { /* Bones that are deforming * are regarded to be "skinnable" and are eligible for @@ -134,16 +134,16 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) * * This function performs 2 functions: * - * a) If the bone is skinnable, it creates + * a) If the bone is skinnable, it creates * a vertex group for ob that has * the name of the skinnable bone * (if one doesn't exist already). * b) If the pointer data is non null, * it is treated like a handle to a - * bDeformGroup pointer -- the + * bDeformGroup pointer -- the * bDeformGroup pointer is set to point * to the deform group with the bone's - * name, and the pointer the handle + * name, and the pointer the handle * points to is incremented to point to the * next member of an array of pointers * to bDeformGroups. This way we can loop using @@ -162,7 +162,7 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) segments = bone->segments; else segments = 1; - + if (!data->is_weight_paint || ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED))) { if (!(defgroup = defgroup_find_name(ob, bone->name))) { defgroup = BKE_object_defgroup_add_name(ob, bone->name); @@ -172,10 +172,10 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) defgroup = NULL; } } - + if (data->list != NULL) { hgroup = (bDeformGroup ***) &data->list; - + for (a = 0; a < segments; a++) { **hgroup = defgroup; ++*hgroup; @@ -215,25 +215,25 @@ static void envelope_bone_weighting( } iflip = (dgroupflip) ? mesh_get_x_mirror_vert(ob, NULL, i, use_topology) : -1; - + /* for each skinnable bone */ for (j = 0; j < numbones; ++j) { if (!selected[j]) continue; - + bone = bonelist[j]; dgroup = dgrouplist[j]; - + /* store the distance-factor from the vertex to the bone */ distance = distfactor_to_bone(verts[i], root[j], tip[j], bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale); - + /* add the vert to the deform group if (weight != 0.0) */ if (distance != 0.0f) ED_vgroup_vert_add(ob, dgroup, i, distance, WEIGHT_REPLACE); else ED_vgroup_vert_remove(ob, dgroup, i); - + /* do same for mirror */ if (dgroupflip && dgroupflip[j] && iflip != -1) { if (distance != 0.0f) @@ -282,10 +282,10 @@ static void add_verts_to_dgroups( /* count the number of skinnable bones */ numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb); - + if (numbones == 0) return; - + if (BKE_object_defgroup_data_create(ob->data) == NULL) return; @@ -313,13 +313,13 @@ static void add_verts_to_dgroups( for (j = 0; j < numbones; ++j) { bone = bonelist[j]; dgroup = dgrouplist[j]; - + /* handle bbone */ if (heat) { if (segments == 0) { segments = 1; bbone = NULL; - + if ((par->pose) && (pchan = BKE_pose_channel_find_name(par->pose, bone->name))) { if (bone->segments > 1) { segments = bone->segments; @@ -328,10 +328,10 @@ static void add_verts_to_dgroups( } } } - + segments--; } - + /* compute root and tip */ if (bbone) { mul_v3_m4v3(root[j], bone->arm_mat, bbone[segments].mat[3]); @@ -346,10 +346,10 @@ static void add_verts_to_dgroups( copy_v3_v3(root[j], bone->arm_head); copy_v3_v3(tip[j], bone->arm_tail); } - + mul_m4_v3(par->obmat, root[j]); mul_m4_v3(par->obmat, tip[j]); - + /* set selected */ if (wpmode) { if ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED)) @@ -357,7 +357,7 @@ static void add_verts_to_dgroups( } else selected[j] = 1; - + /* find flipped group */ if (dgroup && mirror) { char name_flip[MAXBONENAME]; @@ -374,12 +374,12 @@ static void add_verts_to_dgroups( if (wpmode) { /* if in weight paint mode, use final verts from derivedmesh */ DerivedMesh *dm = mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_BAREMESH); - + if (dm->foreachMappedVert) { mesh_get_mapped_verts_coords(dm, verts, mesh->totvert); vertsfilled = 1; } - + dm->release(dm); } else if (modifiers_findByType(ob, eModifierType_Subsurf)) { @@ -431,7 +431,7 @@ void ED_object_vgroup_calc_from_armature( ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, Object *par, const int mode, const bool mirror) { - /* Lets try to create some vertex groups + /* Lets try to create some vertex groups * based on the bones of the parent armature. */ bArmature *arm = par->data; @@ -439,7 +439,7 @@ void ED_object_vgroup_calc_from_armature( if (mode == ARM_GROUPS_NAME) { const int defbase_tot = BLI_listbase_count(&ob->defbase); int defbase_add; - /* Traverse the bone list, trying to create empty vertex + /* Traverse the bone list, trying to create empty vertex * groups corresponding to the bone. */ defbase_add = bone_looper(ob, arm->bonebase.first, NULL, vgroup_add_unique_bone_cb); @@ -451,7 +451,7 @@ void ED_object_vgroup_calc_from_armature( } } else if (ELEM(mode, ARM_GROUPS_ENVELOPE, ARM_GROUPS_AUTO)) { - /* Traverse the bone list, trying to create vertex groups + /* Traverse the bone list, trying to create vertex groups * that are populated with the vertices for which the * bone is closest. */ diff --git a/source/blender/editors/armature/armature_utils.c b/source/blender/editors/armature/armature_utils.c index ffa8b9f5007..a8116ce26cf 100644 --- a/source/blender/editors/armature/armature_utils.c +++ b/source/blender/editors/armature/armature_utils.c @@ -57,7 +57,7 @@ void ED_armature_edit_sync_selection(ListBase *edbo) { EditBone *ebo; - + for (ebo = edbo->first; ebo; ebo = ebo->next) { /* if bone is not selectable, we shouldn't alter this setting... */ if ((ebo->flag & BONE_UNSELECTABLE) == 0) { @@ -67,7 +67,7 @@ void ED_armature_edit_sync_selection(ListBase *edbo) else ebo->flag &= ~BONE_ROOTSEL; } - + if ((ebo->flag & BONE_TIPSEL) && (ebo->flag & BONE_ROOTSEL)) ebo->flag |= BONE_SELECTED; else @@ -94,27 +94,27 @@ void ED_armature_edit_validate_active(struct bArmature *arm) int bone_looper(Object *ob, Bone *bone, void *data, int (*bone_func)(Object *, Bone *, void *)) { - /* We want to apply the function bone_func to every bone - * in an armature -- feed bone_looper the first bone and - * a pointer to the bone_func and watch it go!. The int count + /* We want to apply the function bone_func to every bone + * in an armature -- feed bone_looper the first bone and + * a pointer to the bone_func and watch it go!. The int count * can be useful for counting bones with a certain property * (e.g. skinnable) */ int count = 0; - + if (bone) { /* only do bone_func if the bone is non null */ count += bone_func(ob, bone, data); - + /* try to execute bone_func for the first child */ count += bone_looper(ob, bone->childbase.first, data, bone_func); - + /* try to execute bone_func for the next bone at this * depth of the recursion. */ count += bone_looper(ob, bone->next, data, bone_func); } - + return count; } @@ -273,13 +273,13 @@ EditBone *ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo) if (ebo == NULL) return NULL; - + BLI_string_flip_side_name(name_flip, ebo->name, false, sizeof(name_flip)); - + if (!STREQ(name_flip, ebo->name)) { return ED_armature_ebone_find_name(edbo, name_flip); } - + return NULL; } @@ -293,7 +293,7 @@ void armature_select_mirrored_ex(bArmature *arm, const int flag) /* Select mirrored bones */ if (arm->flag & ARM_MIRROR_EDIT) { EditBone *curBone, *ebone_mirr; - + for (curBone = arm->edbo->first; curBone; curBone = curBone->next) { if (arm->layer & curBone->layer) { if (curBone->flag & flag) { @@ -304,7 +304,7 @@ void armature_select_mirrored_ex(bArmature *arm, const int flag) } } } - + } void armature_select_mirrored(bArmature *arm) @@ -333,7 +333,7 @@ void armature_tag_select_mirrored(bArmature *arm) } } } - + for (curBone = arm->edbo->first; curBone; curBone = curBone->next) { if (curBone->flag & BONE_DONE) { EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, curBone); @@ -363,17 +363,17 @@ void ED_armature_edit_transform_mirror_update(Object *obedit) { bArmature *arm = obedit->data; EditBone *ebo, *eboflip; - + for (ebo = arm->edbo->first; ebo; ebo = ebo->next) { /* no layer check, correct mirror is more important */ if (ebo->flag & (BONE_TIPSEL | BONE_ROOTSEL)) { eboflip = ED_armature_ebone_get_mirrored(arm->edbo, ebo); - + if (eboflip) { /* we assume X-axis flipping for now */ if (ebo->flag & BONE_TIPSEL) { EditBone *children; - + eboflip->tail[0] = -ebo->tail[0]; eboflip->tail[1] = ebo->tail[1]; eboflip->tail[2] = ebo->tail[2]; @@ -381,7 +381,7 @@ void ED_armature_edit_transform_mirror_update(Object *obedit) eboflip->roll = -ebo->roll; eboflip->curveOutX = -ebo->curveOutX; eboflip->roll2 = -ebo->roll2; - + /* Also move connected children, in case children's name aren't mirrored properly */ for (children = arm->edbo->first; children; children = children->next) { if (children->parent == eboflip && children->flag & BONE_CONNECTED) { @@ -398,7 +398,7 @@ void ED_armature_edit_transform_mirror_update(Object *obedit) eboflip->roll = -ebo->roll; eboflip->curveInX = -ebo->curveInX; eboflip->roll1 = -ebo->roll1; - + /* Also move connected parent, in case parent's name isn't mirrored properly */ if (eboflip->parent && eboflip->flag & BONE_CONNECTED) { EditBone *parent = eboflip->parent; @@ -411,7 +411,7 @@ void ED_armature_edit_transform_mirror_update(Object *obedit) eboflip->roll = -ebo->roll; eboflip->xwidth = ebo->xwidth; eboflip->zwidth = ebo->zwidth; - + eboflip->curveInX = -ebo->curveInX; eboflip->curveOutX = -ebo->curveOutX; eboflip->roll1 = -ebo->roll1; @@ -432,17 +432,17 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone EditBone *eBoneAct = NULL; EditBone *eBoneTest = NULL; Bone *curBone; - + for (curBone = bones->first; curBone; curBone = curBone->next) { eBone = MEM_callocN(sizeof(EditBone), "make_editbone"); - + /* Copy relevant data from bone to eBone * Keep selection logic in sync with ED_armature_edit_sync_selection. */ eBone->parent = parent; BLI_strncpy(eBone->name, curBone->name, sizeof(eBone->name)); eBone->flag = curBone->flag; - + /* fix selection flags */ if (eBone->flag & BONE_SELECTED) { /* if the bone is selected the copy its root selection to the parents tip */ @@ -462,11 +462,11 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone eBone->flag &= ~BONE_ROOTSEL; } } - + copy_v3_v3(eBone->head, curBone->arm_head); copy_v3_v3(eBone->tail, curBone->arm_tail); eBone->roll = curBone->arm_roll; - + /* rest of stuff copy */ eBone->length = curBone->length; eBone->dist = curBone->dist; @@ -492,20 +492,20 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone if (curBone->prop) eBone->prop = IDP_CopyProperty(curBone->prop); - + BLI_addtail(edbo, eBone); - + /* Add children if necessary */ if (curBone->childbase.first) { eBoneTest = make_boneList(edbo, &curBone->childbase, eBone, actBone); if (eBoneTest) eBoneAct = eBoneTest; } - + if (curBone == actBone) eBoneAct = eBone; } - + return eBoneAct; } @@ -590,18 +590,18 @@ void ED_armature_from_edit(bArmature *arm) EditBone *eBone, *neBone; Bone *newBone; Object *obt; - + /* armature bones */ BKE_armature_bonelist_free(&arm->bonebase); arm->act_bone = NULL; - + /* remove zero sized bones, this gives unstable restposes */ for (eBone = arm->edbo->first; eBone; eBone = neBone) { float len_sq = len_squared_v3v3(eBone->head, eBone->tail); neBone = eBone->next; if (len_sq <= SQUARE(0.000001f)) { /* FLT_EPSILON is too large? */ EditBone *fBone; - + /* Find any bones that refer to this bone */ for (fBone = arm->edbo->first; fBone; fBone = fBone->next) { if (fBone->parent == eBone) @@ -612,19 +612,19 @@ void ED_armature_from_edit(bArmature *arm) bone_free(arm, eBone); } } - + /* Copy the bones from the editData into the armature */ for (eBone = arm->edbo->first; eBone; eBone = eBone->next) { newBone = MEM_callocN(sizeof(Bone), "bone"); eBone->temp.bone = newBone; /* Associate the real Bones with the EditBones */ - + BLI_strncpy(newBone->name, eBone->name, sizeof(newBone->name)); copy_v3_v3(newBone->arm_head, eBone->head); copy_v3_v3(newBone->arm_tail, eBone->tail); newBone->arm_roll = eBone->roll; - + newBone->flag = eBone->flag; - + if (eBone == arm->act_edbone) { /* don't change active selection, this messes up separate which uses * editmode toggle and can separate active bone which is de-selected originally */ @@ -632,10 +632,10 @@ void ED_armature_from_edit(bArmature *arm) arm->act_bone = newBone; } newBone->roll = 0.0f; - + newBone->weight = eBone->weight; newBone->dist = eBone->dist; - + newBone->xwidth = eBone->xwidth; newBone->zwidth = eBone->zwidth; newBone->rad_head = eBone->rad_head; @@ -659,7 +659,7 @@ void ED_armature_from_edit(bArmature *arm) if (eBone->prop) newBone->prop = IDP_CopyProperty(eBone->prop); } - + /* Fix parenting in a separate pass to ensure ebone->bone connections are valid at this point. * Do not set bone->head/tail here anymore, using EditBone data for that is not OK since our later fiddling * with parent's arm_mat (for roll conversion) may have some small but visible impact on locations (T46010). */ @@ -674,24 +674,24 @@ void ED_armature_from_edit(bArmature *arm) BLI_addtail(&arm->bonebase, newBone); } } - + /* Finalize definition of restpose data (roll, bone_mat, arm_mat, head/tail...). */ armature_finalize_restpose(&arm->bonebase, arm->edbo); - + /* so all users of this armature should get rebuilt */ for (obt = G.main->object.first; obt; obt = obt->id.next) { if (obt->data == arm) { BKE_pose_rebuild(obt, arm); } } - + DEG_id_tag_update(&arm->id, 0); } void ED_armature_edit_free(struct bArmature *arm) { EditBone *eBone; - + /* Clear the editbones list */ if (arm->edbo) { if (arm->edbo->first) { @@ -701,7 +701,7 @@ void ED_armature_edit_free(struct bArmature *arm) MEM_freeN(eBone->prop); } } - + BLI_freelistN(arm->edbo); } MEM_freeN(arm->edbo); diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index ea4a12482d9..bc6d776911a 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -96,7 +96,7 @@ struct LaplacianSystem { float *H; /* diagonal H matrix */ float *p; /* values from all p vectors */ float *mindist; /* minimum distance to a bone for all vertices */ - + BVHTree *bvhtree; /* ray tracing acceleration structure */ const MLoopTri **vltree; /* a looptri that the vertex belongs to */ } heat; @@ -261,7 +261,7 @@ static void laplacian_system_construct_end(LaplacianSystem *sys) if (sys->areaweights) for (a = 0, face = sys->faces; a < sys->totface; a++, face++) laplacian_triangle_area(sys, (*face)[0], (*face)[1], (*face)[2]); - + for (a = 0; a < totvert; a++) { if (sys->areaweights) { if (sys->varea[a] != 0.0f) @@ -277,7 +277,7 @@ static void laplacian_system_construct_end(LaplacianSystem *sys) if (sys->storeweights) sys->fweights = MEM_callocN(sizeof(float) * 3 * totface, "LaplacianFWeight"); - + for (a = 0, face = sys->faces; a < totface; a++, face++) laplacian_triangle_weights(sys, a, (*face)[0], (*face)[1], (*face)[2]); @@ -405,7 +405,7 @@ static void heat_ray_tree_create(LaplacianSystem *sys) const MLoopTri *lt = &looptri[a]; float bb[6]; int vtri[3]; - + vtri[0] = mloop[lt->tri[0]].v; vtri[1] = mloop[lt->tri[1]].v; vtri[2] = mloop[lt->tri[2]].v; @@ -416,14 +416,14 @@ static void heat_ray_tree_create(LaplacianSystem *sys) minmax_v3v3_v3(bb, bb + 3, verts[vtri[2]]); BLI_bvhtree_insert(sys->heat.bvhtree, a, bb, 2); - + //Setup inverse pointers to use on isect.orig sys->heat.vltree[vtri[0]] = lt; sys->heat.vltree[vtri[1]] = lt; sys->heat.vltree[vtri[2]] = lt; } - BLI_bvhtree_balance(sys->heat.bvhtree); + BLI_bvhtree_balance(sys->heat.bvhtree); } static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source) @@ -459,7 +459,7 @@ static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source) static float heat_source_distance(LaplacianSystem *sys, int vertex, int source) { float closest[3], d[3], dist, cosine; - + /* compute euclidian distance */ closest_to_line_segment_v3(closest, sys->heat.verts[vertex], sys->heat.root[source], sys->heat.tip[source]); @@ -481,7 +481,7 @@ static int heat_source_closest(LaplacianSystem *sys, int vertex, int source) if (dist <= sys->heat.mindist[vertex] * (1.0f + DISTANCE_EPSILON)) if (heat_ray_source_visible(sys, vertex, source)) return 1; - + return 0; } @@ -516,7 +516,7 @@ static void heat_set_H(LaplacianSystem *sys, int vertex) } else h = 0.0f; - + sys->heat.H[vertex] = h; } @@ -533,7 +533,7 @@ static void heat_calc_vnormals(LaplacianSystem *sys) v3 = (*face)[2]; normal_tri_v3(fnor, sys->verts[v1], sys->verts[v2], sys->verts[v3]); - + add_v3_v3(sys->heat.vnors[v1], fnor); add_v3_v3(sys->heat.vnors[v2], fnor); add_v3_v3(sys->heat.vnors[v3], fnor); @@ -680,7 +680,7 @@ void heat_bone_weighting( for (a = 0; a < me->totvert; a++) vertsflipped[a] = mesh_get_x_mirror_vert(ob, NULL, a, use_topology); } - + /* compute weights per bone */ for (j = 0; j < numsource; j++) { if (!selected[j]) @@ -718,7 +718,7 @@ void heat_bone_weighting( continue; solution = laplacian_system_get_solution(sys, a); - + if (bbone) { if (solution > 0.0f) ED_vgroup_vert_add(ob, dgrouplist[j], a, solution, @@ -853,7 +853,7 @@ typedef struct MeshDeformBind { /* direct solver */ int *varidx; - + BVHTree *bvhtree; BVHTreeFromMesh bvhdata; @@ -874,7 +874,7 @@ typedef struct MeshDeformIsect { bool isect; float u, v; - + } MeshDeformIsect; /* ray intersection */ @@ -894,9 +894,9 @@ static void harmonic_ray_callback(void *userdata, int index, const BVHTreeRay *r MeshDeformIsect *isec = data->isec; float no[3], co[3], dist; float *face[3]; - + lt = &looptri[index]; - + face[0] = mdb->cagecos[mloop[lt->tri[0]].v]; face[1] = mdb->cagecos[mloop[lt->tri[1]].v]; face[2] = mdb->cagecos[mloop[lt->tri[2]].v]; @@ -920,7 +920,7 @@ static void harmonic_ray_callback(void *userdata, int index, const BVHTreeRay *r hit->index = index; hit->dist = dist; copy_v3_v3(hit->co, co); - + isec->isect = (dot_v3v3(no, ray->direction) <= 0.0f); isec->lambda = dist; } @@ -1003,7 +1003,7 @@ static int meshdeform_inside_cage(MeshDeformBind *mdb, float *co) copy_v3_v3(start, co); sub_v3_v3v3(dir, outside, start); normalize_v3(dir); - + isect = meshdeform_ray_tree_intersect(mdb, start, outside); if (isect && !isect->facing) return 1; @@ -1017,7 +1017,7 @@ static int meshdeform_inside_cage(MeshDeformBind *mdb, float *co) BLI_INLINE int meshdeform_index(MeshDeformBind *mdb, int x, int y, int z, int n) { int size = mdb->size; - + x += MESHDEFORM_OFFSET[n][0]; y += MESHDEFORM_OFFSET[n][1]; z += MESHDEFORM_OFFSET[n][2]; @@ -1121,7 +1121,7 @@ static void meshdeform_bind_floodfill(MeshDeformBind *mdb) if (mdb->semibound[a]) ts++; } - + printf("interior %d exterior %d boundary %d semi-boundary %d\n", ti, te, tb, ts); } #endif @@ -1230,7 +1230,7 @@ static void meshdeform_matrix_add_cell(MeshDeformBind *mdb, LinearSolver *contex return; EIG_linear_solver_matrix_add(context, mdb->varidx[acenter], mdb->varidx[acenter], 1.0f); - + totweight = meshdeform_boundary_total_weight(mdb, x, y, z); for (i = 1; i <= 6; i++) { a = meshdeform_index(mdb, x, y, z, i); @@ -1280,7 +1280,7 @@ static void meshdeform_matrix_add_semibound_phi(MeshDeformBind *mdb, int x, int a = meshdeform_index(mdb, x, y, z, 0); if (!mdb->semibound[a]) return; - + mdb->phi[a] = 0.0f; totweight = meshdeform_boundary_total_weight(mdb, x, y, z); @@ -1418,7 +1418,7 @@ static void meshdeform_matrix_solve(MeshDeformModifierData *mmd, MeshDeformBind printf("totalphi deficiency [%s|%d] %d: %.10f\n", (mdb->tag[b] == MESHDEFORM_TAG_INTERIOR) ? "interior" : "boundary", mdb->semibound[b], mdb->varidx[b], mdb->totalphi[b]); #endif - + /* free */ MEM_freeN(mdb->varidx); @@ -1504,7 +1504,7 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa /* start with all cells untyped */ for (a = 0; a < mdb->size3; a++) mdb->tag[a] = MESHDEFORM_TAG_UNTYPED; - + /* detect intersections and tag boundary cells */ for (z = 0; z < mdb->size; z++) for (y = 0; y < mdb->size; y++) @@ -1591,7 +1591,7 @@ void ED_mesh_deform_bind_callback( /* get mesh and cage mesh */ mdb.vertexcos = MEM_callocN(sizeof(float) * 3 * totvert, "MeshDeformCos"); mdb.totvert = totvert; - + mdb.cagemesh = cagemesh; mdb.totcagevert = mdb.cagemesh->totvert; mdb.cagecos = MEM_callocN(sizeof(*mdb.cagecos) * mdb.totcagevert, "MeshDeformBindCos"); diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c index 5cb8d37b90a..fa9927419a0 100644 --- a/source/blender/editors/armature/pose_edit.c +++ b/source/blender/editors/armature/pose_edit.c @@ -91,7 +91,7 @@ bool ED_object_posemode_enter_ex(struct Main *bmain, Object *ob) { BLI_assert(!ID_IS_LINKED(ob)); bool ok = false; - + switch (ob->type) { case OB_ARMATURE: ob->restore_mode = ob->mode; @@ -185,15 +185,15 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) struct Main *bmain = CTX_data_main(C); Depsgraph *depsgraph = CTX_data_depsgraph(C); ListBase targets = {NULL, NULL}; - + /* set flag to force recalc, then grab the relevant bones to target */ ob->pose->avs.recalc |= ANIMVIZ_RECALC_PATHS; animviz_get_object_motionpaths(ob, &targets); - + /* recalculate paths, then free */ animviz_calc_motionpaths(depsgraph, bmain, scene, &targets); BLI_freelistN(&targets); - + /* tag armature object for copy on write - so paths will draw/redraw */ DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); } @@ -201,52 +201,52 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) /* show popup to determine settings */ static int pose_calculate_paths_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) -{ +{ Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); - + if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* set default settings from existing/stored settings */ { bAnimVizSettings *avs = &ob->pose->avs; PointerRNA avs_ptr; - + RNA_int_set(op->ptr, "start_frame", avs->path_sf); RNA_int_set(op->ptr, "end_frame", avs->path_ef); - + RNA_pointer_create(NULL, &RNA_AnimVizMotionPaths, avs, &avs_ptr); RNA_enum_set(op->ptr, "bake_location", RNA_enum_get(&avs_ptr, "bake_location")); } - + /* show popup dialog to allow editing of range... */ // FIXME: hardcoded dimensions here are just arbitrary return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 10 * UI_UNIT_Y); } -/* For the object with pose/action: create path curves for selected bones +/* For the object with pose/action: create path curves for selected bones * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range */ static int pose_calculate_paths_exec(bContext *C, wmOperator *op) { Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); Scene *scene = CTX_data_scene(C); - + if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* grab baking settings from operator settings */ { bAnimVizSettings *avs = &ob->pose->avs; PointerRNA avs_ptr; - + avs->path_sf = RNA_int_get(op->ptr, "start_frame"); avs->path_ef = RNA_int_get(op->ptr, "end_frame"); - + RNA_pointer_create(NULL, &RNA_AnimVizMotionPaths, avs, &avs_ptr); RNA_enum_set(&avs_ptr, "bake_location", RNA_enum_get(op->ptr, "bake_location")); } - + /* set up path data for bones being calculated */ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) { @@ -262,7 +262,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op) /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void POSE_OT_paths_calculate(wmOperatorType *ot) @@ -271,23 +271,23 @@ void POSE_OT_paths_calculate(wmOperatorType *ot) ot->name = "Calculate Bone Paths"; ot->idname = "POSE_OT_paths_calculate"; ot->description = "Calculate paths for the selected bones"; - + /* api callbacks */ ot->invoke = pose_calculate_paths_invoke; ot->exec = pose_calculate_paths_exec; ot->poll = ED_operator_posemode_exclusive; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ - RNA_def_int(ot->srna, "start_frame", 1, MINAFRAME, MAXFRAME, "Start", + RNA_def_int(ot->srna, "start_frame", 1, MINAFRAME, MAXFRAME, "Start", "First frame to calculate bone paths on", MINFRAME, MAXFRAME / 2.0); - RNA_def_int(ot->srna, "end_frame", 250, MINAFRAME, MAXFRAME, "End", + RNA_def_int(ot->srna, "end_frame", 250, MINAFRAME, MAXFRAME, "End", "Last frame to calculate bone paths on", MINFRAME, MAXFRAME / 2.0); - - RNA_def_enum(ot->srna, "bake_location", rna_enum_motionpath_bake_location_items, 0, - "Bake Location", + + RNA_def_enum(ot->srna, "bake_location", rna_enum_motionpath_bake_location_items, 0, + "Bake Location", "Which point on the bones is used when calculating paths"); } @@ -299,7 +299,7 @@ static int pose_update_paths_poll(bContext *C) Object *ob = CTX_data_active_object(C); return (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) != 0; } - + return false; } @@ -307,17 +307,17 @@ static int pose_update_paths_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); Scene *scene = CTX_data_scene(C); - + if (ELEM(NULL, ob, scene)) return OPERATOR_CANCELLED; /* calculate the bones that now have motionpaths... */ /* TODO: only make for the selected bones? */ ED_pose_recalculate_paths(C, scene, ob); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -327,11 +327,11 @@ void POSE_OT_paths_update(wmOperatorType *ot) ot->name = "Update Bone Paths"; ot->idname = "POSE_OT_paths_update"; ot->description = "Recalculate paths for bones that already have them"; - + /* api callbakcs */ ot->exec = pose_update_paths_exec; ot->poll = pose_update_paths_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -343,10 +343,10 @@ static void ED_pose_clear_paths(Object *ob, bool only_selected) { bPoseChannel *pchan; bool skipped = false; - + if (ELEM(NULL, ob, ob->pose)) return; - + /* free the motionpath blocks for all bones - This is easier for users to quickly clear all */ for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { if (pchan->mpath) { @@ -359,7 +359,7 @@ static void ED_pose_clear_paths(Object *ob, bool only_selected) } } } - + /* if nothing was skipped, there should be no paths left! */ if (skipped == false) ob->pose->avs.path_bakeflag &= ~MOTIONPATH_BAKE_HAS_PATHS; @@ -370,18 +370,18 @@ static int pose_clear_paths_exec(bContext *C, wmOperator *op) { Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); bool only_selected = RNA_boolean_get(op->ptr, "only_selected"); - + /* only continue if there's an object */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* use the backend function for this */ ED_pose_clear_paths(ob, only_selected); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - - return OPERATOR_FINISHED; + + return OPERATOR_FINISHED; } /* operator callback/wrapper */ @@ -399,17 +399,17 @@ void POSE_OT_paths_clear(wmOperatorType *ot) ot->name = "Clear Bone Paths"; ot->idname = "POSE_OT_paths_clear"; ot->description = "Clear path caches for all bones, hold Shift key for selected bones only"; - + /* api callbacks */ ot->invoke = pose_clear_paths_invoke; ot->exec = pose_clear_paths_exec; ot->poll = ED_operator_posemode_exclusive; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ - ot->prop = RNA_def_boolean(ot->srna, "only_selected", false, "Only Selected", + ot->prop = RNA_def_boolean(ot->srna, "only_selected", false, "Only Selected", "Only clear paths from selected bones"); RNA_def_property_flag(ot->prop, PROP_SKIP_SAVE); } @@ -424,13 +424,13 @@ static void pose_copy_menu(Scene *scene) bPoseChannel *pchan, *pchanact; short nr = 0; int i = 0; - + /* paranoia checks */ if (ELEM(NULL, ob, ob->pose)) return; if ((ob == obedit) || (ob->mode & OB_MODE_POSE) == 0) return; - + pchan = BKE_pose_channel_active(ob); - + if (pchan == NULL) return; pchanact = pchan; arm = ob->data; @@ -452,10 +452,10 @@ static void pose_copy_menu(Scene *scene) else nr = pupmenu("Copy Pose Attributes %t|Local Location %x1|Local Rotation %x2|Local Size %x3|%l|Visual Location %x9|Visual Rotation %x10|Visual Size %x11|%l|Constraints (All) %x4|%l|Transform Locks %x6|IK Limits %x7|Bone Shape %x8"); } - - if (nr <= 0) + + if (nr <= 0) return; - + if (nr != 5) { for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { if ((arm->layer & pchan->bone->layer) && @@ -476,23 +476,23 @@ static void pose_copy_menu(Scene *scene) case 4: /* All Constraints */ { ListBase tmp_constraints = {NULL, NULL}; - - /* copy constraints to tmpbase and apply 'local' tags before + + /* copy constraints to tmpbase and apply 'local' tags before * appending to list of constraints for this channel */ BKE_constraints_copy(&tmp_constraints, &pchanact->constraints, true); if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) { bConstraint *con; - + /* add proxy-local tags */ for (con = tmp_constraints.first; con; con = con->next) con->flag |= CONSTRAINT_PROXY_LOCAL; } BLI_movelisttolist(&pchan->constraints, &tmp_constraints); - + /* update flags (need to add here, not just copy) */ pchan->constflag |= pchanact->constflag; - + if (ob->pose) BKE_pose_tag_recalc(bmain, ob->pose); } @@ -523,12 +523,12 @@ static void pose_copy_menu(Scene *scene) case 10: /* Visual Rotation */ { float delta_mat[4][4]; - + BKE_armature_mat_pose_to_bone(pchan, pchanact->pose_mat, delta_mat); - + if (pchan->rotmode == ROT_MODE_AXISANGLE) { float tmp_quat[4]; - + /* need to convert to quat first (in temp var)... */ mat4_to_quat(tmp_quat, delta_mat); quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, tmp_quat); @@ -542,7 +542,7 @@ static void pose_copy_menu(Scene *scene) case 11: /* Visual Size */ { float delta_mat[4][4], size[4]; - + BKE_armature_mat_pose_to_bone(pchan, pchanact->pose_mat, delta_mat); mat4_to_size(size, delta_mat); copy_v3_v3(pchan->size, size); @@ -555,20 +555,20 @@ static void pose_copy_menu(Scene *scene) bConstraint *con, *con_back; int const_toggle[24] = {0}; /* XXX, initialize as 0 to quiet errors */ ListBase const_copy = {NULL, NULL}; - + BLI_duplicatelist(&const_copy, &(pchanact->constraints)); - + /* build the puplist of constraints */ for (con = pchanact->constraints.first, i = 0; con; con = con->next, i++) { const_toggle[i] = 1; // add_numbut(i, UI_BTYPE_TOGGLE|INT, con->name, 0, 0, &(const_toggle[i]), ""); } - + // if (!do_clever_numbuts("Select Constraints", i, REDRAW)) { // BLI_freelistN(&const_copy); // return; // } - + /* now build a new listbase from the options selected */ for (i = 0, con = const_copy.first; con; i++) { /* if not selected, free/remove it from the list */ @@ -580,7 +580,7 @@ static void pose_copy_menu(Scene *scene) else con = con->next; } - + /* Copy the temo listbase to the selected posebones */ for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { if ((arm->layer & pchan->bone->layer) && @@ -588,8 +588,8 @@ static void pose_copy_menu(Scene *scene) (pchan != pchanact) ) { ListBase tmp_constraints = {NULL, NULL}; - - /* copy constraints to tmpbase and apply 'local' tags before + + /* copy constraints to tmpbase and apply 'local' tags before * appending to list of constraints for this channel */ BKE_constraints_copy(&tmp_constraints, &const_copy, true); @@ -599,22 +599,22 @@ static void pose_copy_menu(Scene *scene) con->flag |= CONSTRAINT_PROXY_LOCAL; } BLI_movelisttolist(&pchan->constraints, &tmp_constraints); - + /* update flags (need to add here, not just copy) */ pchan->constflag |= pchanact->constflag; } } BLI_freelistN(&const_copy); BKE_pose_update_constraint_flags(ob->pose); /* we could work out the flags but its simpler to do this */ - + if (ob->pose) BKE_pose_tag_recalc(bmain, ob->pose); } - + DEG_id_tag_update(&ob->id, OB_RECALC_DATA); // and all its relations - + BIF_undo_push("Copy Pose Attributes"); - + } #endif @@ -624,7 +624,7 @@ static int pose_flip_names_exec(bContext *C, wmOperator *op) { ViewLayer *view_layer = CTX_data_view_layer(C); const bool do_strip_numbers = RNA_boolean_get(op->ptr, "do_strip_numbers"); - + FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob) { bArmature *arm = ob->data; @@ -639,7 +639,7 @@ static int pose_flip_names_exec(bContext *C, wmOperator *op) ED_armature_bones_flip_names(arm, &bones_names, do_strip_numbers); BLI_freelistN(&bones_names); - + /* since we renamed stuff... */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -647,7 +647,7 @@ static int pose_flip_names_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); } FOREACH_OBJECT_IN_MODE_END; - + return OPERATOR_FINISHED; } @@ -657,11 +657,11 @@ void POSE_OT_flip_names(wmOperatorType *ot) ot->name = "Flip Names"; ot->idname = "POSE_OT_flip_names"; ot->description = "Flips (and corrects) the axis suffixes of the names of selected bones"; - + /* api callbacks */ ot->exec = pose_flip_names_exec; ot->poll = ED_operator_posemode_local; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -678,12 +678,12 @@ static int pose_autoside_names_exec(bContext *C, wmOperator *op) bArmature *arm; char newname[MAXBONENAME]; short axis = RNA_enum_get(op->ptr, "axis"); - + /* paranoia checks */ - if (ELEM(NULL, ob, ob->pose)) + if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; arm = ob->data; - + /* loop through selected bones, auto-naming them */ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) { @@ -692,13 +692,13 @@ static int pose_autoside_names_exec(bContext *C, wmOperator *op) ED_armature_bone_rename(arm, pchan->name, newname); } CTX_DATA_END; - + /* since we renamed stuff... */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -710,20 +710,20 @@ void POSE_OT_autoside_names(wmOperatorType *ot) {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, {0, NULL, 0, NULL, NULL} }; - + /* identifiers */ ot->name = "AutoName by Axis"; ot->idname = "POSE_OT_autoside_names"; ot->description = "Automatically renames the selected bones according to which side of the target axis they fall on"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = pose_autoside_names_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* settings */ ot->prop = RNA_def_enum(ot->srna, "axis", axis_items, 0, "Axis", "Axis tag names with"); } @@ -734,18 +734,18 @@ static int pose_bone_rotmode_exec(bContext *C, wmOperator *op) { Object *ob = CTX_data_active_object(C); int mode = RNA_enum_get(op->ptr, "type"); - + /* set rotation mode of selected bones */ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) { pchan->rotmode = mode; } CTX_DATA_END; - + /* notifiers and updates */ DEG_id_tag_update((ID *)ob, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); - + return OPERATOR_FINISHED; } @@ -755,15 +755,15 @@ void POSE_OT_rotation_mode_set(wmOperatorType *ot) ot->name = "Set Rotation Mode"; ot->idname = "POSE_OT_rotation_mode_set"; ot->description = "Set the rotation representation used by selected bones"; - + /* callbacks */ ot->invoke = WM_menu_invoke; ot->exec = pose_bone_rotmode_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_posebone_rotmode_items, 0, "Rotation Mode", ""); } @@ -805,26 +805,26 @@ static int pose_armature_layers_showall_exec(bContext *C, wmOperator *op) int maxLayers = (RNA_boolean_get(op->ptr, "all")) ? 32 : 16; int layers[32] = {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ int i; - + /* sanity checking */ if (arm == NULL) return OPERATOR_CANCELLED; - + /* use RNA to set the layers * although it would be faster to just set directly using bitflags, we still * need to setup a RNA pointer so that we get the "update" callbacks for free... */ RNA_id_pointer_create(&arm->id, &ptr); - + for (i = 0; i < maxLayers; i++) layers[i] = 1; - + RNA_boolean_set_array(&ptr, "layers", layers); - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE); - + /* done */ return OPERATOR_FINISHED; } @@ -835,14 +835,14 @@ void ARMATURE_OT_layers_show_all(wmOperatorType *ot) ot->name = "Show All Layers"; ot->idname = "ARMATURE_OT_layers_show_all"; ot->description = "Make all armature layers visible"; - + /* callbacks */ ot->exec = pose_armature_layers_showall_exec; ot->poll = armature_layers_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All Layers", "Enable all layers or just the first 16 (top row)"); } @@ -856,16 +856,16 @@ static int armature_layers_invoke(bContext *C, wmOperator *op, const wmEvent *ev bArmature *arm = armature_layers_get_data(&ob); PointerRNA ptr; int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - + /* sanity checking */ if (arm == NULL) return OPERATOR_CANCELLED; - + /* get RNA pointer to armature data to use that to retrieve the layers as ints to init the operator */ RNA_id_pointer_create((ID *)arm, &ptr); RNA_boolean_get_array(&ptr, "layers", layers); RNA_boolean_set_array(op->ptr, "layers", layers); - + /* part to sync with other similar operators... */ return WM_operator_props_popup(C, op, event); } @@ -902,15 +902,15 @@ void ARMATURE_OT_armature_layers(wmOperatorType *ot) ot->name = "Change Armature Layers"; ot->idname = "ARMATURE_OT_armature_layers"; ot->description = "Change the visible armature layers"; - + /* callbacks */ ot->invoke = armature_layers_invoke; ot->exec = armature_layers_exec; ot->poll = armature_layers_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean_layer_member(ot->srna, "layers", 32, NULL, "Layer", "Armature layers to make visible"); } @@ -921,22 +921,22 @@ void ARMATURE_OT_armature_layers(wmOperatorType *ot) static int pose_bone_layers_invoke(bContext *C, wmOperator *op, const wmEvent *event) { int layers[32] = {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - + /* get layers that are active already */ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) { short bit; - + /* loop over the bits for this pchan's layers, adding layers where they're needed */ for (bit = 0; bit < 32; bit++) { layers[bit] = (pchan->bone->layer & (1u << bit)) != 0; } } CTX_DATA_END; - + /* copy layers to operator */ RNA_boolean_set_array(op->ptr, "layers", layers); - + /* part to sync with other similar operators... */ return WM_operator_props_popup(C, op, event); } @@ -977,15 +977,15 @@ void POSE_OT_bone_layers(wmOperatorType *ot) ot->name = "Change Bone Layers"; ot->idname = "POSE_OT_bone_layers"; ot->description = "Change the layers that the selected bones belong to"; - + /* callbacks */ ot->invoke = pose_bone_layers_invoke; ot->exec = pose_bone_layers_exec; ot->poll = ED_operator_posemode_exclusive; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean_layer_member(ot->srna, "layers", 32, NULL, "Layer", "Armature layers that bone belongs to"); } @@ -996,12 +996,12 @@ void POSE_OT_bone_layers(wmOperatorType *ot) static int armature_bone_layers_invoke(bContext *C, wmOperator *op, const wmEvent *event) { int layers[32] = {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - + /* get layers that are active already */ CTX_DATA_BEGIN (C, EditBone *, ebone, selected_editable_bones) { short bit; - + /* loop over the bits for this pchan's layers, adding layers where they're needed */ for (bit = 0; bit < 32; bit++) { if (ebone->layer & (1u << bit)) { @@ -1010,10 +1010,10 @@ static int armature_bone_layers_invoke(bContext *C, wmOperator *op, const wmEven } } CTX_DATA_END; - + /* copy layers to operator */ RNA_boolean_set_array(op->ptr, "layers", layers); - + /* part to sync with other similar operators... */ return WM_operator_props_popup(C, op, event); } @@ -1024,10 +1024,10 @@ static int armature_bone_layers_exec(bContext *C, wmOperator *op) Object *ob = CTX_data_edit_object(C); PointerRNA ptr; int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - + /* get the values set in the operator properties */ RNA_boolean_get_array(op->ptr, "layers", layers); - + /* set layers of pchans based on the values set in the operator props */ CTX_DATA_BEGIN_WITH_ID (C, EditBone *, ebone, selected_editable_bones, bArmature *, arm) { @@ -1036,10 +1036,10 @@ static int armature_bone_layers_exec(bContext *C, wmOperator *op) RNA_boolean_set_array(&ptr, "layers", layers); } CTX_DATA_END; - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -1049,15 +1049,15 @@ void ARMATURE_OT_bone_layers(wmOperatorType *ot) ot->name = "Change Bone Layers"; ot->idname = "ARMATURE_OT_bone_layers"; ot->description = "Change the layers that the selected bones belong to"; - + /* callbacks */ ot->invoke = armature_bone_layers_invoke; ot->exec = armature_bone_layers_exec; ot->poll = ED_operator_editarmature; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean_layer_member(ot->srna, "layers", 32, NULL, "Layer", "Armature layers that bone belongs to"); } @@ -1121,19 +1121,19 @@ void POSE_OT_hide(wmOperatorType *ot) ot->name = "Hide Selected"; ot->idname = "POSE_OT_hide"; ot->description = "Tag selected bones to not be visible in Pose Mode"; - + /* api callbacks */ ot->exec = pose_hide_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* props */ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", ""); } -static int show_pose_bone_cb(Object *ob, Bone *bone, void *data) +static int show_pose_bone_cb(Object *ob, Bone *bone, void *data) { const bool select = GET_INT_FROM_POINTER(data); @@ -1184,11 +1184,11 @@ void POSE_OT_reveal(wmOperatorType *ot) ot->name = "Reveal Selected"; ot->idname = "POSE_OT_reveal"; ot->description = "Reveal all bones hidden in Pose Mode"; - + /* api callbacks */ ot->exec = pose_reveal_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -1237,11 +1237,11 @@ void POSE_OT_quaternions_flip(wmOperatorType *ot) ot->name = "Flip Quats"; ot->idname = "POSE_OT_quaternions_flip"; ot->description = "Flip quaternion values to achieve desired rotations, while maintaining the same orientations"; - + /* callbacks */ ot->exec = pose_flip_quats_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } diff --git a/source/blender/editors/armature/pose_group.c b/source/blender/editors/armature/pose_group.c index 62fd0966c53..aefca13d66c 100644 --- a/source/blender/editors/armature/pose_group.c +++ b/source/blender/editors/armature/pose_group.c @@ -68,13 +68,13 @@ static int pose_group_add_exec(bContext *C, wmOperator *UNUSED(op)) /* only continue if there's an object and pose */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* for now, just call the API function for this */ BKE_pose_add_group(ob->pose, NULL); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -84,11 +84,11 @@ void POSE_OT_group_add(wmOperatorType *ot) ot->name = "Add Bone Group"; ot->idname = "POSE_OT_group_add"; ot->description = "Add a new bone group"; - + /* api callbacks */ ot->exec = pose_group_add_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -97,18 +97,18 @@ void POSE_OT_group_add(wmOperatorType *ot) static int pose_group_remove_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = ED_pose_object_from_context(C); - + /* only continue if there's an object and pose */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* for now, just call the API function for this */ BKE_pose_remove_group_index(ob->pose, ob->pose->active_group); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); - + return OPERATOR_FINISHED; } @@ -118,11 +118,11 @@ void POSE_OT_group_remove(wmOperatorType *ot) ot->name = "Remove Bone Group"; ot->idname = "POSE_OT_group_remove"; ot->description = "Remove the active bone group"; - + /* api callbacks */ ot->exec = pose_group_remove_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -135,14 +135,14 @@ static int pose_groups_menu_invoke(bContext *C, wmOperator *op, const wmEvent *U Object *ob = ED_pose_object_from_context(C); bPose *pose; PropertyRNA *prop = RNA_struct_find_property(op->ptr, "type"); - + uiPopupMenu *pup; uiLayout *layout; bActionGroup *grp; int i; - + /* only continue if there's an object, and a pose there too */ - if (ELEM(NULL, ob, ob->pose)) + if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; pose = ob->pose; @@ -156,28 +156,28 @@ static int pose_groups_menu_invoke(bContext *C, wmOperator *op, const wmEvent *U return op->type->exec(C, op); } } - + /* if there's no active group (or active is invalid), create a new menu to find it */ if (pose->active_group <= 0) { /* create a new menu, and start populating it with group names */ pup = UI_popup_menu_begin(C, op->type->name, ICON_NONE); layout = UI_popup_menu_layout(pup); - - /* special entry - allow to create new group, then use that + + /* special entry - allow to create new group, then use that * (not to be used for removing though) */ if (strstr(op->idname, "assign")) { uiItemIntO(layout, "New Group", ICON_NONE, op->idname, "type", 0); uiItemS(layout); } - + /* add entries for each group */ for (grp = pose->agroups.first, i = 1; grp; grp = grp->next, i++) uiItemIntO(layout, grp->name, ICON_NONE, op->idname, "type", i); - + /* finish building the menu, and process it (should result in calling self again) */ UI_popup_menu_end(C, pup); - + return OPERATOR_INTERFACE; } else { @@ -199,14 +199,14 @@ static int pose_group_assign_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; pose = ob->pose; - - /* set the active group number to the one from operator props + + /* set the active group number to the one from operator props * - if 0 after this, make a new group... */ pose->active_group = RNA_int_get(op->ptr, "type"); if (pose->active_group == 0) BKE_pose_add_group(ob->pose, NULL); - + /* add selected bones to group then */ FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob, pchan) { @@ -218,7 +218,7 @@ static int pose_group_assign_exec(bContext *C, wmOperator *op) /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); - + /* report done status */ if (done) return OPERATOR_FINISHED; @@ -232,15 +232,15 @@ void POSE_OT_group_assign(wmOperatorType *ot) ot->name = "Add Selected to Bone Group"; ot->idname = "POSE_OT_group_assign"; ot->description = "Add selected bones to the chosen bone group"; - + /* api callbacks */ ot->invoke = pose_groups_menu_invoke; ot->exec = pose_group_assign_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_int(ot->srna, "type", 0, 0, INT_MAX, "Bone Group Index", "", 0, 10); } @@ -250,11 +250,11 @@ static int pose_group_unassign_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = ED_pose_object_from_context(C); bool done = false; - + /* only continue if there's an object, and a pose there too */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + /* find selected bones to remove from all bone groups */ FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob, pchan) { @@ -264,11 +264,11 @@ static int pose_group_unassign_exec(bContext *C, wmOperator *UNUSED(op)) } } FOREACH_PCHAN_SELECTED_IN_OBJECT_END; - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); - + /* report done status */ if (done) return OPERATOR_FINISHED; @@ -282,11 +282,11 @@ void POSE_OT_group_unassign(wmOperatorType *ot) ot->name = "Remove Selected from Bone Groups"; ot->idname = "POSE_OT_group_unassign"; ot->description = "Remove selected bones from all bone groups"; - + /* api callbacks */ ot->exec = pose_group_unassign_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -442,16 +442,16 @@ void POSE_OT_group_sort(wmOperatorType *ot) static void pose_group_select(Object *ob, bool select) { bPose *pose = ob->pose; - + FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN (ob, pchan) { if ((pchan->bone->flag & BONE_UNSELECTABLE) == 0) { if (select) { - if (pchan->agrp_index == pose->active_group) + if (pchan->agrp_index == pose->active_group) pchan->bone->flag |= BONE_SELECTED; } else { - if (pchan->agrp_index == pose->active_group) + if (pchan->agrp_index == pose->active_group) pchan->bone->flag &= ~BONE_SELECTED; } } @@ -462,16 +462,16 @@ static void pose_group_select(Object *ob, bool select) static int pose_group_select_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = ED_pose_object_from_context(C); - + /* only continue if there's an object, and a pose there too */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + pose_group_select(ob, 1); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -481,11 +481,11 @@ void POSE_OT_group_select(wmOperatorType *ot) ot->name = "Select Bones of Bone Group"; ot->idname = "POSE_OT_group_select"; ot->description = "Select bones in active Bone Group"; - + /* api callbacks */ ot->exec = pose_group_select_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -493,16 +493,16 @@ void POSE_OT_group_select(wmOperatorType *ot) static int pose_group_deselect_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = ED_pose_object_from_context(C); - + /* only continue if there's an object, and a pose there too */ if (ELEM(NULL, ob, ob->pose)) return OPERATOR_CANCELLED; - + pose_group_select(ob, 0); - + /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - + return OPERATOR_FINISHED; } @@ -512,11 +512,11 @@ void POSE_OT_group_deselect(wmOperatorType *ot) ot->name = "Deselect Bone Group"; ot->idname = "POSE_OT_group_deselect"; ot->description = "Deselect bones of active Bone Group"; - + /* api callbacks */ ot->exec = pose_group_deselect_exec; ot->poll = ED_operator_posemode_context; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } diff --git a/source/blender/editors/armature/pose_lib.c b/source/blender/editors/armature/pose_lib.c index 007f986104b..02a1e22dbba 100644 --- a/source/blender/editors/armature/pose_lib.c +++ b/source/blender/editors/armature/pose_lib.c @@ -81,7 +81,7 @@ static void action_set_activemarker(void *UNUSED(a), void *UNUSED(b), void *UNUSED(c)) {} /* ************************************************************* */ -/* == POSE-LIBRARY TOOL FOR BLENDER == +/* == POSE-LIBRARY TOOL FOR BLENDER == * * Overview: * This tool allows animators to store a set of frequently used poses to dump into @@ -100,7 +100,7 @@ static void action_set_activemarker(void *UNUSED(a), void *UNUSED(b), void *UNUS /* ************************************************************* */ -/* gets the first available frame in poselib to store a pose on +/* gets the first available frame in poselib to store a pose on * - frames start from 1, and a pose should occur on every frame... 0 is error! */ static int poselib_get_free_index(bAction *act) @@ -108,17 +108,17 @@ static int poselib_get_free_index(bAction *act) TimeMarker *marker; int low = 0, high = 0; bool changed = false; - + /* sanity checks */ if (ELEM(NULL, act, act->markers.first)) return 1; - - /* As poses are not stored in chronological order, we must iterate over this list + + /* As poses are not stored in chronological order, we must iterate over this list * a few times until we don't make any new discoveries (mostly about the lower bound). * Prevents problems with deleting then trying to add new poses [#27412] */ do { changed = false; - + for (marker = act->markers.first; marker; marker = marker->next) { /* only increase low if value is 1 greater than low, to find "gaps" where * poses were removed from the poselib @@ -127,7 +127,7 @@ static int poselib_get_free_index(bAction *act) low++; changed = true; } - + /* value replaces high if it is the highest value encountered yet */ if (marker->frame > high) { high = marker->frame; @@ -135,19 +135,19 @@ static int poselib_get_free_index(bAction *act) } } } while (changed != 0); - - /* - if low is not equal to high, then low+1 is a gap - * - if low is equal to high, then high+1 is the next index (add at end) + + /* - if low is not equal to high, then low+1 is a gap + * - if low is equal to high, then high+1 is the next index (add at end) */ - if (low < high) + if (low < high) return (low + 1); - else + else return (high + 1); } /* returns the active pose for a poselib */ static TimeMarker *poselib_get_active_pose(bAction *act) -{ +{ if ((act) && (act->active_marker)) return BLI_findlink(&act->markers, act->active_marker - 1); else @@ -159,14 +159,14 @@ static TimeMarker *poselib_get_active_pose(bAction *act) static Object *get_poselib_object(bContext *C) { ScrArea *sa; - + /* sanity check */ if (C == NULL) return NULL; - + sa = CTX_wm_area(C); - - if (sa && (sa->spacetype == SPACE_BUTS)) + + if (sa && (sa->spacetype == SPACE_BUTS)) return ED_object_context(C); else return BKE_object_pose_armature_get(CTX_data_active_object(C)); @@ -196,14 +196,14 @@ static bAction *poselib_init_new(Object *ob) /* sanity checks - only for armatures */ if (ELEM(NULL, ob, ob->pose)) return NULL; - + /* init object's poselib action (unlink old one if there) */ if (ob->poselib) id_us_min(&ob->poselib->id); - + ob->poselib = BKE_action_add(G.main, "PoseLib"); ob->poselib->idroot = ID_OB; - + return ob->poselib; } @@ -224,17 +224,17 @@ static bAction *poselib_validate(Object *ob) static int poselib_new_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = get_poselib_object(C); - + /* sanity checks */ if (ob == NULL) return OPERATOR_CANCELLED; - + /* new method here deals with the rest... */ poselib_init_new(ob); - + /* notifier here might evolve? */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL); - + return OPERATOR_FINISHED; } @@ -244,11 +244,11 @@ void POSELIB_OT_new(wmOperatorType *ot) ot->name = "New Pose Library"; ot->idname = "POSELIB_OT_new"; ot->description = "Add New Pose Library to active Object"; - + /* callbacks */ ot->exec = poselib_new_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -258,18 +258,18 @@ void POSELIB_OT_new(wmOperatorType *ot) static int poselib_unlink_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob = get_poselib_object(C); - + /* sanity checks */ if (ELEM(NULL, ob, ob->poselib)) return OPERATOR_CANCELLED; - + /* there should be a poselib (we just checked above!), so just lower its user count and remove */ id_us_min(&ob->poselib->id); ob->poselib = NULL; - + /* notifier here might evolve? */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL); - + return OPERATOR_FINISHED; } @@ -279,11 +279,11 @@ void POSELIB_OT_unlink(wmOperatorType *ot) ot->name = "Unlink Pose Library"; ot->idname = "POSELIB_OT_unlink"; ot->description = "Remove Pose Library from active Object"; - + /* callbacks */ ot->exec = poselib_unlink_exec; ot->poll = has_poselib_pose_data_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -291,7 +291,7 @@ void POSELIB_OT_unlink(wmOperatorType *ot) /* ************************************************************* */ /* Pose Editing Operators */ -/* This tool automagically generates/validates poselib data so that it corresponds to the data +/* This tool automagically generates/validates poselib data so that it corresponds to the data * in the action. This is for use in making existing actions usable as poselibs. */ static int poselib_sanitize_exec(bContext *C, wmOperator *op) @@ -301,13 +301,13 @@ static int poselib_sanitize_exec(bContext *C, wmOperator *op) DLRBT_Tree keys; ActKeyColumn *ak; TimeMarker *marker, *markern; - + /* validate action */ if (act == NULL) { BKE_report(op->reports, RPT_WARNING, "No action to validate"); return OPERATOR_CANCELLED; } - + /* determine which frames have keys */ BLI_dlrbTree_init(&keys); action_to_keylist(NULL, act, &keys, NULL); @@ -323,39 +323,39 @@ static int poselib_sanitize_exec(bContext *C, wmOperator *op) break; } } - + /* add new if none found */ if (marker == NULL) { /* add pose to poselib */ marker = MEM_callocN(sizeof(TimeMarker), "ActionMarker"); - + BLI_snprintf(marker->name, sizeof(marker->name), "F%d Pose", (int)ak->cfra); - + marker->frame = (int)ak->cfra; marker->flag = -1; - + BLI_addtail(&act->markers, marker); } } - + /* remove all untagged poses (unused), and remove all tags */ for (marker = act->markers.first; marker; marker = markern) { markern = marker->next; - + if (marker->flag != -1) BLI_freelinkN(&act->markers, marker); else marker->flag = 0; } - + /* free temp memory */ BLI_dlrbTree_free(&keys); - - /* send notifiers for this - using keyframe editing notifiers, since action - * may be being shown in anim editors as active action + + /* send notifiers for this - using keyframe editing notifiers, since action + * may be being shown in anim editors as active action */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); - + return OPERATOR_FINISHED; } @@ -365,11 +365,11 @@ void POSELIB_OT_action_sanitize(wmOperatorType *ot) ot->name = "Sanitize Pose Library Action"; ot->idname = "POSELIB_OT_action_sanitize"; ot->description = "Make action suitable for use as a Pose Library"; - + /* callbacks */ ot->exec = poselib_sanitize_exec; ot->poll = has_poselib_pose_data_for_editing_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -400,14 +400,14 @@ static void poselib_add_menu_invoke__replacemenu(bContext *C, uiLayout *layout, Object *ob = get_poselib_object(C); bAction *act = ob->poselib; /* never NULL */ TimeMarker *marker; - + wmOperatorType *ot = WM_operatortype_find("POSELIB_OT_pose_add", 1); BLI_assert(ot != NULL); /* set the operator execution context correctly */ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); - + /* add each marker to this menu */ for (marker = act->markers.first; marker; marker = marker->next) { PointerRNA props_ptr; @@ -427,30 +427,30 @@ static int poselib_add_menu_invoke(bContext *C, wmOperator *op, const wmEvent *U bPose *pose = (ob) ? ob->pose : NULL; uiPopupMenu *pup; uiLayout *layout; - + /* sanity check */ - if (ELEM(NULL, ob, pose)) + if (ELEM(NULL, ob, pose)) return OPERATOR_CANCELLED; - + /* start building */ pup = UI_popup_menu_begin(C, op->type->name, ICON_NONE); layout = UI_popup_menu_layout(pup); uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); - + /* add new (adds to the first unoccupied frame) */ uiItemIntO(layout, IFACE_("Add New"), ICON_NONE, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib)); - + /* check if we have any choices to add a new pose in any other way */ if ((ob->poselib) && (ob->poselib->markers.first)) { /* add new (on current frame) */ uiItemIntO(layout, IFACE_("Add New (Current Frame)"), ICON_NONE, "POSELIB_OT_pose_add", "frame", CFRA); - + /* replace existing - submenu */ uiItemMenuF(layout, IFACE_("Replace Existing..."), 0, poselib_add_menu_invoke__replacemenu, NULL); } - + UI_popup_menu_end(C, pup); - + /* this operator is only for a menu, not used further */ return OPERATOR_INTERFACE; } @@ -465,14 +465,14 @@ static int poselib_add_exec(bContext *C, wmOperator *op) KeyingSet *ks; int frame = RNA_int_get(op->ptr, "frame"); char name[64]; - + /* sanity check (invoke should have checked this anyway) */ - if (ELEM(NULL, ob, pose)) + if (ELEM(NULL, ob, pose)) return OPERATOR_CANCELLED; - + /* get name to give to pose */ RNA_string_get(op->ptr, "name", name); - + /* add pose to poselib - replaces any existing pose there * - for the 'replace' option, this should end up finding the appropriate marker, * so no new one will be added @@ -485,20 +485,20 @@ static int poselib_add_exec(bContext *C, wmOperator *op) } if (marker == NULL) { marker = MEM_callocN(sizeof(TimeMarker), "ActionMarker"); - + BLI_strncpy(marker->name, name, sizeof(marker->name)); marker->frame = frame; - + BLI_addtail(&act->markers, marker); } - + /* validate name */ BLI_uniquename(&act->markers, marker, DATA_("Pose"), '.', offsetof(TimeMarker, name), sizeof(marker->name)); - + /* use Keying Set to determine what to store for the pose */ ks = ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_WHOLE_CHARACTER_SELECTED_ID); /* this includes custom props :)*/ ANIM_apply_keyingset(C, NULL, act, ks, MODIFYKEY_MODE_INSERT, (float)frame); - + /* store new 'active' pose number */ act->active_marker = BLI_listbase_count(&act->markers); DEG_id_tag_update(&act->id, DEG_TAG_COPY_ON_WRITE); @@ -513,15 +513,15 @@ void POSELIB_OT_pose_add(wmOperatorType *ot) ot->name = "PoseLib Add Pose"; ot->idname = "POSELIB_OT_pose_add"; ot->description = "Add the current Pose to the active Pose Library"; - + /* api callbacks */ ot->invoke = poselib_add_menu_invoke; ot->exec = poselib_add_exec; ot->poll = poselib_add_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_int(ot->srna, "frame", 1, 0, INT_MAX, "Frame", "Frame to store pose on", 0, INT_MAX); RNA_def_string(ot->srna, "name", "Pose", 64, "Pose Name", "Name of newly added Pose"); @@ -542,7 +542,7 @@ static const EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA if (C == NULL) { return DummyRNA_NULL_items; } - + /* check that the action exists */ if (act) { /* add each marker to the list */ @@ -589,12 +589,12 @@ static int poselib_remove_exec(bContext *C, wmOperator *op) BKE_reportf(op->reports, RPT_ERROR, "Invalid pose specified %d", marker_index); return OPERATOR_CANCELLED; } - + /* remove relevant keyframes */ for (fcu = act->curves.first; fcu; fcu = fcu->next) { BezTriple *bezt; unsigned int i; - + if (fcu->bezt) { for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) { /* check if remove */ @@ -605,15 +605,15 @@ static int poselib_remove_exec(bContext *C, wmOperator *op) } } } - + /* remove poselib from list */ BLI_freelinkN(&act->markers, marker); - + /* fix active pose number */ act->active_marker = 0; - - /* send notifiers for this - using keyframe editing notifiers, since action - * may be being shown in anim editors as active action + + /* send notifiers for this - using keyframe editing notifiers, since action + * may be being shown in anim editors as active action */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); DEG_id_tag_update(&act->id, DEG_TAG_COPY_ON_WRITE); @@ -625,20 +625,20 @@ static int poselib_remove_exec(bContext *C, wmOperator *op) void POSELIB_OT_pose_remove(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "PoseLib Remove Pose"; ot->idname = "POSELIB_OT_pose_remove"; ot->description = "Remove nth pose from the active Pose Library"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = poselib_remove_exec; ot->poll = has_poselib_pose_data_for_editing_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ prop = RNA_def_enum(ot->srna, "pose", DummyRNA_NULL_items, 0, "Pose", "The pose to remove"); RNA_def_enum_funcs(prop, poselib_stored_pose_itemf); @@ -651,13 +651,13 @@ static int poselib_rename_invoke(bContext *C, wmOperator *op, const wmEvent *eve Object *ob = get_poselib_object(C); bAction *act = (ob) ? ob->poselib : NULL; TimeMarker *marker; - + /* check if valid poselib */ if (act == NULL) { BKE_report(op->reports, RPT_ERROR, "Object does not have pose lib data"); return OPERATOR_CANCELLED; } - + /* get index (and pointer) of pose to remove */ marker = BLI_findlink(&act->markers, act->active_marker - 1); if (marker == NULL) { @@ -669,7 +669,7 @@ static int poselib_rename_invoke(bContext *C, wmOperator *op, const wmEvent *eve RNA_enum_set(op->ptr, "pose", act->active_marker - 1); RNA_string_set(op->ptr, "name", marker->name); } - + /* part to sync with other similar operators... */ return WM_operator_props_popup_confirm(C, op, event); } @@ -680,32 +680,32 @@ static int poselib_rename_exec(bContext *C, wmOperator *op) bAction *act = (ob) ? ob->poselib : NULL; TimeMarker *marker; char newname[64]; - + /* check if valid poselib */ if (act == NULL) { BKE_report(op->reports, RPT_ERROR, "Object does not have pose lib data"); return OPERATOR_CANCELLED; } - + /* get index (and pointer) of pose to remove */ marker = BLI_findlink(&act->markers, RNA_enum_get(op->ptr, "pose")); if (marker == NULL) { BKE_report(op->reports, RPT_ERROR, "Invalid index for pose"); return OPERATOR_CANCELLED; } - + /* get new name */ RNA_string_get(op->ptr, "name", newname); - + /* copy name and validate it */ BLI_strncpy(marker->name, newname, sizeof(marker->name)); BLI_uniquename(&act->markers, marker, DATA_("Pose"), '.', offsetof(TimeMarker, name), sizeof(marker->name)); - - /* send notifiers for this - using keyframe editing notifiers, since action - * may be being shown in anim editors as active action + + /* send notifiers for this - using keyframe editing notifiers, since action + * may be being shown in anim editors as active action */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -713,20 +713,20 @@ static int poselib_rename_exec(bContext *C, wmOperator *op) void POSELIB_OT_pose_rename(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "PoseLib Rename Pose"; ot->idname = "POSELIB_OT_pose_rename"; ot->description = "Rename specified pose from the active Pose Library"; - + /* api callbacks */ ot->invoke = poselib_rename_invoke; ot->exec = poselib_rename_exec; ot->poll = has_poselib_pose_data_for_editing_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ /* NOTE: name not pose is the operator's "main" property, so that it will get activated in the popup for easy renaming */ ot->prop = RNA_def_string(ot->srna, "name", "RenamedPose", 64, "New Pose Name", "New name for pose"); @@ -825,10 +825,10 @@ void POSELIB_OT_pose_move(wmOperatorType *ot) typedef struct tPoseLib_PreviewData { ListBase backups; /* tPoseLib_Backup structs for restoring poses */ ListBase searchp; /* LinkData structs storing list of poses which match the current search-string */ - + Scene *scene; /* active scene */ ScrArea *sa; /* active area */ - + PointerRNA rna_ptr; /* RNA-Pointer to Object 'ob' */ Object *ob; /* object to work on */ bArmature *arm; /* object's armature data */ @@ -845,7 +845,7 @@ typedef struct tPoseLib_PreviewData { short search_cursor; /* position of cursor in searchstr (cursor occurs before the item at the nominated index) */ char searchstr[64]; /* (Part of) Name to search for to filter poses that get shown */ char searchold[64]; /* Previously set searchstr (from last loop run), so that we can detected when to rebuild searchp */ - + char headerstr[UI_MAX_DRAW_STR]; /* Info-text to print in header */ } tPoseLib_PreviewData; @@ -855,7 +855,7 @@ enum { PL_PREVIEW_RUNNING, PL_PREVIEW_CONFIRM, PL_PREVIEW_CANCEL, - PL_PREVIEW_RUNONCE + PL_PREVIEW_RUNONCE }; /* defines for tPoseLib_PreviewData->redraw values */ @@ -877,9 +877,9 @@ enum { /* simple struct for storing backup info */ typedef struct tPoseLib_Backup { struct tPoseLib_Backup *next, *prev; - + bPoseChannel *pchan; /* pose channel backups are for */ - + bPoseChannel olddata; /* copy of pose channel's old data (at start) */ IDProperty *oldprops; /* copy (needs freeing) of pose channel's properties (at start) */ } tPoseLib_Backup; @@ -907,22 +907,22 @@ static void poselib_backup_posecopy(tPoseLib_PreviewData *pld) for (agrp = pld->act->groups.first; agrp; agrp = agrp->next) { /* try to find posechannel */ pchan = BKE_pose_channel_find_name(pld->pose, agrp->name); - + /* backup data if available */ if (pchan) { tPoseLib_Backup *plb; - + /* store backup */ plb = MEM_callocN(sizeof(tPoseLib_Backup), "tPoseLib_Backup"); - + plb->pchan = pchan; memcpy(&plb->olddata, plb->pchan, sizeof(bPoseChannel)); - + if (pchan->prop) plb->oldprops = IDP_CopyProperty(pchan->prop); - + BLI_addtail(&pld->backups, plb); - + /* mark as being affected */ pld->totcount++; } @@ -933,7 +933,7 @@ static void poselib_backup_posecopy(tPoseLib_PreviewData *pld) static void poselib_backup_restore(tPoseLib_PreviewData *pld) { tPoseLib_Backup *plb; - + for (plb = pld->backups.first; plb; plb = plb->next) { /* copy most of data straight back */ memcpy(plb->pchan, &plb->olddata, sizeof(bPoseChannel)); @@ -959,7 +959,7 @@ static void poselib_backup_free_data(tPoseLib_PreviewData *pld) IDP_FreeProperty(plb->oldprops); MEM_freeN(plb->oldprops); } - + /* free backup element now */ BLI_freelinkN(&pld->backups, plb); } @@ -980,19 +980,19 @@ static void poselib_apply_pose(tPoseLib_PreviewData *pld) bPoseChannel *pchan; bAction *act = pld->act; bActionGroup *agrp; - + KeyframeEditData ked = {{NULL}}; KeyframeEditFunc group_ok_cb; int frame = 1; const bool any_bone_selected = pld->flag & PL_PREVIEW_ANY_BONE_SELECTED; - + /* get the frame */ if (pld->marker) frame = pld->marker->frame; else return; - - + + /* init settings for testing groups for keyframes */ group_ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); ked.f1 = ((float)frame) - 0.5f; @@ -1004,10 +1004,10 @@ static void poselib_apply_pose(tPoseLib_PreviewData *pld) if (ANIM_animchanneldata_keyframes_loop(&ked, NULL, agrp, ALE_GROUP, NULL, group_ok_cb, NULL)) { /* has keyframe on this frame, so try to get a PoseChannel with this name */ pchan = BKE_pose_channel_find_name(pose, agrp->name); - + if (pchan) { bool ok = 0; - + /* check if this bone should get any animation applied */ if (!any_bone_selected) { /* if no bones are selected, then any bone is ok */ @@ -1023,7 +1023,7 @@ static void poselib_apply_pose(tPoseLib_PreviewData *pld) } } - if (ok) + if (ok) animsys_evaluate_action_group(ptr, act, agrp, NULL, (float)frame); } } @@ -1037,7 +1037,7 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, tPoseLib_PreviewData bPoseChannel *pchan; bAction *act = pld->act; bActionGroup *agrp; - + KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID); ListBase dsources = {NULL, NULL}; bool autokey = autokeyframe_cfra_can_key(scene, &pld->ob->id); @@ -1047,13 +1047,13 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, tPoseLib_PreviewData for (agrp = act->groups.first; agrp; agrp = agrp->next) { /* only for selected bones unless there aren't any selected, in which case all are included */ pchan = BKE_pose_channel_find_name(pose, agrp->name); - + if (pchan) { if (!any_bone_selected || ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED))) { if (autokey) { /* add datasource override for the PoseChannel, to be used later */ - ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan); - + ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan); + /* clear any unkeyed tags */ if (pchan->bone) pchan->bone->flag &= ~BONE_UNKEYED; @@ -1066,14 +1066,14 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, tPoseLib_PreviewData } } } - + /* perform actual auto-keying now */ if (autokey) { /* insert keyframes for all relevant bones in one go */ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); BLI_freelistN(&dsources); } - + /* send notifiers for this */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); } @@ -1082,7 +1082,7 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, tPoseLib_PreviewData static void poselib_preview_apply(bContext *C, wmOperator *op) { tPoseLib_PreviewData *pld = (tPoseLib_PreviewData *)op->customdata; - + /* only recalc pose (and its dependencies) if pose has changed */ if (pld->redraw == PL_PREVIEW_REDRAWALL) { /* don't clear pose if firsttime */ @@ -1090,7 +1090,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) poselib_backup_restore(pld); else pld->flag &= ~PL_PREVIEW_FIRSTTIME; - + /* pose should be the right one to draw (unless we're temporarily not showing it) */ if ((pld->flag & PL_PREVIEW_SHOWORIGINAL) == 0) { RNA_int_set(op->ptr, "pose_index", BLI_findindex(&pld->act->markers, pld->marker)); @@ -1098,8 +1098,8 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) } else RNA_int_set(op->ptr, "pose_index", -2); /* -2 means don't apply any pose */ - - /* old optimize trick... this enforces to bypass the depgraph + + /* old optimize trick... this enforces to bypass the depgraph * - note: code copied from transform_generics.c -> recalcData() */ // FIXME: shouldn't this use the builtin stuff? @@ -1108,7 +1108,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) else BKE_pose_where_is(CTX_data_depsgraph(C), pld->scene, pld->ob); } - + /* do header print - if interactively previewing */ if (pld->state == PL_PREVIEW_RUNNING) { if (pld->flag & PL_PREVIEW_SHOWORIGINAL) { @@ -1121,10 +1121,10 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) char tempstr[65]; char markern[64]; short index; - + /* get search-string */ index = pld->search_cursor; - + if (index >= 0 && index < sizeof(tempstr) - 1) { memcpy(&tempstr[0], &pld->searchstr[0], index); tempstr[index] = '|'; @@ -1133,7 +1133,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) else { BLI_strncpy(tempstr, pld->searchstr, sizeof(tempstr)); } - + /* get marker name */ BLI_strncpy(markern, pld->marker ? pld->marker->name : "No Matches", sizeof(markern)); @@ -1152,7 +1152,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) ED_area_headerprint(pld->sa, pld->headerstr); } } - + /* request drawing of view + clear redraw flag */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, pld->ob); pld->redraw = PL_PREVIEW_NOREDRAW; @@ -1160,7 +1160,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op) /* ---------------------------- */ -/* This helper function is called during poselib_preview_poses to find the +/* This helper function is called during poselib_preview_poses to find the * pose to preview next (after a change event) */ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) @@ -1168,20 +1168,20 @@ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) /* stop if not going anywhere, as we assume that there is a direction to move in */ if (step == 0) return; - + /* search-string dictates a special approach */ if (pld->searchstr[0]) { TimeMarker *marker; LinkData *ld, *ldn, *ldc; - + /* free and rebuild if needed (i.e. if search-str changed) */ if (!STREQ(pld->searchstr, pld->searchold)) { /* free list of temporary search matches */ BLI_freelistN(&pld->searchp); - + /* generate a new list of search matches */ for (marker = pld->act->markers.first; marker; marker = marker->next) { - /* does the name partially match? + /* does the name partially match? * - don't worry about case, to make it easier for users to quickly input a name (or * part of one), which is the whole point of this feature */ @@ -1192,17 +1192,17 @@ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) BLI_addtail(&pld->searchp, ld); } } - + /* set current marker to NULL (so that we start from first) */ pld->marker = NULL; } - + /* check if any matches */ if (BLI_listbase_is_empty(&pld->searchp)) { pld->marker = NULL; return; } - + /* find first match */ for (ldc = pld->searchp.first; ldc; ldc = ldc->next) { if (ldc->data == pld->marker) @@ -1210,8 +1210,8 @@ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) } if (ldc == NULL) ldc = pld->searchp.first; - - /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate + + /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate * until step == 0. At this point, marker should be the correct marker. */ if (step > 0) { @@ -1222,19 +1222,19 @@ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) for (ld = ldc; ld && step; ld = ldn, step++) ldn = (ld->prev) ? ld->prev : pld->searchp.last; } - + /* set marker */ if (ld) pld->marker = ld->data; } else { TimeMarker *marker, *next; - + /* if no marker, because we just ended searching, then set that to the start of the list */ if (pld->marker == NULL) pld->marker = pld->act->markers.first; - - /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate + + /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate * until step == 0. At this point, marker should be the correct marker. */ if (step > 0) { @@ -1245,7 +1245,7 @@ static void poselib_preview_get_next(tPoseLib_PreviewData *pld, int step) for (marker = pld->marker; marker && step; marker = next, step++) next = (marker->prev) ? marker->prev : pld->act->markers.last; } - + /* it should be fairly impossible for marker to be NULL */ if (marker) pld->marker = marker; @@ -1262,28 +1262,28 @@ static void poselib_preview_handle_search(tPoseLib_PreviewData *pld, unsigned sh short len = strlen(pld->searchstr); short index = pld->search_cursor; short i; - - for (i = index; i <= len; i++) + + for (i = index; i <= len; i++) pld->searchstr[i - 1] = pld->searchstr[i]; - + pld->search_cursor--; - + poselib_preview_get_next(pld, 1); pld->redraw = PL_PREVIEW_REDRAWALL; return; } break; - + case DELKEY: if (pld->searchstr[0] && pld->searchstr[1]) { short len = strlen(pld->searchstr); short index = pld->search_cursor; int i; - + if (index < len) { - for (i = index; i < len; i++) + for (i = index; i < len; i++) pld->searchstr[i] = pld->searchstr[i + 1]; - + poselib_preview_get_next(pld, 1); pld->redraw = PL_PREVIEW_REDRAWALL; return; @@ -1291,23 +1291,23 @@ static void poselib_preview_handle_search(tPoseLib_PreviewData *pld, unsigned sh } break; } - + if (ascii) { /* character to add to the string */ short index = pld->search_cursor; short len = (pld->searchstr[0]) ? strlen(pld->searchstr) : 0; short i; - + if (len) { - for (i = len; i > index; i--) + for (i = len; i > index; i--) pld->searchstr[i] = pld->searchstr[i - 1]; } else pld->searchstr[1] = 0; - + pld->searchstr[index] = ascii; pld->search_cursor++; - + poselib_preview_get_next(pld, 1); pld->redraw = PL_PREVIEW_REDRAWALL; } @@ -1318,18 +1318,18 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con { tPoseLib_PreviewData *pld = op->customdata; int ret = OPERATOR_RUNNING_MODAL; - + /* only accept 'press' event, and ignore 'release', so that we don't get double actions */ if (ELEM(event->val, KM_PRESS, KM_NOTHING) == 0) { //printf("PoseLib: skipping event with type '%s' and val %d\n", WM_key_event_string(event->type, false), event->val); - return ret; + return ret; } - + /* backup stuff that needs to occur before every operation * - make a copy of searchstr, so that we know if cache needs to be rebuilt */ BLI_strncpy(pld->searchold, pld->searchstr, sizeof(pld->searchold)); - + /* if we're currently showing the original pose, only certain events are handled */ if (pld->flag & PL_PREVIEW_SHOWORIGINAL) { switch (event->type) { @@ -1338,7 +1338,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con case RIGHTMOUSE: pld->state = PL_PREVIEW_CANCEL; break; - + /* exit - confirm */ case LEFTMOUSE: case RETKEY: @@ -1346,30 +1346,30 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con case SPACEKEY: pld->state = PL_PREVIEW_CONFIRM; break; - + /* view manipulation */ - /* we add pass through here, so that the operators responsible for these can still run, + /* we add pass through here, so that the operators responsible for these can still run, * even though we still maintain control (as RUNNING_MODAL flag is still set too) */ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4: case PAD5: case PAD6: case PAD7: case PAD8: case PAD9: - case PADPLUSKEY: case PADMINUS: + case PADPLUSKEY: case PADMINUS: case MIDDLEMOUSE: case MOUSEMOVE: //pld->redraw = PL_PREVIEW_REDRAWHEADER; ret = OPERATOR_PASS_THROUGH; break; - + /* quicky compare to original */ case TABKEY: pld->flag &= ~PL_PREVIEW_SHOWORIGINAL; pld->redraw = PL_PREVIEW_REDRAWALL; break; } - + /* EXITS HERE... */ return ret; } - + /* NORMAL EVENT HANDLING... */ /* searching takes priority over normal activity */ switch (event->type) { @@ -1378,7 +1378,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con case RIGHTMOUSE: pld->state = PL_PREVIEW_CANCEL; break; - + /* exit - confirm */ case LEFTMOUSE: case RETKEY: @@ -1386,39 +1386,39 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con case SPACEKEY: pld->state = PL_PREVIEW_CONFIRM; break; - + /* toggle between original pose and poselib pose*/ case TABKEY: pld->flag |= PL_PREVIEW_SHOWORIGINAL; pld->redraw = PL_PREVIEW_REDRAWALL; break; - + /* change to previous pose (cyclic) */ case PAGEUPKEY: case WHEELUPMOUSE: poselib_preview_get_next(pld, -1); pld->redraw = PL_PREVIEW_REDRAWALL; break; - + /* change to next pose (cyclic) */ case PAGEDOWNKEY: case WHEELDOWNMOUSE: poselib_preview_get_next(pld, 1); pld->redraw = PL_PREVIEW_REDRAWALL; break; - + /* jump 5 poses (cyclic, back) */ case DOWNARROWKEY: poselib_preview_get_next(pld, -5); pld->redraw = PL_PREVIEW_REDRAWALL; break; - + /* jump 5 poses (cyclic, forward) */ case UPARROWKEY: poselib_preview_get_next(pld, 5); pld->redraw = PL_PREVIEW_REDRAWALL; break; - + /* change to next pose or searching cursor control */ case RIGHTARROWKEY: if (pld->searchstr[0]) { @@ -1433,7 +1433,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con pld->redraw = PL_PREVIEW_REDRAWALL; } break; - + /* change to next pose or searching cursor control */ case LEFTARROWKEY: if (pld->searchstr[0]) { @@ -1448,7 +1448,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con pld->redraw = PL_PREVIEW_REDRAWALL; } break; - + /* change to first pose or start of searching string */ case HOMEKEY: if (pld->searchstr[0]) { @@ -1459,11 +1459,11 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con /* change to first pose */ pld->marker = pld->act->markers.first; pld->act->active_marker = 1; - + pld->redraw = PL_PREVIEW_REDRAWALL; } break; - + /* change to last pose or start of searching string */ case ENDKEY: if (pld->searchstr[0]) { @@ -1474,20 +1474,20 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con /* change to last pose */ pld->marker = pld->act->markers.last; pld->act->active_marker = BLI_listbase_count(&pld->act->markers); - + pld->redraw = PL_PREVIEW_REDRAWALL; } break; - + /* view manipulation */ - /* we add pass through here, so that the operators responsible for these can still run, + /* we add pass through here, so that the operators responsible for these can still run, * even though we still maintain control (as RUNNING_MODAL flag is still set too) */ case MIDDLEMOUSE: case MOUSEMOVE: //pld->redraw = PL_PREVIEW_REDRAWHEADER; ret = OPERATOR_PASS_THROUGH; break; - + /* view manipulation, or searching */ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4: case PAD5: case PAD6: case PAD7: case PAD8: case PAD9: @@ -1502,13 +1502,13 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con ret = OPERATOR_PASS_THROUGH; } break; - + /* otherwise, assume that searching might be able to handle it */ default: poselib_preview_handle_search(pld, event->type, event->ascii); break; } - + return ret; } @@ -1520,19 +1520,19 @@ static void poselib_preview_init_data(bContext *C, wmOperator *op) tPoseLib_PreviewData *pld; Object *ob = get_poselib_object(C); int pose_index = RNA_int_get(op->ptr, "pose_index"); - + /* set up preview state info */ op->customdata = pld = MEM_callocN(sizeof(tPoseLib_PreviewData), "PoseLib Preview Data"); - + /* get basic data */ pld->ob = ob; pld->arm = (ob) ? (ob->data) : NULL; pld->pose = (ob) ? (ob->pose) : NULL; pld->act = (ob) ? (ob->poselib) : NULL; - + pld->scene = CTX_data_scene(C); pld->sa = CTX_wm_area(C); - + /* get starting pose based on RNA-props for this operator */ if (pose_index == -1) pld->marker = poselib_get_active_pose(pld->act); @@ -1540,7 +1540,7 @@ static void poselib_preview_init_data(bContext *C, wmOperator *op) pld->flag |= PL_PREVIEW_SHOWORIGINAL; else pld->marker = (pld->act) ? BLI_findlink(&pld->act->markers, pose_index) : NULL; - + /* check if valid poselib */ if (ELEM(NULL, pld->ob, pld->pose, pld->arm)) { BKE_report(op->reports, RPT_ERROR, "Pose lib is only for armatures in pose mode"); @@ -1556,7 +1556,7 @@ static void poselib_preview_init_data(bContext *C, wmOperator *op) if (pld->act->markers.first) { /* just use first one then... */ pld->marker = pld->act->markers.first; - if (pose_index > -2) + if (pose_index > -2) BKE_report(op->reports, RPT_WARNING, "Pose lib had no active pose"); } else { @@ -1565,23 +1565,23 @@ static void poselib_preview_init_data(bContext *C, wmOperator *op) return; } } - + /* get ID pointer for applying poses */ RNA_id_pointer_create(&ob->id, &pld->rna_ptr); - + /* make backups for restoring pose */ poselib_backup_posecopy(pld); - + /* set flags for running */ pld->state = PL_PREVIEW_RUNNING; pld->redraw = PL_PREVIEW_REDRAWALL; pld->flag |= PL_PREVIEW_FIRSTTIME; - + /* set depsgraph flags */ /* make sure the lock is set OK, unlock can be accidentally saved? */ pld->pose->flag |= POSE_LOCKED; pld->pose->flag &= ~POSE_DO_UNLOCK; - + /* clear strings + search */ pld->headerstr[0] = pld->searchstr[0] = pld->searchold[0] = '\0'; pld->search_cursor = 0; @@ -1597,18 +1597,18 @@ static void poselib_preview_cleanup(bContext *C, wmOperator *op) bArmature *arm = pld->arm; bAction *act = pld->act; TimeMarker *marker = pld->marker; - + /* redraw the header so that it doesn't show any of our stuff anymore */ ED_area_headerprint(pld->sa, NULL); - + /* this signal does one recalc on pose, then unlocks, so ESC or edit will work */ pose->flag |= POSE_DO_UNLOCK; - + /* clear pose if canceled */ if (pld->state == PL_PREVIEW_CANCEL) { poselib_backup_restore(pld); - - /* old optimize trick... this enforces to bypass the depgraph + + /* old optimize trick... this enforces to bypass the depgraph * - note: code copied from transform_generics.c -> recalcData() */ if ((arm->flag & ARM_DELAYDEFORM) == 0) @@ -1619,14 +1619,14 @@ static void poselib_preview_cleanup(bContext *C, wmOperator *op) else if (pld->state == PL_PREVIEW_CONFIRM) { /* tag poses as appropriate */ poselib_keytag_pose(C, scene, pld); - + /* change active pose setting */ act->active_marker = BLI_findindex(&act->markers, marker) + 1; action_set_activemarker(act, marker, NULL); - + /* Update event for pose and deformation children */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); - + /* updates */ if (IS_AUTOKEY_MODE(scene, NORMAL)) { //remake_action_ipos(ob->action); @@ -1634,14 +1634,14 @@ static void poselib_preview_cleanup(bContext *C, wmOperator *op) else BKE_pose_where_is(CTX_data_depsgraph(C), scene, ob); } - + /* Request final redraw of the view. */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, pld->ob); - + /* free memory used for backups and searching */ poselib_backup_free_data(pld); BLI_freelistN(&pld->searchp); - + /* free temp data for operator */ MEM_freeN(pld); op->customdata = NULL; @@ -1652,10 +1652,10 @@ static int poselib_preview_exit(bContext *C, wmOperator *op) { tPoseLib_PreviewData *pld = op->customdata; int exit_state = pld->state; - + /* finish up */ poselib_preview_cleanup(C, op); - + if (ELEM(exit_state, PL_PREVIEW_CANCEL, PL_PREVIEW_ERROR)) return OPERATOR_CANCELLED; else @@ -1673,18 +1673,18 @@ static int poselib_preview_modal(bContext *C, wmOperator *op, const wmEvent *eve { tPoseLib_PreviewData *pld = op->customdata; int ret; - + /* 1) check state to see if we're still running */ if (pld->state != PL_PREVIEW_RUNNING) return poselib_preview_exit(C, op); - + /* 2) handle events */ ret = poselib_preview_handle_event(C, op, event); - + /* 3) apply changes and redraw, otherwise, confirming goes wrong */ if (pld->redraw) poselib_preview_apply(C, op); - + return ret; } @@ -1692,20 +1692,20 @@ static int poselib_preview_modal(bContext *C, wmOperator *op, const wmEvent *eve static int poselib_preview_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { tPoseLib_PreviewData *pld; - + /* check if everything is ok, and init settings for modal operator */ poselib_preview_init_data(C, op); pld = (tPoseLib_PreviewData *)op->customdata; - + if (pld->state == PL_PREVIEW_ERROR) { /* an error occurred, so free temp mem used */ poselib_preview_cleanup(C, op); return OPERATOR_CANCELLED; } - + /* do initial apply to have something to look at */ poselib_preview_apply(C, op); - + /* add temp handler if we're running as a modal operator */ WM_event_add_modal_handler(C, op); @@ -1716,28 +1716,28 @@ static int poselib_preview_invoke(bContext *C, wmOperator *op, const wmEvent *UN static int poselib_preview_exec(bContext *C, wmOperator *op) { tPoseLib_PreviewData *pld; - + /* check if everything is ok, and init settings for modal operator */ poselib_preview_init_data(C, op); pld = (tPoseLib_PreviewData *)op->customdata; - + if (pld->state == PL_PREVIEW_ERROR) { /* an error occurred, so free temp mem used */ poselib_preview_cleanup(C, op); return OPERATOR_CANCELLED; } - + /* the exec() callback is effectively a 'run-once' scenario, so set the state to that * so that everything draws correctly */ pld->state = PL_PREVIEW_RUNONCE; - + /* apply the active pose */ poselib_preview_apply(C, op); - + /* now, set the status to exit */ pld->state = PL_PREVIEW_CONFIRM; - + /* cleanup */ return poselib_preview_exit(C, op); } @@ -1748,21 +1748,21 @@ void POSELIB_OT_browse_interactive(wmOperatorType *ot) ot->name = "PoseLib Browse Poses"; ot->idname = "POSELIB_OT_browse_interactive"; ot->description = "Interactively browse poses in 3D-View"; - + /* callbacks */ ot->invoke = poselib_preview_invoke; ot->modal = poselib_preview_modal; ot->cancel = poselib_preview_cancel; ot->exec = poselib_preview_exec; ot->poll = has_poselib_pose_data_poll; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - + /* properties */ // TODO: make the pose_index into a proper enum instead of a cryptic int... ot->prop = RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX); - + // XXX: percentage vs factor? /* not used yet */ /* RNA_def_float_factor(ot->srna, "blend_factor", 1.0f, 0.0f, 1.0f, "Blend Factor", "Amount that the pose is applied on top of the existing poses", 0.0f, 1.0f); */ @@ -1774,7 +1774,7 @@ void POSELIB_OT_apply_pose(wmOperatorType *ot) ot->name = "Apply Pose Library Pose"; ot->idname = "POSELIB_OT_apply_pose"; ot->description = "Apply specified Pose Library pose to the rig"; - + /* callbacks */ ot->exec = poselib_preview_exec; ot->poll = has_poselib_pose_data_poll; diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index f0dc680598c..75fd952b52a 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -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; diff --git a/source/blender/editors/armature/pose_slide.c b/source/blender/editors/armature/pose_slide.c index 88203474d03..b82535f013b 100644 --- a/source/blender/editors/armature/pose_slide.c +++ b/source/blender/editors/armature/pose_slide.c @@ -63,7 +63,7 @@ #include "armature_intern.h" /* **************************************************** */ -/* == POSE 'SLIDING' TOOLS == +/* == POSE 'SLIDING' TOOLS == * * A) Push & Relax, Breakdowner * These tools provide the animator with various capabilities @@ -96,21 +96,21 @@ typedef struct tPoseSlideOp { DLRBT_Tree keys; /* binary tree for quicker searching for keyframes (when applicable) */ int cframe; /* current frame number - global time */ - + int prevFrame; /* frame before current frame (blend-from) - global time */ int nextFrame; /* frame after current frame (blend-to) - global time */ - + float prevFrameF; /* prevFrame, but in local action time (for F-Curve lookups to work) */ float nextFrameF; /* nextFrame, but in local action time (for F-Curve lookups to work) */ - + short mode; /* sliding mode (ePoseSlide_Modes) */ short flag; /* unused for now, but can later get used for storing runtime settings.... */ - + short channels; /* which transforms/channels are affected (ePoseSlide_Channels) */ short axislock; /* axis-limits for transforms (ePoseSlide_AxisLock) */ - + float percentage; /* 0-1 value for determining the influence of whatever is relevant */ - + NumInput num; /* numeric input */ } tPoseSlideOp; @@ -125,19 +125,19 @@ typedef enum ePoseSlide_Modes { /* Transforms/Channels to Affect */ typedef enum ePoseSlide_Channels { PS_TFM_ALL = 0, /* All transforms and properties */ - + PS_TFM_LOC, /* Loc/Rot/Scale */ PS_TFM_ROT, PS_TFM_SIZE, - + PS_TFM_BBONE_SHAPE, /* Bendy Bones */ - + PS_TFM_PROPS /* Custom Properties */ } ePoseSlide_Channels; /* Property enum for ePoseSlide_Channels */ static const EnumPropertyItem prop_channels_types[] = { - {PS_TFM_ALL, "ALL", 0, "All Properties", + {PS_TFM_ALL, "ALL", 0, "All Properties", "All properties, including transforms, bendy bone shape, and custom properties"}, {PS_TFM_LOC, "LOC", 0, "Location", "Location only"}, {PS_TFM_ROT, "ROT", 0, "Rotation", "Rotation only"}, @@ -171,60 +171,60 @@ static int pose_slide_init(bContext *C, wmOperator *op, short mode) { tPoseSlideOp *pso; bAction *act = NULL; - + /* init slide-op data */ pso = op->customdata = MEM_callocN(sizeof(tPoseSlideOp), "tPoseSlideOp"); - + /* get info from context */ pso->scene = CTX_data_scene(C); pso->ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); pso->arm = (pso->ob) ? pso->ob->data : NULL; pso->sa = CTX_wm_area(C); /* only really needed when doing modal() */ pso->ar = CTX_wm_region(C); /* only really needed when doing modal() */ - + pso->cframe = pso->scene->r.cfra; pso->mode = mode; - + /* set range info from property values - these may get overridden for the invoke() */ pso->percentage = RNA_float_get(op->ptr, "percentage"); pso->prevFrame = RNA_int_get(op->ptr, "prev_frame"); pso->nextFrame = RNA_int_get(op->ptr, "next_frame"); - + /* get the set of properties/axes that can be operated on */ pso->channels = RNA_enum_get(op->ptr, "channels"); pso->axislock = RNA_enum_get(op->ptr, "axis_lock"); - + /* ensure validity of the settings from the context */ if (ELEM(NULL, pso->ob, pso->arm, pso->ob->adt, pso->ob->adt->action)) return 0; - + act = pso->ob->adt->action; - + /* apply NLA mapping corrections so the frame lookups work */ pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP); pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP); - - /* for each Pose-Channel which gets affected, get the F-Curves for that channel + + /* for each Pose-Channel which gets affected, get the F-Curves for that channel * and set the relevant transform flags... */ poseAnim_mapping_get(C, &pso->pfLinks, pso->ob, act); - + /* set depsgraph flags */ /* make sure the lock is set OK, unlock can be accidentally saved? */ pso->ob->pose->flag |= POSE_LOCKED; pso->ob->pose->flag &= ~POSE_DO_UNLOCK; - - /* do basic initialize of RB-BST used for finding keyframes, but leave the filling of it up + + /* do basic initialize of RB-BST used for finding keyframes, but leave the filling of it up * to the caller of this (usually only invoke() will do it, to make things more efficient). */ BLI_dlrbTree_init(&pso->keys); - + /* initialise numeric input */ initNumInput(&pso->num); pso->num.idx_max = 0; /* one axis */ pso->num.val_flag[0] |= NUM_NO_NEGATIVE; pso->num.unit_type[0] = B_UNIT_NONE; /* percentages don't have any units... */ - + /* return status is whether we've got all the data we were requested to get */ return 1; } @@ -233,19 +233,19 @@ static int pose_slide_init(bContext *C, wmOperator *op, short mode) static void pose_slide_exit(wmOperator *op) { tPoseSlideOp *pso = op->customdata; - + /* if data exists, clear its data and exit */ if (pso) { /* free the temp pchan links and their data */ poseAnim_mapping_free(&pso->pfLinks); - + /* free RB-BST for keyframes (if it contained data) */ BLI_dlrbTree_free(&pso->keys); - + /* free data itself */ MEM_freeN(pso); } - + /* cleanup */ op->customdata = NULL; } @@ -265,19 +265,19 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val) float cframe = (float)pso->cframe; float sVal, eVal; float w1, w2; - + /* get keyframe values for endpoint poses to blend with */ /* previous/start */ sVal = evaluate_fcurve(fcu, pso->prevFrameF); /* next/end */ eVal = evaluate_fcurve(fcu, pso->nextFrameF); - + /* if both values are equal, don't do anything */ if (IS_EQF(sVal, eVal)) { (*val) = sVal; return; } - + /* calculate the relative weights of the endpoints */ if (pso->mode == POSESLIDE_BREAKDOWN) { /* get weights from the percentage control */ @@ -285,20 +285,20 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val) w2 = 1.0f - w1; /* this must come first */ } else { - /* - these weights are derived from the relative distance of these + /* - these weights are derived from the relative distance of these * poses from the current frame * - they then get normalized so that they only sum up to 1 */ - float wtot; - + float wtot; + w1 = cframe - (float)pso->prevFrame; w2 = (float)pso->nextFrame - cframe; - + wtot = w1 + w2; w1 = (w1 / wtot); w2 = (w2 / wtot); } - + /* depending on the mode, calculate the new value * - in all of these, the start+end values are multiplied by w2 and w1 (respectively), * since multiplication in another order would decrease the value the current frame is closer to @@ -311,7 +311,7 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val) * - perform this weighting a number of times given by the percentage... */ int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */ - + while (iters-- > 0) { (*val) = (-((sVal * w2) + (eVal * w1)) + ((*val) * 6.0f) ) / 5.0f; } @@ -324,7 +324,7 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val) * - perform this weighting a number of times given by the percentage... */ int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */ - + while (iters-- > 0) { (*val) = ( ((sVal * w2) + (eVal * w1)) + ((*val) * 5.0f) ) / 6.0f; } @@ -345,19 +345,19 @@ static void pose_slide_apply_vec3(tPoseSlideOp *pso, tPChanFCurveLink *pfl, floa { LinkData *ld = NULL; char *path = NULL; - + /* get the path to use... */ path = BLI_sprintfN("%s.%s", pfl->pchan_path, propName); - + /* using this path, find each matching F-Curve for the variables we're interested in */ while ( (ld = poseAnim_mapping_getNextFCurve(&pfl->fcurves, ld, path)) ) { FCurve *fcu = (FCurve *)ld->data; const int idx = fcu->array_index; const int lock = pso->axislock; - + /* check if this F-Curve is ok given the current axis locks */ BLI_assert(fcu->array_index < 3); - + if ((lock == 0) || ((lock & PS_LOCK_X) && (idx == 0)) || ((lock & PS_LOCK_Y) && (idx == 1)) || @@ -367,7 +367,7 @@ static void pose_slide_apply_vec3(tPoseSlideOp *pso, tPChanFCurveLink *pfl, floa pose_slide_apply_val(pso, fcu, &vec[fcu->array_index]); } } - + /* free the temp path we got */ MEM_freeN(path); } @@ -378,11 +378,11 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con PointerRNA ptr = {{NULL}}; LinkData *ld; int len = strlen(pfl->pchan_path); - + /* setup pointer RNA for resolving paths */ RNA_pointer_create(NULL, &RNA_PoseBone, pfl->pchan, &ptr); - - /* - custom properties are just denoted using ["..."][etc.] after the end of the base path, + + /* - custom properties are just denoted using ["..."][etc.] after the end of the base path, * so just check for opening pair after the end of the path * - bbone properties are similar, but they always start with a prefix "bbone_*", * so a similar method should work here for those too @@ -390,23 +390,23 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con for (ld = pfl->fcurves.first; ld; ld = ld->next) { FCurve *fcu = (FCurve *)ld->data; const char *bPtr, *pPtr; - + if (fcu->rna_path == NULL) continue; - - /* do we have a match? + + /* do we have a match? * - bPtr is the RNA Path with the standard part chopped off * - pPtr is the chunk of the path which is left over */ bPtr = strstr(fcu->rna_path, pfl->pchan_path) + len; pPtr = strstr(bPtr, prop_prefix); - + if (pPtr) { /* use RNA to try and get a handle on this property, then, assuming that it is just * numerical, try and grab the value as a float for temp editing before setting back */ PropertyRNA *prop = RNA_struct_find_property(&ptr, pPtr); - + if (prop) { switch (RNA_property_type(prop)) { /* continuous values that can be smoothly interpolated... */ @@ -424,7 +424,7 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con RNA_property_int_set(&ptr, prop, (int)tval); break; } - + /* values which can only take discrete values */ case PROP_BOOLEAN: { @@ -440,7 +440,7 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con */ break; } - + default: /* cannot handle */ //printf("Cannot Pose Slide non-numerical property\n"); @@ -459,17 +459,17 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl) LinkData *ld = NULL; char *path = NULL; float cframe; - + /* get the path to use - this should be quaternion rotations only (needs care) */ path = BLI_sprintfN("%s.%s", pfl->pchan_path, "rotation_quaternion"); - + /* get the current frame number */ cframe = (float)pso->cframe; - + /* using this path, find each matching F-Curve for the variables we're interested in */ while ( (ld = poseAnim_mapping_getNextFCurve(&pfl->fcurves, ld, path)) ) { FCurve *fcu = (FCurve *)ld->data; - + /* assign this F-Curve to one of the relevant pointers... */ switch (fcu->array_index) { case 3: /* z */ @@ -486,22 +486,22 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl) break; } } - + /* only if all channels exist, proceed */ if (fcu_w && fcu_x && fcu_y && fcu_z) { float quat_prev[4], quat_next[4]; - + /* get 2 quats */ quat_prev[0] = evaluate_fcurve(fcu_w, pso->prevFrameF); quat_prev[1] = evaluate_fcurve(fcu_x, pso->prevFrameF); quat_prev[2] = evaluate_fcurve(fcu_y, pso->prevFrameF); quat_prev[3] = evaluate_fcurve(fcu_z, pso->prevFrameF); - + quat_next[0] = evaluate_fcurve(fcu_w, pso->nextFrameF); quat_next[1] = evaluate_fcurve(fcu_x, pso->nextFrameF); quat_next[2] = evaluate_fcurve(fcu_y, pso->nextFrameF); quat_next[3] = evaluate_fcurve(fcu_z, pso->nextFrameF); - + /* perform blending */ if (pso->mode == POSESLIDE_BREAKDOWN) { /* just perform the interpol between quat_prev and quat_next using pso->percentage as a guide */ @@ -509,35 +509,35 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl) } else if (pso->mode == POSESLIDE_PUSH) { float quat_diff[4], quat_orig[4]; - + /* calculate the delta transform from the previous to the current */ /* TODO: investigate ways to favour one transform more? */ sub_qt_qtqt(quat_diff, pchan->quat, quat_prev); - + /* make a copy of the original rotation */ copy_qt_qt(quat_orig, pchan->quat); - + /* increase the original by the delta transform, by an amount determined by percentage */ add_qt_qtqt(pchan->quat, quat_orig, quat_diff, pso->percentage); } else { float quat_interp[4], quat_orig[4]; int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */ - + /* perform this blending several times until a satisfactory result is reached */ while (iters-- > 0) { /* calculate the interpolation between the endpoints */ interp_qt_qtqt(quat_interp, quat_prev, quat_next, (cframe - pso->prevFrame) / (pso->nextFrame - pso->prevFrame)); - + /* make a copy of the original rotation */ copy_qt_qt(quat_orig, pchan->quat); - + /* tricky interpolations - blending between original and new */ interp_qt_qtqt(pchan->quat, quat_orig, quat_interp, 1.0f / 6.0f); } } } - + /* free the path now */ MEM_freeN(path); } @@ -546,37 +546,37 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl) static void pose_slide_apply(bContext *C, tPoseSlideOp *pso) { tPChanFCurveLink *pfl; - + /* sanitise the frame ranges */ if (pso->prevFrame == pso->nextFrame) { /* move out one step either side */ pso->prevFrame--; pso->nextFrame++; - + /* apply NLA mapping corrections so the frame lookups work */ pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP); pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP); } - + /* for each link, handle each set of transforms */ for (pfl = pso->pfLinks.first; pfl; pfl = pfl->next) { - /* valid transforms for each PoseChannel should have been noted already - * - sliding the pose should be a straightforward exercise for location+rotation, - * but rotations get more complicated since we may want to use quaternion blending + /* valid transforms for each PoseChannel should have been noted already + * - sliding the pose should be a straightforward exercise for location+rotation, + * but rotations get more complicated since we may want to use quaternion blending * for quaternions instead... */ bPoseChannel *pchan = pfl->pchan; - + if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_LOC) && (pchan->flag & POSE_LOC)) { /* calculate these for the 'location' vector, and use location curves */ pose_slide_apply_vec3(pso, pfl, pchan->loc, "location"); } - + if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_SIZE) && (pchan->flag & POSE_SIZE)) { /* calculate these for the 'scale' vector, and use scale curves */ pose_slide_apply_vec3(pso, pfl, pchan->size, "scale"); } - + if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_ROT) && (pchan->flag & POSE_ROT)) { /* everything depends on the rotation mode */ if (pchan->rotmode > 0) { @@ -591,12 +591,12 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso) pose_slide_apply_quat(pso, pfl); } } - + if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_BBONE_SHAPE) && (pchan->flag & POSE_BBONE_SHAPE)) { /* bbone properties - they all start a "bbone_" prefix */ - pose_slide_apply_props(pso, pfl, "bbone_"); + pose_slide_apply_props(pso, pfl, "bbone_"); } - + if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_PROPS) && (pfl->oldprops)) { /* not strictly a transform, but custom properties contribute to the pose produced in many rigs * (e.g. the facial rigs used in Sintel) @@ -604,7 +604,7 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso) pose_slide_apply_props(pso, pfl, "[\""); /* dummy " for texteditor bugs */ } } - + /* depsgraph updates + redraws */ pose_slide_refresh(C, pso); } @@ -633,7 +633,7 @@ static void pose_slide_draw_status(tPoseSlideOp *pso) char limits_str[UI_MAX_DRAW_STR]; char axis_str[50]; char mode_str[32]; - + switch (pso->mode) { case POSESLIDE_PUSH: strcpy(mode_str, "Push Pose"); @@ -644,13 +644,13 @@ static void pose_slide_draw_status(tPoseSlideOp *pso) case POSESLIDE_BREAKDOWN: strcpy(mode_str, "Breakdown"); break; - + default: /* unknown */ strcpy(mode_str, "Sliding-Tool"); break; } - + switch (pso->axislock) { case PS_LOCK_X: BLI_strncpy(axis_str, "[X]/Y/Z axis only (X to clear)", sizeof(axis_str)); @@ -661,7 +661,7 @@ static void pose_slide_draw_status(tPoseSlideOp *pso) case PS_LOCK_Z: BLI_strncpy(axis_str, "X/Y/[Z] axis only (Z to clear)", sizeof(axis_str)); break; - + default: if (ELEM(pso->channels, PS_TFM_LOC, PS_TFM_ROT, PS_TFM_SIZE)) { BLI_strncpy(axis_str, "X/Y/Z = Axis Constraint", sizeof(axis_str)); @@ -671,7 +671,7 @@ static void pose_slide_draw_status(tPoseSlideOp *pso) } break; } - + switch (pso->channels) { case PS_TFM_LOC: BLI_snprintf(limits_str, sizeof(limits_str), "[G]/R/S/B/C - Location only (G to clear) | %s", axis_str); @@ -692,19 +692,19 @@ static void pose_slide_draw_status(tPoseSlideOp *pso) BLI_strncpy(limits_str, "G/R/S/B/C - Limit to Transform/Property Set", sizeof(limits_str)); break; } - + if (hasNumInput(&pso->num)) { Scene *scene = pso->scene; char str_offs[NUM_STR_REP_LEN]; - + outputNumInput(&pso->num, str_offs, &scene->unit); - + BLI_snprintf(status_str, sizeof(status_str), "%s: %s | %s", mode_str, str_offs, limits_str); } else { BLI_snprintf(status_str, sizeof(status_str), "%s: %d %% | %s", mode_str, (int)(pso->percentage * 100.0f), limits_str); } - + ED_area_headerprint(pso->sa, status_str); } @@ -714,34 +714,34 @@ static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *p tPChanFCurveLink *pfl; AnimData *adt = pso->ob->adt; wmWindow *win = CTX_wm_window(C); - + /* for each link, add all its keyframes to the search tree */ for (pfl = pso->pfLinks.first; pfl; pfl = pfl->next) { LinkData *ld; - + /* do this for each F-Curve */ for (ld = pfl->fcurves.first; ld; ld = ld->next) { FCurve *fcu = (FCurve *)ld->data; fcurve_to_keylist(adt, fcu, &pso->keys, NULL); } } - + /* consolidate these keyframes, and figure out the nearest ones */ BLI_dlrbTree_linkedlist_sync(&pso->keys); - + /* cancel if no keyframes found... */ if (pso->keys.root) { ActKeyColumn *ak; float cframe = (float)pso->cframe; - + /* firstly, check if the current frame is a keyframe... */ ak = (ActKeyColumn *)BLI_dlrbTree_search_exact(&pso->keys, compare_ak_cfraPtr, &cframe); - + if (ak == NULL) { /* current frame is not a keyframe, so search */ ActKeyColumn *pk = (ActKeyColumn *)BLI_dlrbTree_search_prev(&pso->keys, compare_ak_cfraPtr, &cframe); ActKeyColumn *nk = (ActKeyColumn *)BLI_dlrbTree_search_next(&pso->keys, compare_ak_cfraPtr, &cframe); - + /* new set the frames */ /* prev frame */ pso->prevFrame = (pk) ? (pk->cfra) : (pso->cframe - 1); @@ -759,7 +759,7 @@ static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *p pso->nextFrame = (ak->next) ? (ak->next->cfra) : (pso->cframe + 1); RNA_int_set(op->ptr, "next_frame", pso->nextFrame); } - + /* apply NLA mapping corrections so the frame lookups work */ pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP); pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP); @@ -769,20 +769,20 @@ static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *p pose_slide_exit(op); return OPERATOR_CANCELLED; } - + /* initial apply for operator... */ /* TODO: need to calculate percentage for initial round too... */ pose_slide_apply(C, pso); - + /* depsgraph updates + redraws */ pose_slide_refresh(C, pso); - + /* set cursor to indicate modal */ WM_cursor_modal_set(win, BC_EW_SCROLLCURSOR); - + /* header print */ pose_slide_draw_status(pso); - + /* add a modal handler for this operator */ WM_event_add_modal_handler(C, op); return OPERATOR_RUNNING_MODAL; @@ -810,8 +810,8 @@ static void pose_slide_toggle_channels_mode(wmOperator *op, tPoseSlideOp *pso, e pso->channels = channel; } RNA_enum_set(op->ptr, "channels", pso->channels); - - + + /* Reset axis limits too for good measure */ pso->axislock = 0; RNA_enum_set(op->ptr, "axis_lock", pso->axislock); @@ -826,7 +826,7 @@ static bool pose_slide_toggle_axis_locks(wmOperator *op, tPoseSlideOp *pso, ePos RNA_enum_set(op->ptr, "axis_lock", pso->axislock); return false; } - + /* Turn on or off? */ if (pso->axislock == axis) { /* Already limiting on this axis, so turn off */ @@ -837,7 +837,7 @@ static bool pose_slide_toggle_axis_locks(wmOperator *op, tPoseSlideOp *pso, ePos pso->axislock = axis; } RNA_enum_set(op->ptr, "axis_lock", pso->axislock); - + /* Setting changed, so pose update is needed */ return true; } @@ -848,9 +848,9 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) tPoseSlideOp *pso = op->customdata; wmWindow *win = CTX_wm_window(C); bool do_pose_update = false; - + const bool has_numinput = hasNumInput(&pso->num); - + switch (event->type) { case LEFTMOUSE: /* confirm */ case RETKEY: @@ -859,35 +859,35 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) /* return to normal cursor and header status */ ED_area_headerprint(pso->sa, NULL); WM_cursor_modal_restore(win); - + /* insert keyframes as required... */ pose_slide_autoKeyframe(C, pso); pose_slide_exit(op); - + /* done! */ return OPERATOR_FINISHED; } - + case ESCKEY: /* cancel */ - case RIGHTMOUSE: + case RIGHTMOUSE: { /* return to normal cursor and header status */ ED_area_headerprint(pso->sa, NULL); WM_cursor_modal_restore(win); - + /* reset transforms back to original state */ pose_slide_reset(pso); - + /* depsgraph updates + redraws */ pose_slide_refresh(C, pso); - + /* clean up temp data */ pose_slide_exit(op); - + /* canceled! */ return OPERATOR_CANCELLED; } - + /* Percentage Chane... */ case MOUSEMOVE: /* calculate new position */ { @@ -895,7 +895,7 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) if (has_numinput == false) { /* update percentage based on position of mouse */ pose_slide_mouse_update_percentage(pso, op, event); - + /* update pose to reflect the new values (see below) */ do_pose_update = true; } @@ -905,17 +905,17 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) { if ((event->val == KM_PRESS) && handleNumInput(C, &pso->num, event)) { float value; - - /* Grab percentage from numeric input, and store this new value for redo + + /* Grab percentage from numeric input, and store this new value for redo * NOTE: users see ints, while internally we use a 0-1 float */ value = pso->percentage * 100.0f; applyNumInput(&pso->num, &value); - + pso->percentage = value / 100.0f; CLAMP(pso->percentage, 0.0f, 1.0f); RNA_float_set(op->ptr, "percentage", pso->percentage); - + /* Update pose to reflect the new values (see below) */ do_pose_update = true; break; @@ -954,8 +954,8 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) do_pose_update = true; break; } - - + + /* Axis Locks */ /* XXX: Hardcoded... */ case XKEY: @@ -979,8 +979,8 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) } break; } - - + + default: /* Some other unhandled key... */ break; } @@ -992,20 +992,20 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event) } } } - - + + /* perform pose updates - in response to some user action (e.g. pressing a key or moving the mouse) */ if (do_pose_update) { /* update percentage indicator in header */ pose_slide_draw_status(pso); - + /* reset transforms (to avoid accumulation errors) */ pose_slide_reset(pso); - + /* apply... */ pose_slide_apply(C, pso); } - + /* still running... */ return OPERATOR_RUNNING_MODAL; } @@ -1022,13 +1022,13 @@ static int pose_slide_exec_common(bContext *C, wmOperator *op, tPoseSlideOp *pso { /* settings should have been set up ok for applying, so just apply! */ pose_slide_apply(C, pso); - + /* insert keyframes if needed */ pose_slide_autoKeyframe(C, pso); - + /* cleanup and done */ pose_slide_exit(op); - + return OPERATOR_FINISHED; } @@ -1037,10 +1037,10 @@ static int pose_slide_exec_common(bContext *C, wmOperator *op, tPoseSlideOp *pso static void pose_slide_opdef_properties(wmOperatorType *ot) { RNA_def_float_percentage(ot->srna, "percentage", 0.5f, 0.0f, 1.0f, "Percentage", "Weighting factor for which keyframe is favored more", 0.3, 0.7); - + RNA_def_int(ot->srna, "prev_frame", 0, MINAFRAME, MAXFRAME, "Previous Keyframe", "Frame number of keyframe immediately before the current frame", 0, 50); RNA_def_int(ot->srna, "next_frame", 0, MINAFRAME, MAXFRAME, "Next Keyframe", "Frame number of keyframe immediately after the current frame", 0, 50); - + RNA_def_enum(ot->srna, "channels", prop_channels_types, PS_TFM_ALL, "Channels", "Set of properties that are affected"); RNA_def_enum(ot->srna, "axis_lock", prop_axis_lock_types, 0, "Axis Lock", "Transform axis to restrict effects to"); } @@ -1051,7 +1051,7 @@ static void pose_slide_opdef_properties(wmOperatorType *ot) static int pose_slide_push_invoke(bContext *C, wmOperator *op, const wmEvent *event) { tPoseSlideOp *pso; - + /* initialize data */ if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) { pose_slide_exit(op); @@ -1059,10 +1059,10 @@ static int pose_slide_push_invoke(bContext *C, wmOperator *op, const wmEvent *ev } else pso = op->customdata; - + /* initialise percentage so that it won't pop on first mouse move */ pose_slide_mouse_update_percentage(pso, op, event); - + /* do common setup work */ return pose_slide_invoke_common(C, op, pso); } @@ -1071,7 +1071,7 @@ static int pose_slide_push_invoke(bContext *C, wmOperator *op, const wmEvent *ev static int pose_slide_push_exec(bContext *C, wmOperator *op) { tPoseSlideOp *pso; - + /* initialize data (from RNA-props) */ if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) { pose_slide_exit(op); @@ -1079,7 +1079,7 @@ static int pose_slide_push_exec(bContext *C, wmOperator *op) } else pso = op->customdata; - + /* do common exec work */ return pose_slide_exec_common(C, op, pso); } @@ -1090,17 +1090,17 @@ void POSE_OT_push(wmOperatorType *ot) ot->name = "Push Pose"; ot->idname = "POSE_OT_push"; ot->description = "Exaggerate the current pose"; - + /* callbacks */ ot->exec = pose_slide_push_exec; ot->invoke = pose_slide_push_invoke; ot->modal = pose_slide_modal; ot->cancel = pose_slide_cancel; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - + /* Properties */ pose_slide_opdef_properties(ot); } @@ -1111,7 +1111,7 @@ void POSE_OT_push(wmOperatorType *ot) static int pose_slide_relax_invoke(bContext *C, wmOperator *op, const wmEvent *event) { tPoseSlideOp *pso; - + /* initialize data */ if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) { pose_slide_exit(op); @@ -1119,10 +1119,10 @@ static int pose_slide_relax_invoke(bContext *C, wmOperator *op, const wmEvent *e } else pso = op->customdata; - + /* initialise percentage so that it won't pop on first mouse move */ pose_slide_mouse_update_percentage(pso, op, event); - + /* do common setup work */ return pose_slide_invoke_common(C, op, pso); } @@ -1131,7 +1131,7 @@ static int pose_slide_relax_invoke(bContext *C, wmOperator *op, const wmEvent *e static int pose_slide_relax_exec(bContext *C, wmOperator *op) { tPoseSlideOp *pso; - + /* initialize data (from RNA-props) */ if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) { pose_slide_exit(op); @@ -1139,7 +1139,7 @@ static int pose_slide_relax_exec(bContext *C, wmOperator *op) } else pso = op->customdata; - + /* do common exec work */ return pose_slide_exec_common(C, op, pso); } @@ -1150,17 +1150,17 @@ void POSE_OT_relax(wmOperatorType *ot) ot->name = "Relax Pose"; ot->idname = "POSE_OT_relax"; ot->description = "Make the current pose more similar to its surrounding ones"; - + /* callbacks */ ot->exec = pose_slide_relax_exec; ot->invoke = pose_slide_relax_invoke; ot->modal = pose_slide_modal; ot->cancel = pose_slide_cancel; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - + /* Properties */ pose_slide_opdef_properties(ot); } @@ -1171,7 +1171,7 @@ void POSE_OT_relax(wmOperatorType *ot) static int pose_slide_breakdown_invoke(bContext *C, wmOperator *op, const wmEvent *event) { tPoseSlideOp *pso; - + /* initialize data */ if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) { pose_slide_exit(op); @@ -1179,10 +1179,10 @@ static int pose_slide_breakdown_invoke(bContext *C, wmOperator *op, const wmEven } else pso = op->customdata; - + /* initialise percentage so that it won't pop on first mouse move */ pose_slide_mouse_update_percentage(pso, op, event); - + /* do common setup work */ return pose_slide_invoke_common(C, op, pso); } @@ -1191,7 +1191,7 @@ static int pose_slide_breakdown_invoke(bContext *C, wmOperator *op, const wmEven static int pose_slide_breakdown_exec(bContext *C, wmOperator *op) { tPoseSlideOp *pso; - + /* initialize data (from RNA-props) */ if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) { pose_slide_exit(op); @@ -1199,7 +1199,7 @@ static int pose_slide_breakdown_exec(bContext *C, wmOperator *op) } else pso = op->customdata; - + /* do common exec work */ return pose_slide_exec_common(C, op, pso); } @@ -1210,17 +1210,17 @@ void POSE_OT_breakdown(wmOperatorType *ot) ot->name = "Pose Breakdowner"; ot->idname = "POSE_OT_breakdown"; ot->description = "Create a suitable breakdown pose on the current frame"; - + /* callbacks */ ot->exec = pose_slide_breakdown_exec; ot->invoke = pose_slide_breakdown_invoke; ot->modal = pose_slide_modal; ot->cancel = pose_slide_cancel; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - + /* Properties */ pose_slide_opdef_properties(ot); } @@ -1240,7 +1240,7 @@ typedef enum ePosePropagate_Termination { POSE_PROPAGATE_BEFORE_FRAME, /* stop when we run out of keyframes */ POSE_PROPAGATE_BEFORE_END, - + /* only do on keyframes that are selected */ POSE_PROPAGATE_SELECTED_KEYS, /* only do on the frames where markers are selected */ @@ -1251,14 +1251,14 @@ typedef enum ePosePropagate_Termination { typedef union tPosePropagate_ModeData { /* smart holds + before frame: frame number to stop on */ float end_frame; - + /* selected markers: listbase for CfraElem's marking these frames */ ListBase sel_markers; } tPosePropagate_ModeData; /* --------------------------------- */ -/* get frame on which the "hold" for the bone ends +/* get frame on which the "hold" for the bone ends * XXX: this may not really work that well if a bone moves on some channels and not others * if this happens to be a major issue, scrap this, and just make this happen * independently per F-Curve @@ -1267,47 +1267,47 @@ static float pose_propagate_get_boneHoldEndFrame(Object *ob, tPChanFCurveLink *p { DLRBT_Tree keys, blocks; ActKeyBlock *ab; - + AnimData *adt = ob->adt; LinkData *ld; float endFrame = startFrame; - + /* set up optimized data-structures for searching for relevant keyframes + holds */ BLI_dlrbTree_init(&keys); BLI_dlrbTree_init(&blocks); - + for (ld = pfl->fcurves.first; ld; ld = ld->next) { FCurve *fcu = (FCurve *)ld->data; fcurve_to_keylist(adt, fcu, &keys, &blocks); } - + BLI_dlrbTree_linkedlist_sync(&keys); BLI_dlrbTree_linkedlist_sync(&blocks); - - /* find the long keyframe (i.e. hold), and hence obtain the endFrame value + + /* find the long keyframe (i.e. hold), and hence obtain the endFrame value * - the best case would be one that starts on the frame itself */ ab = (ActKeyBlock *)BLI_dlrbTree_search_exact(&blocks, compare_ab_cfraPtr, &startFrame); - + if (actkeyblock_is_valid(ab, &keys) == 0) { /* There are only two cases for no-exact match: * 1) the current frame is just before another key but not on a key itself * 2) the current frame is on a key, but that key doesn't link to the next * - * If we've got the first case, then we can search for another block, + * If we've got the first case, then we can search for another block, * otherwise forget it, as we'd be overwriting some valid data. */ if (BLI_dlrbTree_search_exact(&keys, compare_ak_cfraPtr, &startFrame) == NULL) { /* we've got case 1, so try the one after */ ab = (ActKeyBlock *)BLI_dlrbTree_search_next(&blocks, compare_ab_cfraPtr, &startFrame); - + if (actkeyblock_is_valid(ab, &keys) == 0) { /* try the block before this frame then as last resort */ ab = (ActKeyBlock *)BLI_dlrbTree_search_prev(&blocks, compare_ab_cfraPtr, &startFrame); - + /* whatever happens, stop searching now... */ if (actkeyblock_is_valid(ab, &keys) == 0) { - /* restrict range to just the frame itself + /* restrict range to just the frame itself * i.e. everything is in motion, so no holds to safely overwrite */ ab = NULL; @@ -1319,13 +1319,13 @@ static float pose_propagate_get_boneHoldEndFrame(Object *ob, tPChanFCurveLink *p ab = NULL; } } - + /* check if we can go any further than we've already gone */ if (ab) { /* go to next if it is also valid and meets "extension" criteria */ while (ab->next) { ActKeyBlock *abn = (ActKeyBlock *)ab->next; - + /* must be valid */ if (actkeyblock_is_valid(abn, &keys) == 0) break; @@ -1335,24 +1335,24 @@ static float pose_propagate_get_boneHoldEndFrame(Object *ob, tPChanFCurveLink *p /* should have the same number of curves */ if (ab->totcurve != abn->totcurve) break; - /* should have the same value + /* should have the same value * XXX: this may be a bit fuzzy on larger data sets, so be careful */ if (ab->val != abn->val) break; - + /* we can extend the bounds to the end of this "next" block now */ ab = abn; } - + /* end frame can now take the value of the end of the block */ endFrame = ab->end; } - + /* free temp memory */ BLI_dlrbTree_free(&keys); BLI_dlrbTree_free(&blocks); - + /* return the end frame we've found */ return endFrame; } @@ -1363,10 +1363,10 @@ static bool pose_propagate_get_refVal(Object *ob, FCurve *fcu, float *value) PointerRNA id_ptr, ptr; PropertyRNA *prop; bool found = false; - + /* base pointer is always the object -> id_ptr */ RNA_id_pointer_create(&ob->id, &id_ptr); - + /* resolve the property... */ if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) { if (RNA_property_array_check(prop)) { @@ -1411,7 +1411,7 @@ static bool pose_propagate_get_refVal(Object *ob, FCurve *fcu, float *value) } } } - + return found; } @@ -1420,25 +1420,25 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu, float startFrame, tPosePropagate_ModeData modeData) { const int mode = RNA_enum_get(op->ptr, "mode"); - + BezTriple *bezt; float refVal = 0.0f; bool keyExists; int i, match; short first = 1; - + /* skip if no keyframes to edit */ if ((fcu->bezt == NULL) || (fcu->totvert < 2)) return; - + /* find the reference value from bones directly, which means that the user - * doesn't need to firstly keyframe the pose (though this doesn't mean that + * doesn't need to firstly keyframe the pose (though this doesn't mean that * they can't either) */ if (!pose_propagate_get_refVal(ob, fcu, &refVal)) return; - - /* find the first keyframe to start propagating from + + /* find the first keyframe to start propagating from * - if there's a keyframe on the current frame, we probably want to save this value there too * since it may be as of yet unkeyed * - if starting before the starting frame, don't touch the key, as it may have had some valid @@ -1447,7 +1447,7 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu, */ if (mode != POSE_PROPAGATE_SELECTED_KEYS) { match = binarysearch_bezt_index(fcu->bezt, startFrame, fcu->totvert, &keyExists); - + if (fcu->bezt[match].vec[1][0] < startFrame) i = match + 1; else @@ -1457,13 +1457,13 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu, /* selected - start from first keyframe */ i = 0; } - + for (bezt = &fcu->bezt[i]; i < fcu->totvert; i++, bezt++) { /* additional termination conditions based on the operator 'mode' property go here... */ if (ELEM(mode, POSE_PROPAGATE_BEFORE_FRAME, POSE_PROPAGATE_SMART_HOLDS)) { /* stop if keyframe is outside the accepted range */ if (bezt->vec[1][0] > modeData.end_frame) - break; + break; } else if (mode == POSE_PROPAGATE_NEXT_KEY) { /* stop after the first keyframe has been processed */ @@ -1478,13 +1478,13 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu, else if (mode == POSE_PROPAGATE_SELECTED_MARKERS) { /* only allow if there's a marker on this frame */ CfraElem *ce = NULL; - + /* stop on matching marker if there is one */ for (ce = modeData.sel_markers.first; ce; ce = ce->next) { if (ce->cfra == round_fl_to_int(bezt->vec[1][0])) break; } - + /* skip this keyframe if no marker */ if (ce == NULL) continue; @@ -1494,11 +1494,11 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu, if (BEZT_ISSEL_ANY(bezt) == 0) continue; } - + /* just flatten handles, since values will now be the same either side... */ /* TODO: perhaps a fade-out modulation of the value is required here (optional once again)? */ bezt->vec[0][1] = bezt->vec[1][1] = bezt->vec[2][1] = refVal; - + /* select keyframe to indicate that it's been changed */ bezt->f2 |= SELECT; first = 0; @@ -1512,13 +1512,13 @@ static int pose_propagate_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); bAction *act = (ob && ob->adt) ? ob->adt->action : NULL; - + ListBase pflinks = {NULL, NULL}; tPChanFCurveLink *pfl; - + tPosePropagate_ModeData modeData; const int mode = RNA_enum_get(op->ptr, "mode"); - + /* sanity checks */ if (ob == NULL) { BKE_report(op->reports, RPT_ERROR, "No object to propagate poses for"); @@ -1528,10 +1528,10 @@ static int pose_propagate_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No keyframed poses to propagate to"); return OPERATOR_CANCELLED; } - + /* isolate F-Curves related to the selected bones */ poseAnim_mapping_get(C, &pflinks, ob, act); - + /* mode-specific data preprocessing (requiring no access to curves) */ if (mode == POSE_PROPAGATE_SELECTED_MARKERS) { /* get a list of selected markers */ @@ -1541,11 +1541,11 @@ static int pose_propagate_exec(bContext *C, wmOperator *op) /* assume everything else wants endFrame */ modeData.end_frame = RNA_float_get(op->ptr, "end_frame"); } - + /* for each bone, perform the copying required */ for (pfl = pflinks.first; pfl; pfl = pfl->next) { LinkData *ld; - + /* mode-specific data preprocessing (requiring access to all curves) */ if (mode == POSE_PROPAGATE_SMART_HOLDS) { /* we store in endFrame the end frame of the "long keyframe" (i.e. a held value) starting @@ -1553,21 +1553,21 @@ static int pose_propagate_exec(bContext *C, wmOperator *op) */ modeData.end_frame = pose_propagate_get_boneHoldEndFrame(ob, pfl, (float)CFRA); } - + /* go through propagating pose to keyframes, curve by curve */ for (ld = pfl->fcurves.first; ld; ld = ld->next) pose_propagate_fcurve(op, ob, (FCurve *)ld->data, (float)CFRA, modeData); } - + /* free temp data */ poseAnim_mapping_free(&pflinks); - + if (mode == POSE_PROPAGATE_SELECTED_MARKERS) BLI_freelistN(&modeData.sel_markers); - + /* updates + notifiers */ poseAnim_mapping_refresh(C, scene, ob); - + return OPERATOR_FINISHED; } @@ -1591,19 +1591,19 @@ void POSE_OT_propagate(wmOperatorType *ot) {POSE_PROPAGATE_SELECTED_MARKERS, "SELECTED_MARKERS", 0, "On Selected Markers", "Propagate pose to all keyframes occurring on frames with Scene Markers after the current frame"}, {0, NULL, 0, NULL, NULL}}; - + /* identifiers */ ot->name = "Propagate Pose"; ot->idname = "POSE_OT_propagate"; ot->description = "Copy selected aspects of the current pose to subsequent poses already keyframed"; - + /* callbacks */ ot->exec = pose_propagate_exec; ot->poll = ED_operator_posemode; /* XXX: needs selected bones! */ - + /* flag */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ /* TODO: add "fade out" control for tapering off amount of propagation as time goes by? */ ot->prop = RNA_def_enum(ot->srna, "mode", terminate_items, POSE_PROPAGATE_SMART_HOLDS, "Terminate Mode", "Method used to determine when to stop propagating pose to keyframes"); diff --git a/source/blender/editors/armature/pose_transform.c b/source/blender/editors/armature/pose_transform.c index e212d426c9a..de0612d840d 100644 --- a/source/blender/editors/armature/pose_transform.c +++ b/source/blender/editors/armature/pose_transform.c @@ -78,16 +78,16 @@ static void applyarmature_fix_boneparents(const bContext *C, Scene *scene, Objec Depsgraph *depsgraph = CTX_data_depsgraph(C); Main *bmain = CTX_data_main(C); Object workob, *ob; - + /* go through all objects in database */ for (ob = bmain->object.first; ob; ob = ob->id.next) { /* if parent is bone in this armature, apply corrections */ if ((ob->parent == armob) && (ob->partype == PARBONE)) { - /* apply current transform from parent (not yet destroyed), + /* apply current transform from parent (not yet destroyed), * then calculate new parent inverse matrix */ BKE_object_apply_mat4(ob, ob->obmat, false, false); - + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); invert_m4_m4(ob->parentinv, workob.obmat); } @@ -123,18 +123,18 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op) /* Get editbones of active armature to alter */ ED_armature_to_edit(arm); - + /* get pose of active object and move it out of posemode */ pose = ob->pose; - + for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) { const bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name); curbone = ED_armature_ebone_find_name(arm->edbo, pchan->name); - + /* simply copy the head/tail values from pchan over to curbone */ copy_v3_v3(curbone->head, pchan_eval->pose_head); copy_v3_v3(curbone->tail, pchan_eval->pose_tail); - + /* fix roll: * 1. find auto-calculated roll value for this bone now * 2. remove this from the 'visual' y-rotation @@ -142,23 +142,23 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op) { float premat[3][3], imat[3][3], pmat[3][3], tmat[3][3]; float delta[3], eul[3]; - + /* obtain new auto y-rotation */ sub_v3_v3v3(delta, curbone->tail, curbone->head); vec_roll_to_mat3(delta, 0.0f, premat); invert_m3_m3(imat, premat); - + /* get pchan 'visual' matrix */ copy_m3_m4(pmat, pchan_eval->pose_mat); - + /* remove auto from visual and get euler rotation */ mul_m3_m3m3(tmat, imat, pmat); mat3_to_eul(eul, tmat); - + /* just use this euler-y as new roll value */ curbone->roll = eul[1]; } - + /* combine pose and rest values for bendy bone settings, * then clear the pchan values (so we don't get a double-up) */ @@ -174,7 +174,7 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op) curbone->ease2 += pchan_eval->ease2; curbone->scaleIn += pchan_eval->scaleIn; curbone->scaleOut += pchan_eval->scaleOut; - + /* reset pose values */ pchan->curveInX = pchan->curveOutX = 0.0f; pchan->curveInY = pchan->curveOutY = 0.0f; @@ -182,32 +182,32 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op) pchan->ease1 = pchan->ease2 = 0.0f; pchan->scaleIn = pchan->scaleOut = 1.0f; } - + /* clear transform values for pchan */ zero_v3(pchan->loc); zero_v3(pchan->eul); unit_qt(pchan->quat); unit_axis_angle(pchan->rotAxis, &pchan->rotAngle); pchan->size[0] = pchan->size[1] = pchan->size[2] = 1.0f; - + /* set anim lock */ curbone->flag |= BONE_UNKEYED; } - + /* convert editbones back to bones, and then free the edit-data */ ED_armature_from_edit(arm); ED_armature_edit_free(arm); - + /* flush positions of posebones */ BKE_pose_where_is(depsgraph, scene, ob); - + /* fix parenting of objects which are bone-parented */ applyarmature_fix_boneparents(C, scene, ob); - + /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); - + return OPERATOR_FINISHED; } @@ -217,11 +217,11 @@ void POSE_OT_armature_apply(wmOperatorType *ot) ot->name = "Apply Pose as Rest Pose"; ot->idname = "POSE_OT_armature_apply"; ot->description = "Apply the current pose as the new rest pose"; - + /* callbacks */ ot->exec = apply_armature_pose2bones_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -244,21 +244,21 @@ static int pose_visual_transform_apply_exec(bContext *C, wmOperator *UNUSED(op)) const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name); float delta_mat[4][4]; - + /* chan_mat already contains the delta transform from rest pose to pose-mode pose * as that is baked into there so that B-Bones will work. Once we've set this as the - * new raw-transform components, don't recalc the poses yet, otherwise IK result will + * new raw-transform components, don't recalc the poses yet, otherwise IK result will * change, thus changing the result we may be trying to record. */ /* XXX For some reason, we can't use pchan->chan_mat here, gives odd rotation/offset (see T38251). * Using pchan->pose_mat and bringing it back in bone space seems to work as expected! */ BKE_armature_mat_pose_to_bone(pchan_eval, pchan_eval->pose_mat, delta_mat); - + BKE_pchan_apply_mat4(pchan, delta_mat, true); } FOREACH_PCHAN_SELECTED_IN_OBJECT_END; - + DEG_id_tag_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ @@ -275,11 +275,11 @@ void POSE_OT_visual_transform_apply(wmOperatorType *ot) ot->name = "Apply Visual Transform to Pose"; ot->idname = "POSE_OT_visual_transform_apply"; ot->description = "Apply final constrained position of pose bones to their transform"; - + /* callbacks */ ot->exec = pose_visual_transform_apply_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -287,7 +287,7 @@ void POSE_OT_visual_transform_apply(wmOperatorType *ot) /* ********************************************** */ /* Copy/Paste */ -/* This function is used to indicate that a bone is selected +/* This function is used to indicate that a bone is selected * and needs to be included in copy buffer (used to be for inserting keys) */ static void set_pose_keys(Object *ob) @@ -320,33 +320,33 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo bPoseChannel *pchan; char name[MAXBONENAME]; short paste_ok; - + /* get the name - if flipping, we must flip this first */ if (flip) BLI_string_flip_side_name(name, chan->name, false, sizeof(name)); else BLI_strncpy(name, chan->name, sizeof(name)); - + /* only copy when: * 1) channel exists - poses are not meant to add random channels to anymore * 2) if selection-masking is on, channel is selected - only selected bones get pasted on, allowing making both sides symmetrical */ pchan = BKE_pose_channel_find_name(ob->pose, name); - + if (selOnly) paste_ok = ((pchan) && (pchan->bone->flag & BONE_SELECTED)); else paste_ok = (pchan != NULL); - + /* continue? */ if (paste_ok) { - /* only loc rot size - * - only copies transform info for the pose + /* only loc rot size + * - only copies transform info for the pose */ copy_v3_v3(pchan->loc, chan->loc); copy_v3_v3(pchan->size, chan->size); pchan->flag = chan->flag; - + /* check if rotation modes are compatible (i.e. do they need any conversions) */ if (pchan->rotmode == chan->rotmode) { /* copy the type of rotation in use */ @@ -382,29 +382,29 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo else axis_angle_to_quat(pchan->quat, chan->rotAxis, pchan->rotAngle); } - + /* B-Bone posing options should also be included... */ pchan->curveInX = chan->curveInX; pchan->curveInY = chan->curveInY; pchan->curveOutX = chan->curveOutX; pchan->curveOutY = chan->curveOutY; - + pchan->roll1 = chan->roll1; pchan->roll2 = chan->roll2; pchan->ease1 = chan->ease1; pchan->ease2 = chan->ease2; pchan->scaleIn = chan->scaleIn; pchan->scaleOut = chan->scaleOut; - + /* paste flipped pose? */ if (flip) { pchan->loc[0] *= -1; - + pchan->curveInX *= -1; pchan->curveOutX *= -1; pchan->roll1 *= -1; // XXX? pchan->roll2 *= -1; // XXX? - + /* has to be done as eulers... */ if (pchan->rotmode > 0) { pchan->eul[1] *= -1; @@ -412,7 +412,7 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo } else if (pchan->rotmode == ROT_MODE_AXISANGLE) { float eul[3]; - + axis_angle_to_eulO(eul, EULER_ORDER_DEFAULT, pchan->rotAxis, pchan->rotAngle); eul[1] *= -1; eul[2] *= -1; @@ -420,7 +420,7 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo } else { float eul[3]; - + normalize_qt(pchan->quat); quat_to_eul(eul, pchan->quat); eul[1] *= -1; @@ -428,12 +428,12 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo eul_to_quat(pchan->quat, eul); } } - + /* ID properties */ if (chan->prop) { if (pchan->prop) { - /* if we have existing properties on a bone, just copy over the values of - * matching properties (i.e. ones which will have some impact) on to the + /* if we have existing properties on a bone, just copy over the values of + * matching properties (i.e. ones which will have some impact) on to the * target instead of just blinding replacing all [ */ IDP_SyncGroupValues(pchan->prop, chan->prop); @@ -444,7 +444,7 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, const bo } } } - + /* return whether paste went ahead */ return pchan; } @@ -502,11 +502,11 @@ void POSE_OT_copy(wmOperatorType *ot) ot->name = "Copy Pose"; ot->idname = "POSE_OT_copy"; ot->description = "Copies the current pose of the selected bones to copy/paste buffer"; - + /* api callbacks */ ot->exec = pose_copy_exec; ot->poll = ED_operator_posemode; - + /* flag */ ot->flag = OPTYPE_REGISTER; } @@ -520,15 +520,15 @@ static int pose_paste_exec(bContext *C, wmOperator *op) bPoseChannel *chan; const bool flip = RNA_boolean_get(op->ptr, "flipped"); bool selOnly = RNA_boolean_get(op->ptr, "selected_mask"); - + /* Get KeyingSet to use. */ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID); - + /* Sanity checks. */ if (ELEM(NULL, ob, ob->pose)) { return OPERATOR_CANCELLED; } - + /* Read copy buffer .blend file. */ char str[FILE_MAX]; Main *tmp_bmain = BKE_main_new(); @@ -544,7 +544,7 @@ static int pose_paste_exec(bContext *C, wmOperator *op) BKE_main_free(tmp_bmain); return OPERATOR_CANCELLED; } - + Object *object_from = tmp_bmain->object.first; bPose *pose_from = object_from->pose; if (pose_from == NULL) { @@ -552,7 +552,7 @@ static int pose_paste_exec(bContext *C, wmOperator *op) BKE_main_free(tmp_bmain); return OPERATOR_CANCELLED; } - + /* If selOnly option is enabled, if user hasn't selected any bones, * just go back to default behavior to be more in line with other * pose tools. @@ -562,7 +562,7 @@ static int pose_paste_exec(bContext *C, wmOperator *op) selOnly = false; } } - + /* Safely merge all of the channels in the buffer pose into any * existing pose. */ @@ -577,15 +577,15 @@ static int pose_paste_exec(bContext *C, wmOperator *op) } } BKE_main_free(tmp_bmain); - + /* Update event for pose and deformation children. */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); - + /* Recalculate paths if any of the bones have paths... */ if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) { ED_pose_recalculate_paths(C, scene, ob); } - + /* Notifiers for updates, */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); @@ -600,14 +600,14 @@ void POSE_OT_paste(wmOperatorType *ot) ot->name = "Paste Pose"; ot->idname = "POSE_OT_paste"; ot->description = "Paste the stored pose on to the current pose"; - + /* api callbacks */ ot->exec = pose_paste_exec; ot->poll = ED_operator_posemode; - + /* flag */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ prop = RNA_def_boolean(ot->srna, "flipped", false, "Flipped on X-Axis", "Paste the stored pose flipped on to current pose"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); @@ -627,9 +627,9 @@ static void pchan_clear_scale(bPoseChannel *pchan) pchan->size[1] = 1.0f; if ((pchan->protectflag & OB_LOCK_SCALEZ) == 0) pchan->size[2] = 1.0f; - + pchan->ease1 = 0.0f; - pchan->ease2 = 0.0f; + pchan->ease2 = 0.0f; pchan->scaleIn = 1.0f; pchan->scaleOut = 1.0f; } @@ -661,7 +661,7 @@ static void pchan_clear_rot(bPoseChannel *pchan) pchan->rotAxis[1] = 0.0f; if ((pchan->protectflag & OB_LOCK_ROTZ) == 0) pchan->rotAxis[2] = 0.0f; - + /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */ if (IS_EQF(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQF(pchan->rotAxis[1], pchan->rotAxis[2])) pchan->rotAxis[1] = 1.0f; @@ -690,7 +690,7 @@ static void pchan_clear_rot(bPoseChannel *pchan) /* perform clamping using euler form (3-components) */ float eul[3], oldeul[3], quat1[4] = {0}; float qlen = 0.0f; - + if (pchan->rotmode == ROT_MODE_QUAT) { qlen = normalize_qt_qt(quat1, pchan->quat); quat_to_eul(oldeul, quat1); @@ -701,22 +701,22 @@ static void pchan_clear_rot(bPoseChannel *pchan) else { copy_v3_v3(oldeul, pchan->eul); } - + eul[0] = eul[1] = eul[2] = 0.0f; - + if (pchan->protectflag & OB_LOCK_ROTX) eul[0] = oldeul[0]; if (pchan->protectflag & OB_LOCK_ROTY) eul[1] = oldeul[1]; if (pchan->protectflag & OB_LOCK_ROTZ) eul[2] = oldeul[2]; - + if (pchan->rotmode == ROT_MODE_QUAT) { eul_to_quat(pchan->quat, eul); - + /* restore original quat size */ mul_qt_fl(pchan->quat, qlen); - + /* quaternions flip w sign to accumulate rotations correctly */ if ((quat1[0] < 0.0f && pchan->quat[0] > 0.0f) || (quat1[0] > 0.0f && pchan->quat[0] < 0.0f)) { mul_qt_fl(pchan->quat, -1.0f); @@ -742,11 +742,11 @@ static void pchan_clear_rot(bPoseChannel *pchan) zero_v3(pchan->eul); } } - + /* Clear also Bendy Bone stuff - Roll is obvious, but Curve X/Y stuff is also kindof rotational in nature... */ pchan->roll1 = 0.0f; pchan->roll2 = 0.0f; - + pchan->curveInX = 0.0f; pchan->curveInY = 0.0f; pchan->curveOutX = 0.0f; @@ -764,7 +764,7 @@ static void pchan_clear_transforms(bPoseChannel *pchan) /* --------------- */ /* generic exec for clear-pose operators */ -static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op, +static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op, void (*clear_func)(bPoseChannel *), const char default_ksName[]) { Scene *scene = CTX_data_scene(C); @@ -798,7 +798,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op, } /* tag for autokeying later */ ANIM_relative_keyingset_add_source(&dsources, &ob_iter->id, &RNA_PoseBone, pchan); - + #if 1 /* XXX: Ugly Hack - Run clearing function on evaluated copy of pchan */ bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name); clear_func(pchan_eval); @@ -845,7 +845,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op, /* --------------- */ -static int pose_clear_scale_exec(bContext *C, wmOperator *op) +static int pose_clear_scale_exec(bContext *C, wmOperator *op) { return pose_clear_transform_generic_exec(C, op, pchan_clear_scale, ANIM_KS_SCALING_ID); } @@ -856,17 +856,17 @@ void POSE_OT_scale_clear(wmOperatorType *ot) ot->name = "Clear Pose Scale"; ot->idname = "POSE_OT_scale_clear"; ot->description = "Reset scaling of selected bones to their default values"; - + /* api callbacks */ ot->exec = pose_clear_scale_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -static int pose_clear_rot_exec(bContext *C, wmOperator *op) +static int pose_clear_rot_exec(bContext *C, wmOperator *op) { return pose_clear_transform_generic_exec(C, op, pchan_clear_rot, ANIM_KS_ROTATION_ID); } @@ -877,17 +877,17 @@ void POSE_OT_rot_clear(wmOperatorType *ot) ot->name = "Clear Pose Rotation"; ot->idname = "POSE_OT_rot_clear"; ot->description = "Reset rotations of selected bones to their default values"; - + /* api callbacks */ ot->exec = pose_clear_rot_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -static int pose_clear_loc_exec(bContext *C, wmOperator *op) +static int pose_clear_loc_exec(bContext *C, wmOperator *op) { return pose_clear_transform_generic_exec(C, op, pchan_clear_loc, ANIM_KS_LOCATION_ID); } @@ -898,17 +898,17 @@ void POSE_OT_loc_clear(wmOperatorType *ot) ot->name = "Clear Pose Location"; ot->idname = "POSE_OT_loc_clear"; ot->description = "Reset locations of selected bones to their default values"; - + /* api callbacks */ ot->exec = pose_clear_loc_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -static int pose_clear_transforms_exec(bContext *C, wmOperator *op) +static int pose_clear_transforms_exec(bContext *C, wmOperator *op) { return pose_clear_transform_generic_exec(C, op, pchan_clear_transforms, ANIM_KS_LOC_ROT_SCALE_ID); } @@ -919,11 +919,11 @@ void POSE_OT_transforms_clear(wmOperatorType *ot) ot->name = "Clear Pose Transforms"; ot->idname = "POSE_OT_transforms_clear"; ot->description = "Reset location, rotation, and scaling of selected bones to their default values"; - + /* api callbacks */ ot->exec = pose_clear_transforms_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -937,7 +937,7 @@ static int pose_clear_user_transforms_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); float cframe = (float)CFRA; const bool only_select = RNA_boolean_get(op->ptr, "only_selected"); - + FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob) { if ((ob->adt) && (ob->adt->action)) { @@ -947,10 +947,10 @@ static int pose_clear_user_transforms_exec(bContext *C, wmOperator *op) bPose *dummyPose = NULL; Object workob = {{NULL}}; bPoseChannel *pchan; - + /* execute animation step for current frame using a dummy copy of the pose */ BKE_pose_copy_data(&dummyPose, ob->pose, 0); - + BLI_strncpy(workob.id.name, "OB<ClearTfmWorkOb>", sizeof(workob.id.name)); workob.type = OB_ARMATURE; workob.data = ob->data; @@ -958,12 +958,12 @@ static int pose_clear_user_transforms_exec(bContext *C, wmOperator *op) workob.pose = dummyPose; BKE_animsys_evaluate_animdata(NULL, scene, &workob.id, workob.adt, cframe, ADT_RECALC_ANIM); - + /* copy back values, but on selected bones only */ for (pchan = dummyPose->chanbase.first; pchan; pchan = pchan->next) { pose_bone_do_paste(ob, pchan, only_select, 0); } - + /* free temp data - free manually as was copied without constraints */ for (pchan = dummyPose->chanbase.first; pchan; pchan = pchan->next) { if (pchan->prop) { @@ -971,7 +971,7 @@ static int pose_clear_user_transforms_exec(bContext *C, wmOperator *op) MEM_freeN(pchan->prop); } } - + /* was copied without constraints */ BLI_freelistN(&dummyPose->chanbase); MEM_freeN(dummyPose); @@ -982,13 +982,13 @@ static int pose_clear_user_transforms_exec(bContext *C, wmOperator *op) */ BKE_pose_rest(ob->pose); } - + /* notifiers and updates */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); } FOREACH_OBJECT_IN_MODE_END; - + return OPERATOR_FINISHED; } @@ -998,11 +998,11 @@ void POSE_OT_user_transforms_clear(wmOperatorType *ot) ot->name = "Clear User Transforms"; ot->idname = "POSE_OT_user_transforms_clear"; ot->description = "Reset pose on selected bones to keyframed state"; - + /* callbacks */ ot->exec = pose_clear_user_transforms_exec; ot->poll = ED_operator_posemode; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/armature/pose_utils.c b/source/blender/editors/armature/pose_utils.c index a419f22a9f9..b64c8528010 100644 --- a/source/blender/editors/armature/pose_utils.c +++ b/source/blender/editors/armature/pose_utils.c @@ -63,7 +63,7 @@ * convenience functions, such as applying/getting pose values * and/or inserting keyframes for these. */ -/* *********************************************** */ +/* *********************************************** */ /* FCurves <-> PoseChannels Links */ /* helper for poseAnim_mapping_get() -> get the relevant F-Curves per PoseChannel */ @@ -71,25 +71,25 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a { ListBase curves = {NULL, NULL}; int transFlags = action_get_item_transforms(act, ob, pchan, &curves); - + pchan->flag &= ~(POSE_LOC | POSE_ROT | POSE_SIZE | POSE_BBONE_SHAPE); - + /* check if any transforms found... */ if (transFlags) { /* make new linkage data */ tPChanFCurveLink *pfl = MEM_callocN(sizeof(tPChanFCurveLink), "tPChanFCurveLink"); PointerRNA ptr; - + pfl->fcurves = curves; pfl->pchan = pchan; - + /* get the RNA path to this pchan - this needs to be freed! */ RNA_pointer_create((ID *)ob, &RNA_PoseBone, pchan, &ptr); pfl->pchan_path = RNA_path_from_ID_to_struct(&ptr); - + /* add linkage data to operator data */ BLI_addtail(pfLinks, pfl); - + /* set pchan's transform flags */ if (transFlags & ACT_TRANS_LOC) pchan->flag |= POSE_LOC; @@ -99,7 +99,7 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a pchan->flag |= POSE_SIZE; if (transFlags & ACT_TRANS_BBONE) pchan->flag |= POSE_BBONE_SHAPE; - + /* store current transforms */ copy_v3_v3(pfl->oldloc, pchan->loc); copy_v3_v3(pfl->oldrot, pchan->eul); @@ -107,7 +107,7 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a copy_qt_qt(pfl->oldquat, pchan->quat); copy_v3_v3(pfl->oldaxis, pchan->rotAxis); pfl->oldangle = pchan->rotAngle; - + /* store current bbone values */ pfl->roll1 = pchan->roll1; pfl->roll2 = pchan->roll2; @@ -119,18 +119,18 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a pfl->ease2 = pchan->ease2; pfl->scaleIn = pchan->scaleIn; pfl->scaleOut = pchan->scaleOut; - + /* make copy of custom properties */ if (pchan->prop && (transFlags & ACT_TRANS_PROP)) pfl->oldprops = IDP_CopyProperty(pchan->prop); } -} +} /* get sets of F-Curves providing transforms for the bones in the Pose */ void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *act) -{ - /* for each Pose-Channel which gets affected, get the F-Curves for that channel +{ + /* for each Pose-Channel which gets affected, get the F-Curves for that channel * and set the relevant transform flags... */ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) @@ -138,7 +138,7 @@ void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *a fcurves_to_pchan_links_get(pfLinks, ob, act, pchan); } CTX_DATA_END; - + /* if no PoseChannels were found, try a second pass, doing visible ones instead * i.e. if nothing selected, do whole pose */ @@ -148,7 +148,7 @@ void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *a fcurves_to_pchan_links_get(pfLinks, ob, act, pchan); } CTX_DATA_END; - + } } @@ -156,23 +156,23 @@ void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *a void poseAnim_mapping_free(ListBase *pfLinks) { tPChanFCurveLink *pfl, *pfln = NULL; - + /* free the temp pchan links and their data */ for (pfl = pfLinks->first; pfl; pfl = pfln) { pfln = pfl->next; - + /* free custom properties */ if (pfl->oldprops) { IDP_FreeProperty(pfl->oldprops); MEM_freeN(pfl->oldprops); } - + /* free list of F-Curve reference links */ BLI_freelistN(&pfl->fcurves); - + /* free pchan RNA Path */ MEM_freeN(pfl->pchan_path); - + /* free link itself */ BLI_freelinkN(pfLinks, pfl); } @@ -185,8 +185,8 @@ void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob) { Depsgraph *depsgraph = CTX_data_depsgraph(C); bArmature *arm = (bArmature *)ob->data; - - /* old optimize trick... this enforces to bypass the depgraph + + /* old optimize trick... this enforces to bypass the depgraph * - note: code copied from transform_generics.c -> recalcData() */ /* FIXME: shouldn't this use the builtin stuff? */ @@ -194,7 +194,7 @@ void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob) DEG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */ else BKE_pose_where_is(depsgraph, scene, ob); - + DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); /* otherwise animation doesn't get updated */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); } @@ -203,11 +203,11 @@ void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob) void poseAnim_mapping_reset(ListBase *pfLinks) { tPChanFCurveLink *pfl; - + /* iterate over each pose-channel affected, restoring all channels to their original values */ for (pfl = pfLinks->first; pfl; pfl = pfl->next) { bPoseChannel *pchan = pfl->pchan; - + /* just copy all the values over regardless of whether they changed or not */ copy_v3_v3(pchan->loc, pfl->oldloc); copy_v3_v3(pchan->eul, pfl->oldrot); @@ -215,7 +215,7 @@ void poseAnim_mapping_reset(ListBase *pfLinks) copy_qt_qt(pchan->quat, pfl->oldquat); copy_v3_v3(pchan->rotAxis, pfl->oldaxis); pchan->rotAngle = pfl->oldangle; - + /* store current bbone values */ pchan->roll1 = pfl->roll1; pchan->roll2 = pfl->roll2; @@ -227,7 +227,7 @@ void poseAnim_mapping_reset(ListBase *pfLinks) pchan->ease2 = pfl->ease2; pchan->scaleIn = pfl->scaleIn; pchan->scaleOut = pfl->scaleOut; - + /* just overwrite values of properties from the stored copies (there should be some) */ if (pfl->oldprops) IDP_SyncGroupValues(pfl->pchan->prop, pfl->oldprops); @@ -242,26 +242,26 @@ void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, Object *ob, ListBa KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID); ListBase dsources = {NULL, NULL}; tPChanFCurveLink *pfl; - + /* iterate over each pose-channel affected, tagging bones to be keyed */ - /* XXX: here we already have the information about what transforms exist, though + /* XXX: here we already have the information about what transforms exist, though * it might be easier to just overwrite all using normal mechanisms */ for (pfl = pfLinks->first; pfl; pfl = pfl->next) { bPoseChannel *pchan = pfl->pchan; - + /* add datasource override for the PoseChannel, to be used later */ - ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); - + ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); + /* clear any unkeyed tags */ if (pchan->bone) pchan->bone->flag &= ~BONE_UNKEYED; } - + /* insert keyframes for all relevant bones in one go */ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cframe); BLI_freelistN(&dsources); - + /* do the bone paths * - only do this if keyframes should have been added * - do not calculate unless there are paths already to update... @@ -275,25 +275,25 @@ void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, Object *ob, ListBa /* ------------------------- */ -/* find the next F-Curve for a PoseChannel with matching path... +/* find the next F-Curve for a PoseChannel with matching path... * - path is not just the pfl rna_path, since that path doesn't have property info yet */ LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, const char *path) { LinkData *first = (prev) ? prev->next : (fcuLinks) ? fcuLinks->first : NULL; LinkData *ld; - + /* check each link to see if the linked F-Curve has a matching path */ for (ld = first; ld; ld = ld->next) { FCurve *fcu = (FCurve *)ld->data; - + /* check if paths match */ if (STREQ(path, fcu->rna_path)) return ld; } - + /* none found */ return NULL; } -/* *********************************************** */ +/* *********************************************** */ |