Revision: 22080
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22080
Author:   aligorith
Date:     2009-07-31 09:43:47 +0200 (Fri, 31 Jul 2009)

Log Message:
-----------
Animato - NLA + Realtime Animating Goodies 

* When doing realtime recording of animation (i.e. transforming objects + bones 
while animation playback is running, and auto-keying is enabled), animation 
will be added to a new NLA Track+Strip combo everytime a single 'loop' of the 
frame range has finished. This will allow 'passes' over the animation to be 
less destructive.

* Made the evaluation of the active action (when NLA data is present), be 
handled as part of the normal NLA system evaluation code (as if it were just 
another strip in a track at the end). The immediate benefit is that there are 
now some settings (available in the "Animation Data" panel in the NLA Editor 
with a strip selected) which allow for the way the active action is combined 
with the NLA stack results. For instance, the way that the action extrapolates 
is used in the recording tweaks above.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
    
branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c
    
branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h
    branches/blender2.5/blender/source/blender/makesrna/RNA_enum_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_animation.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_nla.c

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-07-31 07:43:47 UTC (rev 22080)
@@ -120,8 +120,15 @@
                IdAdtTemplate *iat= (IdAdtTemplate *)id;
                
                /* check if there's already AnimData, in which case, don't add 
*/
-               if (iat->adt == NULL)
-                       iat->adt= MEM_callocN(sizeof(AnimData), "AnimData");
+               if (iat->adt == NULL) {
+                       AnimData *adt;
+                       
+                       /* add animdata */
+                       adt= iat->adt= MEM_callocN(sizeof(AnimData), 
"AnimData");
+                       
+                       /* set default settings */
+                       adt->act_influence= 1.0f;
+               }
                
                return iat->adt;
        }
@@ -1190,6 +1197,9 @@
  */
 static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
 {
+       ListBase dummy_trackslist = {NULL, NULL};
+       NlaStrip dummy_strip;
+       
        NlaTrack *nlt;
        short track_index=0;
        
@@ -1218,6 +1228,29 @@
                if (nes) nes->track= nlt;
        }
        
+       /* add 'active' Action (may be tweaking track) as last strip to 
evaluate in NLA stack
+        *      - only do this if we're not exclusively evaluating the 'solo' 
NLA-track
+        */
+       if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) {
+               /* make dummy NLA strip, and add that to the stack */
+               memset(&dummy_strip, 0, sizeof(NlaStrip));
+               dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
+               
+               dummy_strip.act= adt->action;
+               dummy_strip.remap= adt->remap;
+               
+               calc_action_range(dummy_strip.act, &dummy_strip.actstart, 
&dummy_strip.actend, 1);
+               dummy_strip.start = dummy_strip.actstart;
+               dummy_strip.end = (IS_EQ(dummy_strip.actstart, 
dummy_strip.actend)) ?  (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+               
+               dummy_strip.blendmode= adt->act_blendmode;
+               dummy_strip.extendmode= adt->act_extendmode;
+               dummy_strip.influence= adt->act_influence;
+               
+               /* add this to our list of evaluation strips */
+               nlastrips_ctime_get_strip(&estrips, &dummy_trackslist, -1, 
ctime);
+       }
+       
        /* only continue if there are strips to evaluate */
        if (estrips.first == NULL)
                return;
@@ -1316,14 +1349,10 @@
                /* evaluate NLA data */
                if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF))
                {
-                       /* evaluate NLA-stack */
+                       /* evaluate NLA-stack 
+                        *      - active action is evaluated as part of the NLA 
stack as the last item
+                        */
                        animsys_evaluate_nla(&id_ptr, adt, ctime);
-                       
-                       /* evaluate 'active' Action (may be tweaking track) on 
top of results of NLA-evaluation 
-                        *      - only do this if we're not exclusively 
evaluating the 'solo' NLA-track
-                        */
-                       if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK))
-                               animsys_evaluate_action(&id_ptr, adt->action, 
adt->remap, ctime);
                }
                /* evaluate Active Action only */
                else if (adt->action)

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c   
2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c   
2009-07-31 07:43:47 UTC (rev 22080)
@@ -1438,10 +1438,17 @@
        /* only filter if auto-key mode requires this */
        if (IS_AUTOKEY_ON(scene) == 0)
                return 0;
