Merge branch 'blender-v4.2-release'
This commit is contained in:
commit
c8b736659b
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user