diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-11-21 14:26:09 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-11-21 14:26:09 +0300 |
commit | 684405e0fb80216dbafbe4dcea3cd21cc18c17c9 (patch) | |
tree | 0c5e5f92db6d123d38dcd3827fc37d3050807edf /source/blender/blenkernel | |
parent | 6073bc9bc3f935e4018fd0cc1fc3d2b1db6fc0b6 (diff) |
id properties for editbones and pose channels were not being freed in a number of cases,
added free_pose_channel(pchan) and use this in all places that free pose bones
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_action.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/action.c | 23 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 7 |
3 files changed, 26 insertions, 10 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 17b56864d1e..e0b65c1996f 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -118,6 +118,12 @@ struct bActionGroup *action_groups_find_named(struct bAction *act, const char na /* Pose API ----------------- */ /** + * Deallocates a pose channel. + * Does not free the pose channel itself. + */ +void free_pose_channel(struct bPoseChannel *pchan); + +/** * Removes and deallocates all channels from a pose. * Does not free the pose itself. */ diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 33f3658c53b..b359ab6ee87 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -62,6 +62,8 @@ #include "BKE_main.h" #include "BKE_object.h" #include "BKE_utildefines.h" +#include "BKE_idprop.h" + #include "BIK_api.h" #include "BLI_math.h" @@ -564,16 +566,27 @@ void init_pose_ikparam(bPose *pose) } } +void free_pose_channel(bPoseChannel *pchan) +{ + if (pchan->path) + MEM_freeN(pchan->path); + + free_constraints(&pchan->constraints); + + if(pchan->prop) { + IDP_FreeProperty(pchan->prop); + MEM_freeN(pchan->prop); + } +} + void free_pose_channels(bPose *pose) { bPoseChannel *pchan; if (pose->chanbase.first) { - for (pchan = pose->chanbase.first; pchan; pchan=pchan->next){ - if (pchan->path) - MEM_freeN(pchan->path); - free_constraints(&pchan->constraints); - } + for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) + free_pose_channel(pchan); + BLI_freelistN(&pose->chanbase); } } diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 81630faccd1..a63ff4ed599 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1530,8 +1530,7 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected } /* free stuff from current channel */ - if (pchan->path) MEM_freeN(pchan->path); - free_constraints(&pchan->constraints); + free_pose_channel(pchan); /* the final copy */ *pchan= pchanw; @@ -1586,9 +1585,7 @@ void armature_rebuild_pose(Object *ob, bArmature *arm) for(pchan= pose->chanbase.first; pchan; pchan= next) { next= pchan->next; if(pchan->bone==NULL) { - if(pchan->path) - MEM_freeN(pchan->path); - free_constraints(&pchan->constraints); + free_pose_channel(pchan); BLI_freelinkN(&pose->chanbase, pchan); } } |