WIP COW Fix: Insert keyframe operators/api now queries depsgraph for evaluated data
When using copy on write, insert keyframe operators were reading from old bmain data instead of COW data. This meant that inserting keyframes would often read old/stale data, resulting in invalid keyframes getting created (e.g. from last transform operation, instead of actual current state). This commit makes it so that keyframing operators will ask depsgraph for the evaluated copy of the data, so that it can read values from that. It introduces a new function - `DEG_get_evaluated_rna_pointer()`, which when working correctly/fully, should work just like the other `DEG_get_evaluated_*()` functions, except it lets you pass in an RNA Pointer. However, currently, this is only done for Pose Bones (as a dirty hack, since this is an important/pivotal requirement for production) and/or datablock properties directly (since we can just use the DEG_get_evaluated_id() directly). on the datablock. Committing to a branch for now as this all needs more testing. More work to come later at a more sane time of day!
This commit is contained in:
@@ -85,6 +85,10 @@ struct Object *DEG_get_evaluated_object(const struct Depsgraph *depsgraph,
|
||||
struct ID *DEG_get_evaluated_id(const struct Depsgraph *depsgraph,
|
||||
struct ID *id);
|
||||
|
||||
/* Get evaluated version of data pointed to by RNA pointer */
|
||||
void DEG_get_evaluated_rna_pointer(const struct Depsgraph *depsgraph,
|
||||
const struct PointerRNA *ptr,
|
||||
struct PointerRNA *r_ptr_eval);
|
||||
|
||||
/* Get original version of object for given evaluated one. */
|
||||
struct Object *DEG_get_original_object(struct Object *object);
|
||||
|
||||
@@ -33,15 +33,21 @@
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
extern "C" {
|
||||
#include <string.h> // XXX: memcpy
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BKE_idcode.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BLI_listbase.h"
|
||||
|
||||
#include "BKE_action.h" // XXX: BKE_pose_channel_from_name
|
||||
} /* extern "C" */
|
||||
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
@@ -152,6 +158,39 @@ ID *DEG_get_evaluated_id(const Depsgraph *depsgraph, ID *id)
|
||||
return id_node->id_cow;
|
||||
}
|
||||
|
||||
/* Get evaluated version of data pointed to by RNA pointer */
|
||||
void DEG_get_evaluated_rna_pointer(const Depsgraph *depsgraph, const PointerRNA *ptr, PointerRNA *r_ptr_eval)
|
||||
{
|
||||
if ((ptr == NULL) || (r_ptr_eval == NULL)) {
|
||||
return;
|
||||
}
|
||||
if ((ptr->id.data == ptr->data)) {
|
||||
ID *orig_id = (ID *)ptr->id.data;
|
||||
ID *cow_id = DEG_get_evaluated_id(depsgraph, orig_id);
|
||||
/* For ID pointers, it's easy... */
|
||||
r_ptr_eval->id.data = (void *)cow_id;
|
||||
r_ptr_eval->data = (void *)cow_id;
|
||||
r_ptr_eval->type = ptr->type;
|
||||
}
|
||||
else {
|
||||
/* XXX: Hack for common cases... Proper fix needs to be made still... A very tricky problem though! */
|
||||
if (ptr->type == &RNA_PoseBone) {
|
||||
const Object *ob_eval = (Object *)DEG_get_evaluated_id(depsgraph, (ID *)ptr->id.data);
|
||||
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
||||
const bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name);
|
||||
/* XXX: Hack - This is just temporary... but this case must be supported. */
|
||||
r_ptr_eval->id.data = (void *)&ob_eval->id;
|
||||
r_ptr_eval->data = (void *)pchan_eval;
|
||||
r_ptr_eval->type = ptr->type;
|
||||
}
|
||||
else {
|
||||
/* FIXME: Maybe we should try resolving paths, or using some kind of depsgraph lookup? */
|
||||
// XXX: For now, just use dirty hack, and hope it doesn't cause nasty issues.
|
||||
*r_ptr_eval = *ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Object *DEG_get_original_object(Object *object)
|
||||
{
|
||||
return (Object *)DEG_get_original_id(&object->id);
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
|
||||
#include "GPU_immediate.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_interface_icons.h"
|
||||
#include "UI_resources.h"
|
||||
@@ -4097,6 +4099,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
FCurve *fcu = (FCurve *)fcu_poin;
|
||||
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
@@ -4122,7 +4125,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
|
||||
flag |= INSERTKEY_REPLACE;
|
||||
|
||||
/* insert a keyframe for this F-Curve */
|
||||
done = insert_keyframe_direct(reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
done = insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
|
||||
if (done)
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
|
||||
@@ -4136,6 +4139,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
|
||||
KeyBlock *kb = (KeyBlock *)kb_poin;
|
||||
char *rna_path = BKE_keyblock_curval_rnapath_get(key, kb);
|
||||
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
@@ -4166,7 +4170,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
|
||||
flag |= INSERTKEY_REPLACE;
|
||||
|
||||
/* insert a keyframe for this F-Curve */
|
||||
done = insert_keyframe_direct(reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
done = insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
|
||||
if (done)
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
|
||||
@@ -4187,6 +4191,7 @@ static void achannel_setting_slider_nla_curve_cb(bContext *C, void *UNUSED(id_po
|
||||
PropertyRNA *prop;
|
||||
int index;
|
||||
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
@@ -4209,7 +4214,7 @@ static void achannel_setting_slider_nla_curve_cb(bContext *C, void *UNUSED(id_po
|
||||
flag |= INSERTKEY_REPLACE;
|
||||
|
||||
/* insert a keyframe for this F-Curve */
|
||||
done = insert_keyframe_direct(reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
done = insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, ts->keyframe_type, flag);
|
||||
|
||||
if (done)
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
|
||||
|
||||
@@ -392,6 +392,7 @@ bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
|
||||
if (scene) {
|
||||
ac->markers = ED_context_get_markers(C);
|
||||
}
|
||||
ac->depsgraph = CTX_data_depsgraph(C);
|
||||
ac->view_layer = CTX_data_view_layer(C);
|
||||
ac->obact = (ac->view_layer->basact) ? ac->view_layer->basact->object : NULL;
|
||||
ac->sa = sa;
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_build.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "ED_anim_api.h"
|
||||
#include "ED_keyframing.h"
|
||||
@@ -615,31 +616,34 @@ static short new_key_needed(FCurve *fcu, float cFrame, float nValue)
|
||||
/* ------------------ RNA Data-Access Functions ------------------ */
|
||||
|
||||
/* Try to read value using RNA-properties obtained already */
|
||||
static float setting_get_rna_value(PointerRNA *ptr, PropertyRNA *prop, int index)
|
||||
static float setting_get_rna_value(Depsgraph *depsgraph, PointerRNA *ptr, PropertyRNA *prop, int index)
|
||||
{
|
||||
PointerRNA ptr_eval;
|
||||
float value = 0.0f;
|
||||
|
||||
DEG_get_evaluated_rna_pointer(depsgraph, ptr, &ptr_eval);
|
||||
|
||||
switch (RNA_property_type(prop)) {
|
||||
case PROP_BOOLEAN:
|
||||
if (RNA_property_array_check(prop))
|
||||
value = (float)RNA_property_boolean_get_index(ptr, prop, index);
|
||||
value = (float)RNA_property_boolean_get_index(&ptr_eval, prop, index);
|
||||
else
|
||||
value = (float)RNA_property_boolean_get(ptr, prop);
|
||||
value = (float)RNA_property_boolean_get(&ptr_eval, prop);
|
||||
break;
|
||||
case PROP_INT:
|
||||
if (RNA_property_array_check(prop))
|
||||
value = (float)RNA_property_int_get_index(ptr, prop, index);
|
||||
value = (float)RNA_property_int_get_index(&ptr_eval, prop, index);
|
||||
else
|
||||
value = (float)RNA_property_int_get(ptr, prop);
|
||||
value = (float)RNA_property_int_get(&ptr_eval, prop);
|
||||
break;
|
||||
case PROP_FLOAT:
|
||||
if (RNA_property_array_check(prop))
|
||||
value = RNA_property_float_get_index(ptr, prop, index);
|
||||
value = RNA_property_float_get_index(&ptr_eval, prop, index);
|
||||
else
|
||||
value = RNA_property_float_get(ptr, prop);
|
||||
value = RNA_property_float_get(&ptr_eval, prop);
|
||||
break;
|
||||
case PROP_ENUM:
|
||||
value = (float)RNA_property_enum_get(ptr, prop);
|
||||
value = (float)RNA_property_enum_get(&ptr_eval, prop);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -800,7 +804,7 @@ static bool visualkey_can_use(PointerRNA *ptr, PropertyRNA *prop)
|
||||
* In the event that it is not possible to perform visual keying, try to fall-back
|
||||
* to using the default method. Assumes that all data it has been passed is valid.
|
||||
*/
|
||||
static float visualkey_get_value(PointerRNA *ptr, PropertyRNA *prop, int array_index)
|
||||
static float visualkey_get_value(Depsgraph *depsgraph, PointerRNA *ptr, PropertyRNA *prop, int array_index)
|
||||
{
|
||||
const char *identifier = RNA_property_identifier(prop);
|
||||
float tmat[4][4];
|
||||
@@ -815,20 +819,25 @@ static float visualkey_get_value(PointerRNA *ptr, PropertyRNA *prop, int array_i
|
||||
*/
|
||||
if (ptr->type == &RNA_Object) {
|
||||
Object *ob = (Object *)ptr->data;
|
||||
const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
|
||||
/* Loc code is specific... */
|
||||
if (strstr(identifier, "location")) {
|
||||
return ob->obmat[3][array_index];
|
||||
return ob_eval->obmat[3][array_index];
|
||||
}
|
||||
|
||||
copy_m4_m4(tmat, ob->obmat);
|
||||
rotmode = ob->rotmode;
|
||||
copy_m4_m4(tmat, ob_eval->obmat);
|
||||
rotmode = ob_eval->rotmode;
|
||||
}
|
||||
else if (ptr->type == &RNA_PoseBone) {
|
||||
Object *ob = (Object *)ptr->id.data;
|
||||
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
||||
|
||||
BKE_armature_mat_pose_to_bone(pchan, pchan->pose_mat, tmat);
|
||||
rotmode = pchan->rotmode;
|
||||
const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name);
|
||||
|
||||
BKE_armature_mat_pose_to_bone(pchan_eval, pchan_eval->pose_mat, tmat);
|
||||
rotmode = pchan_eval->rotmode;
|
||||
|
||||
/* Loc code is specific... */
|
||||
if (strstr(identifier, "location")) {
|
||||
@@ -838,7 +847,7 @@ static float visualkey_get_value(PointerRNA *ptr, PropertyRNA *prop, int array_i
|
||||
}
|
||||
}
|
||||
else {
|
||||
return setting_get_rna_value(ptr, prop, array_index);
|
||||
return setting_get_rna_value(depsgraph, ptr, prop, array_index);
|
||||
}
|
||||
|
||||
/* Rot/Scale code are common! */
|
||||
@@ -876,7 +885,7 @@ static float visualkey_get_value(PointerRNA *ptr, PropertyRNA *prop, int array_i
|
||||
}
|
||||
|
||||
/* as the function hasn't returned yet, read value from system in the default way */
|
||||
return setting_get_rna_value(ptr, prop, array_index);
|
||||
return setting_get_rna_value(depsgraph, ptr, prop, array_index);
|
||||
}
|
||||
|
||||
/* ------------------------- Insert Key API ------------------------- */
|
||||
@@ -891,7 +900,7 @@ static float visualkey_get_value(PointerRNA *ptr, PropertyRNA *prop, int array_i
|
||||
* the keyframe insertion. These include the 'visual' keyframing modes, quick refresh,
|
||||
* and extra keyframe filtering.
|
||||
*/
|
||||
bool insert_keyframe_direct(ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag)
|
||||
bool insert_keyframe_direct(Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag)
|
||||
{
|
||||
float curval = 0.0f;
|
||||
|
||||
@@ -957,11 +966,11 @@ bool insert_keyframe_direct(ReportList *reports, PointerRNA ptr, PropertyRNA *pr
|
||||
* it works by keyframing using a value extracted from the final matrix
|
||||
* instead of using the kt system to extract a value.
|
||||
*/
|
||||
curval = visualkey_get_value(&ptr, prop, fcu->array_index);
|
||||
curval = visualkey_get_value(depsgraph, &ptr, prop, fcu->array_index);
|
||||
}
|
||||
else {
|
||||
/* read value from system */
|
||||
curval = setting_get_rna_value(&ptr, prop, fcu->array_index);
|
||||
curval = setting_get_rna_value(depsgraph, &ptr, prop, fcu->array_index);
|
||||
}
|
||||
|
||||
/* only insert keyframes where they are needed */
|
||||
@@ -1010,7 +1019,7 @@ bool insert_keyframe_direct(ReportList *reports, PointerRNA ptr, PropertyRNA *pr
|
||||
*
|
||||
* index of -1 keys all array indices
|
||||
*/
|
||||
short insert_keyframe(ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag)
|
||||
short insert_keyframe(Depsgraph *depsgraph, ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag)
|
||||
{
|
||||
PointerRNA id_ptr, ptr;
|
||||
PropertyRNA *prop = NULL;
|
||||
@@ -1088,7 +1097,7 @@ short insert_keyframe(ReportList *reports, ID *id, bAction *act, const char grou
|
||||
}
|
||||
|
||||
/* insert keyframe */
|
||||
ret += insert_keyframe_direct(reports, ptr, prop, fcu, cfra, keytype, flag);
|
||||
ret += insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, keytype, flag);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1761,6 +1770,7 @@ void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot)
|
||||
|
||||
static int insert_key_button_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
PointerRNA ptr = {{NULL}};
|
||||
@@ -1793,7 +1803,7 @@ static int insert_key_button_exec(bContext *C, wmOperator *op)
|
||||
FCurve *fcu = list_find_fcurve(&strip->fcurves, RNA_property_identifier(prop), index);
|
||||
|
||||
if (fcu) {
|
||||
success = insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, 0);
|
||||
success = insert_keyframe_direct(depsgraph, op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, 0);
|
||||
}
|
||||
else {
|
||||
BKE_report(op->reports, RPT_ERROR,
|
||||
@@ -1808,7 +1818,7 @@ static int insert_key_button_exec(bContext *C, wmOperator *op)
|
||||
fcu = rna_get_fcurve_context_ui(C, &ptr, prop, index, NULL, NULL, &driven, &special);
|
||||
|
||||
if (fcu && driven) {
|
||||
success = insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER);
|
||||
success = insert_keyframe_direct(depsgraph, op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -1821,7 +1831,7 @@ static int insert_key_button_exec(bContext *C, wmOperator *op)
|
||||
index = -1;
|
||||
}
|
||||
|
||||
success = insert_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index, cfra, ts->keyframe_type, flag);
|
||||
success = insert_keyframe(depsgraph, op->reports, ptr.id.data, NULL, NULL, path, index, cfra, ts->keyframe_type, flag);
|
||||
|
||||
MEM_freeN(path);
|
||||
}
|
||||
|
||||
@@ -958,6 +958,7 @@ static short keyingset_apply_keying_flags(const short base_flags, const short ov
|
||||
*/
|
||||
int ANIM_apply_keyingset(bContext *C, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra)
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
KS_Path *ksp;
|
||||
@@ -1038,7 +1039,7 @@ int ANIM_apply_keyingset(bContext *C, ListBase *dsources, bAction *act, KeyingSe
|
||||
for (; i < arraylen; i++) {
|
||||
/* action to take depends on mode */
|
||||
if (mode == MODIFYKEY_MODE_INSERT)
|
||||
success += insert_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, keytype, kflag2);
|
||||
success += insert_keyframe(depsgraph, reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, keytype, kflag2);
|
||||
else if (mode == MODIFYKEY_MODE_DELETE)
|
||||
success += delete_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob)
|
||||
else
|
||||
BKE_pose_where_is(depsgraph, scene, ob);
|
||||
|
||||
/* note, notifier might evolve */
|
||||
DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); /* otherwise animation doesn't get updated */
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
|
||||
}
|
||||
|
||||
|
||||
@@ -373,7 +373,7 @@ static void gp_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd, RNG *rn
|
||||
}
|
||||
}
|
||||
|
||||
static void gp_stroke_path_animation_add_keyframes(ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
|
||||
static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
|
||||
Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range,
|
||||
const int nbr_gaps, const float tot_gaps_time)
|
||||
{
|
||||
@@ -422,7 +422,7 @@ static void gp_stroke_path_animation_add_keyframes(ReportList *reports, PointerR
|
||||
if ((cfra - last_valid_time) < MIN_TIME_DELTA) {
|
||||
cfra = last_valid_time + MIN_TIME_DELTA;
|
||||
}
|
||||
insert_keyframe_direct(reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
last_valid_time = cfra;
|
||||
}
|
||||
else if (G.debug & G_DEBUG) {
|
||||
@@ -434,7 +434,7 @@ static void gp_stroke_path_animation_add_keyframes(ReportList *reports, PointerR
|
||||
if ((cfra - last_valid_time) < MIN_TIME_DELTA) {
|
||||
cfra = last_valid_time + MIN_TIME_DELTA;
|
||||
}
|
||||
insert_keyframe_direct(reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
last_valid_time = cfra;
|
||||
}
|
||||
else {
|
||||
@@ -442,7 +442,7 @@ static void gp_stroke_path_animation_add_keyframes(ReportList *reports, PointerR
|
||||
* and also far enough from (not yet added!) end_stroke keyframe!
|
||||
*/
|
||||
if ((cfra - last_valid_time) > MIN_TIME_DELTA && (end_stroke_time - cfra) > MIN_TIME_DELTA) {
|
||||
insert_keyframe_direct(reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_BREAKDOWN, INSERTKEY_FAST);
|
||||
insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_BREAKDOWN, INSERTKEY_FAST);
|
||||
last_valid_time = cfra;
|
||||
}
|
||||
else if (G.debug & G_DEBUG) {
|
||||
@@ -455,6 +455,7 @@ static void gp_stroke_path_animation_add_keyframes(ReportList *reports, PointerR
|
||||
|
||||
static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu, tGpTimingData *gtd)
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
bAction *act;
|
||||
FCurve *fcu;
|
||||
@@ -496,7 +497,7 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
|
||||
|
||||
cu->ctime = 0.0f;
|
||||
cfra = (float)gtd->start_frame;
|
||||
insert_keyframe_direct(reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
|
||||
cu->ctime = cu->pathlen;
|
||||
if (gtd->realtime) {
|
||||
@@ -505,7 +506,7 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
|
||||
else {
|
||||
cfra = (float)gtd->end_frame;
|
||||
}
|
||||
insert_keyframe_direct(reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
insert_keyframe_direct(depsgraph, reports, ptr, prop, fcu, cfra, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_FAST);
|
||||
}
|
||||
else {
|
||||
/* Use actual recorded timing! */
|
||||
@@ -531,7 +532,7 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
|
||||
printf("GP Stroke Path Conversion: Starting keying!\n");
|
||||
}
|
||||
|
||||
gp_stroke_path_animation_add_keyframes(reports, ptr, prop, fcu, cu, gtd, rng, time_range,
|
||||
gp_stroke_path_animation_add_keyframes(depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range,
|
||||
nbr_gaps, tot_gaps_time);
|
||||
|
||||
BLI_rng_free(rng);
|
||||
|
||||
@@ -81,6 +81,7 @@ typedef struct bAnimContext {
|
||||
|
||||
struct bDopeSheet *ads; /* dopesheet data for editor (or which is being used) */
|
||||
|
||||
struct Depsgraph *depsgraph; /* active dependency graph */
|
||||
struct Scene *scene; /* active scene */
|
||||
struct ViewLayer *view_layer; /* active scene layer */
|
||||
struct Object *obact; /* active object */
|
||||
|
||||
@@ -50,6 +50,8 @@ struct bPoseChannel;
|
||||
struct bContext;
|
||||
struct ReportList;
|
||||
|
||||
struct Depsgraph;
|
||||
|
||||
struct PointerRNA;
|
||||
struct PropertyRNA;
|
||||
struct EnumPropertyItem;
|
||||
@@ -107,7 +109,7 @@ int insert_vert_fcurve(struct FCurve *fcu, float x, float y, eBezTriple_Keyframe
|
||||
* Use this to insert a keyframe using the current value being keyframed, in the
|
||||
* nominated F-Curve (no creation of animation data performed). Returns success.
|
||||
*/
|
||||
bool insert_keyframe_direct(struct ReportList *reports, struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag);
|
||||
bool insert_keyframe_direct(struct Depsgraph *depsgraph,struct ReportList *reports, struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag);
|
||||
|
||||
/* -------- */
|
||||
|
||||
@@ -115,7 +117,7 @@ bool insert_keyframe_direct(struct ReportList *reports, struct PointerRNA ptr, s
|
||||
* Use this to create any necessary animation data, and then insert a keyframe
|
||||
* using the current value being keyframed, in the relevant place. Returns success.
|
||||
*/
|
||||
short insert_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag);
|
||||
short insert_keyframe(struct Depsgraph *depsgraph, struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag);
|
||||
|
||||
/* Main Keyframing API call:
|
||||
* Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case.
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_nla.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_build.h"
|
||||
|
||||
#include "ED_keyframing.h"
|
||||
@@ -239,10 +240,11 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
|
||||
if (special) {
|
||||
/* NLA Strip property */
|
||||
if (IS_AUTOKEY_ON(scene)) {
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
|
||||
insert_keyframe_direct(reports, but->rnapoin, but->rnaprop, fcu, cfra, ts->keyframe_type, 0);
|
||||
insert_keyframe_direct(depsgraph, reports, but->rnapoin, but->rnaprop, fcu, cfra, ts->keyframe_type, 0);
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
|
||||
}
|
||||
}
|
||||
@@ -251,10 +253,11 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
|
||||
* making it easier to set up corrective drivers
|
||||
*/
|
||||
if (IS_AUTOKEY_ON(scene)) {
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
|
||||
insert_keyframe_direct(reports, but->rnapoin, but->rnaprop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER);
|
||||
insert_keyframe_direct(depsgraph, reports, but->rnapoin, but->rnaprop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER);
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
|
||||
}
|
||||
}
|
||||
@@ -263,6 +266,7 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
|
||||
|
||||
/* TODO: this should probably respect the keyingset only option for anim */
|
||||
if (autokeyframe_cfra_can_key(scene, id)) {
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
short flag = ANIM_get_keyframing_flags(scene, 1);
|
||||
@@ -273,7 +277,8 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
|
||||
* because a button may control all items of an array at once.
|
||||
* E.g., color wheels (see T42567). */
|
||||
BLI_assert((fcu->array_index == but->rnaindex) || (but->rnaindex == -1));
|
||||
insert_keyframe(reports, id, action, ((fcu->grp) ? (fcu->grp->name) : (NULL)),
|
||||
insert_keyframe(depsgraph, reports, id, action,
|
||||
((fcu->grp) ? (fcu->grp->name) : (NULL)),
|
||||
fcu->rna_path, but->rnaindex, cfra, ts->keyframe_type, flag);
|
||||
|
||||
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
|
||||
|
||||
@@ -673,6 +673,7 @@ static void insert_action_keys(bAnimContext *ac, short mode)
|
||||
bAnimListElem *ale;
|
||||
int filter;
|
||||
|
||||
struct Depsgraph *depsgraph = ac->depsgraph;
|
||||
ReportList *reports = ac->reports;
|
||||
Scene *scene = ac->scene;
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
@@ -707,7 +708,7 @@ static void insert_action_keys(bAnimContext *ac, short mode)
|
||||
* (TODO: add the full-blown PointerRNA relative parsing case here...)
|
||||
*/
|
||||
if (ale->id && !ale->owner) {
|
||||
insert_keyframe(reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
|
||||
insert_keyframe(depsgraph, reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
|
||||
}
|
||||
else {
|
||||
const float curval = evaluate_fcurve(fcu, cfra);
|
||||
|
||||
@@ -526,6 +526,7 @@ static void insert_graph_keys(bAnimContext *ac, eGraphKeys_InsertKey_Types mode)
|
||||
|
||||
ReportList *reports = ac->reports;
|
||||
SpaceIpo *sipo = (SpaceIpo *)ac->sl;
|
||||
struct Depsgraph *depsgraph = ac->depsgraph;
|
||||
Scene *scene = ac->scene;
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
short flag = 0;
|
||||
@@ -608,7 +609,7 @@ static void insert_graph_keys(bAnimContext *ac, eGraphKeys_InsertKey_Types mode)
|
||||
* up adding the keyframes on a new F-Curve in the action data instead.
|
||||
*/
|
||||
if (ale->id && !ale->owner && !fcu->driver) {
|
||||
insert_keyframe(reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
|
||||
insert_keyframe(depsgraph, reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
|
||||
}
|
||||
else {
|
||||
const float curval = evaluate_fcurve(fcu, cfra);
|
||||
|
||||
@@ -5892,6 +5892,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, ViewLayer *view_layer, O
|
||||
|
||||
// TODO: this should probably be done per channel instead...
|
||||
if (autokeyframe_cfra_can_key(scene, id)) {
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
|
||||
@@ -5918,7 +5919,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, ViewLayer *view_layer, O
|
||||
if (adt && adt->action) {
|
||||
for (fcu = adt->action->curves.first; fcu; fcu = fcu->next) {
|
||||
fcu->flag &= ~FCURVE_SELECTED;
|
||||
insert_keyframe(reports, id, adt->action,
|
||||
insert_keyframe(depsgraph, reports, id, adt->action,
|
||||
(fcu->grp ? fcu->grp->name : NULL),
|
||||
fcu->rna_path, fcu->array_index, cfra,
|
||||
ts->keyframe_type, flag);
|
||||
@@ -6016,6 +6017,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, Object *ob, int tmode,
|
||||
|
||||
// TODO: this should probably be done per channel instead...
|
||||
if (autokeyframe_cfra_can_key(scene, id)) {
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
ReportList *reports = CTX_wm_reports(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
|
||||
@@ -6059,7 +6061,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, Object *ob, int tmode,
|
||||
* NOTE: this will do constraints too, but those are ok to do here too?
|
||||
*/
|
||||
if (pchanName && STREQ(pchanName, pchan->name)) {
|
||||
insert_keyframe(reports, id, act,
|
||||
insert_keyframe(depsgraph, reports, id, act,
|
||||
((fcu->grp) ? (fcu->grp->name) : (NULL)),
|
||||
fcu->rna_path, fcu->array_index, cfra,
|
||||
ts->keyframe_type, flag);
|
||||
|
||||
@@ -231,6 +231,7 @@ PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyOb
|
||||
* strips themselves. These are stored separately or else the properties will
|
||||
* not have any effect.
|
||||
*/
|
||||
struct Depsgraph *depsgraph = CTX_data_depsgraph(BPy_GetContext());
|
||||
ReportList reports;
|
||||
short result = 0;
|
||||
|
||||
@@ -252,7 +253,7 @@ PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyOb
|
||||
NlaStrip *strip = (NlaStrip *)ptr.data;
|
||||
FCurve *fcu = list_find_fcurve(&strip->fcurves, RNA_property_identifier(prop), index);
|
||||
|
||||
result = insert_keyframe_direct(&reports, ptr, prop, fcu, cfra, keytype, options);
|
||||
result = insert_keyframe_direct(depsgraph, &reports, ptr, prop, fcu, cfra, keytype, options);
|
||||
}
|
||||
else {
|
||||
BKE_reportf(&reports, RPT_ERROR, "Could not resolve path (%s)", path_full);
|
||||
@@ -265,12 +266,13 @@ PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyOb
|
||||
return PyBool_FromLong(result);
|
||||
}
|
||||
else {
|
||||
struct Depsgraph *depsgraph = CTX_data_depsgraph(BPy_GetContext());
|
||||
ReportList reports;
|
||||
short result;
|
||||
|
||||
BKE_reports_init(&reports, RPT_STORE);
|
||||
|
||||
result = insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, keytype, options);
|
||||
result = insert_keyframe(depsgraph, &reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, keytype, options);
|
||||
MEM_freeN((void *)path_full);
|
||||
|
||||
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, true) == -1)
|
||||
|
||||
Reference in New Issue
Block a user