[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18953] branches/blender2.5/blender/source /blender: Animato: Various improvements
Joshua Leung
aligorith at gmail.com
Fri Feb 13 07:33:07 CET 2009
Revision: 18953
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18953
Author: aligorith
Date: 2009-02-13 07:33:07 +0100 (Fri, 13 Feb 2009)
Log Message:
-----------
Animato: Various improvements
* Scene and World AnimDatas are now included in animation editors
* Keyframes for integer-value settings now get the FCURVE_INT_VALUES flag set for their F-Curves, which restricts those curves to only having integer-values. F-Curve displays have been altered accordingly, but some editing tools may still need tweaks to work with this.
* Fixed notifiers for Insert Keyframe -> Active Keying Set.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
branches/blender2.5/blender/source/blender/editors/animation/keyframes_draw.c
branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_draw.h
branches/blender2.5/blender/source/blender/editors/space_action/action_draw.c
branches/blender2.5/blender/source/blender/editors/space_action/action_header.c
branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
branches/blender2.5/blender/source/blender/editors/space_graph/graph_header.c
branches/blender2.5/blender/source/blender/editors/space_graph/space_graph.c
branches/blender2.5/blender/source/blender/makesdna/DNA_action_types.h
branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h
branches/blender2.5/blender/source/blender/makesdna/DNA_world_types.h
Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c 2009-02-13 06:24:15 UTC (rev 18952)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c 2009-02-13 06:33:07 UTC (rev 18953)
@@ -58,6 +58,7 @@
#include "DNA_userdef_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -164,6 +165,10 @@
break;
switch (ale->type) {
+ case ANIMTYPE_SCENE:
+ if (ale->flag & SCE_DS_SELECTED)
+ sel= ACHANNEL_SETFLAG_CLEAR;
+ break;
case ANIMTYPE_OBJECT:
if (ale->flag & SELECT)
sel= ACHANNEL_SETFLAG_CLEAR;
@@ -187,6 +192,13 @@
/* Now set the flags */
for (ale= anim_data.first; ale; ale= ale->next) {
switch (ale->type) {
+ case ANIMTYPE_SCENE:
+ {
+ Scene *scene= (Scene *)ale->data;
+
+ ACHANNEL_SET_FLAG(scene, sel, SCE_DS_SELECTED);
+ }
+ break;
case ANIMTYPE_OBJECT:
{
Base *base= (Base *)ale->data;
@@ -1046,6 +1058,26 @@
/* action to take depends on what channel we've got */
switch (ale->type) {
+ case ANIMTYPE_SCENE:
+ {
+ Scene *sce= (Scene *)ale->data;
+
+ if (x < 16) {
+ /* toggle expand */
+ sce->flag ^= SCE_DS_COLLAPSED;
+ }
+ else {
+ /* set selection status */
+ if (selectmode == SELECT_INVERT) {
+ /* swap select */
+ sce->flag ^= SCE_DS_SELECTED;
+ }
+ else {
+ sce->flag |= SCE_DS_SELECTED;
+ }
+ }
+ }
+ break;
case ANIMTYPE_OBJECT:
{
bDopeSheet *ads= (bDopeSheet *)ac->data;
@@ -1132,6 +1164,12 @@
key->flag ^= KEYBLOCK_DS_EXPAND;
}
break;
+ case ANIMTYPE_DSWOR:
+ {
+ World *wo= (World *)ale->data;
+ wo->flag ^= WO_DS_EXPAND;
+ }
+ break;
case ANIMTYPE_GROUP:
{
Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c 2009-02-13 06:24:15 UTC (rev 18952)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c 2009-02-13 06:33:07 UTC (rev 18953)
@@ -66,6 +66,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
#include "MEM_guardedalloc.h"
@@ -333,6 +334,16 @@
/* do specifics */
switch (datatype) {
+ case ANIMTYPE_SCENE:
+ {
+ Scene *sce= (Scene *)data;
+
+ ale->flag= sce->flag;
+
+ ale->key_data= sce;
+ ale->datatype= ALE_SCE;
+ }
+ break;
case ANIMTYPE_OBJECT:
{
Base *base= (Base *)data;
@@ -431,7 +442,18 @@
ale->datatype= ALE_ACT;
}
break;
+ case ANIMTYPE_DSWOR:
+ {
+ World *wo= (World *)data;
+ AnimData *adt= wo->adt;
+ ale->flag= FILTER_WOR_SCED(wo);
+
+ ale->key_data= (adt) ? adt->action : NULL;
+ ale->datatype= ALE_ACT;
+ }
+ break;
+
case ANIMTYPE_GROUP:
{
bActionGroup *agrp= (bActionGroup *)data;
@@ -1007,6 +1029,117 @@
return items;
}
+static int animdata_filter_dopesheet_scene (ListBase *anim_data, bDopeSheet *ads, Scene *sce, int filter_mode)
+{
+ World *wo= sce->world;
+ bAnimListElem *ale;
+ int items = 0;
+
+ /* add scene as a channel first (even if we aren't showing scenes we still need to show the scene's sub-data */
+ if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
+ /* check if filtering by selection */
+ if ( !(filter_mode & ANIMFILTER_SEL) || (sce->flag & SCE_DS_SELECTED) ) {
+ ale= make_new_animlistelem(sce, ANIMTYPE_SCENE, NULL, ANIMTYPE_NONE, NULL);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+ }
+
+ /* if collapsed, don't go any further (unless adding keyframes only) */
+ if ( (EXPANDED_SCEC(sce) == 0) && !(filter_mode & ANIMFILTER_CURVESONLY) )
+ return items;
+
+ /* Action or Drivers */
+ if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
+ /* Action? */
+ if (ANIMDATA_HAS_KEYS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE)) {
+ AnimData *adt= sce->adt;
+
+ /* include action-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLACTD, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add F-Curve channels? */
+ if (EXPANDED_ACTC(adt->action) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, sce, ANIMTYPE_SCENE, (ID *)sce);
+ }
+ }
+ }
+ else {
+ /* Drivers */
+ if (ANIMDATA_HAS_DRIVERS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE)) {
+ AnimData *adt= sce->adt;
+
+ /* include drivers-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLDRIVERS, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add F-Curve channels (drivers are F-Curves) */
+ if (EXPANDED_DRVD(adt) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, sce, ANIMTYPE_SCENE, filter_mode, (ID *)sce);
+ }
+ }
+ }
+
+ /* world */
+ if ((wo) && !(ads->filterflag & ADS_FILTER_NOWOR)) {
+ /* Animation or Drivers */
+ if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
+ AnimData *adt= wo->adt;
+
+ /* include world-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(wo, ANIMTYPE_DSWOR, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add channels */
+ if (FILTER_WOR_SCED(wo) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, wo, ANIMTYPE_DSWOR, (ID *)wo);
+ }
+ }
+ else {
+ /* Drivers */
+ if (ANIMDATA_HAS_DRIVERS(wo)) {
+ AnimData *adt= wo->adt;
+
+ /* include shapekey-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(wo, ANIMTYPE_DSWOR, sce, ANIMTYPE_SCENE, (ID *)wo);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add F-Curve channels (drivers are F-Curves) */
+ if (FILTER_WOR_SCED(wo)/*EXPANDED_DRVD(adt)*/ || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ // XXX owner info is messed up now...
+ items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, wo, ANIMTYPE_DSWOR, filter_mode, (ID *)wo);
+ }
+ }
+ }
+ }
+
+ /* return the number of items added to the list */
+ return items;
+}
+
// TODO: implement pinning... (if and when pinning is done, what we need to do is to provide freeing mechanisms - to protect against data that was deleted)
static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int filter_mode)
{
@@ -1020,6 +1153,35 @@
return 0;
}
+ /* scene-linked animation */
+ // TODO: sequencer, composite nodes - are we to include those here too?
+ {
+ short sceOk, worOk;
+
+ /* check filtering-flags if ok */
+ if (ads->filterflag) {
+ if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {
+ sceOk= (ANIMDATA_HAS_DRIVERS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE));
+ worOk= ((sce->world) && ANIMDATA_HAS_DRIVERS(sce->world) && !(ads->filterflag & ADS_FILTER_NOWOR));
+ }
+ else {
+ sceOk= (ANIMDATA_HAS_KEYS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE));
+ worOk= ((sce->world) && ANIMDATA_HAS_KEYS(sce->world) && !(ads->filterflag & ADS_FILTER_NOWOR));
+ }
+ }
+ else {
+ sceOk= (ANIMDATA_HAS_KEYS(sce));
+ worOk= ((sce->world) && ANIMDATA_HAS_KEYS(sce->world));
+ }
+
+ /* check if not all bad (i.e. so there is something to show) */
+ if ( !(!sceOk && !worOk) ) {
+ /* add scene data to the list of filtered channels */
+ items += animdata_filter_dopesheet_scene(anim_data, ads, sce, filter_mode);
+ }
+ }
+
+
/* loop over all bases in the scene */
for (base= sce->base.first; base; base= base->next) {
/* check if there's an object (all the relevant checks are done in the ob-function) */
@@ -1049,16 +1211,6 @@
/* only selected should be shown */
continue;
}
-#if 0
- if ((ads->filterflag & ADS_FILTER_NOARM) && (ob->type == OB_ARMATURE)) {
- /* not showing armatures */
- continue;
- }
- if ((ads->filterflag & ADS_FILTER_NOOBJ) && (ob->type != OB_ARMATURE)) {
- /* not showing objects that aren't armatures */
- continue;
- }
-#endif
/* check filters for datatypes */
if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {
@@ -1066,7 +1218,7 @@
keyOk= ((key) && ANIMDATA_HAS_DRIVERS(key) && !(ads->filterflag & ADS_FILTER_NOSHAPEKEYS));
}
else {
- actOk= (ANIMDATA_HAS_KEYS(ob) /*&& !(ads->filterflag & ADS_FILTER_NOACTS)*/);
+ actOk= ANIMDATA_HAS_KEYS(ob);
keyOk= ((key) && ANIMDATA_HAS_KEYS(key) && !(ads->filterflag & ADS_FILTER_NOSHAPEKEYS));
}
Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframes_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframes_draw.c 2009-02-13 06:24:15 UTC (rev 18952)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframes_draw.c 2009-02-13 06:33:07 UTC (rev 18953)
@@ -63,6 +63,7 @@
#include "DNA_userdef_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
#include "BKE_action.h"
#include "BKE_depsgraph.h"
@@ -331,6 +332,18 @@
/* *************************** Channel Drawing Funcs *************************** */
+void draw_scene_channel(gla2DDrawInfo *di, ActKeysInc *aki, Scene *sce, float ypos)
+{
+ ListBase keys = {0, 0};
+ ListBase blocks = {0, 0};
+
+ scene_to_keylist(sce, &keys, &blocks, aki);
+ draw_keylist(di, &keys, &blocks, ypos);
+
+ BLI_freelistN(&keys);
+ BLI_freelistN(&blocks);
+}
+
void draw_object_channel(gla2DDrawInfo *di, ActKeysInc *aki, Object *ob, float ypos)
{
ListBase keys = {0, 0};
@@ -390,9 +403,44 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list