-       else if (IS_AUTOKEY_MODE(scene, NORMAL)) 
+               
+       if (IS_AUTOKEY_MODE(scene, NORMAL)) {
+               /* can insert anytime we like... */
                return 1;
-       else 
+       }
+       else /* REPLACE */ {
+               /* for whole block - only key if there's a keyframe on that 
frame already
+                *      this is a valid assumption when we're blocking + 
tweaking
+                */
                return id_frame_has_keyframe(id, cfra, ANIMFILTER_KEYS_LOCAL);
+       }
 }
 
 /* ******************************************* */

Modified: 
branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h    
    2009-07-31 02:35:56 UTC (rev 22079)
+++ 
branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h    
    2009-07-31 07:43:47 UTC (rev 22080)
@@ -33,10 +33,19 @@
 typedef struct ScreenAnimData {
        ARegion *ar;    /* do not read from this, only for comparing if region 
exists */
        int redraws;
-       int reverse;
+       int flag;               /* flags for playback */
 } ScreenAnimData;
 
+/* for animplayer */
+enum {
+               /* user-setting - frame range is played backwards */
+       ANIMPLAY_FLAG_REVERSE           = (1<<0),
+               /* temporary - playback just jumped to the start/end */
+       ANIMPLAY_FLAG_JUMPED            = (1<<1),
+};
 
