Revision: 21029
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21029
Author:   aligorith
Date:     2009-06-20 11:36:55 +0200 (Sat, 20 Jun 2009)

Log Message:
-----------
NLA SoC: Conversions for old NLA-data to the new system 

Old NLA-data now gets mostly ported converted over to the new system, with 
strips and their respective Actions being handled correctly in the test cases 
I've got. 

The conversion procedure now tries to fit multiple strips into since tracks as 
it is assumed that quite a few old setups tried to do. However, some old setups 
may be adversely affected by this (i.e. if they depend on a certain order of 
holding adds for example). 

For now, there are no complete replacements for the NLA-Modifier/Auto-Walking 
stuff yet, so that info is currently just ignored (but correctly freed). The 
current plan here is to get Armature-level pose-offset system + F-Modifiers 
where appropriate. This should be one of the major causes of file breakage 
now...

Also, I've yet to restore some patching for group instancing NLA stuff, since 
more trickery here is required. This is probably the second major cause of file 
breakage...

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/blenkernel/intern/ipo.c

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/intern/ipo.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/intern/ipo.c  
2009-06-20 06:41:50 UTC (rev 21028)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/intern/ipo.c  
2009-06-20 09:36:55 UTC (rev 21029)
@@ -58,6 +58,7 @@
 #include "DNA_key_types.h"
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_nla_types.h"
 #include "DNA_object_types.h"
 #include "DNA_object_force.h"
 #include "DNA_particle_types.h"
@@ -85,6 +86,7 @@
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mesh.h"
+#include "BKE_nla.h"
 #include "BKE_object.h"
 
 
@@ -1463,6 +1465,87 @@
        action_to_animato(act, &adt->action->groups, &adt->action->curves, 
&adt->drivers);
 }
 
+/* ------------------------- */
+
+// TODO:
+//     - NLA group duplicators info
+//     - NLA curve/stride modifiers...
+
+/* Convert NLA-Strip to new system */
+static void nlastrips_to_animdata (ID *id, ListBase *strips)
+{
+       AnimData *adt= BKE_animdata_from_id(id);
+       NlaTrack *nlt = NULL;
+       NlaStrip *strip;
+       bActionStrip *as, *asn;
+       
+       /* for each one of the original strips, convert to a new strip and free 
the old... */
+       for (as= strips->first; as; as= asn) {
+               asn= as->next;
+               
+               /* this old strip is only worth something if it had an 
action... */
+               if (as->act) {
+                       /* convert Action data (if not yet converted), storing 
the results in the same Action */
+                       action_to_animato(as->act, &as->act->groups, 
&as->act->curves, &adt->drivers);
+                       
+                       /* create a new-style NLA-strip which references this 
Action, then copy over relevant settings */
+                       {
+                               /* init a new strip, and assign the action to 
it 
+                                *      - no need to muck around with the 
user-counts, since this is just 
+                                *        passing over the ref to the new 
owner, not creating an additional ref
+                                */
+                               strip= MEM_callocN(sizeof(NlaStrip), 
"NlaStrip");
+                               strip->act= as->act;
+                               
+                                       /* endpoints */
+                               strip->start= as->start;
+                               strip->end= as->end;
+                               strip->actstart= as->actstart;
+                               strip->actend= as->actend;
+                               
+                                       /* action reuse */
+                               strip->repeat= as->repeat;
+                               strip->scale= as->scale;
+                               if (as->flag & ACTSTRIP_LOCK_ACTION)    
strip->flag |= NLASTRIP_FLAG_SYNC_LENGTH;
+                               
+                                       /* blending */
+                               strip->blendin= as->blendin;
+                               strip->blendout= as->blendout;
+                               strip->blendmode= (as->mode==ACTSTRIPMODE_ADD) 
? NLASTRIP_MODE_ADD : NLASTRIP_MODE_BLEND;
+                               if (as->flag & ACTSTRIP_AUTO_BLENDS)    
strip->flag |= NLASTRIP_FLAG_AUTO_BLENDS;
+                                       
+                                       /* assorted setting flags */
+                               if (as->flag & ACTSTRIP_SELECT)                 
strip->flag |= NLASTRIP_FLAG_SELECT;
+                               if (as->flag & ACTSTRIP_ACTIVE)                 
strip->flag |= NLASTRIP_FLAG_ACTIVE;
+                               
+                               if (as->flag & ACTSTRIP_MUTE)                   
strip->flag |= NLASTRIP_FLAG_MUTED;
+                               if (as->flag & ACTSTRIP_REVERSE)                
strip->flag |= NLASTRIP_FLAG_REVERSE;
+                               
+                                       /* by default, we now always 
extrapolate, while in the past this was optional */
+                               if ((as->flag & ACTSTRIP_HOLDLASTFRAME)==0) 
+                                       strip->extendmode= 
NLASTRIP_EXTEND_NOTHING;
+                       }       
+                       
+                       /* try to add this strip to the current NLA-Track (i.e. 
the 'last' one on the stack atm) */
+                       if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+                               /* trying to add to the current failed (no 
space), 
+                                * so add a new track to the stack, and add to 
that...
+                                */
+                               nlt= add_nlatrack(adt, NULL);
+                               BKE_nlatrack_add_strip(nlt, strip);
+                       }
+               }
+               
+               /* modifiers */
+               // FIXME: for now, we just free them...
+               if (as->modifiers.first)
+                       BLI_freelistN(&as->modifiers);
+               
+               /* free the old strip */
+               BLI_freelinkN(strips, as);
+       }
+}
+
 /* *************************************************** */
 /* External API - Only Called from do_versions() */
 
@@ -1509,10 +1592,33 @@
                if (G.f & G_DEBUG) printf("\tconverting ob %s \n", id->name+2);
                
                /* check if object has any animation data */
-               if ((ob->ipo) || (ob->action) || (ob->nlastrips.first)) {
+               if (ob->nlastrips.first) {
                        /* Add AnimData block */
                        adt= BKE_id_add_animdata(id);
                        
+                       /* IPO first to take into any non-NLA'd Object 
Animation */
+                       if (ob->ipo) {
+                               ipo_to_animdata(id, ob->ipo, NULL, NULL);
+                               
+                               ob->ipo->id.us--;
+                               ob->ipo= NULL;
+                       }
+                       
+                       /* Action is skipped since it'll be used by some strip 
in the NLA anyway, 
+                        * causing errors with evaluation in the new evaluation 
pipeline
+                        */
+                       if (ob->action) {
+                               ob->action->id.us--;
+                               ob->action= NULL;
+                       }
+                       
+                       /* finally NLA */
+                       nlastrips_to_animdata(id, &ob->nlastrips);
+               }
+               else if ((ob->ipo) || (ob->action)) {
+                       /* Add AnimData block */
+                       adt= BKE_id_add_animdata(id);
+                       
                        /* Action first - so that Action name get conserved */
                        if (ob->action) {
                                action_to_animdata(id, ob->action);
@@ -1530,9 +1636,6 @@
                                ob->ipo->id.us--;
                                ob->ipo= NULL;
                        }
-                       
-                       /* finally NLA */
-                       // XXX todo... for now, new NLA code not hooked up yet, 
so keep old stuff (but not for too long!)
                }
                
                /* check PoseChannels for constraints with local data */


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

Reply via email to