Commit: 6499615e6a4dd3858bf0c95d46de8d44d87211f6
Author: Richard Antalik
Date: Fri Sep 10 09:45:04 2021 +0200
Branches: temp-vse-preview-transform2
https://developer.blender.org/rB6499615e6a4dd3858bf0c95d46de8d44d87211f6
Merge D12343, even though these are quite functionally independent, but
transform tools are bit awkward to evaluate without any election in viewport
===================================================================
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 1e1bef6588b..229db595c4d 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -2524,6 +2524,9 @@ 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'},
None),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS',
"shift": True},
+ {"properties": [("extend", True)]}),
])
if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
@@ -2606,9 +2609,6 @@ def km_sequencer(params):
for i in range(10)
)
),
- ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
None),
- ("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 80d3e2cbdaa..819f4d457df 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -626,6 +626,96 @@ 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... 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 bool element_already_selected(const Sequence *seq, const int
handle_clicked)
{
const bool handle_already_selected = ((handle_clicked == SEQ_SIDE_LEFT) &&
@@ -680,8 +770,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. */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs