Merge branch 'blender-v4.2-release'

This commit is contained in:
Richard Antalik 2024-06-28 17:12:57 +02:00
commit c8b736659b
9 changed files with 118 additions and 64 deletions

@ -2955,6 +2955,8 @@ def km_sequencer(params):
{"properties": [("adjust_length", True)]}),
("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
("sequencer.retiming_key_delete", {"type": 'X', "value": 'PRESS'}, None),
("sequencer.retiming_key_delete", {"type": 'DEL', "value": 'PRESS'}, None),
("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),

@ -1798,6 +1798,8 @@ def km_sequencer(params):
{"properties": [("adjust_length", True)]}),
("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
("sequencer.retiming_key_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
("sequencer.retiming_key_delete", {"type": 'DEL', "value": 'PRESS'}, None),
("sequencer.delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),

@ -967,7 +967,7 @@ class SEQUENCER_MT_strip_retiming(Menu):
layout.separator()
layout.operator("sequencer.delete", text="Delete Retiming Keys")
layout.operator("sequencer.retiming_key_delete")
col = layout.column()
col.operator("sequencer.retiming_reset")
col.enabled = not is_retiming

@ -1663,10 +1663,6 @@ static int sequencer_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
if (RNA_boolean_get(op->ptr, "use_retiming_mode")) {
sequencer_retiming_key_remove_exec(C, op);
}
SEQ_prefetch_stop(scene);
for (Sequence *seq : ED_sequencer_selected_strips_from_context(C)) {
@ -1699,20 +1695,16 @@ static int sequencer_delete_invoke(bContext *C, wmOperator *op, const wmEvent *e
}
}
if (sequencer_retiming_mode_is_active(C)) {
RNA_boolean_set(op->ptr, "use_retiming_mode", true);
}
return sequencer_delete_exec(C, op);
}
static bool sequencer_delete_poll_property(const bContext * /* C */,
wmOperator *op,
wmOperator * /*op*/,
const PropertyRNA *prop)
{
const char *prop_id = RNA_property_identifier(prop);
if (STREQ(prop_id, "delete_data") && RNA_boolean_get(op->ptr, "use_retiming_mode")) {
if (STREQ(prop_id, "delete_data")) {
return false;
}
@ -1743,13 +1735,6 @@ void SEQUENCER_OT_delete(wmOperatorType *ot)
"Delete Data",
"After removing the Strip, delete the associated data also");
RNA_def_property_flag(ot->prop, PROP_SKIP_SAVE);
ot->prop = RNA_def_boolean(ot->srna,
"use_retiming_mode",
false,
"Use Retiming Data",
"Operate on retiming data instead of strips");
RNA_def_property_flag(ot->prop, PROP_HIDDEN);
}
/** \} */

@ -319,12 +319,12 @@ void SEQUENCER_OT_retiming_show(wmOperatorType *ot);
void SEQUENCER_OT_retiming_key_add(wmOperatorType *ot);
void SEQUENCER_OT_retiming_freeze_frame_add(wmOperatorType *ot);
void SEQUENCER_OT_retiming_transition_add(wmOperatorType *ot);
void SEQUENCER_OT_retiming_key_delete(wmOperatorType *ot);
void SEQUENCER_OT_retiming_segment_speed_set(wmOperatorType *ot);
int sequencer_retiming_key_select_exec(bContext *C, wmOperator *op);
/* Select a key and all following keys. */
int sequencer_retiming_select_linked_time(bContext *C, wmOperator *op);
int sequencer_select_exec(bContext *C, wmOperator *op);
int sequencer_retiming_key_remove_exec(bContext *C, wmOperator *op);
int sequencer_retiming_select_all_exec(bContext *C, wmOperator *op);
int sequencer_retiming_box_select_exec(bContext *C, wmOperator *op);

@ -76,6 +76,7 @@ void sequencer_operatortypes()
WM_operatortype_append(SEQUENCER_OT_retiming_freeze_frame_add);
WM_operatortype_append(SEQUENCER_OT_retiming_transition_add);
WM_operatortype_append(SEQUENCER_OT_retiming_segment_speed_set);
WM_operatortype_append(SEQUENCER_OT_retiming_key_delete);
/* `sequencer_select.cc` */
WM_operatortype_append(SEQUENCER_OT_select_all);

@ -525,6 +525,83 @@ void SEQUENCER_OT_retiming_transition_add(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
/** \name Retiming Delete Key
* \{ */
static int sequencer_retiming_key_delete_exec(bContext *C, wmOperator * /*op*/)
{
Scene *scene = CTX_data_scene(C);
blender::Map selection = SEQ_retiming_selection_get(SEQ_editing_get(scene));
blender::Vector<Sequence *> strips_to_handle;
if (!sequencer_retiming_mode_is_active(C) || selection.size() == 0) {
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
}
for (Sequence *seq : selection.values()) {
strips_to_handle.append_non_duplicates(seq);
}
for (Sequence *seq : strips_to_handle) {
blender::Vector<SeqRetimingKey *> keys_to_delete;
for (auto item : selection.items()) {
if (item.value != seq) {
continue;
}
keys_to_delete.append(item.key);
}
SEQ_retiming_remove_multiple_keys(seq, keys_to_delete);
}
for (Sequence *seq : strips_to_handle) {
SEQ_relations_invalidate_cache_raw(scene, seq);
}
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
}
static int sequencer_retiming_key_delete_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
Scene *scene = CTX_data_scene(C);
ListBase *markers = &scene->markers;
if (!BLI_listbase_is_empty(markers)) {
ARegion *region = CTX_wm_region(C);
if (region && (region->regiontype == RGN_TYPE_WINDOW)) {
/* Bounding box of 30 pixels is used for markers shortcuts,
* prevent conflict with markers shortcuts here. */
if (event->mval[1] <= 30) {
return OPERATOR_PASS_THROUGH;
}
}
}
return sequencer_retiming_key_delete_exec(C, op);
}
void SEQUENCER_OT_retiming_key_delete(wmOperatorType *ot)
{
/* Identifiers. */
ot->name = "Delete Retiming Keys";
ot->idname = "SEQUENCER_OT_retiming_key_delete";
ot->description = "Delete selected strips from the sequencer";
/* Api callbacks. */
ot->invoke = sequencer_retiming_key_delete_invoke;
ot->exec = sequencer_retiming_key_delete_exec;
ot->poll = retiming_poll;
/* Flags. */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Retiming Set Segment Speed
* \{ */
@ -919,34 +996,3 @@ int sequencer_retiming_select_all_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
}
int sequencer_retiming_key_remove_exec(bContext *C, wmOperator * /* op */)
{
Scene *scene = CTX_data_scene(C);
blender::Map selection = SEQ_retiming_selection_get(SEQ_editing_get(scene));
blender::Vector<Sequence *> strips_to_handle;
for (Sequence *seq : selection.values()) {
strips_to_handle.append_non_duplicates(seq);
}
for (Sequence *seq : strips_to_handle) {
blender::Vector<SeqRetimingKey *> keys_to_delete;
for (auto item : selection.items()) {
if (item.value != seq) {
continue;
}
keys_to_delete.append(item.key);
}
SEQ_retiming_remove_multiple_keys(seq, keys_to_delete);
}
for (Sequence *seq : strips_to_handle) {
SEQ_relations_invalidate_cache_raw(scene, seq);
}
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
}

@ -576,13 +576,15 @@ static void flushTransSeq(TransInfo *t)
* recalculation, hierarchy is not taken into account. */
int max_offset = 0;
float edge_pan_offset[2] = {0.0f, 0.0f};
view2d_edge_pan_loc_compensate(t, edge_pan_offset, edge_pan_offset);
/* Flush to 2D vector from internally used 3D vector. */
for (a = 0, td = tc->data, td2d = tc->data_2d; a < tc->data_len; a++, td++, td2d++) {
tdsq = (TransDataSeq *)td->extra;
seq = tdsq->seq;
float loc[2];
view2d_edge_pan_loc_compensate(t, td->loc, loc);
new_frame = round_fl_to_int(loc[0]);
new_frame = round_fl_to_int(td->loc[0] + edge_pan_offset[0]);
switch (tdsq->sel_flag) {
case SELECT: {
@ -593,7 +595,7 @@ static void flushTransSeq(TransInfo *t)
max_offset = offset;
}
}
seq->machine = round_fl_to_int(loc[1]);
seq->machine = round_fl_to_int(td->loc[1] + edge_pan_offset[1]);
CLAMP(seq->machine, 1, MAXSEQ);
break;
}

@ -475,22 +475,38 @@ static void sequencer_image_crop_transform_matrix(const Sequence *seq,
const float preview_scale_factor,
float r_transform_matrix[4][4])
{
const StripTransform *transform = seq->strip->transform;
const float scale_x = transform->scale_x * image_scale_factor;
const float scale_y = transform->scale_y * image_scale_factor;
/* Center the image and scale it to expected size (downscale original media if needed). */
const float image_center_offs_x = (out->x - in->x) / 2;
const float image_center_offs_y = (out->y - in->y) / 2;
const float translate_x = transform->xofs * preview_scale_factor + image_center_offs_x;
const float translate_y = transform->yofs * preview_scale_factor + image_center_offs_y;
const float pivot[3] = {in->x * transform->origin[0], in->y * transform->origin[1], 0.0f};
float image_prescale_matrix[4][4];
float rotation_matrix[3][3];
unit_m3(rotation_matrix);
loc_rot_size_to_mat4(image_prescale_matrix,
float3{image_center_offs_x, image_center_offs_y, 0.0f},
rotation_matrix,
float3{image_scale_factor, image_scale_factor, 1.0f});
const float3 preview_scale_pivot{in->x * 0.5f, in->y * 0.5f, 0.0f};
transform_pivot_set_m4(image_prescale_matrix, preview_scale_pivot);
/* Apply rest of transformations. */
float transform_matrix[4][4];
const StripTransform *transform = seq->strip->transform;
const float translate_x = transform->xofs * preview_scale_factor;
const float translate_y = transform->yofs * preview_scale_factor;
axis_angle_to_mat3_single(rotation_matrix, 'Z', transform->rotation);
loc_rot_size_to_mat4(r_transform_matrix,
loc_rot_size_to_mat4(transform_matrix,
float3{translate_x, translate_y, 0.0f},
rotation_matrix,
float3{scale_x, scale_y, 1.0f});
transform_pivot_set_m4(r_transform_matrix, pivot);
float3{transform->scale_x, transform->scale_y, 1.0f});
/* Calculate pivot point: Center of output buffer +/- half of prescaled input image. */
const float2 image_size{in->x * image_scale_factor, in->y * image_scale_factor};
const float2 origin_fac{transform->origin[0] - 0.5f, transform->origin[1] - 0.5f};
const float2 origin_rel = image_size * origin_fac;
const float3 pivot{out->x / 2 + origin_rel.x, out->y / 2 + origin_rel.y, 0.0f};
transform_pivot_set_m4(transform_matrix, pivot);
mul_m4_m4m4_aligned_scale(r_transform_matrix, transform_matrix, image_prescale_matrix);
invert_m4(r_transform_matrix);
}