2.5 - More animation/rigging bugfixes

* #19419: PoseLib rename/remove tools could crash when an invalid 
(However, now care is needed when touching that index field, since the warnings can keep piling up)

* Added Browse Poses for PoseLib to the toolbar

* Removing constraints from bones now properly updates. A DAG rebuild is now forced, and the constraint flags are cleared.

* Attempting to improve the situation with Copy Rotation constraint and rotation orders other than xyz. Unforunately, it looks like a different method is required...
This commit is contained in:
Joshua Leung 2009-09-20 11:21:44 +00:00
parent 2c871f722d
commit ad25fc829e
4 changed files with 27 additions and 9 deletions

@ -277,8 +277,6 @@ class VIEW3D_PT_tools_posemode(View3DPanel):
def draw(self, context):
layout = self.layout
col = layout.column(align=True)
col.itemL(text="Transform:")
col.itemO("tfm.translate")
@ -299,7 +297,8 @@ class VIEW3D_PT_tools_posemode(View3DPanel):
col.itemL(text="Pose:")
col.itemO("pose.copy", text="Copy")
col.itemO("pose.paste", text="Paste")
col.itemO("poselib.pose_add", text="Add To library")
col.itemO("poselib.pose_add", text="Add To Library")
col.itemO("poselib.browse_interactive", text="Browse Library")
col = layout.column(align=True)
col.itemL(text="In-Between:")

@ -685,9 +685,17 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
ct->flag= CONSTRAINT_TAR_TEMP; \
\
if (ct->tar) { \
if ((ct->tar->type==OB_ARMATURE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_BONE; \
else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_VERT; \
else ct->type = CONSTRAINT_OBTYPE_OBJECT; \
if ((ct->tar->type==OB_ARMATURE) && (ct->subtarget[0])) { \
bPoseChannel *pchan= get_pose_channel(ct->tar->pose, ct->subtarget); \
ct->type = CONSTRAINT_OBTYPE_BONE; \
ct->rotOrder= pchan->rotmode; \
}\
else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) { \
ct->type = CONSTRAINT_OBTYPE_VERT; \
} \
else {\
ct->type = CONSTRAINT_OBTYPE_OBJECT; \
} \
} \
\
BLI_addtail(list, ct); \

@ -467,6 +467,7 @@ static int poselib_remove_exec (bContext *C, wmOperator *op)
marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "index"));
if (marker == NULL) {
BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose");
return OPERATOR_CANCELLED;
}
/* remove relevant keyframes */
@ -533,6 +534,7 @@ static int poselib_rename_exec (bContext *C, wmOperator *op)
marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "index"));
if (marker == NULL) {
BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose");
return OPERATOR_CANCELLED;
}
/* get new name */

@ -823,17 +823,22 @@ void CONSTRAINT_OT_move_up (wmOperatorType *ot)
static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
/* free constraints for all selected bones */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
{
free_constraints(&pchan->constraints);
pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_CONST);
}
CTX_DATA_END;
/* force depsgraph to get recalculated since relationships removed */
DAG_scene_sort(scene); /* sort order of objects */
/* do updates */
DAG_id_flush_update(&ob->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE|ND_CONSTRAINT|NA_REMOVED, ob);
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
return OPERATOR_FINISHED;
}
@ -854,14 +859,18 @@ void POSE_OT_constraints_clear(wmOperatorType *ot)
static int object_constraints_clear_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
/* do freeing */
// TODO: we should free constraints for all selected objects instead (to be more consistent with bones)
free_constraints(&ob->constraints);
/* force depsgraph to get recalculated since relationships removed */
DAG_scene_sort(scene); /* sort order of objects */
/* do updates */
DAG_id_flush_update(&ob->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, ob);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
return OPERATOR_FINISHED;
}