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:
parent
9d104f57b6
commit
9c02f6b1ed
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue