54#include "RNA_prototypes.hh"
136 if (!scene->adt->action) {
178bool sequencer_strip_poll(
bContext *C)
192 return (ed && (ed->
act_seq !=
nullptr));
206 if (sseq ==
nullptr) {
228 if (sseq ==
nullptr) {
248 if (sseq ==
nullptr) {
285 ot->
idname =
"SEQUENCER_OT_gap_remove";
287 "Remove gap at current frame to first strip at the right, independent of selection or "
288 "locked state of strips";
323 ot->
idname =
"SEQUENCER_OT_gap_insert";
325 "Insert gap at current frame to first strips at the right, independent of selection or "
326 "locked state of strips";
342 "Frames to insert after current strip",
387 seq->flag &= ~SEQ_OVERLAP;
399 if (seq->seq1 && (seq->seq1->flag &
SELECT)) {
400 if (!either_handle_selected) {
405 else if (seq->seq2 && (seq->seq2->flag &
SELECT)) {
406 if (!either_handle_selected) {
426 snap_frame = scene->r.cfra;
435 ot->
name =
"Snap Strips to the Current Frame";
437 ot->
description =
"Frame where selected strips will be snapped";
453 "Frame where selected strips will be snapped",
490 int trimmed_sequences = 0;
498 return trimmed_sequences;
517 data = MEM_cnew<SlipData>(
"trimdata");
519 data->seq_array = MEM_cnew_array<Sequence *>(num_seq,
"trimdata_sequences");
520 data->num_seq = num_seq;
521 data->previous_offset = 0;
524 data->num_input.idx_max = 0;
526 data->num_input.unit_type[0] = 0;
546 for (
int i = data->num_seq - 1; i >= 0; i--) {
557 for (
int i = data->num_seq - 1; i >= 0; i--) {
567 int delta_offset = *offset - data->previous_offset;
569 for (
int i = 0; i < data->num_seq; i++) {
583 delta_offset +=
diff;
585 data->previous_offset = *offset;
602 SlipData *data = MEM_cnew<SlipData>(
"trimdata");
604 data->seq_array = MEM_cnew_array<Sequence *>(num_seq,
"trimdata_sequences");
605 data->num_seq = num_seq;
612 float subframe_delta = 0.0f;
613 if (std::trunc(offset_fl) != offset_fl) {
615 subframe_delta = offset_fl - offset;
631 if (area ==
nullptr) {
660 float subframe_delta = 0.0f;
661 if (data->subframe_restore != 0.0f) {
665 subframe_delta = -data->subframe_restore;
666 data->subframe_restore = 0.0f;
668 if (std::trunc(offset_fl) != offset_fl) {
670 subframe_delta = offset_fl - data->previous_subframe_offset - delta_offset;
671 data->subframe_restore += subframe_delta;
673 data->previous_subframe_offset = offset_fl;
684 const bool has_numInput =
hasNumInput(&data->num_input);
693 switch (event->
type) {
702 mouse_x =
event->mval[0] - data->slow_offset;
704 mouse_x += data->slow_offset;
707 mouse_x =
event->mval[0];
712 float offset_fl = mouseloc[0] - data->init_mouseloc[0];
721 float subframe_delta = 0.0f;
724 subframe_delta = offset_fl - data->previous_subframe_offset - delta_offset;
725 data->subframe_restore += subframe_delta;
727 else if (data->subframe_restore != 0.0f) {
729 subframe_delta = -data->subframe_restore;
730 data->subframe_restore = 0.0f;
732 data->previous_subframe_offset = offset_fl;
756 int offset = data->previous_offset;
757 float subframe_delta = data->subframe_restore;
778 data->slow_offset =
event->mval[0];
824 "Offset to the data of the strip",
855 if ((seq->flag &
SELECT) == 0) {
884 ot->
srna,
"unselected",
false,
"Unselected",
"Mute unselected rather than selected strips");
906 seq->flag &= ~SEQ_MUTE;
911 if ((seq->flag &
SELECT) == 0) {
912 seq->flag &= ~SEQ_MUTE;
928 ot->
name =
"Unmute Strips";
943 "Unmute unselected rather than selected strips");
973 ot->
description =
"Lock strips so they can't be transformed";
996 seq->flag &= ~SEQ_LOCK;
1008 ot->
name =
"Unlock Strips";
1009 ot->
idname =
"SEQUENCER_OT_unlock";
1010 ot->
description =
"Unlock strips so they can be transformed";
1034 if (selected.is_empty()) {
1052 ot->
name =
"Connect Strips";
1053 ot->
idname =
"SEQUENCER_OT_connect";
1054 ot->
description =
"Link selected strips together for simplified group selection";
1089 ot->
name =
"Disconnect Strips";
1090 ot->
idname =
"SEQUENCER_OT_disconnect";
1091 ot->
description =
"Unlink selected strips so that they can be selected individually";
1113 if (seq->flag &
SELECT) {
1117 if (adjust_length) {
1135 ot->
name =
"Reload Strips";
1136 ot->
idname =
"SEQUENCER_OT_reload";
1150 "Adjust length of strips to their data length");
1162 if (
G.is_rendering) {
1185 ot->
name =
"Refresh Sequencer";
1186 ot->
idname =
"SEQUENCER_OT_refresh_all";
1205 const char **r_error_str)
1208 Sequence *seq1 =
nullptr, *seq2 =
nullptr;
1210 *r_error_str =
nullptr;
1217 *r_selseq1 = *r_selseq2 =
nullptr;
1222 if (seq->flag &
SELECT) {
1224 *r_error_str =
N_(
"Cannot apply effects to audio sequence strips");
1227 if (!
ELEM(seq, activeseq, seq2)) {
1228 if (seq2 ==
nullptr) {
1231 else if (seq1 ==
nullptr) {
1235 *r_error_str =
N_(
"Cannot apply effect to more than 2 sequence strips");
1244 if (seq2 ==
nullptr) {
1245 *r_error_str =
N_(
"At least one selected sequence strip is needed");
1248 if (seq1 ==
nullptr) {
1253 if (seq1 ==
nullptr || seq2 ==
nullptr) {
1254 *r_error_str =
N_(
"2 selected sequence strips are needed");
1260 if (seq1 ==
nullptr && seq2 ==
nullptr) {
1261 *r_error_str =
N_(
"TODO: in what cases does this happen?");
1270 *r_selseq2 =
nullptr;
1280 const char *error_msg;
1301 last_seq->
seq1 = seq1;
1302 last_seq->
seq2 = seq2;
1304 int old_start = last_seq->
start;
1338 ot->
name =
"Reassign Inputs";
1339 ot->
idname =
"SEQUENCER_OT_reassign_inputs";
1340 ot->
description =
"Reassign the inputs for the effect strip";
1361 if (last_seq->
seq1 ==
nullptr || last_seq->
seq2 ==
nullptr) {
1366 seq = last_seq->
seq1;
1368 last_seq->
seq2 = seq;
1379 ot->
name =
"Swap Inputs";
1380 ot->
idname =
"SEQUENCER_OT_swap_inputs";
1381 ot->
description =
"Swap the two inputs of the effect strip";
1414 {0,
nullptr, 0,
nullptr,
nullptr},
1423 {0,
nullptr, 0,
nullptr,
nullptr},
1448 bool changed =
false;
1449 bool seq_selected =
false;
1469 if (use_cursor_position && seq->machine != split_channel) {
1473 if (ignore_selection || seq->flag &
SELECT) {
1474 const char *error_msg =
nullptr;
1480 if (error_msg !=
nullptr) {
1487 if (ignore_selection) {
1488 if (use_cursor_position) {
1491 seq->machine == split_channel)
1496 if (!seq_selected) {
1499 seq->machine == split_channel)
1501 seq->flag &= ~SEQ_ALLSEL;
1512 seq->flag &= ~SEQ_ALLSEL;
1517 seq->flag &= ~SEQ_ALLSEL;
1539 int split_frame = scene->r.cfra;
1553 split_frame = mouseloc[0];
1586 ot->
name =
"Split Strips";
1606 "Frame where selected strips will be split",
1615 "Channel in which strip will be cut",
1623 "The type of split operation to perform on strips");
1626 "use_cursor_position",
1628 "Use Cursor Position",
1629 "Split at position of the cursor instead of current frame");
1636 "The side that remains selected after splitting");
1645 "Make cut even if strip is not selected preserving selection state after cut");
1661 if (ed ==
nullptr) {
1666 ListBase duplicated_strips = {
nullptr,
nullptr};
1671 if (duplicated_strips.
first ==
nullptr) {
1691 for (; seq; seq = seq->
next) {
1692 if (active_seq !=
nullptr &&
STREQ(seq->
name, active_seq->
name)) {
1713 ot->
name =
"Duplicate Strips";
1714 ot->
idname =
"SEQUENCER_OT_duplicate";
1782 if (event->
mval[1] <= 30) {
1795 ot->
name =
"Delete Strips";
1796 ot->
idname =
"SEQUENCER_OT_delete";
1797 ot->
description =
"Delete selected strips from the sequencer";
1812 "After removing the Strip, delete the associated data also");
1868 ot->
name =
"Clear Strip Offset";
1869 ot->
idname =
"SEQUENCER_OT_offset_clear";
1870 ot->
description =
"Clear strip offsets from the start and end frames";
1895 int start_ofs, timeline_frame, frame_end;
1912 while (timeline_frame < frame_end) {
1918 seq_new->
start = start_ofs;
1922 seq_new->
endofs = 1 - step;
1925 strip_new = seq_new->
strip;
1936 seq_new->
flag &= ~SEQ_OVERLAP;
1966 C, op, event,
IFACE_(
"Separate Sequence Images"),
IFACE_(
"Separate"));
1972 ot->
name =
"Separate Images";
1973 ot->
idname =
"SEQUENCER_OT_images_separate";
1974 ot->
description =
"On image sequence strips, it returns a strip for each image";
1984 RNA_def_int(
ot->
srna,
"length", 1, 1, INT_MAX,
"Length",
"Length of each frame", 1, 1000);
2026 ot->
name =
"Toggle Meta Strip";
2027 ot->
idname =
"SEQUENCER_OT_meta_toggle";
2028 ot->
description =
"Toggle a meta-strip (to edit enclosed strips)";
2058 int channel_max = 1, channel_min = INT_MAX, meta_start_frame =
MAXFRAME,
2067 strips_to_move.
add(seq);
2072 for (
Sequence *seq : strips_to_move) {
2076 channel_max =
max_ii(seq->machine, channel_max);
2077 channel_min =
min_ii(seq->machine, channel_min);
2084 for (
int i = channel_min; i <= channel_max; i++) {
2088 channel_meta->
flag = channel_cur->
flag;
2094 seqm->
start = meta_start_frame;
2095 seqm->
len = meta_end_frame - meta_start_frame;
2111 ot->
name =
"Make Meta Strip";
2112 ot->
idname =
"SEQUENCER_OT_meta_make";
2113 ot->
description =
"Group selected strips into a meta-strip";
2156 if (seq->flag &
SELECT) {
2157 seq->flag &= ~SEQ_OVERLAP;
2173 ot->
name =
"UnMeta Strip";
2174 ot->
idname =
"SEQUENCER_OT_meta_separate";
2175 ot->
description =
"Put the contents of a meta-strip back in the sequencer";
2193 const bool do_skip_mute,
2194 const bool do_center)
2196 bool changed =
false;
2197 int timeline_frame = scene->r.cfra;
2199 scene, timeline_frame, side, do_skip_mute, do_center,
false);
2201 if (next_frame != timeline_frame) {
2202 scene->r.cfra = next_frame;
2212 if (
G.is_rendering) {
2239 ot->
name =
"Jump to Strip";
2240 ot->
idname =
"SEQUENCER_OT_strip_jump";
2264 {0,
nullptr, 0,
nullptr,
nullptr},
2288 Sequence *seq, *best_seq =
nullptr;
2291 int dist, best_dist;
2294 if (ed ==
nullptr) {
2301 ((sel == -1) || (sel == (seq->
flag &
SELECT))))
2328 if (dist < best_dist) {
2340 return ((par->
seq1 == seq) || (par->
seq2 == seq));
2352 if (active_seq ==
nullptr) {
2408 ot->
description =
"Swap active strip with strip to the right or left";
2434 if (active_seq ==
nullptr || active_seq->
strip ==
nullptr) {
2438 switch (active_seq->
type) {
2449 if (se ==
nullptr) {
2474 ot->
name =
"Set Render Size";
2475 ot->
idname =
"SEQUENCER_OT_rendersize";
2476 ot->
description =
"Set render size and aspect from active sequence";
2497 ot->
description =
"Copy the selected strips to the internal clipboard";
2516 bool changed =
false;
2518 if (ed ==
nullptr) {
2524 seq->flag &= ~SEQ_ALLSEL;
2536 ot->
description =
"Paste strips from the internal clipboard";
2551 "Keep strip offset relative to the current frame when pasting");
2566 const char *error_msg;
2589 if (seq_act->
sound) {
2592 if (seq_other->
sound) {
2607 ot->
name =
"Sequencer Swap Data";
2608 ot->
idname =
"SEQUENCER_OT_swap_data";
2632 if (*seq_1 ==
nullptr || *seq_2 ==
nullptr) {
2637 std::swap(*seq_1, *seq_2);
2648 ot->
name =
"Change Effect Input";
2649 ot->
idname =
"SEQUENCER_OT_change_effect_input";
2666 {
SEQ_TYPE_CROSS,
"CROSS", 0,
"Crossfade",
"Crossfade effect strip type"},
2667 {
SEQ_TYPE_ADD,
"ADD", 0,
"Add",
"Add effect strip type"},
2668 {
SEQ_TYPE_SUB,
"SUBTRACT", 0,
"Subtract",
"Subtract effect strip type"},
2671 {
SEQ_TYPE_GAMCROSS,
"GAMMA_CROSS", 0,
"Gamma Cross",
"Gamma Cross effect strip type"},
2672 {
SEQ_TYPE_MUL,
"MULTIPLY", 0,
"Multiply",
"Multiply effect strip type"},
2673 {
SEQ_TYPE_OVERDROP,
"OVER_DROP", 0,
"Alpha Over Drop",
"Alpha Over Drop effect strip type"},
2674 {
SEQ_TYPE_WIPE,
"WIPE", 0,
"Wipe",
"Wipe effect strip type"},
2675 {
SEQ_TYPE_GLOW,
"GLOW", 0,
"Glow",
"Glow effect strip type"},
2677 {
SEQ_TYPE_COLOR,
"COLOR", 0,
"Color",
"Color effect strip type"},
2678 {
SEQ_TYPE_SPEED,
"SPEED", 0,
"Speed",
"Color effect strip type"},
2684 {0,
nullptr, 0,
nullptr,
nullptr},
2710 seq->
type = new_type;
2724 ot->
name =
"Change Effect Type";
2725 ot->
idname =
"SEQUENCER_OT_change_effect_type";
2739 "Sequencer effect type");
2756 int minext_frameme, numdigits;
2764 if (use_placeholders) {
2775 if (is_relative_path) {
2788 if (use_placeholders) {
2805 seq->
flag &= ~SEQ_SINGLE_FRAME_CONTENT;
2817 if (sound ==
nullptr) {
2872 ot->
name =
"Change Data/Files";
2873 ot->
idname =
"SEQUENCER_OT_change_path";
2895 "Use placeholders for missing frames of the strip");
2907 if (ed ==
nullptr) {
2920 if (scene_seq ==
nullptr) {
2928 seq->
scene = scene_seq;
2955 ot->
name =
"Change Scene";
2956 ot->
idname =
"SEQUENCER_OT_change_scene";
2983 const Scene *scene =
static_cast<Scene *
>(thunk);
2991 if (seq_a_start == seq_b_start) {
2995 return (seq_a_start > seq_b_start);
3059 if (ed !=
nullptr) {
3074 for (seq =
static_cast<Sequence *
>(text_seq.
first); seq; seq = seq_next) {
3076 char timecode_str_start[32];
3077 char timecode_str_end[32];
3082 sizeof(timecode_str_start),
3089 sizeof(timecode_str_end),
3096 file,
"%d\n%s --> %s\n%s\n\n", iter++, timecode_str_start, timecode_str_end, data->text);
3118 ot->
name =
"Export Subtitles";
3119 ot->
idname =
"SEQUENCER_OT_export_subtitles";
3120 ot->
description =
"Export .srt file containing text strips";
3152 bool selected =
false;
3156 if (seq->flag &
SELECT) {
3177 scene->r.psfra =
max_ii(0, sfra);
3178 scene->r.pefra = efra;
3181 scene->r.flag &= ~SCER_PRV_RANGE;
3182 scene->r.sfra =
max_ii(0, sfra);
3183 scene->r.efra = efra;
3196 ot->
name =
"Set Range to Strips";
3197 ot->
idname =
"SEQUENCER_OT_set_range_to_strips";
3198 ot->
description =
"Set the frame range to the selected strips start and end";
3228 {
STRIP_TRANSFORM_ALL,
"ALL", 0,
"All",
"Reset strip transform location, scale and rotation"},
3229 {0,
nullptr, 0,
nullptr,
nullptr},
3243 transform->
xofs = 0;
3244 transform->yofs = 0;
3247 transform->scale_x = 1.0f;
3248 transform->scale_y = 1.0f;
3251 transform->rotation = 0.0f;
3254 transform->xofs = 0;
3255 transform->yofs = 0;
3256 transform->scale_x = 1.0f;
3257 transform->scale_y = 1.0f;
3258 transform->rotation = 0.0f;
3272 ot->
name =
"Clear Strip Transform";
3273 ot->
idname =
"SEQUENCER_OT_strip_transform_clear";
3274 ot->
description =
"Reset image transformation to default value";
3288 "Strip transform property to be reset");
3298 {
SEQ_SCALE_TO_FIT,
"FIT", 0,
"Scale to Fit",
"Scale image so fits in preview"},
3299 {
SEQ_SCALE_TO_FILL,
"FILL", 0,
"Scale to Fill",
"Scale image so it fills preview completely"},
3300 {
SEQ_STRETCH_TO_FILL,
"STRETCH", 0,
"Stretch to Fill",
"Stretch image so it fills preview"},
3301 {0,
nullptr, 0,
nullptr,
nullptr},
3312 const int timeline_frame = scene->r.cfra;
3315 if (strip_elem ==
nullptr) {
3336 ot->
name =
"Strip Transform Set Fit";
3337 ot->
idname =
"SEQUENCER_OT_strip_transform_fit";
3351 "Scale fit fit_method");
3361 if (seq->flag &
SELECT) {
3362 seq->color_tag = color_tag;
3373 if (scene ==
nullptr) {
3378 if (ed ==
nullptr) {
3383 return act_seq !=
nullptr;
3389 ot->
name =
"Set Color Tag";
3390 ot->
idname =
"SEQUENCER_OT_strip_color_tag_set";
3391 ot->
description =
"Set a color tag for the selected strips";
3415 float cursor_pixel[2];
3429 float cursor_pixel[2];
3431 ®ion->v2d, event->
mval[0], event->
mval[1], &cursor_pixel[0], &cursor_pixel[1]);
3441 ot->
name =
"Set 2D Cursor";
3443 ot->
idname =
"SEQUENCER_OT_cursor_set";
3461 "Cursor location in normalized preview coordinates",
3502 ot->
name =
"Update Scene Frame Range";
3504 ot->
idname =
"SEQUENCER_OT_scene_frame_range_update";
Functions for backward compatibility with the legacy Action API.
ScrArea * CTX_wm_area(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
SpaceSeq * CTX_wm_space_seq(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_sound_load(struct Main *bmain, struct bSound *sound)
void * BKE_sound_add_scene_sound_defaults(struct Scene *scene, struct Sequence *sequence)
void BKE_sound_remove_scene_sound(struct Scene *scene, void *handle)
File and directory operations.
bool BLI_file_touch(const char *filepath) ATTR_NONNULL(1)
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_file_is_writable(const char *filepath) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
FILE * BLI_fopen(const char *filepath, const char *mode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_file_ensure_parent_dir_exists(const char *filepath) ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
MINLINE int round_fl_to_int(float a)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v2_v2(float r[2], const float a[2])
#define BLI_path_join(...)
bool BLI_path_extension_ensure(char *path, size_t path_maxncpy, const char *ext) ATTR_NONNULL(1
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
int bool BLI_str_startswith(const char *__restrict str, const char *__restrict start) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t BLI_timecode_string_from_time(char *str, size_t maxncpy, int brevity_level, float time_seconds, double fps, short timecode_style) ATTR_NONNULL()
#define BLT_I18NCONTEXT_ID_SEQUENCE
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_SEQUENCER_STRIPS
#define ID_IS_EDITABLE(_id)
#define SEQ_HAS_PATH(_seq)
@ SEQ_SINGLE_FRAME_CONTENT
@ SEQ_IGNORE_CHANNEL_LOCK
@ SEQ_VIEW_SEQUENCE_PREVIEW
void ED_fileselect_ensure_default_filepath(bContext *C, wmOperator *op, const char *extension)
bool ED_scene_delete(bContext *C, Main *bmain, Scene *scene) ATTR_NONNULL()
void ED_area_status_text(ScrArea *area, const char *str)
bool ED_operator_sequencer_active(bContext *C)
blender::VectorSet< Sequence * > ED_sequencer_selected_strips_from_context(bContext *C)
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define RNA_BEGIN(sptr, itemptr, propname)
const EnumPropertyItem * RNA_scene_without_active_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
#define SEQ_DUPE_UNIQUE_NAME
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
View2D * UI_view2d_fromcontext(const bContext *C)
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
#define ND_SPACE_SEQUENCER
#define ND_RENDER_OPTIONS
void SEQ_animation_backup_original(Scene *scene, SeqAnimationBackup *backup)
void SEQ_offset_animdata(Scene *scene, Sequence *seq, int ofs)
void SEQ_animation_duplicate_backup_to_scene(Scene *scene, Sequence *seq, SeqAnimationBackup *backup)
void SEQ_animation_restore_original(Scene *scene, SeqAnimationBackup *backup)
SeqTimelineChannel * SEQ_channel_get_by_index(const ListBase *channels, const int channel_index)
ListBase * SEQ_channels_displayed_get(Editing *ed)
void add_multiple(Span< Key > keys)
local_group_size(16, 16) .push_constant(Type b
SeqEffectHandle SEQ_effect_handle_get(Sequence *seq)
int SEQ_effect_get_num_inputs(int seq_type)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
const vector< Marker > & markers
VectorSet< Sequence * > SEQ_query_selected_strips(ListBase *seqbase)
void SEQ_for_each_callback(ListBase *seqbase, SeqForEachFunc callback, void *user_data)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
Vector< FCurve * > fcurves_for_assigned_action(AnimData *adt)
void thumbnail_cache_invalidate_strip(Scene *scene, const Sequence *seq)
void media_presence_free(Scene *scene)
void thumbnail_cache_clear(Scene *scene)
void SEQ_prefetch_stop(Scene *scene)
bool SEQ_render_is_muted(const ListBase *channels, const Sequence *seq)
StripElem * SEQ_render_give_stripelem(const Scene *scene, const Sequence *seq, int timeline_frame)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
bool RNA_struct_property_is_set_ex(PointerRNA *ptr, const char *identifier, bool use_ghost)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
int RNA_int_get(PointerRNA *ptr, const char *name)
char * RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen, int *r_len)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
const EnumPropertyItem rna_enum_dummy_NULL_items[]
const EnumPropertyItem rna_enum_strip_color_items[]
void SEQ_sequence_lookup_invalidate(const Scene *scene)
void SEQ_sequence_base_unique_name_recursive(Scene *scene, ListBase *seqbasep, Sequence *seq)
void SEQ_set_scale_to_fit(const Sequence *seq, const int image_width, const int image_height, const int preview_width, const int preview_height, const eSeqImageFitMethod fit_method)
void SEQ_ensure_unique_name(Sequence *seq, Scene *scene)
Mask * SEQ_active_mask_get(Scene *scene)
void SEQ_sequence_base_dupli_recursive(const Scene *scene_src, Scene *scene_dst, ListBase *nseqbase, const ListBase *seqbase, int dupe_flag, const int flag)
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Sequence * SEQ_meta_stack_pop(Editing *ed)
Sequence * SEQ_sequence_dupli_recursive(const Scene *scene_src, Scene *scene_dst, ListBase *new_seq_list, Sequence *seq, int dupe_flag)
void SEQ_meta_stack_set(const Scene *scene, Sequence *dst_seq)
Sequence * SEQ_sequence_alloc(ListBase *lb, int timeline_frame, int machine, int type)
Editing * SEQ_editing_get(const Scene *scene)
void sequencer_image_seq_reserve_frames(wmOperator *op, StripElem *se, int len, int minframe, int numdigits)
int sequencer_image_seq_get_minmax_frame(wmOperator *op, int sfra, int *r_minframe, int *r_numdigits)
int sequencer_clipboard_paste_exec(bContext *C, wmOperator *op)
int sequencer_clipboard_copy_exec(bContext *C, wmOperator *op)
bool sequencer_view_preview_only_poll(const bContext *C)
bool ED_space_sequencer_check_show_strip(SpaceSeq *sseq)
static bool sequencer_strip_color_tag_set_poll(bContext *C)
void SEQUENCER_OT_change_effect_input(wmOperatorType *ot)
static void sequencer_slip_strips(Scene *scene, SlipData *data, int delta, float subframe_delta)
void SEQUENCER_OT_strip_transform_fit(wmOperatorType *ot)
static int sequencer_snap_exec(bContext *C, wmOperator *op)
static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
bool sequencer_strip_has_path_poll(bContext *C)
static int sequencer_change_scene_exec(bContext *C, wmOperator *op)
static int sequencer_mute_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_mute(wmOperatorType *ot)
static int sequencer_separate_images_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQUENCER_OT_copy(wmOperatorType *ot)
static int sequencer_lock_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_delete(wmOperatorType *ot)
bool ED_space_sequencer_check_show_imbuf(SpaceSeq *sseq)
void SEQUENCER_OT_rendersize(wmOperatorType *ot)
static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
static int sequencer_delete_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQUENCER_OT_set_range_to_strips(wmOperatorType *ot)
int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **r_selseq1, Sequence **r_selseq2, const char **r_error_str)
static int sequencer_connect_exec(bContext *C, wmOperator *op)
static int sequencer_reload_exec(bContext *C, wmOperator *op)
static void sequencer_split_ui(bContext *, wmOperator *op)
static bool sequencer_scene_frame_range_update_poll(bContext *C)
bool ED_space_sequencer_maskedit_poll(bContext *C)
bool sequencer_view_has_preview_poll(bContext *C)
void SEQUENCER_OT_change_effect_type(wmOperatorType *ot)
static int sequencer_slip_exec(bContext *C, wmOperator *op)
static void handle_number_input(bContext *C, wmOperator *op, ScrArea *area, SlipData *data, Scene *scene)
void SEQUENCER_OT_scene_frame_range_update(wmOperatorType *ot)
bool ED_space_sequencer_maskedit_mask_poll(bContext *C)
@ STRIP_TRANSFORM_POSITION
@ STRIP_TRANSFORM_ROTATION
static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int sequencer_meta_separate_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_reload(wmOperatorType *ot)
static void sequencer_delete_strip_data(bContext *C, Sequence *seq)
static int sequencer_strip_transform_clear_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_swap_data(wmOperatorType *ot)
static bool seq_is_parent(const Sequence *par, const Sequence *seq)
static int slip_count_sequences(ListBase *seqbasep)
void SEQUENCER_OT_strip_transform_clear(wmOperatorType *ot)
static const EnumPropertyItem scale_fit_methods[]
static bool sequencer_refresh_all_poll(bContext *C)
void SEQUENCER_OT_lock(wmOperatorType *ot)
static bool sequencer_strip_change_scene_poll(bContext *C)
static int sequencer_swap_data_exec(bContext *C, wmOperator *op)
static int sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQUENCER_OT_disconnect(wmOperatorType *ot)
void SEQUENCER_OT_connect(wmOperatorType *ot)
void SEQUENCER_OT_strip_color_tag_set(wmOperatorType *ot)
void SEQUENCER_OT_images_separate(wmOperatorType *ot)
static int sequencer_unmute_exec(bContext *C, wmOperator *op)
static bool sequencer_fcurves_targets_color_strip(const FCurve *fcurve)
static int sequencer_offset_clear_exec(bContext *C, wmOperator *)
static int seq_cmp_time_startdisp_channel(void *thunk, const void *a, const void *b)
void SEQUENCER_OT_reassign_inputs(wmOperatorType *ot)
static bool sequencer_strip_is_text_poll(bContext *C)
static int sequence_split_side_for_exec_get(wmOperator *op)
static int sequencer_set_2d_cursor_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_change_path(wmOperatorType *ot)
static bool seq_get_text_strip_cb(Sequence *seq, void *user_data)
static int sequencer_snap_invoke(bContext *C, wmOperator *op, const wmEvent *)
void SEQUENCER_OT_refresh_all(wmOperatorType *ot)
void SEQUENCER_OT_offset_clear(wmOperatorType *ot)
static int sequencer_gap_insert_exec(bContext *C, wmOperator *op)
static int sequencer_strip_jump_exec(bContext *C, wmOperator *op)
static bool strip_jump_internal(Scene *scene, const short side, const bool do_skip_mute, const bool do_center)
void SEQUENCER_OT_meta_make(wmOperatorType *ot)
bool sequencer_edit_with_channel_region_poll(bContext *C)
void SEQUENCER_OT_unmute(wmOperatorType *ot)
static int sequencer_change_effect_type_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_gap_insert(wmOperatorType *ot)
const EnumPropertyItem sequencer_prop_effect_types[]
static int sequencer_set_2d_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool ED_space_sequencer_has_playback_animation(const SpaceSeq *sseq, const Scene *scene)
static int sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
const EnumPropertyItem prop_side_types[]
static int sequencer_change_scene_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int sequencer_refresh_all_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_duplicate(wmOperatorType *ot)
static bool sequencer_effect_poll(bContext *C)
static void slip_add_sequences(ListBase *seqbasep, Sequence **seq_array)
static int mouse_frame_side(View2D *v2d, short mouse_x, int frame)
static int sequencer_slip_apply_limits(const Scene *scene, SlipData *data, int *offset)
static int sequencer_add_duplicate_exec(bContext *C, wmOperator *)
bool sequencer_edit_poll(bContext *C)
static int sequencer_disconnect_exec(bContext *C, wmOperator *)
static bool sequencer_strip_jump_poll(bContext *C)
static int sequencer_strip_color_tag_set_exec(bContext *C, wmOperator *op)
bool sequencer_view_strips_poll(bContext *C)
static int sequencer_scene_frame_range_update_exec(bContext *C, wmOperator *)
static void sequencer_slip_update_header(Scene *scene, ScrArea *area, SlipData *data, int offset)
void SEQUENCER_OT_slip(wmOperatorType *ot)
bool sequencer_editing_initialized_and_active(bContext *C)
void SEQUENCER_OT_swap(wmOperatorType *ot)
static int sequencer_split_exec(bContext *C, wmOperator *op)
static int sequencer_rendersize_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_gap_remove(wmOperatorType *ot)
void SEQUENCER_OT_snap(wmOperatorType *ot)
static int sequencer_change_path_exec(bContext *C, wmOperator *op)
static int sequencer_gap_remove_exec(bContext *C, wmOperator *op)
bool sequencer_strip_editable_poll(bContext *C)
static int sequencer_unlock_exec(bContext *C, wmOperator *)
bool ED_sequencer_deselect_all(Scene *scene)
void SEQUENCER_OT_paste(wmOperatorType *ot)
void SEQUENCER_OT_swap_inputs(wmOperatorType *ot)
static int sequencer_set_range_to_strips_exec(bContext *C, wmOperator *op)
static int sequencer_meta_toggle_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_meta_toggle(wmOperatorType *ot)
static const EnumPropertyItem prop_split_types[]
void SEQUENCER_OT_export_subtitles(wmOperatorType *ot)
void SEQUENCER_OT_change_scene(wmOperatorType *ot)
static int sequencer_change_effect_input_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem prop_side_lr_types[]
void SEQUENCER_OT_split(wmOperatorType *ot)
bool ED_space_sequencer_check_show_maskedit(SpaceSeq *sseq, Scene *scene)
void SEQUENCER_OT_unlock(wmOperatorType *ot)
static int sequencer_swap_inputs_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_cursor_set(wmOperatorType *ot)
static int sequencer_change_path_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int sequencer_swap_exec(bContext *C, wmOperator *op)
static int sequencer_delete_exec(bContext *C, wmOperator *op)
static int sequencer_strip_transform_fit_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_strip_jump(wmOperatorType *ot)
static int sequencer_export_subtitles_invoke(bContext *C, wmOperator *op, const wmEvent *)
void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
static void swap_sequence(Scene *scene, Sequence *seqa, Sequence *seqb)
static const EnumPropertyItem transform_reset_properties[]
static Sequence * find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel)
static int sequencer_split_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const bool lock_range)
bool SEQ_disconnect(Sequence *seq)
void SEQ_connect(Sequence *seq1, Sequence *seq2)
blender::VectorSet< Sequence * > SEQ_get_connected_strips(const Sequence *seq)
bool SEQ_are_strips_connected_together(blender::VectorSet< Sequence * > &seq_list)
bool SEQ_edit_remove_gaps(Scene *scene, ListBase *seqbase, const int initial_frame, const bool remove_all_gaps)
void SEQ_edit_flag_for_removal(Scene *scene, ListBase *seqbase, Sequence *seq)
Sequence * SEQ_edit_strip_split(Main *bmain, Scene *scene, ListBase *seqbase, Sequence *seq, const int timeline_frame, const eSeqSplitMethod method, const char **r_error)
bool SEQ_edit_sequence_swap(Scene *scene, Sequence *seq_a, Sequence *seq_b, const char **r_error_str)
void SEQ_edit_remove_flagged_sequences(Scene *scene, ListBase *seqbase)
bool SEQ_relations_render_loop_check(Sequence *seq_main, Sequence *seq)
void SEQ_relations_invalidate_cache_raw(Scene *scene, Sequence *seq)
void SEQ_relations_sequence_free_anim(Sequence *seq)
void SEQ_relations_invalidate_dependent(Scene *scene, Sequence *seq)
void SEQ_relations_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render)
void SEQ_relations_invalidate_cache_preprocessed(Scene *scene, Sequence *seq)
void SEQ_relations_invalidate_cache_composite(Scene *scene, Sequence *seq)
bool SEQ_select_active_get_pair(Scene *scene, Sequence **r_seq_act, Sequence **r_seq_other)
void SEQ_select_active_set(Scene *scene, Sequence *seq)
Sequence * SEQ_select_active_get(const Scene *scene)
void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame)
void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
void SEQ_time_slip_strip(const Scene *scene, Sequence *seq, int delta, float subframe_delta)
int SEQ_time_find_next_prev_edit(Scene *scene, int timeline_frame, const short side, const bool do_skip_mute, const bool do_center, const bool do_unselected)
float SEQ_time_start_frame_get(const Sequence *seq)
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)
void(* free)(Sequence *seq, bool do_id_user)
void(* init)(Sequence *seq)
float previous_subframe_offset
StripTransform * transform
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* ui)(bContext *C, wmOperator *op)
struct ReportList * reports
void WM_event_add_fileselect(bContext *C, wmOperator *op)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operator_properties_filesel(wmOperatorType *ot, const int filter, const short type, const eFileSel_Action action, const eFileSel_Flag flag, const short display, const short sort)
int WM_operator_props_popup_confirm_ex(bContext *C, wmOperator *op, const wmEvent *, std::optional< std::string > title, std::optional< std::string > confirm_text, const bool cancel_default)
int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *)