[Bf-blender-cvs] [03c57b3c242] temp-vse-preview-transform: VSE: Selection in preview area
Richard Antalik
noreply at git.blender.org
Mon Aug 30 00:01:29 CEST 2021
Commit: 03c57b3c242bebd1eb35bfb0756c35b262b51389
Author: Richard Antalik
Date: Sun Aug 29 23:56:05 2021 +0200
Branches: temp-vse-preview-transform
https://developer.blender.org/rB03c57b3c242bebd1eb35bfb0756c35b262b51389
VSE: Selection in preview area
Just basic select operator only with extend mode
This patch requires D12208, D12105 and D12320.
Differential Revision: https://developer.blender.org/D12343
===================================================================
M release/scripts/presets/keyconfig/keymap_data/blender_default.py
M source/blender/editors/space_sequencer/sequencer_select.c
===================================================================
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index ae86c321c39..0d70218bd07 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -2524,6 +2524,10 @@ def km_sequencercommon(params):
("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
{"properties": [("data_path", 'space_data.view_type'), ("value_1", 'SEQUENCER'), ("value_2", 'PREVIEW')]}),
("sequencer.refresh_all", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("deselect_all", True)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
])
if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
@@ -2606,10 +2610,6 @@ def km_sequencer(params):
for i in range(10)
)
),
- ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("deselect_all", True)]}),
- ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("extend", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
{"properties": [("linked_handle", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 3d9be2dace9..d32b99488c1 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -637,6 +637,96 @@ static bool element_already_selected(const Sequence *seq, const int handle_click
return element_already_selected;
}
+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... This is garbage code... */
+ 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 screen. */
+ r_rctf.xmin = r_rctf.xmax = transform->xofs;
+ r_rctf.ymin = r_rctf.ymax = transform->yofs;
+ /* Calculate rect */
+ 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]);
+}
+
+/* Tl;dr:
+ * - get list of rendered seqs
+ * - for each unselected if click is in image boundary, return seq
+ * - else for each selected if click is in image boundary, return seq */
+static Sequence *seq_select_seq_from_preview(const bContext *C, const int mval[2])
+{
+ Scene *scene = CTX_data_scene(C);
+ Editing *ed = SEQ_editing_get(scene, false);
+ ListBase *seqbase = SEQ_active_seqbase_get(ed);
+ SpaceSeq *sseq = CTX_wm_space_seq(C);
+ View2D *v2d = UI_view2d_fromcontext(C);
+
+ float click_x, click_y;
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &click_x, &click_y);
+
+ SeqCollection *strips = Seq_query_rendered_strips(seqbase, scene->r.cfra, sseq->chanshown);
+ Sequence *seq;
+ SEQ_ITERATOR_FOREACH (seq, strips) {
+ if ((seq->flag & SELECT) != 0) {
+ continue;
+ }
+
+ if (seq_select_point_image_isect(scene, seq, click_x, click_y)) {
+ SEQ_collection_free(strips);
+ return seq;
+ }
+ }
+
+ SEQ_filter_selected_strips(strips);
+ SEQ_ITERATOR_FOREACH (seq, strips) {
+ if (seq_select_point_image_isect(scene, seq, click_x, click_y)) {
+ SEQ_collection_free(strips);
+ return seq;
+ }
+ }
+
+ SEQ_collection_free(strips);
+ return NULL;
+}
+
static int sequencer_select(const Editing *ed,
Sequence *seq,
const int handle_clicked,
@@ -683,8 +773,15 @@ static int sequencer_select_exec(bContext *C, wmOperator *op)
mval[0] = RNA_int_get(op->ptr, "mouse_x");
mval[1] = RNA_int_get(op->ptr, "mouse_y");
- int handle_clicked;
- Sequence *seq = find_nearest_seq(scene, v2d, &handle_clicked, mval);
+ ARegion *region = CTX_wm_region(C);
+ int handle_clicked = SEQ_SIDE_NONE;
+ Sequence *seq = NULL;
+ if (region->regiontype == RGN_TYPE_PREVIEW) {
+ seq = seq_select_seq_from_preview(C, mval);
+ }
+ else {
+ seq = find_nearest_seq(scene, v2d, &handle_clicked, mval);
+ }
/* Note: `side_of_frame` and `linked_time` functionality is designed to be shared on one keymap,
* therefore both properties can be true at the same time. */
More information about the Bf-blender-cvs
mailing list