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"
This commit is contained in:
Joshua Leung 2016-06-24 02:52:13 +12:00
parent 7e53f9fb1a
commit 833e69ff7e
5 changed files with 52 additions and 8 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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);

View File

@ -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) */

View File

@ -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: