[Bf-blender-cvs] [0628fe7a6cf] blender2.8: Followup to previous change, reduce number of relations updates

Sergey Sharybin noreply at git.blender.org
Mon Oct 22 17:14:43 CEST 2018


Commit: 0628fe7a6cf33bec370a4db53bb9d5980fa40162
Author: Sergey Sharybin
Date:   Mon Oct 22 17:13:19 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB0628fe7a6cf33bec370a4db53bb9d5980fa40162

Followup to previous change, reduce number of relations updates

Only tag relations update when new f-curve was allocated. This solves
possible too slow keyframe insertion when doing character animation,
but still does proper relation update when new ID component became
animated.

===================================================================

M	source/blender/editors/animation/anim_channels_defines.c
M	source/blender/editors/animation/keyframing.c
M	source/blender/editors/animation/keyingsets.c
M	source/blender/editors/gpencil/gpencil_convert.c
M	source/blender/editors/include/ED_keyframing.h
M	source/blender/editors/object/object_constraint.c
M	source/blender/editors/object/object_relations.c
M	source/blender/makesrna/intern/rna_action.c
M	source/blender/python/intern/bpy_rna_anim.c

===================================================================

diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index b80667a011a..1dcf0a13055 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -4186,7 +4186,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
 		/* find or create new F-Curve */
 		// XXX is the group name for this ok?
 		bAction *act = verify_adt_action(bmain, (ID *)key, 1);
-		FCurve *fcu = verify_fcurve(act, NULL, &ptr, rna_path, 0, 1);
+		FCurve *fcu = verify_fcurve(bmain, act, NULL, &ptr, rna_path, 0, 1);
 
 		/* set the special 'replace' flag if on a keyframe */
 		if (fcurve_frame_has_keyframe(fcu, cfra, 0))
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index f453c306cc7..4199213d219 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -157,14 +157,10 @@ bAction *verify_adt_action(Main *bmain, ID *id, short add)
 		 */
 		adt->action->idroot = GS(id->name);
 
+		/* Tag depsgraph to be rebuilt to include time dependency. */
+		DEG_relations_tag_update(bmain);
 	}
 
-	/* Tag depsgraph to be rebuilt to include time dependency.
-	 *
-	 * NOTE: Do it for all animation data modification, since existing animation
-	 * data might not include relations to the newly animated components.
-	 */
-	DEG_relations_tag_update(bmain);
 	DEG_id_tag_update(&adt->action->id, DEG_TAG_COPY_ON_WRITE);
 
 	/* return the action */
@@ -174,7 +170,7 @@ bAction *verify_adt_action(Main *bmain, ID *id, short add)
 /* Get (or add relevant data to be able to do so) F-Curve from the Active Action,
  * for the given Animation Data block. This assumes that all the destinations are valid.
  */
-FCurve *verify_fcurve(bAction *act, const char group[], PointerRNA *ptr,
+FCurve *verify_fcurve(Main *bmain, bAction *act, const char group[], PointerRNA *ptr,
                       const char rna_path[], const int array_index, short add)
 {
 	bActionGroup *agrp;
@@ -235,6 +231,11 @@ FCurve *verify_fcurve(bAction *act, const char group[], PointerRNA *ptr,
 			/* just add F-Curve to end of Action's list */
 			BLI_addtail(&act->curves, fcu);
 		}
+
+		/* New f-curve was added, meaning it's possible that it affects
+		 * dependency graph component which wasn't previously animated.
+		 */
+		DEG_relations_tag_update(bmain);
 	}
 
 	/* return the F-Curve */
@@ -1086,7 +1087,7 @@ short insert_keyframe(
 		 *	- if we're replacing keyframes only, DO NOT create new F-Curves if they do not exist yet
 		 *	  but still try to get the F-Curve if it exists...
 		 */
-		fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, (flag & INSERTKEY_REPLACE) == 0);
+		fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, (flag & INSERTKEY_REPLACE) == 0);
 
 		/* we may not have a F-Curve when we're replacing only... */
 		if (fcu) {
@@ -1159,7 +1160,9 @@ static bool delete_keyframe_fcurve(AnimData *adt, FCurve *fcu, float cfra)
 	return false;
 }
 
-short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags UNUSED(flag))
+short delete_keyframe(Main *bmain, ReportList *reports, ID *id, bAction *act,
+                      const char group[], const char rna_path[], int array_index, float cfra,
+                      eInsertKeyFlags UNUSED(flag))
 {
 	AnimData *adt = BKE_animdata_from_id(id);
 	PointerRNA id_ptr, ptr;
@@ -1217,7 +1220,7 @@ short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char grou
 
 	/* will only loop once unless the array index was -1 */
 	for (; array_index < array_index_max; array_index++) {
-		FCurve *fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, 0);
+		FCurve *fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, 0);
 
 		/* check if F-Curve exists and/or whether it can be edited */
 		if (fcu == NULL)
@@ -1248,7 +1251,9 @@ short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char grou
  *	The flag argument is used for special settings that alter the behavior of
  *	the keyframe deletion. These include the quick refresh options.
  */
