[Bf-blender-cvs] [ae72a9206e9] master: Fix T46163: NLA properties with drivers aren't displayed as having drivers

Joshua Leung noreply at git.blender.org
Fri Oct 20 06:07:09 CEST 2017


Commit: ae72a9206e988a3f4ef5d35393ce490b23db2629
Author: Joshua Leung
Date:   Fri Oct 20 17:04:57 2017 +1300
Branches: master
https://developer.blender.org/rBae72a9206e988a3f4ef5d35393ce490b23db2629

Fix T46163: NLA properties with drivers aren't displayed as having drivers

While such drivers will generally get evaluated too late to be of much
use during animations, it can still be useful to allow using drivers to
control a whole bunch of NLA strip properties (i.e. syncing NLA strip
timings via a single property/control).

Keyframe insertion however is still not allowed on these properties
(and an error message will now be displayed when trying to do so,
instead of silently failing), as it is useless.

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

M	source/blender/blenkernel/BKE_nla.h
M	source/blender/blenkernel/intern/fcurve.c
M	source/blender/blenkernel/intern/nla.c
M	source/blender/editors/animation/keyframing.c

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

diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h
index 3bf8bba47f5..8d9fc8ff6cf 100644
--- a/source/blender/blenkernel/BKE_nla.h
+++ b/source/blender/blenkernel/BKE_nla.h
@@ -40,6 +40,9 @@ struct bAction;
 struct Scene;
 struct Speaker;
 
+struct PointerRNA;
+struct PropertyRNA;
+
 /* ----------------------------- */
 /* Data Management */
 
@@ -103,6 +106,8 @@ bool BKE_nlatrack_has_animated_strips(struct NlaTrack *nlt);
 bool BKE_nlatracks_have_animated_strips(ListBase *tracks);
 void BKE_nlastrip_validate_fcurves(struct NlaStrip *strip);
 
+bool BKE_nlastrip_has_curves_for_property(const struct PointerRNA *ptr, const struct PropertyRNA *prop);
+
 void BKE_nla_validate_state(struct AnimData *adt);
 
 /* ............ */
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 103f23a2c18..1a93031034b 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -61,6 +61,7 @@
 #include "BKE_curve.h" 
 #include "BKE_global.h"
 #include "BKE_object.h"
+#include "BKE_nla.h"
 
 #include "RNA_access.h"
 
@@ -335,7 +336,7 @@ FCurve *rna_get_fcurve_context_ui(
 	if (r_action) *r_action = NULL;
 	
 	/* Special case for NLA Control Curves... */
-	if (ptr->type == &RNA_NlaStrip) {
+	if (BKE_nlastrip_has_curves_for_property(ptr, prop)) {
 		NlaStrip *strip = (NlaStrip *)ptr->data;
 		
 		/* Set the special flag, since it cannot be a normal action/driver
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index 148fc3827e0..9a923b643ac 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -1417,6 +1417,40 @@ void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
 	}
 }
 
+/* Check if the given RNA pointer + property combo should be handled by
+ * NLA strip curves or not.
+ */
+bool BKE_nlastrip_has_curves_for_property(const PointerRNA *ptr, const PropertyRNA *prop)
+{
+	/* sanity checks */
+	if (ELEM(NULL, ptr, prop))
+		return false;
+	
+	/* 1) Must be NLA strip */
+	if (ptr->type == &RNA_NlaStrip) {
+		/* 2) Must be one of the predefined properties */
+		static PropertyRNA *prop_influence = NULL; 
+		static PropertyRNA *prop_time = NULL;
+		static bool needs_init = true;
+		
+		/* Init the properties on first use */
+		if (needs_init) {
+			prop_influence = RNA_struct_type_find_property(&RNA_NlaStrip, "influence");
+			prop_time = RNA_struct_type_find_property(&RNA_NlaStrip, "strip_time");
+			
+			needs_init = false;
+		}
+		
+		/* Check if match */
+		if (ELEM(prop, prop_influence, prop_time)) {
+			return true;
+		}
+	}
+	
+	/* No criteria met */
+	return false;
+}
+
 /* Sanity Validation ------------------------------------ */
 
 static bool nla_editbone_name_check(void *arg, const char *name)
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 540886196fe..344c6cc1621 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -1789,6 +1789,10 @@ static int insert_key_button_exec(bContext *C, wmOperator *op)
 			if (fcu) {
 				success = insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, 0);
 			}
+			else {
+				BKE_report(op->reports, RPT_ERROR,
+				           "This property cannot be animated as it will not get updated correctly");
+			}
 		}
 		else if (UI_but_flag_is_set(but, UI_BUT_DRIVEN)) {
 			/* Driven property - Find driver */
@@ -1884,7 +1888,7 @@ static int delete_key_button_exec(bContext *C, wmOperator *op)
 	}
 
 	if (ptr.id.data && ptr.data && prop) {
-		if (ptr.type == &RNA_NlaStrip) {
+		if (BKE_nlastrip_has_curves_for_property(&ptr, prop)) {
 			/* 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.



More information about the Bf-blender-cvs mailing list