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)...
This commit is contained in:
Bastien Montagne 2018-10-02 17:59:11 +02:00
parent 9d104f57b6
commit 9c02f6b1ed
3 changed files with 28 additions and 2 deletions

View File

@ -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,

View File

@ -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);
}
}
}

View File

@ -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
}