Revision: 18644
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18644
Author:   aligorith
Date:     2009-01-24 09:21:39 +0100 (Sat, 24 Jan 2009)

Log Message:
-----------
Animato - FCurve Modifier Bugfixes

* FModifier data is now allocated correctly, solving crashes on loading files 
containing IPO-curves with cyclic extrapolation
* Fixed memory leaks with FModifiers and their data not being freed correctly. 
Not sure exactly why the old code didn't work for this.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c       
2009-01-24 06:08:46 UTC (rev 18643)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c       
2009-01-24 08:21:39 UTC (rev 18644)
@@ -1412,10 +1412,13 @@
                return NULL;
        }
        
-       /* add modifier data */
+       /* add modifier itself */
        fcm= MEM_callocN(sizeof(FModifier), "F-Curve Modifier");
        BLI_addtail(&fcu->modifiers, fcm);
        
+       /* add modifier's data */
+       fcm->data= MEM_callocN(fmi->size, "F-Curve Modifier Data");
+               
        /* init custom settings if necessary */
        if (fmi->new_data)      
                fmi->new_data(fcm->data);
@@ -1452,16 +1455,25 @@
 {
        FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
        
-       /* sanity checks */
-       if ELEM3(NULL, fcu, fcm, fmi)
+       /* sanity check */
+       if (fcm == NULL)
                return;
+       
+       /* free modifier's special data (stored inside fcm->data) */
+       if (fmi && fmi->free_data)
+               fmi->free_data(fcm);
                
-       /* free modifier's special data */
-       if (fmi->free_data)
-               fmi->free_data(fcm);
+       /* free modifier's data (fcm->data) */
+       MEM_freeN(fcm->data);
        
        /* remove modifier from stack */
-       BLI_freelinkN(&fcu->modifiers, fcm);
+       if (fcu)
+               BLI_freelinkN(&fcu->modifiers, fcm);
+       else {
+               // XXX this case can probably be removed some day, as it 
shouldn't happen...
+               printf("fcurve_remove_modifier() - no fcurve \n");
+               MEM_freeN(fcm);
+       }
 }
 
 /* Remove all of a given F-Curve's modifiers */


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

Reply via email to