[Bf-blender-cvs] [833e69f] master: DopeSheet: GPencil-Mode supports Circle and Lasso Select

Joshua Leung noreply at git.blender.org
Thu Jun 23 17:19:58 CEST 2016


Commit: 833e69ff7ead32f20cce36f3a1dfe90f80020ea1
Author: Joshua Leung
Date:   Fri Jun 24 02:52:13 2016 +1200
Branches: master
https://developer.blender.org/rB833e69ff7ead32f20cce36f3a1dfe90f80020ea1

DopeSheet: GPencil-Mode supports Circle and Lasso Select

To get this working the least effort, I've had to expose the helper functions
used by the lasso and circle select keyframe-test callbacks (which are generic)
and expose them for use by the GP keyframe editing code too. Hopefully in time
we clean this all up and just write the code once to operate on "keyframes"

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

M	source/blender/editors/animation/keyframes_edit.c
M	source/blender/editors/gpencil/editaction_gpencil.c
M	source/blender/editors/include/ED_gpencil.h
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 f909b39..7b35a15 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -541,7 +541,7 @@ static short ok_bezier_region(KeyframeEditData *ked, BezTriple *bezt)
 /**
  * Called from #ok_bezier_region_lasso and #ok_bezier_channel_lasso
  */
-static bool bezier_region_lasso_test(
+bool keyframe_region_lasso_test(
         const KeyframeEdit_LassoData *data_lasso,
         const float xy[2])
 {
@@ -564,7 +564,7 @@ static short ok_bezier_region_lasso(KeyframeEditData *ked, BezTriple *bezt)
 	if (ked->data) {
 		short ok = 0;
 		
-#define KEY_CHECK_OK(_index) bezier_region_lasso_test(ked->data, bezt->vec[_index])
+#define KEY_CHECK_OK(_index) keyframe_region_lasso_test(ked->data, bezt->vec[_index])
 		KEYFRAME_OK_CHECKS(KEY_CHECK_OK);
 #undef KEY_CHECK_OK
 		
@@ -596,7 +596,7 @@ static short ok_bezier_channel_lasso(KeyframeEditData *ked, BezTriple *bezt)
 		pt[0] = bezt->vec[1][0];
 		pt[1] = ked->channel_y;
 		
-		if (bezier_region_lasso_test(data, pt))
+		if (keyframe_region_lasso_test(data, pt))
 			return KEYFRAME_OK_KEY;
 	}
 	return 0;
@@ -605,7 +605,7 @@ static short ok_bezier_channel_lasso(KeyframeEditData *ked, BezTriple *bezt)
 /**
  * Called from #ok_bezier_region_circle and #ok_bezier_channel_circle
  */
-static bool bezier_region_circle_test(
+bool keyframe_region_circle_test(
         const KeyframeEdit_CircleData *data_circle,
         const float xy[2])
 {
@@ -629,7 +629,7 @@ static short ok_bezier_region_circle(KeyframeEditData *ked, BezTriple *bezt)
 	if (ked->data) {
 		short ok = 0;
 		
-#define KEY_CHECK_OK(_index) bezier_region_circle_test(ked->data, bezt->vec[_index])
+#define KEY_CHECK_OK(_index) keyframe_region_circle_test(ked->data, bezt->vec[_index])
 		KEYFRAME_OK_CHECKS(KEY_CHECK_OK);
 #undef KEY_CHECK_OK
 		
@@ -661,7 +661,7 @@ static short ok_bezier_channel_circle(KeyframeEditData *ked, BezTriple *bezt)
 		pt[0] = bezt->vec[1][0];
 		pt[1] = ked->channel_y;
 		
-		if (bezier_region_circle_test(data, pt))
+		if (keyframe_region_circle_test(data, pt))
 			return KEYFRAME_OK_KEY;
 	}
 	return 0;
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index a49b336..738496a 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -205,6 +205,36 @@ void ED_gplayer_frames_select_border(bGPDlayer *gpl, float min, float max, short
 	}
 }
 
+/* select the frames in this layer that occur within the lasso/circle region specified */
+void ED_gplayer_frames_select_region(KeyframeEditData *ked, bGPDlayer *gpl, short tool, short select_mode)
+{
+	bGPDframe *gpf;
+	
+	if (gpl == NULL)
+		return;
+	
+	/* only select frames which are within the region */
+	for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+		/* construct a dummy point coordinate to do this testing with */
+		float pt[2] = {0};
+		
+		pt[0] = gpf->framenum;
+		pt[1] = ked->channel_y;
+		
+		/* check the necessary regions */
+		if (tool == BEZT_OK_CHANNEL_LASSO) {
+			/* Lasso */	
+			if (keyframe_region_lasso_test(ked->data, pt))
+				gpframe_select(gpf, select_mode);
+		}
+		else if (tool == BEZT_OK_CHANNEL_CIRCLE) {
+			/* Circle */
+			if (keyframe_region_circle_test(ked->data, pt))
+				gpframe_select(gpf, select_mode);
+		}
+	}
+}
+
 /* ***************************************** */
 /* Frame Editing Tools */
 
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 255827d..de5ab80 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -42,6 +42,7 @@ struct bGPDlayer;
 struct bGPDframe;
 struct bGPDstroke;
 struct bAnimContext;
+struct KeyframeEditData;
 struct PointerRNA;
 struct wmWindowManager;
 struct wmKeyConfig;
@@ -120,6 +121,7 @@ void ED_gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, bool only
 bool  ED_gplayer_frame_select_check(struct bGPDlayer *gpl);
 void  ED_gplayer_frame_select_set(struct bGPDlayer *gpl, short mode);
 void  ED_gplayer_frames_select_border(struct bGPDlayer *gpl, float min, float max, short select_mode);
+void  ED_gplayer_frames_select_region(struct KeyframeEditData *ked, struct bGPDlayer *gpl, short tool, short select_mode);
 void  ED_gpencil_select_frames(struct bGPDlayer *gpl, short select_mode);
 void  ED_gpencil_select_frame(struct bGPDlayer *gpl, int selx, short select_mode);
 
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index 0d352ab..c0eb88c 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -266,6 +266,18 @@ short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt);
  */
 void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
 
+/* ------ 1.5-D Region Testing Uitls (Lasso/Circle Select) ------- */
+/* XXX: These are temporary, until we can unify GP/Mask Keyframe handling and standard FCurve Keyframe handling */
+
+bool keyframe_region_lasso_test(
+        const KeyframeEdit_LassoData *data_lasso,
+        const float xy[2]);
+
+bool keyframe_region_circle_test(
+        const KeyframeEdit_CircleData *data_circle,
+        const float xy[2]);
+
+
 /* ************************************************ */
 /* Destructive Editing API (keyframes_general.c) */
 
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index c9a4922..62050f1 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -468,13 +468,13 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
 					bGPdata *gpd = ale->data;
 					bGPDlayer *gpl;
 					for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
-						//ED_gplayer_frames_select_border(gpl, rectf.xmin, rectf.xmax, selectmode);
+						ED_gplayer_frames_select_region(&ked, ale->data, mode, selectmode);
 					}
 					break;
 				}
 				case ANIMTYPE_GPLAYER:
 				{
-					//ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);
+					ED_gplayer_frames_select_region(&ked, ale->data, mode, selectmode);
 					break;
 				}
 				case ANIMTYPE_MASKDATABLOCK:




More information about the Bf-blender-cvs mailing list