[Bf-blender-cvs] [8ad6ac9277a] temp-vse-preview-transform2: Add box select tool
Richard Antalik
noreply at git.blender.org
Wed Sep 15 17:19:57 CEST 2021
Commit: 8ad6ac9277aec860ceca074c3dc4b5dd9c619793
Author: Richard Antalik
Date: Mon Sep 13 13:57:37 2021 +0200
Branches: temp-vse-preview-transform2
https://developer.blender.org/rB8ad6ac9277aec860ceca074c3dc4b5dd9c619793
Add box select tool
===================================================================
M release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M source/blender/editors/space_sequencer/sequencer_draw.c
M source/blender/editors/space_sequencer/sequencer_select.c
M source/blender/sequencer/SEQ_transform.h
M source/blender/sequencer/intern/strip_transform.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 3bf959f3daa..bcdae645363 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -3063,7 +3063,7 @@ class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel):
None: [
],
'PREVIEW': [
- # *_tools_select,
+ *_tools_select,
_defs_sequencer_generic.sample,
_defs_sequencer_generic.translate,
_defs_sequencer_generic.rotate,
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 56816f81059..c26757716d0 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -2091,26 +2091,8 @@ static void seq_draw_image_origin_and_outline(const bContext *C, Sequence *seq)
(const float[]){transform->scale_x, transform->scale_y});
transform_pivot_set_m3(transform_matrix, origin);
- float image_size[2];
- if (strip_elem == NULL) {
- Scene *scene = CTX_data_scene(C);
- image_size[0] = scene->r.xsch;
- image_size[1] = scene->r.ysch;
- }
- else {
- image_size[0] = strip_elem->orig_width;
- image_size[1] = strip_elem->orig_height;
- }
-
- mul_v2_fl(image_size, 0.5f);
- float a[2] = {image_size[0], image_size[1]};
- float b[2] = {image_size[0], -image_size[1]};
- float c[2] = {-image_size[0], -image_size[1]};
- float d[2] = {-image_size[0], image_size[1]};
- mul_m3_v2(transform_matrix, a);
- mul_m3_v2(transform_matrix, b);
- mul_m3_v2(transform_matrix, c);
- mul_m3_v2(transform_matrix, d);
+ float seq_image_quad[4][2];
+ SEQ_image_transform_final_quad_get(CTX_data_scene(C), seq, seq_image_quad);
GPU_line_smooth(true);
GPU_blend(GPU_BLEND_ALPHA);
@@ -2122,10 +2104,10 @@ static void seq_draw_image_origin_and_outline(const bContext *C, Sequence *seq)
immUniformColor3fv(col);
immUniform1f("lineWidth", U.pixelsize);
immBegin(GPU_PRIM_LINE_LOOP, 4);
- immVertex2f(pos, a[0], a[1]);
- immVertex2f(pos, b[0], b[1]);
- immVertex2f(pos, c[0], c[1]);
- immVertex2f(pos, d[0], d[1]);
+ immVertex2f(pos, seq_image_quad[0][0], seq_image_quad[0][1]);
+ immVertex2f(pos, seq_image_quad[1][0], seq_image_quad[1][1]);
+ immVertex2f(pos, seq_image_quad[2][0], seq_image_quad[2][1]);
+ immVertex2f(pos, seq_image_quad[3][0], seq_image_quad[3][1]);
immEnd();
immUnbindProgram();
GPU_line_width(1);
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 610f6b0faa4..f486493b8d3 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -386,6 +386,14 @@ void recurs_sel_seq(Sequence *seq_meta)
}
}
+static bool seq_point_image_isect(const Scene *scene, const Sequence *seq, float point[2])
+{
+ float seq_image_quad[4][2];
+ SEQ_image_transform_final_quad_get(scene, seq, seq_image_quad);
+ return isect_point_quad_v2(
+ point, seq_image_quad[0], seq_image_quad[1], seq_image_quad[2], seq_image_quad[3]);
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -627,56 +635,6 @@ static void sequencer_select_linked_handle(const bContext *C,
}
}
-static bool seq_select_point_image_isect(const Scene *scene,
- const Sequence *seq,
- const float click_x,
- const float click_y)
-{
- StripTransform *transform = seq->strip->transform;
- StripCrop *crop = seq->strip->crop;
- rctf r_rctf;
-
- float transform_matrix[3][3];
- loc_rot_size_to_mat3(transform_matrix,
- (const float[]){transform->xofs, transform->yofs},
- transform->rotation,
- (const float[]){1, 1});
- transform_pivot_set_m3(transform_matrix, (const float[]){0, 0});
-
- /* Calculated image position is without rotation. Apply reverse rotation to mouse cursor, so
- * `BLI_rctf_isect_pt` can be used to check for intersection. */
- float point[2] = {click_x, click_y};
- invert_m3(transform_matrix);
- mul_m3_v2(transform_matrix, point);
-
- /* With rotation also translation is applied. Offset mouse position by same amount. */
- point[0] += transform->xofs;
- point[1] += transform->yofs;
-
- int img_x = scene->r.xsch;
- int img_y = scene->r.ysch;
-
- if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE)) {
- img_x = seq->strip->stripdata->orig_width;
- img_y = seq->strip->stripdata->orig_height;
- }
- else {
- img_x = scene->r.xsch;
- img_y = scene->r.ysch;
- }
-
- /* Set center. Both view and sequencer image 0 coord is in center of preview area. */
- r_rctf.xmin = r_rctf.xmax = transform->xofs;
- r_rctf.ymin = r_rctf.ymax = transform->yofs;
- /* Calculate rect for strip image. */
- r_rctf.xmin -= ((img_x / 2) - crop->left) * transform->scale_x;
- r_rctf.xmax += ((img_x / 2) - crop->right) * transform->scale_x;
- r_rctf.ymin -= ((img_y / 2) - crop->bottom) * transform->scale_y;
- r_rctf.ymax += ((img_y / 2) - crop->top) * transform->scale_y;
-
- return BLI_rctf_isect_pt(&r_rctf, point[0], point[1]);
-}
-
/* Check if click happened on image which belongs to strip. If multiple strips are found, loop
* through them in order. */
static Sequence *seq_select_seq_from_preview(const bContext *C, const int mval[2])
@@ -694,7 +652,8 @@ static Sequence *seq_select_seq_from_preview(const bContext *C, const int mval[2
ListBase strips_ordered = {NULL};
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, strips) {
- if (seq_select_point_image_isect(scene, seq, click_x, click_y)) {
+ float click_point[2] = {click_x, click_y};
+ if (seq_point_image_isect(scene, seq, click_point)) {
BLI_remlink(seqbase, seq);
BLI_addtail(&strips_ordered, seq);
}
@@ -1408,6 +1367,52 @@ void SEQUENCER_OT_select_side(wmOperatorType *ot)
/** \name Box Select Operator
* \{ */
+static bool seq_box_select_rect_image_isect(const Scene *scene, const Sequence *seq, rctf *rect)
+{
+ float seq_image_quad[4][2];
+ SEQ_image_transform_final_quad_get(scene, seq, seq_image_quad);
+ float rect_quad[4][2];
+ rect_quad[0][0] = rect->xmax;
+ rect_quad[0][1] = rect->ymax;
+ rect_quad[1][0] = rect->xmax;
+ rect_quad[1][1] = rect->ymin;
+ rect_quad[2][0] = rect->xmin;
+ rect_quad[2][1] = rect->ymin;
+ rect_quad[3][0] = rect->xmin;
+ rect_quad[3][1] = rect->ymax;
+
+ return seq_point_image_isect(scene, seq, rect_quad[0]) ||
+ seq_point_image_isect(scene, seq, rect_quad[1]) ||
+ seq_point_image_isect(scene, seq, rect_quad[2]) ||
+ seq_point_image_isect(scene, seq, rect_quad[3]) ||
+ isect_point_quad_v2(
+ seq_image_quad[0], rect_quad[0], rect_quad[1], rect_quad[2], rect_quad[3]) ||
+ isect_point_quad_v2(
+ seq_image_quad[1], rect_quad[0], rect_quad[1], rect_quad[2], rect_quad[3]) ||
+ isect_point_quad_v2(
+ seq_image_quad[2], rect_quad[0], rect_quad[1], rect_quad[2], rect_quad[3]) ||
+ isect_point_quad_v2(
+ seq_image_quad[3], rect_quad[0], rect_quad[1], rect_quad[2], rect_quad[3]);
+}
+
+static void seq_box_select_seq_from_preview(const bContext *C, rctf *rect)
+{
+ Scene *scene = CTX_data_scene(C);
+ Editing *ed = SEQ_editing_get(scene);
+ ListBase *seqbase = SEQ_active_seqbase_get(ed);
+ SpaceSeq *sseq = CTX_wm_space_seq(C);
+
+ SeqCollection *strips = SEQ_query_rendered_strips(seqbase, scene->r.cfra, sseq->chanshown);
+ Sequence *seq;
+ SEQ_ITERATOR_FOREACH (seq, strips) {
+ if (seq_box_select_rect_image_isect(scene, seq, rect)) {
+ seq->flag |= SELECT;
+ }
+ }
+
+ SEQ_collection_free(strips);
+}
+
static int sequencer_box_select_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
@@ -1430,6 +1435,12 @@ static int sequencer_box_select_exec(bContext *C, wmOperator *op)
WM_operator_properties_border_to_rctf(op, &rectf);
UI_view2d_region_to_view_rctf(v2d, &rectf, &rectf);
+ ARegion *region = CTX_wm_region(C);
+ if (region->regiontype == RGN_TYPE_PREVIEW) {
+ seq_box_select_seq_from_preview(C, &rectf);
+ return OPERATOR_FINISHED;
+ }
+
LISTBASE_FOREACH (Sequence *, seq, ed->seqbasep) {
rctf rq;
seq_rectf(seq, &rq);
diff --git a/source/blender/sequencer/SEQ_transform.h b/source/blender/sequencer/SEQ_transform.h
index 9d83359045b..2a5f1d613ee 100644
--- a/source/blender/sequencer/SEQ_transform.h
+++ b/source/blender/sequencer/SEQ_transform.h
@@ -63,6 +63,9 @@ void SEQ_transform_offset_after_frame(struct Scene *scene,
void SEQ_image_transform_origin_offset_get(const struct Scene *scene,
const struct Sequence *seq,
float r_origin[2]);
+void SEQ_image_transform_final_quad_get(const struct Scene *scene,
+ const struct Sequence *seq,
+ float r_quad[4][2]);
#ifdef __cplusplus
}
diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c
index f34a8e2e9cd..9e774833044 100644
--- a/source/blender/sequencer/intern/strip_transform.c
+++ b/source/blender/sequencer/intern/strip_transform.c
@@ -448,3 +448,40 @@ void SEQ_image_transform_origin_offset_get(const Scene *scene,
r_origin[0] = (image_size[0] * transform->origin[0]) - (image_size[0] * 0.5f);
r_origin[1] = (image_size[1] * transform->origin[1]) - (image_size[1] * 0.5f);
}
+
+void SEQ_image_transform_final_quad_get(const Scene *scene,
+ const Sequence *seq,
+ float r_quad[4][2])
+{
+ StripTransform *transform = seq->strip->transform;
+ StripCrop *crop = seq->strip->crop;
+
+ int img_x = scene->r.xsch;
+ int img_y = scene->r.ysch;
+ if (ELEM(seq->type, SEQ_TYPE_MOVIE
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list