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-01-03 14:35:39 +0300
committerJoshua Leung <aligorith@gmail.com>2009-01-03 14:35:39 +0300
commit7d5847defb332b4b41bc1df39263755c3c250e5f (patch)
tree9cc96da36a47e44f5682040fde3f880da80579bb /source/blender/editors
parent38fcc20580fc27994531f8ef49cc06affd6d54a3 (diff)
2.5
* Start of Action/Pose syncing code (in anim_deps.c) This is currently not hooked up yet, as we still need to figure out where these should get called (due to a few dependencies they have - i.e. visibility syncing of channels is turned on/off by setting in appropriate views). * Also added assorted comments/changes to rna/dna
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/animation/anim_deps.c99
-rw-r--r--source/blender/editors/include/ED_anim_api.h4
2 files changed, 102 insertions, 1 deletions
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index fbd9f5ecdb7..985d57ed31f 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -32,6 +32,8 @@
#include "MEM_guardedalloc.h"
#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -41,6 +43,7 @@
#include "BLI_blenlib.h"
+#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -52,6 +55,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "ED_anim_api.h"
/* ***************** depsgraph calls and anim updates ************* */
@@ -84,7 +88,7 @@ void ED_anim_dag_flush_update(const bContext *C)
/* results in fully updated anim system */
/* in future sound should be on WM level, only 1 sound can play! */
-void ED_update_for_newframe(bContext *C, int mute)
+void ED_update_for_newframe(const bContext *C, int mute)
{
bScreen *screen= CTX_wm_screen(C);
Scene *scene= screen->scene;
@@ -118,3 +122,96 @@ void ED_update_for_newframe(bContext *C, int mute)
}
}
+/* **************************** pose <-> action syncing ******************************** */
+/* Summary of what needs to be synced between poses and actions:
+ * 1) Flags
+ * a) Visibility (only for pose to action)
+ * b) Selection status (both ways)
+ * 2) Group settings (only for pose to action) - do we also need to make sure same groups exist?
+ * 3) Grouping (only for pose to action for now)
+ */
+
+/* Notifier from Action/Dopesheet (this may be extended to include other things such as Python...)
+ * Channels in action changed, so update pose channels/groups to reflect changes.
+ *
+ * An object (usually 'active' Object) needs to be supplied, so that its Pose-Channels can be synced with
+ * the channels in its active Action.
+ */
+void ANIM_action_to_pose_sync (Object *ob)
+{
+ bAction *act= (bAction *)ob->action;
+ bActionChannel *achan;
+ bPoseChannel *pchan;
+
+ /* error checking */
+ if ((ob == NULL) || (ob->type != OB_ARMATURE) || ELEM(NULL, act, ob->pose))
+ return;
+
+ /* 1b) loop through all Action-Channels (there should be fewer channels to search through here in general) */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ /* find matching pose-channel */
+ pchan= get_pose_channel(ob->pose, achan->name);
+
+ /* sync active and selected flags */
+ if (pchan && pchan->bone) {
+ /* selection */
+ if (achan->flag & ACHAN_SELECTED)
+ pchan->bone->flag |= BONE_SELECTED;
+ else
+ pchan->bone->flag &= ~BONE_SELECTED;
+
+ /* active */
+ if (achan->flag & ACHAN_HILIGHTED)
+ pchan->bone->flag |= BONE_ACTIVE;
+ else
+ pchan->bone->flag &= ~BONE_ACTIVE;
+ }
+ }
+
+ // TODO: add grouping changes too? For now, these tools aren't exposed to users in animation editors yet...
+}
+
+/* Notifier from 3D-View/Outliner (this is likely to include other sources too...)
+ * Pose channels/groups changed, so update action channels
+ *
+ * An object (usually 'active' Object) needs to be supplied, so that its Pose-Channels can be synced with
+ * the channels in its active Action.
+ */
+void ANIM_pose_to_action_sync (Object *ob)
+{
+ bArmature *arm= (bArmature *)ob->data;
+ bAction *act= (bAction *)ob->action;
+ bActionChannel *achan;
+ //bActionGroup *agrp, *bgrp;
+ bPoseChannel *pchan;
+
+ /* error checking */
+ if ((ob == NULL) || (ob->type != OB_ARMATURE) || ELEM3(NULL, arm, act, ob->pose))
+ return;
+
+ /* 1) loop through all Action-Channels (there should be fewer channels to search through here in general) */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ /* find matching pose-channel */
+ pchan= get_pose_channel(ob->pose, achan->name);
+
+ /* sync selection and visibility settings */
+ if (pchan && pchan->bone) {
+ /* visibility - if layer is hidden, or if bone itself is hidden */
+ // XXX we may not want this happening though! (maybe we need some extra flags from context or so)
+ // only if SACTION_NOHIDE==0, and saction->pin == 0, when in Action Editor mode
+ if (!(pchan->bone->layer & arm->layer) || (pchan->bone->flag & BONE_HIDDEN_P))
+ achan->flag |= ACHAN_HIDDEN;
+ else
+ achan->flag &= ~ACHAN_HIDDEN;
+
+ /* selection */
+ if (pchan->bone->flag & BONE_SELECTED)
+ achan->flag |= ACHAN_SELECTED;
+ else
+ achan->flag &= ~ACHAN_SELECTED;
+ }
+ }
+
+ // XXX step 2 needs to be coded still... currently missing action/bone group API to do any more work here...
+ // XXX step 3 needs to be coded still... it's a messy case to deal with (we'll use the temp indices for this?)
+}
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 1c44fbbd6ac..2489aed66b5 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -322,6 +322,10 @@ void ANIM_nla_mapping_apply_ipo(struct Object *ob, struct Ipo *ipo, short restor
void ED_anim_dag_flush_update(const struct bContext *C);
void ED_update_for_newframe(const struct bContext *C, int mute);
+/* pose <-> action syncing */
+void ANIM_action_to_pose_sync(struct Object *ob);
+void ANIM_pose_to_action_sync(struct Object *ob);
+
/* ************************************************* */
/* OPERATORS */