+
+
 typedef struct AZone {
        struct AZone *next, *prev;
        ARegion *ar;

Modified: 
branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c   
    2009-07-31 02:35:56 UTC (rev 22079)
+++ 
branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c   
    2009-07-31 07:43:47 UTC (rev 22080)
@@ -144,7 +144,7 @@
 
        if(fcu && !driven) {
                id= but->rnapoin.id.data;
-
+               
                if(autokeyframe_cfra_can_key(scene, id)) {
                        short flag = 0;
                        

Modified: 
branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c     
2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c     
2009-07-31 07:43:47 UTC (rev 22080)
@@ -1477,7 +1477,7 @@
                screen->animtimer= WM_event_add_window_timer(win, TIMER0, 
(1.0/FPS));
                sad->ar= CTX_wm_region(C);
                sad->redraws= redraws;
-               sad->reverse= (enable < 0);
+               sad->flag= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0;
                screen->animtimer->customdata= sad;
                
        }

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c      
2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c      
2009-07-31 07:43:47 UTC (rev 22080)
@@ -2197,39 +2197,50 @@
                
                if(scene->audio.flag & AUDIO_SYNC) {
                        int step = floor(wt->duration * FPS);
-                       if (sad->reverse) // XXX does this option work with 
audio?
+                       if (sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this 
option work with audio?
                                scene->r.cfra -= step;
                        else
                                scene->r.cfra += step;
                        wt->duration -= ((float)step)/FPS;
                }
                else {
-                       if (sad->reverse)
+                       if (sad->flag & ANIMPLAY_FLAG_REVERSE)
                                scene->r.cfra--;
                        else
                                scene->r.cfra++;
                }
                
-               if (sad->reverse) {
-                       /* jump back to end */
+               /* reset 'jumped' flag before checking if we need to jump... */
+               sad->flag &= ~ANIMPLAY_FLAG_JUMPED;
+               
+               if (sad->flag & ANIMPLAY_FLAG_REVERSE) {
+                       /* jump back to end? */
                        if (scene->r.psfra) {
-                               if(scene->r.cfra < scene->r.psfra)
+                               if (scene->r.cfra < scene->r.psfra) {
                                        scene->r.cfra= scene->r.pefra;
+                                       sad->flag |= ANIMPLAY_FLAG_JUMPED;
+                               }
                        }
                        else {
-                               if(scene->r.cfra < scene->r.sfra)
+                               if (scene->r.cfra < scene->r.sfra) {
                                        scene->r.cfra= scene->r.efra;
+                                       sad->flag |= ANIMPLAY_FLAG_JUMPED;
+                               }
                        }
                }
                else {
-                       /* jump back to start */
+                       /* jump back to start? */
                        if (scene->r.psfra) {
-                               if(scene->r.cfra > scene->r.pefra)
+                               if (scene->r.cfra > scene->r.pefra) {
                                        scene->r.cfra= scene->r.psfra;
+                                       sad->flag |= ANIMPLAY_FLAG_JUMPED;
+                               }
                        }
                        else {
-                               if(scene->r.cfra > scene->r.efra)
+                               if (scene->r.cfra > scene->r.efra) {
                                        scene->r.cfra= scene->r.sfra;
+                                       sad->flag |= ANIMPLAY_FLAG_JUMPED;
+                               }
                        }
                }
 

Modified: 
branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c  
2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c  
2009-07-31 07:43:47 UTC (rev 22080)
@@ -100,7 +100,7 @@
        WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_TRANSFORM, NULL);
 }
 
-static int nla_panel_context(const bContext *C, PointerRNA *nlt_ptr, 
PointerRNA *strip_ptr)
+static int nla_panel_context(const bContext *C, PointerRNA *adt_ptr, 
PointerRNA *nlt_ptr, PointerRNA *strip_ptr)
 {
        bAnimContext ac;
        bAnimListElem *ale= NULL;
@@ -121,8 +121,13 @@
        for (ale= anim_data.first; ale; ale= ale->next) {
                if (ale->type == ANIMTYPE_NLATRACK) {
                        NlaTrack *nlt= (NlaTrack *)ale->data;
+                       AnimData *adt= ale->adt;
                        
                        /* found it, now set the pointers */
+                       if (adt_ptr) {
+                               /* AnimData pointer */
+                               RNA_pointer_create(ale->id, &RNA_AnimData, adt, 
adt_ptr);
+                       }
                        if (nlt_ptr) {
                                /* NLA-Track pointer */
                                RNA_pointer_create(ale->id, &RNA_NlaTrack, nlt, 
nlt_ptr);
@@ -151,16 +156,22 @@
 }
 #endif
 
+static int nla_animdata_panel_poll(const bContext *C, PanelType *pt)
+{
+       PointerRNA ptr;
+       return (nla_panel_context(C, &ptr, NULL, NULL) && (ptr.data != NULL));
+}
+
 static int nla_track_panel_poll(const bContext *C, PanelType *pt)
 {
        PointerRNA ptr;
-       return (nla_panel_context(C, &ptr, NULL) && (ptr.data != NULL));
+       return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL));
 }
 
 static int nla_strip_panel_poll(const bContext *C, PanelType *pt)
 {
        PointerRNA ptr;
-       return (nla_panel_context(C, NULL, &ptr) && (ptr.data != NULL));
+       return (nla_panel_context(C, NULL, NULL, &ptr) && (ptr.data != NULL));
 }
 
 static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
@@ -168,7 +179,7 @@
        PointerRNA ptr;
        NlaStrip *strip;
        
-       if (!nla_panel_context(C, NULL, &ptr))
+       if (!nla_panel_context(C, NULL, NULL, &ptr))
                return 0;
        if (ptr.data == NULL)
                return 0;
@@ -179,6 +190,42 @@
 
 /* -------------- */
 
+/* active AnimData */
+static void nla_panel_animdata (const bContext *C, Panel *pa)
+{
+       PointerRNA adt_ptr;
+       AnimData *adt;
+       uiLayout *layout= pa->layout;
+       uiLayout *row;
+       uiBlock *block;
+       
+       /* check context and also validity of pointer */
+       if (!nla_panel_context(C, &adt_ptr, NULL, NULL))
+               return;
+       adt= adt_ptr.data;
+       
+       block= uiLayoutGetBlock(layout);
+       uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+       

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to