diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-10-02 18:59:11 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-10-02 19:00:42 +0300 |
commit | 9c02f6b1ed6fea5352ee161b146abff033a085e4 (patch) | |
tree | 4e482aef47bc7f834bea52604181df13489f6092 | |
parent | 9d104f57b60c8a82337e38bb44b2aef6a93ac840 (diff) |
Fix (unreported) memleak with legacy IKsolver.
Looks like new depsgraph may initialize some IK trees, without ever
executing them (which also frees them with legacy IKSolver code)...
-rw-r--r-- | source/blender/ikplugin/intern/ikplugin_api.c | 4 | ||||
-rw-r--r-- | source/blender/ikplugin/intern/iksolver_plugin.c | 24 | ||||
-rw-r--r-- | source/blender/ikplugin/intern/iksolver_plugin.h | 2 |
3 files changed, 28 insertions, 2 deletions
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c index d2681440177..80de0beb9f4 100644 --- a/source/blender/ikplugin/intern/ikplugin_api.c +++ b/source/blender/ikplugin/intern/ikplugin_api.c @@ -53,8 +53,8 @@ static IKPlugin ikplugin_tab[] = { { iksolver_initialize_tree, iksolver_execute_tree, - NULL, - NULL, + iksolver_release_tree, + iksolver_clear_data, NULL, NULL, NULL, diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c index 9248d85c809..0baaa406201 100644 --- a/source/blender/ikplugin/intern/iksolver_plugin.c +++ b/source/blender/ikplugin/intern/iksolver_plugin.c @@ -582,3 +582,27 @@ void iksolver_execute_tree(struct Depsgraph *depsgraph, struct Scene *scene, Obj free_posetree(tree); } } + +void iksolver_release_tree(struct Scene *UNUSED(scene), struct Object *ob, float UNUSED(ctime)) +{ + iksolver_clear_data(ob->pose); +} + +void iksolver_clear_data(bPose *pose) +{ + for (bPoseChannel *pchan = pose->chanbase.first; pchan; pchan = pchan->next) { + if ((pchan->flag & POSE_IKTREE) == 0) + continue; + + while (pchan->iktree.first) { + PoseTree *tree = pchan->iktree.first; + + /* stop on the first tree that isn't a standard IK chain */ + if (tree->type != CONSTRAINT_TYPE_KINEMATIC) + break; + + BLI_remlink(&pchan->iktree, tree); + free_posetree(tree); + } + } +} diff --git a/source/blender/ikplugin/intern/iksolver_plugin.h b/source/blender/ikplugin/intern/iksolver_plugin.h index cce9511630f..09eb7139192 100644 --- a/source/blender/ikplugin/intern/iksolver_plugin.h +++ b/source/blender/ikplugin/intern/iksolver_plugin.h @@ -45,6 +45,8 @@ void iksolver_initialize_tree( void iksolver_execute_tree( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan_root, float ctime); +void iksolver_release_tree(struct Scene *scene, struct Object *ob, float ctime); +void iksolver_clear_data(struct bPose *pose); #ifdef __cplusplus } |