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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user