Revision: 23565
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23565
Author:   aligorith
Date:     2009-09-30 06:59:14 +0200 (Wed, 30 Sep 2009)

Log Message:
-----------
Animato: Bugfixes

* #19501: Only the first user of multi-user IPO's were getting converted to 
AnimData. 
Now, this AnimData gets converted multiple times - once for each user. This 
will mean that multi-user actions will no longer be multi-user after conversion 
though, although this could be fixed manually if there really is such a need.

* #19503: Nasty memory leaks when duplicating objects with AnimData
Fixed a few little oversights made when coding the copying code for NLA-data 
(which resulted in exponential copying-loops of doom), and sanitised the 
AnimData copying code for ID-blocks to be simpler to manage.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim_sys.c
    trunk/blender/source/blender/blenkernel/intern/ipo.c
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/nla.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/scene.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim_sys.c   2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/anim_sys.c   2009-09-30 
04:59:14 UTC (rev 23565)
@@ -187,8 +187,6 @@
        dadt= MEM_dupallocN(adt);
        
        /* make a copy of action - at worst, user has to delete copies... */
-       // XXX review this... it might not be optimal behaviour yet...
-       //id_us_plus((ID *)dadt->action);
        dadt->action= copy_action(adt->action);
        dadt->tmpact= copy_action(adt->tmpact);
        
@@ -1466,7 +1464,11 @@
  *
  * Unresolved things:
  *     - Handling of multi-user settings (i.e. time-offset, group-instancing) 
-> big cache grids or nodal system? but stored where?
- *     - Multiple-block dependencies (i.e. drivers for settings are in both 
local and higher levels) -> split into separate lists?  
+ *     - Multiple-block dependencies (i.e. drivers for settings are in both 
local and higher levels) -> split into separate lists? 
+ *
+ * Current Status:
+ *     - Currently (as of September 2009), overrides we haven't needed to 
(fully) implement overrides. 
+ *       However, the code fo this is relatively harmless, so is left in the 
code for now.
  */
 
 /* Evaluation loop for evaluation animation data 
@@ -1623,9 +1625,10 @@
        
        /* objects */
                /* ADT_RECALC_ANIM doesn't need to be supplied here, since 
object AnimData gets 
-                * this tagged by Depsgraph on framechange 
+                * this tagged by Depsgraph on framechange. This optimisation 
means that objects
+                * linked from other (not-visible) scenes will not need their 
data calculated.
                 */
-       EVAL_ANIM_IDS(main->object.first, /*ADT_RECALC_ANIM*/0); 
+       EVAL_ANIM_IDS(main->object.first, 0); 
        
        /* worlds */
        EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM);

Modified: trunk/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/ipo.c        2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/ipo.c        2009-09-30 
04:59:14 UTC (rev 23565)
@@ -1047,10 +1047,6 @@
                }
        }
        
-       
-       /* free old driver */
-       MEM_freeN(idriver);
-       
        /* return the new one */
        return cdriver;
 }
@@ -1122,11 +1118,9 @@
        /* allocate memory for a new F-Curve */
        fcu= MEM_callocN(sizeof(FCurve), "FCurve");
        
-       /* convert driver - will free the old one... */
-       if (icu->driver) {
+       /* convert driver */
+       if (icu->driver)
                fcu->driver= idriver_to_cdriver(icu->driver);
-               icu->driver= NULL;
-       }
        
        /* copy flags */
        if (icu->flag & IPO_VISIBLE) fcu->flag |= FCURVE_VISIBLE;
@@ -1233,10 +1227,6 @@
                        /* add new F-Curve to list */
                        fcurve_add_to_list(groups, list, fcurve, actname);
                }
-               
-               /* free old data of curve now that it's no longer needed for 
converting any more curves */
-               if (icu->bezt) MEM_freeN(icu->bezt);
-               if (icu->bp) MEM_freeN(icu->bezt);
        }
        else {
                /* get rna-path
@@ -1302,9 +1292,6 @@
                                        }
                                }
                        }
-                       
-                       /* free this data now */
-                       MEM_freeN(icu->bezt);
                }
                else if (icu->bp) {
                        /* TODO: need to convert from BPoint type to the more 
compact FPoint type... but not priority, since no data used this */
@@ -1325,7 +1312,7 @@
  */
 static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], 
ListBase *animgroups, ListBase *anim, ListBase *drivers)
 {
-       IpoCurve *icu, *icn;
+       IpoCurve *icu;
        
        /* sanity check */
        if (ELEM3(NULL, ipo, anim, drivers))
@@ -1347,25 +1334,44 @@
        }
        
        /* loop over IPO-Curves, freeing as we progress */
-       for (icu= ipo->curve.first; icu; icu= icn) {
-               /* get link to next (for later) */
-               icn= icu->next;
-               
+       for (icu= ipo->curve.first; icu; icu= icu->next) {
                /* Since an IPO-Curve may end up being made into many F-Curves 
(i.e. bitflag curves), 
                 * we figure out the best place to put the channel, then tell 
the curve-converter to just dump there
                 */
                if (icu->driver) {
                        /* Blender 2.4x allowed empty drivers, but we don't 
now, since they cause more trouble than they're worth */
-                       if ((icu->driver->ob) || (icu->driver->type == 
IPO_DRIVER_TYPE_PYTHON))
+                       if ((icu->driver->ob) || (icu->driver->type == 
IPO_DRIVER_TYPE_PYTHON)) {
                                icu_to_fcurves(NULL, drivers, icu, actname, 
constname);
-                       else
+                       }
+                       else {
                                MEM_freeN(icu->driver);
+                               icu->driver= NULL;
+                       }
                }
                else
                        icu_to_fcurves(animgroups, anim, icu, actname, 
constname);
+       }
+       
+       /* if this IPO block doesn't have any users after this one, free... */
+       ipo->id.us--;
+       if ( (ipo->id.us == 0) || ((ipo->id.us == 1) && (ipo->id.flag & 
LIB_FAKEUSER)) ) 
+       {
+               IpoCurve *icn;
                
-               /* free this IpoCurve now that it's been converted */
-               BLI_freelinkN(&ipo->curve, icu);
+               for (icu= ipo->curve.first; icu; icu= icn) {
+                       icn= icu->next;
+                       
+                       /* free driver */
+                       if (icu->driver)
+                               MEM_freeN(icu->driver);
+                               
+                       /* free old data of curve now that it's no longer 
needed for converting any more curves */
+                       if (icu->bezt) MEM_freeN(icu->bezt);
+                       if (icu->bp) MEM_freeN(icu->bezt);
+                       
+                       /* free this IPO-Curve */
+                       BLI_freelinkN(&ipo->curve, icu);
+               }
        }
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c    2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/library.c    2009-09-30 
04:59:14 UTC (rev 23565)
@@ -640,42 +640,15 @@
 }
 
 /* by spec, animdata is first item after ID */
-/* we still read ->adt itself, to ensure compiler warns when it doesnt exist */
+/* and, trust that BKE_animdata_from_id() will only find AnimData for valid 
ID-types */
 static void id_copy_animdata(ID *id)
 {
-       switch(GS(id->name)) {
-               case ID_OB:
-                       ((Object *)id)->adt= BKE_copy_animdata(((Object 
*)id)->adt);
-                       break;
-               case ID_CU:
-                       ((Curve *)id)->adt= BKE_copy_animdata(((Curve 
*)id)->adt);
-                       break;
-               case ID_CA:
-                       ((Camera *)id)->adt= BKE_copy_animdata(((Camera 
*)id)->adt);
-                       break;
-               case ID_KE:
-                       ((Key *)id)->adt= BKE_copy_animdata(((Key *)id)->adt);
-                       break;
-               case ID_LA:
-                       ((Lamp *)id)->adt= BKE_copy_animdata(((Lamp *)id)->adt);
-                       break;
-               case ID_MA:
-                       ((Material *)id)->adt= BKE_copy_animdata(((Material 
*)id)->adt);
-                       break;
-               case ID_NT:
-                       ((bNodeTree *)id)->adt= BKE_copy_animdata(((bNodeTree 
*)id)->adt);
-                       break;
-               case ID_SCE:
-                       ((Scene *)id)->adt= BKE_copy_animdata(((Scene 
*)id)->adt);
-                       break;
-               case ID_TE:
-                       ((Tex *)id)->adt= BKE_copy_animdata(((Tex *)id)->adt);
-                       break;
-               case ID_WO:
-                       ((World *)id)->adt= BKE_copy_animdata(((World 
*)id)->adt);
-                       break;
-       }
+       AnimData *adt= BKE_animdata_from_id(id);
        
+       if (adt) {
+               IdAdtTemplate *iat = (IdAdtTemplate *)id;
+               iat->adt= BKE_copy_animdata(iat->adt);
+       }
 }
 
 /* used everywhere in blenkernel and text.c */
