DopeSheet Mask Mode: Circle/Lasso support

Adapted from the code for Grease Pencil (just like the whole mode was)
This commit is contained in:
Joshua Leung 2016-06-24 02:57:03 +12:00
parent 833e69ff7e
commit 9466829ead
3 changed files with 34 additions and 2 deletions

View File

@ -35,6 +35,7 @@ struct bContext;
struct wmKeyConfig;
struct MaskLayer;
struct MaskLayerShape;
struct KeyframeEditData;
/* mask_edit.c */
void ED_mask_get_size(struct ScrArea *sa, int *width, int *height);
@ -80,6 +81,7 @@ void ED_masklayer_make_cfra_list(struct MaskLayer *masklay, ListBase *elems, boo
bool ED_masklayer_frame_select_check(struct MaskLayer *masklay);
void ED_masklayer_frame_select_set(struct MaskLayer *masklay, short mode);
void ED_masklayer_frames_select_border(struct MaskLayer *masklay, float min, float max, short select_mode);
void ED_masklayer_frames_select_region(struct KeyframeEditData *ked, struct MaskLayer *masklay, short tool, short select_mode);
void ED_mask_select_frames(struct MaskLayer *masklay, short select_mode);
void ED_mask_select_frame(struct MaskLayer *masklay, int selx, short select_mode);

View File

@ -201,6 +201,36 @@ void ED_masklayer_frames_select_border(MaskLayer *masklay, float min, float max,
}
}
/* select the frames in this layer that occur within the lasso/circle region specified */
void ED_masklayer_frames_select_region(KeyframeEditData *ked, MaskLayer *masklay, short tool, short select_mode)
{
MaskLayerShape *masklay_shape;
if (masklay == NULL)
return;
/* only select frames which are within the region */
for (masklay_shape = masklay->splines_shapes.first; masklay_shape; masklay_shape = masklay_shape->next) {
/* construct a dummy point coordinate to do this testing with */
float pt[2] = {0};
pt[0] = masklay_shape->frame;
pt[1] = ked->channel_y;
/* check the necessary regions */
if (tool == BEZT_OK_CHANNEL_LASSO) {
/* Lasso */
if (keyframe_region_lasso_test(ked->data, pt))
masklayshape_select(masklay_shape, select_mode);
}
else if (tool == BEZT_OK_CHANNEL_CIRCLE) {
/* Circle */
if (keyframe_region_circle_test(ked->data, pt))
masklayshape_select(masklay_shape, select_mode);
}
}
}
/* ***************************************** */
/* Frame Editing Tools */

View File

@ -482,13 +482,13 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
Mask *mask = ale->data;
MaskLayer *masklay;
for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
//ED_masklayer_frames_select_border(masklay, rectf.xmin, rectf.xmax, selectmode);
ED_masklayer_frames_select_region(&ked, masklay, mode, selectmode);
}
break;
}
case ANIMTYPE_MASKLAYER:
{
//ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);
ED_masklayer_frames_select_region(&ked, ale->data, mode, selectmode);
break;
}
default: