Revision: 38600
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38600
Author:   aligorith
Date:     2011-07-22 07:25:52 +0000 (Fri, 22 Jul 2011)
Log Message:
-----------
Split up recalcData() function in transform_generics.c into smaller
functions based on editor types

This could be split up further in future if there's such a need, but
this should already be sufficient. Most notably required since the NLA
recalc stuff was taking quite a few lines within that block

Modified Paths:
--------------
    
branches/soc-2011-pepper/source/blender/editors/transform/transform_generics.c

Modified: 
branches/soc-2011-pepper/source/blender/editors/transform/transform_generics.c
===================================================================
--- 
branches/soc-2011-pepper/source/blender/editors/transform/transform_generics.c  
    2011-07-22 05:33:06 UTC (rev 38599)
+++ 
branches/soc-2011-pepper/source/blender/editors/transform/transform_generics.c  
    2011-07-22 07:25:52 UTC (rev 38600)
@@ -323,524 +323,548 @@
        return 0;
 }
 
-/* called for updating while transform acts, once per redraw */
-void recalcData(TransInfo *t)
+/* helper for recalcData() - for Action Editor transforms */
+static void recalcData_actedit(TransInfo *t)
 {
-       Base *base = t->scene->basact;
-
-       if (t->spacetype==SPACE_NODE) {
-               flushTransNodes(t);
+       Scene *scene= t->scene;
+       SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
+       
+       bAnimContext ac= {NULL};
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
+       int filter;
+       
+       /* initialise relevant anim-context 'context' data from TransInfo data 
*/
+               /* NOTE: sync this with the code in ANIM_animdata_get_context() 
*/
+       ac.scene= t->scene;
+       ac.obact= OBACT;
+       ac.sa= t->sa;
+       ac.ar= t->ar;
+       ac.sl= (t->sa)? t->sa->spacedata.first : NULL;
+       ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+       ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+       
+       ANIM_animdata_context_getdata(&ac);
+       
+       /* perform flush */
+       if (ac.datatype == ANIMCONT_GPENCIL) {
+               /* flush transform values back to actual coordinates */
+               flushTransGPactionData(t);
        }
-       else if (t->spacetype==SPACE_SEQ) {
-               flushTransSeq(t);
-       }
-       else if (t->spacetype == SPACE_ACTION) {
-               Scene *scene= t->scene;
-               SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
+       else {
+               /* get animdata blocks visible in editor, assuming that these 
will be the ones where things changed */
+               filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
+               ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, 
ac.datatype);
                
-               bAnimContext ac= {NULL};
-               ListBase anim_data = {NULL, NULL};
-               bAnimListElem *ale;
-               int filter;
-               
-               /* initialise relevant anim-context 'context' data from 
TransInfo data */
-                       /* NOTE: sync this with the code in 
ANIM_animdata_get_context() */
-               ac.scene= t->scene;
-               ac.obact= OBACT;
-               ac.sa= t->sa;
-               ac.ar= t->ar;
-               ac.sl= (t->sa)? t->sa->spacedata.first : NULL;
-               ac.spacetype= (t->sa)? t->sa->spacetype : 0;
-               ac.regiontype= (t->ar)? t->ar->regiontype : 0;
-               
-               ANIM_animdata_context_getdata(&ac);
-               
-               /* perform flush */
-               if (ac.datatype == ANIMCONT_GPENCIL) {
-                       /* flush transform values back to actual coordinates */
-                       flushTransGPactionData(t);
-               }
-               else {
-                       /* get animdata blocks visible in editor, assuming that 
these will be the ones where things changed */
-                       filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
-                       ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, 
ac.datatype);
-                       
-                       /* just tag these animdata-blocks to recalc, assuming 
that some data there changed 
-                        * BUT only do this if realtime updates are enabled
-                        */
-                       if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
-                               for (ale= anim_data.first; ale; ale= ale->next) 
{
-                                       /* set refresh tags for objects using 
this animation */
-                                       ANIM_list_elem_update(t->scene, ale);
-                               }
+               /* just tag these animdata-blocks to recalc, assuming that some 
data there changed 
+                * BUT only do this if realtime updates are enabled
+                */
+               if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
+                       for (ale= anim_data.first; ale; ale= ale->next) {
+                               /* set refresh tags for objects using this 
animation */
+                               ANIM_list_elem_update(t->scene, ale);
                        }
-                       
-                       /* now free temp channels */
-                       BLI_freelistN(&anim_data);
                }
+               
+               /* now free temp channels */
+               BLI_freelistN(&anim_data);
        }
-       else if (t->spacetype == SPACE_IPO) {
-               Scene *scene;
-               SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
+}
+
+/* helper for recalcData() - for Graph Editor transforms */
+static void recalcData_graphedit(TransInfo *t)
+{
+       SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
+       Scene *scene;
+       
+       ListBase anim_data = {NULL, NULL};
+       bAnimContext ac= {NULL};
+       int filter;
+       
+       bAnimListElem *ale;
+       int dosort = 0;
+       
+       
+       /* initialise relevant anim-context 'context' data from TransInfo data 
*/
+               /* NOTE: sync this with the code in ANIM_animdata_get_context() 
*/
+       scene= ac.scene= t->scene;
+       ac.obact= OBACT;
+       ac.sa= t->sa;
+       ac.ar= t->ar;
+       ac.sl= (t->sa)? t->sa->spacedata.first : NULL;
+       ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+       ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+       
+       ANIM_animdata_context_getdata(&ac);
+       
+       /* do the flush first */
+       flushTransGraphData(t);
+       
+       /* get curves to check if a re-sort is needed */
+       filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | 
ANIMFILTER_CURVE_VISIBLE);
+       ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+       
+       /* now test if there is a need to re-sort */
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               FCurve *fcu= (FCurve *)ale->key_data;
                
-               ListBase anim_data = {NULL, NULL};
-               bAnimContext ac= {NULL};
-               int filter;
+               /* ignore unselected fcurves */
+               if (!fcu_test_selected(fcu))
+                       continue;
                
-               bAnimListElem *ale;
-               int dosort = 0;
+               // fixme: only do this for selected verts...
+               ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, 
ale->key_data, 
ANIM_UNITCONV_ONLYSEL|ANIM_UNITCONV_SELVERTS|ANIM_UNITCONV_RESTORE);
                
                
-               /* initialise relevant anim-context 'context' data from 
TransInfo data */
-                       /* NOTE: sync this with the code in 
ANIM_animdata_get_context() */
-               scene= ac.scene= t->scene;
-               ac.obact= OBACT;
-               ac.sa= t->sa;
-               ac.ar= t->ar;
-               ac.sl= (t->sa)? t->sa->spacedata.first : NULL;
-               ac.spacetype= (t->sa)? t->sa->spacetype : 0;
-               ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+               /* watch it: if the time is wrong: do not correct handles yet */
+               if (test_time_fcurve(fcu))
+                       dosort++;
+               else
+                       calchandles_fcurve(fcu);
                
