parent
3cbe95f683
commit
b1c6ddb107
|
@ -36,12 +36,15 @@
|
|||
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_anim_types.h"
|
||||
|
||||
#include "ED_keyframing.h"
|
||||
#include "ED_keyframes_edit.h"
|
||||
|
||||
#include "BKE_report.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_animsys.h"
|
||||
#include "BKE_fcurve.h"
|
||||
#include "BKE_idcode.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_enum_types.h"
|
||||
|
@ -310,6 +313,67 @@ PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyOb
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
else if (self->ptr.type == &RNA_NlaStrip) {
|
||||
/* Handle special properties for NLA Strips, whose F-Curves are stored on the
|
||||
* strips themselves. These are stored separately or else the properties will
|
||||
* not have any effect.
|
||||
*/
|
||||
ReportList reports;
|
||||
short result = 0;
|
||||
|
||||
PointerRNA ptr = self->ptr;
|
||||
PropertyRNA *prop = NULL;
|
||||
const char *prop_name;
|
||||
|
||||
BKE_reports_init(&reports, RPT_STORE);
|
||||
|
||||
/* Retrieve the property identifier from the full path, since we can't get it any other way */
|
||||
prop_name = strrchr(path_full, '.');
|
||||
if ((prop_name >= path_full) &&
|
||||
(prop_name + 1 < path_full + strlen(path_full)))
|
||||
{
|
||||
prop = RNA_struct_find_property(&ptr, prop_name + 1);
|
||||
}
|
||||
|
||||
if (prop) {
|
||||
ID *id = ptr.id.data;
|
||||
NlaStrip *strip = (NlaStrip *)ptr.data;
|
||||
FCurve *fcu = list_find_fcurve(&strip->fcurves, RNA_property_identifier(prop), index);
|
||||
|
||||
BLI_assert(fcu != NULL); /* NOTE: This should be true, or else we wouldn't be able to get here */
|
||||
|
||||
if (BKE_fcurve_is_protected(fcu)) {
|
||||
BKE_reportf(&reports, RPT_WARNING,
|
||||
"Not deleting keyframe for locked F-Curve for NLA Strip influence on %s - %s '%s'",
|
||||
strip->name, BKE_idcode_to_name(GS(id->name)), id->name + 2);
|
||||
}
|
||||
else {
|
||||
/* remove the keyframe directly
|
||||
* NOTE: cannot use delete_keyframe_fcurve(), as that will free the curve,
|
||||
* and delete_keyframe() expects the FCurve to be part of an action
|
||||
*/
|
||||
bool found = false;
|
||||
int i;
|
||||
|
||||
/* try to find index of beztriple to get rid of */
|
||||
i = binarysearch_bezt_index(fcu->bezt, cfra, fcu->totvert, &found);
|
||||
if (found) {
|
||||
/* delete the key at the index (will sanity check + do recalc afterwards) */
|
||||
delete_fcurve_key(fcu, i, 1);
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
BKE_reportf(&reports, RPT_ERROR, "Could not resolve path (%s)", path_full);
|
||||
}
|
||||
MEM_freeN((void *)path_full);
|
||||
|
||||
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, true) == -1)
|
||||
return NULL;
|
||||
|
||||
return PyBool_FromLong(result);
|
||||
}
|
||||
else {
|
||||
short result;
|
||||
ReportList reports;
|
||||
|
|
Loading…
Reference in New Issue