Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-10-02 18:59:11 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-10-02 19:00:42 +0300
commit9c02f6b1ed6fea5352ee161b146abff033a085e4 (patch)
tree4e482aef47bc7f834bea52604181df13489f6092 /source/blender/ikplugin
parent9d104f57b60c8a82337e38bb44b2aef6a93ac840 (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)...
Diffstat (limited to 'source/blender/ikplugin')
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c4
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c24
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.h2
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
}