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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-04-16 04:53:22 +0400
committerJoshua Leung <aligorith@gmail.com>2009-04-16 04:53:22 +0400
commita7916f4a3d29c02119cf2fcdb74106384b74f9fd (patch)
treefdcdb40aa104ab94bac2419ef60f72da0ed67555 /source/blender/editors/armature/poselib.c
parentf2e40f7234b4f076114d03c7f9c61aced135c742 (diff)
PoseLib: Fixed up RNA-properties for this operator so that it can be repeated using the exec() callback added in previous commit.
Diffstat (limited to 'source/blender/editors/armature/poselib.c')
-rw-r--r--source/blender/editors/armature/poselib.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 0b5a89e823f..f4391ca95c8 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -824,8 +824,12 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
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)
+ if ((pld->flag & PL_PREVIEW_SHOWORIGINAL)==0) {
+ RNA_int_set(op->ptr, "pose_index", BLI_findindex(&pld->act->markers, pld->marker));
poselib_apply_pose(pld);
+ }
+ 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
* - note: code copied from transform_generics.c -> recalcData()
@@ -1241,7 +1245,7 @@ static void poselib_preview_init_data (bContext *C, wmOperator *op)
{
tPoseLib_PreviewData *pld;
Object *ob= CTX_data_active_object(C);
- short apply_active= RNA_boolean_get(op->ptr, "apply_active");
+ 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");
@@ -1251,11 +1255,18 @@ static void poselib_preview_init_data (bContext *C, wmOperator *op)
pld->arm= (ob) ? (ob->data) : NULL;
pld->pose= (ob) ? (ob->pose) : NULL;
pld->act= (ob) ? (ob->poselib) : NULL;
- pld->marker= poselib_get_active_pose(pld->act);
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);
+ else if (pose_index == -2)
+ pld->flag |= PL_PREVIEW_SHOWORIGINAL;
+ else
+ pld->marker= (pld->act) ? BLI_findlink(&pld->act->markers, pose_index) : NULL;
+
/* check if valid poselib */
if (ELEM3(NULL, pld->ob, pld->pose, pld->arm)) {
BKE_report(op->reports, RPT_ERROR, "PoseLib is only for Armatures in PoseMode");
@@ -1268,10 +1279,10 @@ static void poselib_preview_init_data (bContext *C, wmOperator *op)
return;
}
if (pld->marker == NULL) {
- if ((apply_active==0) && (pld->act->markers.first)) {
+ if (pld->act->markers.first) {
/* just use first one then... */
pld->marker= pld->act->markers.first;
- printf("PoseLib had no active pose\n");
+ if (pose_index > -2) printf("PoseLib had no active pose\n");
}
else {
BKE_report(op->reports, RPT_ERROR, "PoseLib has no poses to preview/apply");
@@ -1287,9 +1298,9 @@ static void poselib_preview_init_data (bContext *C, wmOperator *op)
poselib_backup_posecopy(pld);
/* set flags for running */
- pld->state= (apply_active) ? PL_PREVIEW_RUNONCE : PL_PREVIEW_RUNNING;
+ pld->state= PL_PREVIEW_RUNNING;
pld->redraw= PL_PREVIEW_REDRAWALL;
- pld->flag= PL_PREVIEW_FIRSTTIME;
+ pld->flag |= PL_PREVIEW_FIRSTTIME;
/* set depsgraph flags */
/* make sure the lock is set OK, unlock can be accidentally saved? */
@@ -1392,16 +1403,8 @@ static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
int ret;
/* 1) check state to see if we're still running */
- if (ELEM(pld->state, PL_PREVIEW_RUNONCE, PL_PREVIEW_RUNNING) == 0)
- return poselib_preview_exit(C, op);
-
- /* check if time to exit */
- if (pld->state == PL_PREVIEW_RUNONCE) {
- /* set status to cleanup time */
- pld->state = PL_PREVIEW_CONFIRM;
-
+ if (pld->state != PL_PREVIEW_RUNNING)
return poselib_preview_exit(C, op);
- }
/* 2) handle events */
ret= poselib_preview_handle_event(C, op, event);
@@ -1410,7 +1413,7 @@ static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
if (pld->redraw)
poselib_preview_apply(C, op);
- return ret; //OPERATOR_RUNNING_MODAL;
+ return ret;
}
/* Modal Operator init */
@@ -1452,9 +1455,17 @@ static int poselib_preview_exec (bContext *C, wmOperator *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);
}
@@ -1477,6 +1488,5 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- // FIXME: the following should be removed...
- RNA_def_boolean(ot->srna, "apply_active", 0, "Apply Active Pose", "Simply apply the active pose and exit");
+ 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);
}