Fix #141243: Crash when removing constraints with drivers via python

The issue was that the depsgraph was not rebuilt, thus
the driver node still stuck around. This then crashed when the
depsgraph evaluated.

The reason why this wasn't caught in the unit tests, was because the
depsgraph was not updated between creating and removing the data.

Pull Request: https://projects.blender.org/blender/blender/pulls/141272
This commit is contained in:
Christoph Lendenfeld
2025-07-01 14:28:27 +02:00
committed by Christoph Lendenfeld
parent 03183c3328
commit 3233ddc3b3
3 changed files with 13 additions and 0 deletions

View File

@@ -4238,6 +4238,13 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, ID *id, int driver_index, FCu
fcu = static_cast<FCurve *>(BLI_findlink(&adt->drivers, driver_index));
}
if (!fcu) {
/* Trying to evaluate a driver that does no longer exist. Potentially missing a call to
* DEG_relations_tag_update. */
BLI_assert_unreachable();
return;
}
DEG_debug_print_eval_subdata_index(
depsgraph, __func__, id->name, id, "fcu", fcu->rna_path, fcu, fcu->array_index);

View File

@@ -392,6 +392,7 @@ static void rna_PoseChannel_constraints_remove(
con_ptr->invalidate();
blender::ed::object::constraint_update(bmain, ob);
DEG_relations_tag_update(bmain);
/* XXX(@ideasman42): is this really needed? */
BKE_constraints_active_set(&pchan->constraints, nullptr);

View File

@@ -236,6 +236,11 @@ class SubDataDriverRemovalTest(AbstractEmptyDriverTest, unittest.TestCase):
self.assertEqual(len(pose_bone.constraints), 1)
arm_ob.driver_add('pose.bones["test"].constraints["test"].distance')
self.assertEqual(len(arm_ob.animation_data.drivers), 1)
# To do a proper test, the depsgraph needs to be evaluated between adding
# the data and removing it. This causes depsgraph nodes to be built, which
# have to be removed as well. See #141243
bpy.context.evaluated_depsgraph_get()
pose_bone.constraints.remove(constraint)
self.assertEqual(len(pose_bone.constraints), 0)
self.assertEqual(len(arm_ob.animation_data.drivers), 0,