diff --git a/source/blender/animrig/intern/keyframing.cc b/source/blender/animrig/intern/keyframing.cc index cc26df19d15..8b09b04c5aa 100644 --- a/source/blender/animrig/intern/keyframing.cc +++ b/source/blender/animrig/intern/keyframing.cc @@ -1015,9 +1015,11 @@ void insert_key_rna(PointerRNA *rna_pointer, /* Keyframing functions can deal with the nla_context being a nullptr. */ ListBase nla_cache = {nullptr, nullptr}; NlaKeyframingContext *nla_context = nullptr; + if (adt && adt->action == action) { + PointerRNA id_pointer = RNA_id_pointer_create(id); nla_context = BKE_animsys_get_nla_keyframing_context( - &nla_cache, rna_pointer, adt, &anim_eval_context); + &nla_cache, &id_pointer, adt, &anim_eval_context); } const float nla_frame = BKE_nla_tweakedit_remap(adt, scene_frame, NLATIME_CONVERT_UNMAP); diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 31617dd56b5..55528b67734 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -237,7 +237,7 @@ typedef struct NlaKeyframingContext NlaKeyframingContext; * * \param cache: List used to cache contexts for reuse when keying * multiple channels in one operation. - * \param ptr: RNA pointer to the Object with the animation. + * \param ptr: RNA pointer to the ID with the animation. * \return Keyframing context, or NULL if not necessary. */ struct NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context( diff --git a/source/blender/blenkernel/intern/anim_sys.cc b/source/blender/blenkernel/intern/anim_sys.cc index 8ac5231e8ce..7813ddd6e3d 100644 --- a/source/blender/blenkernel/intern/anim_sys.cc +++ b/source/blender/blenkernel/intern/anim_sys.cc @@ -3673,6 +3673,11 @@ void nlasnapshot_blend_get_inverted_lower_snapshot(NlaEvalData *eval_data, NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context( ListBase *cache, PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context) { + /* The PointerRNA needs to point to an ID because animsys_evaluate_nla_for_keyframing uses + * F-Curve paths to resolve properties. Since F-Curve paths are always relative to the ID this + * would fail if the PointerRNA was e.g. a bone. */ + BLI_assert(RNA_struct_is_ID(ptr->type)); + /* No remapping needed if NLA is off or no action. */ if ((adt == nullptr) || (adt->action == nullptr) || (adt->nla_tracks.first == nullptr) || (adt->flag & ADT_NLA_EVAL_OFF))