[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