Compare commits
4 Commits
temp-copy-
...
tmp-COW_In
Author | SHA1 | Date | |
---|---|---|---|
d56df9d135 | |||
b8e44cc194 | |||
8451f3fabc | |||
57abe7b132 |
@@ -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,
|
||||
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,60 @@ 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, PointerRNA *ptr, PointerRNA *r_ptr_eval)
|
||||
{
|
||||
if ((ptr == NULL) || (r_ptr_eval == NULL)) {
|
||||
return;
|
||||
}
|
||||
ID *orig_id = (ID *)ptr->id.data;
|
||||
ID *cow_id = DEG_get_evaluated_id(depsgraph, orig_id);
|
||||
if (ptr->id.data == ptr->data) {
|
||||
/* 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 if (ptr->type == &RNA_PoseBone) {
|
||||
/* HACK: Since bone keyframing is quite commonly used,
|
||||
* speed things up for this case by doing a special lookup
|
||||
* for bones
|
||||
*/
|
||||
const Object *ob_eval = (Object *)cow_id;
|
||||
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
||||
const bPoseChannel *pchan_eval = BKE_pose_channel_find_name(ob_eval->pose, pchan->name);
|
||||
r_ptr_eval->id.data = (void *)cow_id;
|
||||
r_ptr_eval->data = (void *)pchan_eval;
|
||||
r_ptr_eval->type = ptr->type;
|
||||
}
|
||||
else {
|
||||
/* For everything else, try to get RNA Path of the BMain-pointer,
|
||||
* then use that to look up what the COW-domain one should be
|
||||
* given the COW ID pointer as the new lookup point
|
||||
*/
|
||||
/* TODO: Find a faster alternative, or implement support for other
|
||||
* common types too above (e.g. modifiers)
|
||||
*/
|
||||
char *path = RNA_path_from_ID_to_struct(ptr);
|
||||
if (path) {
|
||||
PointerRNA cow_id_ptr;
|
||||
RNA_id_pointer_create(cow_id, &cow_id_ptr);
|
||||
if (!RNA_path_resolve(&cow_id_ptr, path, r_ptr_eval, NULL)) {
|
||||
/* Couldn't find COW copy of data */
|
||||
fprintf(stderr,
|
||||
"%s: Couldn't resolve RNA path ('%s') relative to COW ID (%p) for '%s'\n",
|
||||
__func__, path, (void *)cow_id, orig_id->name);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Path resolution failed - XXX: Hide this behind a debug flag */
|
||||
fprintf(stderr,
|
||||
"%s: Couldn't get RNA path for %s relative to %s\n",
|
||||
__func__, RNA_struct_identifier(ptr->type), orig_id->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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