[Bf-blender-cvs] [c4dc14b] master: Fix T45915: Cannot select keyframes in summary channels in Dope Sheet in TweakMode

Joshua Leung noreply at git.blender.org
Fri Feb 5 14:43:42 CET 2016


Commit: c4dc14b079d81fd012383b910291246e7ebf9a04
Author: Joshua Leung
Date:   Sat Feb 6 02:34:57 2016 +1300
Branches: master
https://developer.blender.org/rBc4dc14b079d81fd012383b910291246e7ebf9a04

Fix T45915: Cannot select keyframes in summary channels in Dope Sheet in TweakMode

When in TweakMode on NLA strips that had an offset, it was not possible to select
those keyframes in the Summary Channel in the Dope Sheet.

The main gist of it is that the current code is from before the summary track was
introduced, and so could assume that ANIM_nla_mapping_get() would work for all channels
present. Thus, simply converting the clicked frame to nla-mapped time once would be
enough. However, for summary channels, nla-mapping_get() doesn't do anything, since
we can potentially include keyframes from several different objects!

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

M	source/blender/editors/animation/keyframes_edit.c
M	source/blender/editors/include/ED_keyframes_edit.h
M	source/blender/editors/space_action/action_select.c

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

diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index dd01e53..ba98702 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -44,6 +44,7 @@
 #include "DNA_scene_types.h"
 
 #include "BKE_fcurve.h"
+#include "BKE_nla.h"
 
 #include "ED_anim_api.h"
 #include "ED_keyframes_edit.h"
@@ -290,9 +291,39 @@ static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, Key
 			case ALE_MASKLAY:
 			case ALE_GPFRAME:
 				break;
+				
+			case ALE_FCURVE:
 			default:
-				ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);
+			{
+				if (ked->iterflags) {
+					/* make backups of the current values, so that a localised fix
+					 * (e.g. NLA time remapping) can be applied to these values
+					 */
+					float f1 = ked->f1;
+					float f2 = ked->f2;
+					
+					if (ked->iterflags & (KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP)) {
+						AnimData *adt = ANIM_nla_mapping_get(ac, ale);
+						
+						if (ked->iterflags & KED_F1_NLA_UNMAP)
+							ked->f1 = BKE_nla_tweakedit_remap(adt, f1, NLATIME_CONVERT_UNMAP);
+						if (ked->iterflags & KED_F2_NLA_UNMAP)
+							ked->f2 = BKE_nla_tweakedit_remap(adt, f2, NLATIME_CONVERT_UNMAP);
+					}
+					
+					/* now operate on the channel as per normal */
+					ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);
+					
+					/* reset */
+					ked->f1 = f1;
+					ked->f2 = f2;
+				}
+				else {
+					/* no special handling required... */
+					ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);
+				}
 				break;
+			}
 		}
 		
 		if (ret_code)
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index 910b647..7528594 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -132,9 +132,20 @@ typedef struct KeyframeEditData {
 
 	/* flags */
 	short curflags;             /* current flags for the keyframe we're reached in the iteration process */
-	short iterflags; /* settings for iteration process */            // XXX: unused...
+	short iterflags;            /* settings for iteration process */
 } KeyframeEditData;
 
+/* Flags for controlling the iteration process (to supply additional capabilities, etc.) */
+typedef enum eKeyframeEditData_IterFlags {
+	/* Perform NLA time remapping (global -> strip) for the "f1" parameter
+	 * (e.g. used for selection tools on summary tracks)
+	 */
+	KED_F1_NLA_UNMAP = (1 << 0),
+	
+	/* Perform NLA time remapping (global -> strip) for the "f2" parameter */
+	KED_F2_NLA_UNMAP = (1 << 1),
+} eKeyframeEditData_IterFlags;
+
 /* ------- Function Pointer Typedefs ---------------- */
 
 /* callback function that refreshes the F-Curve after use */
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 3c9c88a..574d3f6 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -948,6 +948,7 @@ static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short s
 	select_cb = ANIM_editkeyframes_select(select_mode);
 	ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAME);
 	ked.f1 = selx;
+	ked.iterflags |= KED_F1_NLA_UNMAP;
 	
 	/* select the nominated keyframe on the given frame */
 	if (ale->type == ANIMTYPE_GPLAYER) {




More information about the Bf-blender-cvs mailing list