-               ANIM_animdata_context_getdata(&ac);
+               /* set refresh tags for objects using this animation,
+                * BUT only if realtime updates are enabled  
+                */
+               if ((sipo->flag & SIPO_NOREALTIMEUPDATES) == 0)
+                       ANIM_list_elem_update(t->scene, ale);
+       }
+       
+       /* do resort and other updates? */
+       if (dosort) remake_graph_transdata(t, &anim_data);
+       
+       /* now free temp channels */
+       BLI_freelistN(&anim_data);
+}
+
+/* helper for recalcData() - for NLA Editor transforms */
+static void recalcData_nla(TransInfo *t)
+{
+       TransDataNla *tdn= (TransDataNla *)t->customData;
+       SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
+       Scene *scene= t->scene;
+       double secf= FPS;
+       int i;
+       
+       /* for each strip we've got, perform some additional validation of the 
values that got set before
+        * using RNA to set the value (which does some special operations when 
setting these values to make
+        * sure that everything works ok)
+        */
+       for (i = 0; i < t->total; i++, tdn++) {
+               NlaStrip *strip= tdn->strip;
+               PointerRNA strip_ptr;
+               short pExceeded, nExceeded, iter;
+               int delta_y1, delta_y2;
                
-               /* do the flush first */
-               flushTransGraphData(t);
+               /* if this tdn has no handles, that means it is just a dummy 
that should be skipped */
+               if (tdn->handle == 0)
+                       continue;
                
-               /* get curves to check if a re-sort is needed */
-               filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | 
ANIMFILTER_CURVE_VISIBLE);
-               ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, 
ac.datatype);
+               /* set refresh tags for objects using this animation,
+                * BUT only if realtime updates are enabled  
+                */
+               if ((snla->flag & SNLA_NOREALTIMEUPDATES) == 0)
+                       ANIM_id_update(t->scene, tdn->id);
                
