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>2010-02-19 14:42:21 +0300
committerJoshua Leung <aligorith@gmail.com>2010-02-19 14:42:21 +0300
commit92927e5f7d094fa1e7262fee95682fb2d588682a (patch)
tree73ddfd52861177c00b19aa98e0213d7aace30500 /source/blender/editors
parentf50962a6892e20e2525947d7bfcfd58a2265898e (diff)
Pose Tools Cleanup:
Moved some of the generic code used to determine the F-Curves linked to PoseChannel transforms (as used by the Pose Sliding tools) into a separate file, in preparation for migration of PoseLib tools to this system too. This should make it easier to add some useful new functionality to the PoseLib browsing system (pending in a later commit).
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/armature/armature_intern.h49
-rw-r--r--source/blender/editors/armature/poseSlide.c156
-rw-r--r--source/blender/editors/armature/poseUtils.c280
-rw-r--r--source/blender/editors/armature/poselib.c25
4 files changed, 349 insertions, 161 deletions
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 370018d5fca..04c113db3be 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -31,6 +31,19 @@
/* internal exports only */
struct wmOperatorType;
+struct bContext;
+struct Scene;
+struct Object;
+struct bAction;
+struct bPoseChannel;
+
+struct bArmature;
+struct EditBone;
+
+struct ListBase;
+struct LinkData;
+
+/* ******************************************************* */
/* editarmature.c operators */
void ARMATURE_OT_bone_primitive_add(struct wmOperatorType *ot);
@@ -119,7 +132,39 @@ void SKETCH_OT_cancel_stroke(struct wmOperatorType *ot);
void SKETCH_OT_select(struct wmOperatorType *ot);
/* ******************************************************* */
+/* Pose Tool Utilities (for PoseLib, Pose Sliding, etc.) */
+/* poseUtils.c */
+
+/* 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) */
+
+ // TODO: need to include axis-angle here at some stage
+ 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];
+} tPChanFCurveLink;
+
+/* ----------- */
+
+void poseAnim_mapping_get(struct bContext *C, ListBase *pfLinks, struct Object *ob, struct bAction *act);
+void poseAnim_mapping_free(ListBase *pfLinks);
+
+void poseAnim_mapping_refresh(struct bContext *C, struct Scene *scene, struct Object *ob);
+void poseAnim_mapping_reset(ListBase *pfLinks);
+void poseAnim_mapping_autoKeyframe(struct bContext *C, struct Scene *scene, struct Object *ob, ListBase *pfLinks, float cframe);
+
+LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, char *path);
+
+/* ******************************************************* */
/* PoseLib */
+/* poselib.c */
void POSELIB_OT_pose_add(struct wmOperatorType *ot);
void POSELIB_OT_pose_remove(struct wmOperatorType *ot);
@@ -128,6 +173,7 @@ void POSELIB_OT_browse_interactive(struct wmOperatorType *ot);
/* ******************************************************* */
/* Pose Sliding Tools */
+/* poseSlide.c */
void POSE_OT_push(struct wmOperatorType *ot);
void POSE_OT_relax(struct wmOperatorType *ot);
@@ -135,9 +181,6 @@ void POSE_OT_breakdown(struct wmOperatorType *ot);
/* ******************************************************* */
/* editarmature.c */
-struct bArmature;
-struct EditBone;
-struct ListBase;
EditBone *make_boneList(struct ListBase *edbo, struct ListBase *bones, struct EditBone *parent, struct Bone *actBone);
void BIF_sk_selectStroke(struct bContext *C, short mval[2], short extend);
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
index be6d7d69b5f..1aa7ea07078 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -108,10 +108,6 @@ typedef struct tPoseSlideOp {
ListBase pfLinks; /* links between posechannels and f-curves */
DLRBT_Tree keys; /* binary tree for quicker searching for keyframes (when applicable) */
- KeyingSet *ks_loc; /* builtin KeyingSet for keyframing locations */
- KeyingSet *ks_rot; /* builtin KeyingSet for keyframing rotations */
- KeyingSet *ks_scale;/* builtin KeyingSet for keyframing scale */
-
int cframe; /* current frame number */
int prevFrame; /* frame before current frame (blend-from) */
int nextFrame; /* frame after current frame (blend-to) */
@@ -129,21 +125,6 @@ typedef enum ePoseSlide_Modes {
POSESLIDE_BREAKDOWN, /* slide between the endpoint poses, finding a 'soft' spot */
} ePoseSlide_Modes;
-/* Temporary data linking PoseChannels with the F-Curves they affect */
-typedef struct tPChanFCurveLink {
- struct tPChanFCurveLink *next, *prev;
-
- ListBase fcurves; /* F-Curves for this PoseChannel */
- 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];
-} tPChanFCurveLink;
-
/* ------------------------------------ */
/* operator init */
@@ -178,45 +159,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
/* 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)
- {
- ListBase curves = {NULL, NULL};
- int transFlags = action_get_item_transforms(act, pso->ob, pchan, &curves);
-
- pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
-
- /* 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 *)pso->ob, &RNA_PoseBone, pchan, &ptr);
- pfl->pchan_path= RNA_path_from_ID_to_struct(&ptr);
-
- /* add linkage data to operator data */
- BLI_addtail(&pso->pfLinks, pfl);
-
- /* set pchan's transform flags */
- if (transFlags & ACT_TRANS_LOC)
- pchan->flag |= POSE_LOC;
- if (transFlags & ACT_TRANS_ROT)
- pchan->flag |= POSE_ROT;
- if (transFlags & ACT_TRANS_SCALE)
- pchan->flag |= POSE_SIZE;
-
- /* store current transforms */
- VECCOPY(pfl->oldloc, pchan->loc);
- VECCOPY(pfl->oldrot, pchan->eul);
- VECCOPY(pfl->oldscale, pchan->size);
- QUATCOPY(pfl->oldquat, pchan->quat);
- }
- }
- CTX_DATA_END;
+ poseAnim_mapping_get(C, &pso->pfLinks, pso->ob, act);
/* set depsgraph flags */
/* make sure the lock is set OK, unlock can be accidentally saved? */
@@ -228,11 +171,6 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
*/
BLI_dlrbTree_init(&pso->keys);
- /* get builtin KeyingSets */
- pso->ks_loc= ANIM_builtin_keyingset_get_named(NULL, "Location");
- pso->ks_rot= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
- pso->ks_scale= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
-
/* return status is whether we've got all the data we were requested to get */
return 1;
}
@@ -244,21 +182,8 @@ static void pose_slide_exit (bContext *C, wmOperator *op)
/* if data exists, clear its data and exit */
if (pso) {
- tPChanFCurveLink *pfl, *pfln=NULL;
-
/* free the temp pchan links and their data */
- for (pfl= pso->pfLinks.first; pfl; pfl= pfln) {
- pfln= pfl->next;
-
- /* 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(&pso->pfLinks, pfl);
- }
+ poseAnim_mapping_free(&pso->pfLinks);
/* free RB-BST for keyframes (if it contained data) */
BLI_dlrbTree_free(&pso->keys);
@@ -276,36 +201,8 @@ static void pose_slide_exit (bContext *C, wmOperator *op)
/* helper for apply() / reset() - refresh the data */
static void pose_slide_refresh (bContext *C, tPoseSlideOp *pso)
{
- /* 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?
- if ((pso->arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&pso->ob->id, OB_RECALC_DATA); /* sets recalc flags */
- else
- where_is_pose(pso->scene, pso->ob);
-
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, pso->ob);
-}
-
-/* helper for apply() callabcks - find the next F-Curve with matching path... */
-static LinkData *find_next_fcurve_link (ListBase *fcuLinks, LinkData *prev, 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 (strcmp(path, fcu->rna_path) == 0)
- return ld;
- }
-
- /* none found */
- return NULL;
+ /* wrapper around the generic version, allowing us to add some custom stuff later still */
+ poseAnim_mapping_refresh(C, pso->scene, pso->ob);
}
/* helper for apply() - perform sliding for some 3-element vector */
@@ -322,7 +219,7 @@ static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, flo
cframe= (float)pso->cframe;
/* using this path, find each matching F-Curve for the variables we're interested in */
- while ( (ld= find_next_fcurve_link(&pfl->fcurves, ld, path)) ) {
+ while ( (ld= poseAnim_mapping_getNextFCurve(&pfl->fcurves, ld, path)) ) {
FCurve *fcu= (FCurve *)ld->data;
float sVal, eVal;
float w1, w2;
@@ -422,7 +319,7 @@ static void pose_slide_apply_quat (tPoseSlideOp *pso, tPChanFCurveLink *pfl)
cframe= (float)pso->cframe;
/* using this path, find each matching F-Curve for the variables we're interested in */
- while ( (ld= find_next_fcurve_link(&pfl->fcurves, ld, path)) ) {
+ while ( (ld= poseAnim_mapping_getNextFCurve(&pfl->fcurves, ld, path)) ) {
FCurve *fcu= (FCurve *)ld->data;
/* assign this F-Curve to one of the relevant pointers... */
@@ -551,48 +448,15 @@ static void pose_slide_apply (bContext *C, wmOperator *op, tPoseSlideOp *pso)
/* perform autokeyframing after changes were made + confirmed */
static void pose_slide_autoKeyframe (bContext *C, tPoseSlideOp *pso)
{
- /* insert keyframes as necessary if autokeyframing */
- if (autokeyframe_cfra_can_key(pso->scene, &pso->ob->id)) {
- bCommonKeySrc cks;
- ListBase dsources = {&cks, &cks};
- tPChanFCurveLink *pfl;
-
- /* init common-key-source for use by KeyingSets */
- memset(&cks, 0, sizeof(bCommonKeySrc));
- cks.id= &pso->ob->id;
-
- /* iterate over each pose-channel affected, applying the changes */
- for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
- bPoseChannel *pchan= pfl->pchan;
- /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
- cks.pchan= pchan;
-
- /* insert keyframes */
- if (pchan->flag & POSE_LOC)
- modify_keyframes(pso->scene, &dsources, NULL, pso->ks_loc, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
- if (pchan->flag & POSE_ROT)
- modify_keyframes(pso->scene, &dsources, NULL, pso->ks_rot, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
- if (pchan->flag & POSE_SIZE)
- modify_keyframes(pso->scene, &dsources, NULL, pso->ks_scale, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
- }
- }
+ /* wrapper around the generic call */
+ poseAnim_mapping_autoKeyframe(C, pso->scene, pso->ob, &pso->pfLinks, (float)pso->cframe);
}
/* reset changes made to current pose */
static void pose_slide_reset (bContext *C, tPoseSlideOp *pso)
{
- tPChanFCurveLink *pfl;
-
- /* iterate over each pose-channel affected, restoring all channels to their original values */
- for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
- bPoseChannel *pchan= pfl->pchan;
-
- /* just copy all the values over regardless of whether they changed or not */
- VECCOPY(pchan->loc, pfl->oldloc);
- VECCOPY(pchan->eul, pfl->oldrot);
- VECCOPY(pchan->size, pfl->oldscale);
- QUATCOPY(pchan->quat, pfl->oldquat);
- }
+ /* wrapper around the generic call, so that custom stuff can be added later */
+ poseAnim_mapping_reset(&pso->pfLinks);
}
/* ------------------------------------ */
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
new file mode 100644
index 00000000000..e2fc2bd4088
--- /dev/null
+++ b/source/blender/editors/armature/poseUtils.c
@@ -0,0 +1,280 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2009, Blender Foundation, Joshua Leung
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_dlrbTree.h"
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+
+#include "BKE_global.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "BIF_gl.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_keyframes_draw.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
+#include "ED_screen.h"
+
+#include "armature_intern.h"
+
+/* *********************************************** */
+/* Contents of this File:
+ *
+ * This file contains methods shared between Pose Slide and Pose Lib;
+ * primarily the functions in question concern Animato <-> Pose
+ * 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 */
+static void fcurves_to_pchan_links_get (ListBase *pfLinks, Object *ob, bAction *act, bPoseChannel *pchan)
+{
+ ListBase curves = {NULL, NULL};
+ int transFlags = action_get_item_transforms(act, ob, pchan, &curves);
+
+ pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
+
+ /* 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;
+ if (transFlags & ACT_TRANS_ROT)
+ pchan->flag |= POSE_ROT;
+ if (transFlags & ACT_TRANS_SCALE)
+ pchan->flag |= POSE_SIZE;
+
+ /* store current transforms */
+ // TODO: store axis-angle too?
+ VECCOPY(pfl->oldloc, pchan->loc);
+ VECCOPY(pfl->oldrot, pchan->eul);
+ VECCOPY(pfl->oldscale, pchan->size);
+ QUATCOPY(pfl->oldquat, pchan->quat);
+ }
+}
+
+
+/* get sets of F-Curves providing transforms for the bones in the Pose */
+// TODO: separate the inner workings out to another helper func, since we need option of whether to take selected or visible bones...
+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
+ * and set the relevant transform flags...
+ */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
+ {
+ fcurves_to_pchan_links_get(pfLinks, ob, act, pchan);
+ }
+ CTX_DATA_END;
+}
+
+/* free F-Curve <-> PoseChannel links */
+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 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);
+ }
+}
+
+/* ------------------------- */
+
+/* helper for apply() / reset() - refresh the data */
+void poseAnim_mapping_refresh (bContext *C, Scene *scene, Object *ob)
+{
+ bArmature *arm= (bArmature *)ob->data;
+
+ /* 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?
+ if ((arm->flag & ARM_DELAYDEFORM)==0)
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ else
+ where_is_pose(scene, ob);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+}
+
+/* reset changes made to current pose */
+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 */
+ // TODO; include axis-angle here too?
+ VECCOPY(pchan->loc, pfl->oldloc);
+ VECCOPY(pchan->eul, pfl->oldrot);
+ VECCOPY(pchan->size, pfl->oldscale);
+ QUATCOPY(pchan->quat, pfl->oldquat);
+ }
+}
+
+/* perform autokeyframing after changes were made + confirmed */
+void poseAnim_mapping_autoKeyframe (bContext *C, Scene *scene, Object *ob, ListBase *pfLinks, float cframe)
+{
+ static short keyingsets_need_init = 1;
+ static KeyingSet *ks_loc = NULL;
+ static KeyingSet *ks_rot = NULL;
+ static KeyingSet *ks_scale = NULL;
+
+ /* get keyingsets the first time this is run?
+ * NOTE: it should be safe to store these static, since they're currently builtin ones
+ * but maybe later this may change, in which case this code needs to be revised!
+ */
+ if (keyingsets_need_init) {
+ ks_loc= ANIM_builtin_keyingset_get_named(NULL, "Location");
+ ks_rot= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
+ ks_scale= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
+
+ keyingsets_need_init = 0;
+ }
+
+ /* insert keyframes as necessary if autokeyframing */
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ bCommonKeySrc cks;
+ ListBase dsources = {&cks, &cks};
+ tPChanFCurveLink *pfl;
+
+ /* init common-key-source for use by KeyingSets */
+ memset(&cks, 0, sizeof(bCommonKeySrc));
+ cks.id= &ob->id;
+
+ /* iterate over each pose-channel affected, applying the changes */
+ for (pfl= pfLinks->first; pfl; pfl= pfl->next) {
+ bPoseChannel *pchan= pfl->pchan;
+ /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
+ cks.pchan= pchan;
+
+ /* insert keyframes */
+ if (pchan->flag & POSE_LOC)
+ modify_keyframes(scene, &dsources, NULL, ks_loc, MODIFYKEY_MODE_INSERT, cframe);
+ if (pchan->flag & POSE_ROT)
+ modify_keyframes(scene, &dsources, NULL, ks_rot, MODIFYKEY_MODE_INSERT, cframe);
+ if (pchan->flag & POSE_SIZE)
+ modify_keyframes(scene, &dsources, NULL, ks_scale, MODIFYKEY_MODE_INSERT, cframe);
+ }
+ }
+}
+
+/* ------------------------- */
+
+/* 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, 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 (strcmp(path, fcu->rna_path) == 0)
+ return ld;
+ }
+
+ /* none found */
+ return NULL;
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 5cf44951c37..02194035ee9 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -83,9 +83,6 @@
/* ******* XXX ********** */
-static void BIF_undo_push() {}
-static void error() {}
-
static void action_set_activemarker() {}
/* ************************************************************* */
@@ -221,7 +218,7 @@ void poselib_validate_act (bAction *act)
/* validate action and poselib */
if (act == NULL) {
- error("No Action to validate");
+ //error("No Action to validate");
return;
}
@@ -233,6 +230,7 @@ void poselib_validate_act (bAction *act)
/* for each key, make sure there is a correspnding pose */
for (ak= keys.first; ak; ak= ak->next) {
/* check if any pose matches this */
+ // TODO: don't go looking through the list like this every time...
for (marker= act->markers.first; marker; marker= marker->next) {
if (IS_EQ(marker->frame, ak->cfra)) {
marker->flag = -1;
@@ -270,7 +268,7 @@ void poselib_validate_act (bAction *act)
/* free temp memory */
BLI_freelistN((ListBase *)&keys);
- BIF_undo_push("PoseLib Validate Action");
+ //BIF_undo_push("PoseLib Validate Action");
}
/* ************************************************************* */
@@ -627,18 +625,18 @@ typedef struct tPoseLib_PreviewData {
bAction *act; /* poselib to use */
TimeMarker *marker; /* 'active' pose */
- short state; /* state of main loop */
- short redraw; /* redraw/update settings during main loop */
- short flag; /* flags for various settings */
-
int selcount; /* number of selected elements to work on */
int totcount; /* total number of elements to work on */
- char headerstr[200]; /* Info-text to print in header */
+ short state; /* state of main loop */
+ short redraw; /* redraw/update settings during main loop */
+ short flag; /* flags for various settings */
+ 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 */
- short search_cursor; /* position of cursor in searchstr (cursor occurs before the item at the nominated index) */
+
+ char headerstr[200]; /* Info-text to print in header */
} tPoseLib_PreviewData;
/* defines for tPoseLib_PreviewData->state values */
@@ -1512,5 +1510,8 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* properties */
- 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);
+ // 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?
+ 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);
}