-static short clear_keyframe(ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, eInsertKeyFlags UNUSED(flag))
+static short clear_keyframe(Main *bmain, ReportList *reports, ID *id, bAction *act,
+                            const char group[], const char rna_path[], int array_index,
+                            eInsertKeyFlags UNUSED(flag))
 {
 	AnimData *adt = BKE_animdata_from_id(id);
 	PointerRNA id_ptr, ptr;
@@ -1303,7 +1308,7 @@ static short clear_keyframe(ReportList *reports, ID *id, bAction *act, const cha
 
 	/* will only loop once unless the array index was -1 */
 	for (; array_index < array_index_max; array_index++) {
-		FCurve *fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, 0);
+		FCurve *fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, 0);
 
 		/* check if F-Curve exists and/or whether it can be edited */
 		if (fcu == NULL)
@@ -1932,6 +1937,7 @@ static int delete_key_button_exec(bContext *C, wmOperator *op)
 	Scene *scene = CTX_data_scene(C);
 	PointerRNA ptr = {{NULL}};
 	PropertyRNA *prop = NULL;
+	Main *bmain = CTX_data_main(C);
 	char *path;
 	float cfra = (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
 	short success = 0;
@@ -1988,7 +1994,7 @@ static int delete_key_button_exec(bContext *C, wmOperator *op)
 					index = -1;
 				}
 
-				success = delete_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index, cfra, 0);
+				success = delete_keyframe(bmain, op->reports, ptr.id.data, NULL, NULL, path, index, cfra, 0);
 				MEM_freeN(path);
 			}
 			else if (G.debug & G_DEBUG)
@@ -2036,6 +2042,7 @@ static int clear_key_button_exec(bContext *C, wmOperator *op)
 {
 	PointerRNA ptr = {{NULL}};
 	PropertyRNA *prop = NULL;
+	Main *bmain = CTX_data_main(C);
 	char *path;
 	short success = 0;
 	int index;
@@ -2056,7 +2063,7 @@ static int clear_key_button_exec(bContext *C, wmOperator *op)
 				index = -1;
 			}
 
-			success += clear_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index, 0);
+			success += clear_keyframe(bmain, op->reports, ptr.id.data, NULL, NULL, path, index, 0);
 			MEM_freeN(path);
 		}
 		else if (G.debug & G_DEBUG)
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index d159636756a..1d6ced02332 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -1042,7 +1042,7 @@ int ANIM_apply_keyingset(bContext *C, ListBase *dsources, bAction *act, KeyingSe
 			if (mode == MODIFYKEY_MODE_INSERT)
 				success += insert_keyframe(bmain, 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);
+				success += delete_keyframe(bmain, reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
 		}
 
 		/* set recalc-flags */
diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c
index 72165b04a05..e6246bb8fd4 100644
--- a/source/blender/editors/gpencil/gpencil_convert.c
+++ b/source/blender/editors/gpencil/gpencil_convert.c
@@ -483,7 +483,7 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
 
 	/* Ensure we have an F-Curve to add keyframes to */
 	act = verify_adt_action(bmain, (ID *)cu, true);
-	fcu = verify_fcurve(act, NULL, &ptr, "eval_time", 0, true);
+	fcu = verify_fcurve(bmain, act, NULL, &ptr, "eval_time", 0, true);
 
 	if (G.debug & G_DEBUG) {
 		printf("%s: tot len: %f\t\ttot time: %f\n", __func__, gtd->tot_dist, gtd->tot_time);
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index 08a039841f8..22e82d6b9ef 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -76,7 +76,7 @@ struct bAction *verify_adt_action(struct Main *bmain, struct ID *id, short add);
 /* Get (or add relevant data to be able to do so) F-Curve from the given Action.
  * This assumes that all the destinations are valid.
  */
-struct FCurve *verify_fcurve(struct bAction *act, const char group[], struct PointerRNA *ptr,
+struct FCurve *verify_fcurve(struct Main *bmain, struct bAction *act, const char group[], struct PointerRNA *ptr,
                              const char rna_path[], const int array_index, short add);
 
 /* -------- */
@@ -124,7 +124,9 @@ short insert_keyframe(
 /* Main Keyframing API call:
  *  Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case.
  */
-short delete_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags flag);
+short delete_keyframe(
+        struct Main *bmain, struct ReportList *reports, struct ID *id, struct bAction *act,
+        const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags flag);
 
 /* ************ Keying Sets ********************** */
 
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 7b72b1eb80e..4081c005132 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -998,7 +998,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op)
 		{
 			/* create F-Curve for path animation */
 			act = verify_adt_action(bmain, &cu->id, 1);
-			fcu = verify_fcurve(act, NULL, NULL, "eval_time", 0, 1);
+			fcu = verify_fcurve(bmain, act, NULL, NULL, "eval_time", 0, 1);
 
 			/* standard vertical range - 1:1 = 100 frames */
 			standardRange = 100.0f;
@@ -1023,7 +1023,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperat

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list