-               /* now test if there is a need to re-sort */
-               for (ale= anim_data.first; ale; ale= ale->next) {
-                       FCurve *fcu= (FCurve *)ale->key_data;
+               /* if cancelling transform, just write the values without 
validating, then move on */
+               if (t->state == TRANS_CANCEL) {
+                       /* clear the values by directly overwriting the 
originals, but also need to restore
+                        * endpoints of neighboring transition-strips
+                        */
                        
-                       /* ignore unselected fcurves */
-                       if (!fcu_test_selected(fcu))
-                               continue;
+                       /* start */
+                       strip->start= tdn->h1[0];
                        
-                       // fixme: only do this for selected verts...
-                       ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, 
ale->key_data, 
ANIM_UNITCONV_ONLYSEL|ANIM_UNITCONV_SELVERTS|ANIM_UNITCONV_RESTORE);
+                       if ((strip->prev) && (strip->prev->type == 
NLASTRIP_TYPE_TRANSITION))
+                               strip->prev->end= tdn->h1[0];
                        
+                       /* end */
+                       strip->end= tdn->h2[0];
                        
-                       /* watch it: if the time is wrong: do not correct 
handles yet */
-                       if (test_time_fcurve(fcu))
-                               dosort++;
-                       else
-                               calchandles_fcurve(fcu);
+                       if ((strip->next) && (strip->next->type == 
NLASTRIP_TYPE_TRANSITION))
+                               strip->next->start= tdn->h2[0];
                        
-                       /* set refresh tags for objects using this animation,
-                        * BUT only if realtime updates are enabled  
-                        */
-                       if ((sipo->flag & SIPO_NOREALTIMEUPDATES) == 0)
-                               ANIM_list_elem_update(t->scene, ale);
+                       /* flush transforms to child strips (since this should 
be a meta) */
+                       BKE_nlameta_flush_transforms(strip);
+                       
+                       /* restore to original track (if needed) */
+                       if (tdn->oldTrack != tdn->nlt) {
+                               /* just append to end of list for now, since 
strips get sorted in special_aftertrans_update() */
+                               BLI_remlink(&tdn->nlt->strips, strip);
+                               BLI_addtail(&tdn->oldTrack->strips, strip);
+                       }
+                       
+                       continue;
                }
                
-               /* do resort and other updates? */
-               if (dosort) remake_graph_transdata(t, &anim_data);
-               
-               /* now free temp channels */
-               BLI_freelistN(&anim_data);
-       }
-       else if (t->spacetype == SPACE_NLA) {
-               TransDataNla *tdn= (TransDataNla *)t->customData;
-               SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
-               Scene *scene= t->scene;
-               double secf= FPS;
-               int i;
-               
-               /* for each strip we've got, perform some additional validation 
of the values that got set before
-                * using RNA to set the value (which does some special 
operations when setting these values to make
-                * sure that everything works ok)
+               /* firstly, check if the proposed transform locations would 
overlap with any neighbouring strips
+                * (barring transitions) which are absolute barriers since they 
are not being moved
+                *
+                * this is done as a iterative procedure (done 5 times max for 
now)
                 */
-               for (i = 0; i < t->total; i++, tdn++) {
-                       NlaStrip *strip= tdn->strip;
-                       PointerRNA strip_ptr;
-                       short pExceeded, nExceeded, iter;
-                       int delta_y1, delta_y2;

@@ 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