@@ -705,9 +678,10 @@
        id->newid= idn;
        idn->flag |= LIB_NEW;
        if (id->properties) idn->properties = IDP_CopyProperty(id->properties);
-
-       id_copy_animdata(id);
        
+       /* the duplicate should get a copy of the animdata */
+       id_copy_animdata(idn);
+       
        return idn;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/nla.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/nla.c        2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/nla.c        2009-09-30 
04:59:14 UTC (rev 23565)
@@ -219,6 +219,9 @@
        if ELEM(NULL, dst, src)
                return;
                
+       /* clear out the destination list first for precautions... */
+       dst->first= dst->last= NULL;
+               
        /* copy each NLA-track, one at a time */
        for (nlt= src->first; nlt; nlt= nlt->next) {
                /* make a copy, and add the copy to the destination list */

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2009-09-30 
04:59:14 UTC (rev 23565)
@@ -1268,7 +1268,7 @@
        /* increase user numbers */
        id_us_plus((ID *)obn->data);
        id_us_plus((ID *)obn->dup_group);
-       // FIXME: add this for animdata too...
+       
 
        for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
        
@@ -1922,31 +1922,6 @@
        
        if(ob==NULL) return;
        
-#if 0 // XXX old animation system
-       /* this is needed to be able to grab objects with ipos, otherwise it 
always freezes them */
-       stime= bsystem_time(scene, ob, ctime, 0.0);
-       if(stime != ob->ctime) {
-               
-               ob->ctime= stime;
-               
-               if(ob->ipo) {
-                       calc_ipo(ob->ipo, stime);
-                       execute_ipo((ID *)ob, ob->ipo);
-               }
-               else 
-                       do_all_object_actions(scene, ob);
-               
-               /* do constraint ipos ..., note it needs stime (0 = all ipos) */
-               do_constraint_channels(&ob->constraints, 
&ob->constraintChannels, stime, 0);
-       }
-       else {
-               /* but, the drivers have to be done */
-               if(ob->ipo) do_ob_ipodrivers(ob, ob->ipo, stime);
-               /* do constraint ipos ..., note it needs stime (1 = only 
drivers ipos) */
-               do_constraint_channels(&ob->constraints, 
&ob->constraintChannels, stime, 1);
-       }
-#endif // XXX old animation system
-
        /* execute drivers only, as animation has already been done */
        BKE_animsys_evaluate_animdata(&ob->id, ob->adt, ctime, 
ADT_RECALC_DRIVERS);
        

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c      2009-09-29 
22:49:33 UTC (rev 23564)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c      2009-09-30 
04:59:14 UTC (rev 23565)
@@ -778,11 +778,11 @@
        DAG_scene_update_flags(sce, lay);   // only stuff that moves or needs 
display still
        
        /* All 'standard' (i.e. without any dependencies) animation is handled 
here,
-               * with an 'local' to 'macro' order of evaluation. This should 
ensure that
-               * settings stored nestled within a hierarchy (i.e. settings in 
a Texture block
-           * can be overridden by settings from Scene, which owns the Texture 
through a hierarchy 
-           * such as Scene->World->MTex/Texture) can still get correctly 
overridden.
-               */
+        * with an 'local' to 'macro' order of evaluation. This should ensure 
that
+        * settings stored nestled within a hierarchy (i.e. settings in a 
Texture block

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to