63#include "RNA_prototypes.hh"
84#include <fmt/format.h>
207 return (
ed && (
ed->act_strip !=
nullptr));
233 if (sseq ==
nullptr) {
260 if (sseq ==
nullptr) {
277 if (sseq ==
nullptr) {
300 if (active_strip && active_strip->is_effect()) {
376 sequencer_scene, seqbase, sequencer_scene->
r.
cfra);
385 return a->channel > b->channel;
388 for (
const Strip *strip : strips) {
400 if (!sequencer_scene) {
406 if (!scene_strip || !scene_strip->
scene) {
417 if (active_scene != scene_strip->
scene) {
421 active_scene = scene_strip->
scene;
439 if (
view3d->camera == camera) {
450 sequencer_scene, scene_strip, sequencer_scene->
r.
cfra) +
451 active_scene->
r.
sfra;
453 active_scene->
r.
cfra = int(frame_index);
454 active_scene->
r.
subframe = frame_index - int(frame_index);
465 if (obact && prev_obact->
type == obact->
type) {
498 ot->name =
"Remove Gaps";
499 ot->idname =
"SEQUENCER_OT_gap_remove";
501 "Remove gap at current frame to first strip at the right, independent of selection or "
502 "locked state of strips";
512 RNA_def_boolean(
ot->srna,
"all",
false,
"All Gaps",
"Do all gaps to right of current frame");
536 ot->name =
"Insert Gaps";
537 ot->idname =
"SEQUENCER_OT_gap_insert";
539 "Insert gap at current frame to first strips at the right, independent of selection or "
540 "locked state of strips";
556 "Frames to insert after current strip",
584 scene, strip, (snap_frame - strip->startofs) - strip->start);
611 if (strip->is_effect()) {
614 if (strip->input1 && (strip->input1->flag &
SELECT)) {
615 if (!either_handle_selected) {
620 else if (strip->input2 && (strip->input2->flag &
SELECT)) {
621 if (!either_handle_selected) {
643 snap_frame = scene->
r.
cfra;
652 ot->name =
"Snap Strips to the Current Frame";
653 ot->idname =
"SEQUENCER_OT_snap";
654 ot->description =
"Frame where selected strips will be snapped";
670 "Frame where selected strips will be snapped",
722 {0,
nullptr, 0,
nullptr,
nullptr},
749 if (
data->can_clamp) {
752 if (
data->clamp_warning) {
753 status.item(
TIP_(
"Not enough content to clamp strip(s)"), ICON_ERROR);
762 if (area ==
nullptr) {
773 int frame_offset = std::trunc(offset);
774 if (
data->show_subframe) {
775 float subframe_offset_sec = (offset - std::trunc(offset)) / scene->frames_per_second();
777 IFACE_(
"Slip Offset: Frames: %d Sound Offset: %.3f"),
779 subframe_offset_sec);
805 for (
Strip *connection : connections) {
806 strips.
add(connection);
819 MEM_SAFE_DELETE(
data);
822 data->strips = strips;
824 data->show_subframe =
false;
825 data->clamp_warning =
false;
826 data->can_clamp =
false;
829 for (
Strip *strip : strips) {
841 data->clamp_warning =
true;
845 data->can_clamp =
true;
848 data->show_subframe =
true;
862 if (
data ==
nullptr) {
869 v2d, event->
mval[0], event->
mval[1], &
data->init_mouse_co[0], &
data->init_mouse_co[1]);
870 data->precision =
false;
871 data->prev_offset = 0.0f;
872 data->prev_mval_x =
event->mval[0];
873 data->virtual_mval_x =
event->mval[0];
892 float new_offset =
data->prev_offset + delta;
895 int frame_delta = std::trunc(new_offset) - std::trunc(
data->prev_offset);
897 float subframe_delta = 0.0f;
899 if (std::trunc(delta) != delta) {
902 subframe_delta = delta - frame_delta;
912 if (
data->clamp ==
true) {
927 data->prev_offset = new_offset;
940 MEM_SAFE_DELETE(
data);
953 float offset_delta = *r_offset -
data->prev_offset;
955 if (
data->can_clamp) {
969 if (
data->clamp && strip->
len >= right_handle - left_handle) {
970 if (unclamped_start > left_handle) {
971 diff = left_handle - unclamped_start;
973 else if (unclamped_end < right_handle) {
974 diff = right_handle - unclamped_end;
980 if (unclamped_start > right_handle - 1) {
981 diff = right_handle - 1 - unclamped_start;
984 if (unclamped_end < left_handle + 1) {
985 diff = left_handle + 1 - unclamped_end;
990 offset_delta +=
diff;
1002 if (
data ==
nullptr) {
1045 switch (event->
val) {
1056 if (!has_num_input) {
1057 data->precision =
true;
1061 float offset = mouse_co[0] -
data->init_mouse_co[0];
1062 float subframe_offset = offset - std::trunc(offset);
1067 if (!has_num_input) {
1068 data->precision =
false;
1087 if (!has_num_input) {
1088 float mouse_x_delta =
event->mval[0] -
data->prev_mval_x;
1089 data->prev_mval_x += mouse_x_delta;
1090 if (
data->precision) {
1091 mouse_x_delta *= 0.1f;
1093 data->virtual_mval_x += mouse_x_delta;
1097 float offset = mouse_co[0] -
data->init_mouse_co[0];
1098 if (!
data->precision) {
1099 offset = std::trunc(offset);
1102 float clamped_offset = offset;
1122 ot->name =
"Slip Strips";
1123 ot->idname =
"SEQUENCER_OT_slip";
1124 ot->description =
"Slip the contents of selected strips";
1144 "Offset to the data of the strip",
1152 "Move the keyframes alongside the media");
1154 "use_cursor_position",
1156 "Use Cursor Position",
1157 "Slip strips under mouse cursor instead of all selected strips");
1159 "ignore_connections",
1161 "Ignore Connections",
1162 "Do not slip connected strips if using cursor position");
1176 for (
Strip *strip : strips) {
1178 if (strip->flag &
SELECT) {
1184 if ((strip->flag &
SELECT) == 0) {
1202 ot->name =
"Mute Strips";
1203 ot->idname =
"SEQUENCER_OT_mute";
1204 ot->description =
"Mute (un)selected strips";
1214 ot->srna,
"unselected",
false,
"Unselected",
"Mute unselected rather than selected strips");
1240 if (strip->flag &
SELECT) {
1246 if ((strip->flag &
SELECT) == 0) {
1264 ot->name =
"Unmute Strips";
1265 ot->idname =
"SEQUENCER_OT_unmute";
1266 ot->description =
"Unmute (un)selected strips";
1279 "Unmute unselected rather than selected strips");
1294 if (strip->flag &
SELECT) {
1307 ot->name =
"Lock Strips";
1308 ot->idname =
"SEQUENCER_OT_lock";
1309 ot->description =
"Lock strips so they cannot be transformed";
1331 if (strip->flag &
SELECT) {
1344 ot->name =
"Unlock Strips";
1345 ot->idname =
"SEQUENCER_OT_unlock";
1346 ot->description =
"Unlock strips so they can be transformed";
1388 ot->name =
"Connect Strips";
1389 ot->idname =
"SEQUENCER_OT_connect";
1390 ot->description =
"Link selected strips together for simplified group selection";
1397 RNA_def_boolean(
ot->srna,
"toggle",
true,
"Toggle",
"Toggle strip connections");
1423 ot->name =
"Disconnect Strips";
1424 ot->idname =
"SEQUENCER_OT_disconnect";
1425 ot->description =
"Unlink selected strips so that they can be selected individually";
1447 if (strip->flag &
SELECT) {
1451 if (adjust_length) {
1469 ot->name =
"Reload Strips";
1470 ot->idname =
"SEQUENCER_OT_reload";
1471 ot->description =
"Reload strips in the sequencer";
1484 "Adjust length of strips to their data length");
1496 if (
G.is_rendering) {
1519 ot->name =
"Refresh Sequencer";
1520 ot->idname =
"SEQUENCER_OT_refresh_all";
1521 ot->description =
"Refresh the sequencer editor";
1537 return "Cannot apply effect to more than 2 strips with video content";
1539 if (num_inputs == 2 &&
inputs.size() != 2) {
1540 return "Exactly 2 selected strips with video content are needed";
1542 if (num_inputs == 1 &&
inputs.size() != 1) {
1543 return "Exactly one selected strip with video content is needed";
1552 if (num_inputs == 0) {
1562 if (ignore_active) {
1566 selected_strips.
remove_if([&](
Strip *strip) {
return strip == active_strip; });
1569 if (selected_strips.
size() > num_inputs) {
1572 inputs.add(selected_strips[
i]);
1577 return selected_strips;
1586 if (num_inputs == 0) {
1610 active_strip->
input1 = input1;
1611 active_strip->
input2 = input2;
1613 int old_start = active_strip->
start;
1638 ot->name =
"Reassign Inputs";
1639 ot->idname =
"SEQUENCER_OT_reassign_inputs";
1640 ot->description =
"Reassign the inputs for the effect strip";
1661 if (!active_strip->is_effect()) {
1667 active_strip->
input2 ==
nullptr)
1675 active_strip->
input2 = strip;
1685 ot->name =
"Swap Inputs";
1686 ot->idname =
"SEQUENCER_OT_swap_inputs";
1687 ot->description =
"Swap the two inputs of the effect strip";
1720 {0,
nullptr, 0,
nullptr,
nullptr},
1729 {0,
nullptr, 0,
nullptr,
nullptr},
1754 bool changed =
false;
1755 bool strip_selected =
false;
1772 if (use_cursor_position && strip->channel != split_channel) {
1776 if (ignore_selection || strip->flag &
SELECT) {
1777 const char *error_msg =
nullptr;
1780 ed->current_strips(),
1785 &error_msg) !=
nullptr)
1789 if (error_msg !=
nullptr) {
1796 if (ignore_selection) {
1797 if (use_cursor_position) {
1800 strip->channel == split_channel)
1805 if (!strip_selected) {
1808 strip->channel == split_channel)
1848 int split_frame = scene->
r.
cfra;
1906 ot->name =
"Split Strips";
1907 ot->idname =
"SEQUENCER_OT_split";
1908 ot->description =
"Split the selected strips in two";
1926 "Frame where selected strips will be split",
1935 "Channel in which strip will be cut",
1943 "The type of split operation to perform on strips");
1946 "use_cursor_position",
1948 "Use Cursor Position",
1949 "Split at position of the cursor instead of current frame");
1956 "The side that remains selected after splitting");
1965 "Make cut even if strip is not selected preserving selection state after cut");
1970 "ignore_connections",
1972 "Ignore Connections",
1973 "Don't propagate split to connected strips");
1989 switch (strip->type) {
1992 scenes.
add(strip->scene);
1997 movieclips.
add(strip->clip);
2002 masks.
add(strip->mask);
2010 const int num_scenes = scenes.
size();
2011 const int num_movieclips = movieclips.
size();
2012 const int num_masks = masks.
size();
2014 if (num_scenes == 0 && num_movieclips == 0 && num_masks == 0) {
2021 report += fmt::format(
"{}{} {}",
2028 if (num_movieclips) {
2029 report += fmt::format(
"{}{} {}",
2037 report += fmt::format(
"{}{} {}",
2057 if (
ed ==
nullptr) {
2062 ListBase duplicated_strips = {
nullptr,
nullptr};
2080 bmain, scene, scene, &duplicated_strips,
ed->current_strips(), dupe_flag, 0);
2083 if (duplicated_strips.
first ==
nullptr) {
2109 for (
Strip *strip = strip_last->
next; strip; strip = strip->
next) {
2110 if (active_strip !=
nullptr &&
STREQ(strip->name, active_strip->
name)) {
2123 for (
Strip *strip = strip_last->
next; strip; strip = strip->
next) {
2144 ot->name =
"Duplicate Strips";
2145 ot->idname =
"SEQUENCER_OT_duplicate";
2146 ot->description =
"Duplicate the selected strips";
2159 "Duplicate strip but not strip data, linking to the original data");
2224 if (event->
mval[1] <= 30) {
2236 ot->name =
"Delete Strips";
2237 ot->idname =
"SEQUENCER_OT_delete";
2238 ot->description =
"Delete selected strips from the sequencer";
2253 "After removing the Strip, delete the associated data also");
2271 for (strip =
static_cast<Strip *
>(
ed->current_strips()->first); strip;
2272 strip =
static_cast<Strip *
>(strip->
next))
2278 if (!strip->is_effect() && (strip->
flag &
SELECT)) {
2284 strip =
static_cast<Strip *
>(
ed->current_strips()->first);
2287 strip = strip->
next;
2290 for (strip =
static_cast<Strip *
>(
ed->current_strips()->first); strip;
2291 strip =
static_cast<Strip *
>(strip->
next))
2293 if (!strip->is_effect() && (strip->
flag &
SELECT)) {
2308 ot->name =
"Clear Strip Offset";
2309 ot->idname =
"SEQUENCER_OT_offset_clear";
2310 ot->description =
"Clear strip in/out offsets from the start and end of content";
2333 Strip *strip, *strip_new;
2336 int start_ofs, timeline_frame, frame_end;
2339 strip =
static_cast<Strip *
>(seqbase->
first);
2353 while (timeline_frame < frame_end) {
2360 strip_new->
start = start_ofs;
2367 data_new = strip_new->
data;
2390 strip_next =
static_cast<Strip *
>(strip->
next);
2395 strip = strip->
next;
2410 C, op, event,
IFACE_(
"Separate Sequence Images"),
IFACE_(
"Separate"));
2416 ot->name =
"Separate Images";
2417 ot->idname =
"SEQUENCER_OT_images_separate";
2418 ot->description =
"On image sequence strips, it returns a strip for each image";
2428 RNA_def_int(
ot->srna,
"length", 1, 1, INT_MAX,
"Length",
"Length of each frame", 1, 1000);
2480 ot->name =
"Toggle Meta Strip";
2481 ot->idname =
"SEQUENCER_OT_meta_toggle";
2482 ot->description =
"Toggle a meta-strip (to edit enclosed strips)";
2513 int channel_max = 1, channel_min = std::numeric_limits<int>::max(), meta_start_frame =
MAXFRAME,
2514 meta_end_frame = std::numeric_limits<int>::min();
2524 for (
Strip *strip : strips_to_move) {
2528 channel_max =
max_ii(strip->channel, channel_max);
2529 channel_min =
min_ii(strip->channel, channel_min);
2536 for (
int i = channel_min;
i <= channel_max;
i++) {
2540 channel_meta->
flag = channel_cur->
flag;
2543 const int channel = active_strip ? active_strip->
channel : channel_max;
2547 strip_meta->
start = meta_start_frame;
2548 strip_meta->
len = meta_end_frame - meta_start_frame;
2564 ot->name =
"Make Meta Strip";
2565 ot->idname =
"SEQUENCER_OT_meta_make";
2566 ot->description =
"Group selected strips into a meta-strip";
2609 if (strip->flag &
SELECT) {
2626 ot->name =
"UnMeta Strip";
2627 ot->idname =
"SEQUENCER_OT_meta_separate";
2628 ot->description =
"Put the contents of a meta-strip back in the sequencer";
2646 const bool do_skip_mute,
2647 const bool do_center)
2649 bool changed =
false;
2650 int timeline_frame = scene->
r.
cfra;
2652 scene, timeline_frame, side, do_skip_mute, do_center,
false);
2654 if (next_frame != timeline_frame) {
2655 scene->
r.
cfra = next_frame;
2665 if (
G.is_rendering) {
2692 ot->name =
"Jump to Strip";
2693 ot->idname =
"SEQUENCER_OT_strip_jump";
2694 ot->description =
"Move frame to previous edit point";
2717 {0,
nullptr, 0,
nullptr,
nullptr},
2741 Strip *strip, *best_strip =
nullptr;
2744 int dist, best_dist;
2747 if (
ed ==
nullptr) {
2751 strip =
static_cast<Strip *
>(
ed->current_strips()->first);
2754 ((sel == -1) || (sel == (strip->
flag &
SELECT))))
2781 if (dist < best_dist) {
2786 strip =
static_cast<Strip *
>(strip->
next);
2793 return ((par->
input1 == strip) || (par->
input2 == strip));
2805 if (active_strip ==
nullptr) {
2843 if (istrip->is_effect() &&
2863 ot->name =
"Swap Strip";
2864 ot->idname =
"SEQUENCER_OT_swap";
2865 ot->description =
"Swap active strip with strip to the right or left";
2891 if (active_strip ==
nullptr || active_strip->
data ==
nullptr) {
2895 switch (active_strip->
type) {
2906 if (se ==
nullptr) {
2931 ot->name =
"Set Render Size";
2932 ot->idname =
"SEQUENCER_OT_rendersize";
2933 ot->description =
"Set render size and aspect from active strip";
2953 ot->idname =
"SEQUENCER_OT_copy";
2954 ot->description =
"Copy the selected strips to the internal clipboard";
2974 ot->idname =
"SEQUENCER_OT_paste";
2975 ot->description =
"Paste strips from the internal clipboard";
2991 "Keep strip offset relative to the current frame when pasting");
2993 prop =
RNA_def_int(
ot->srna,
"x", 0, INT_MIN, INT_MAX,
"X",
"", INT_MIN, INT_MAX);
2995 prop =
RNA_def_int(
ot->srna,
"y", 0, INT_MIN, INT_MAX,
"Y",
"", INT_MIN, INT_MAX);
3010 const char *error_msg;
3033 if (strip_act->
sound) {
3036 if (strip_other->
sound) {
3051 ot->name =
"Sequencer Swap Data";
3052 ot->idname =
"SEQUENCER_OT_swap_data";
3053 ot->description =
"Swap 2 sequencer strips";
3070 {
STRIP_TYPE_CROSS,
"CROSS", 0,
"Crossfade",
"Fade out of one video, fading into another"},
3071 {
STRIP_TYPE_ADD,
"ADD", 0,
"Add",
"Add together color channels from two videos"},
3072 {
STRIP_TYPE_SUB,
"SUBTRACT", 0,
"Subtract",
"Subtract one strip's color from another"},
3075 {
STRIP_TYPE_GAMCROSS,
"GAMMA_CROSS", 0,
"Gamma Crossfade",
"Crossfade with color correction"},
3076 {
STRIP_TYPE_MUL,
"MULTIPLY", 0,
"Multiply",
"Multiply color channels from two videos"},
3077 {
STRIP_TYPE_WIPE,
"WIPE", 0,
"Wipe",
"Sweep a transition line across the frame"},
3078 {
STRIP_TYPE_GLOW,
"GLOW", 0,
"Glow",
"Add blur and brightness to light areas"},
3080 {
STRIP_TYPE_SPEED,
"SPEED", 0,
"Speed",
"Timewarp video strips, modifying playback speed"},
3081 {
STRIP_TYPE_MULTICAM,
"MULTICAM", 0,
"Multicam Selector",
"Control active camera angles"},
3085 {
STRIP_TYPE_COLORMIX,
"COLORMIX", 0,
"Color Mix",
"Combine two strips using blend modes"},
3086 {0,
nullptr, 0,
nullptr,
nullptr},
3093 const int old_type = strip->
type;
3099 if (!strip->is_effect()) {
3109 sh.
free(strip,
true);
3111 strip->
type = new_type;
3135 ot->name =
"Change Effect Type";
3136 ot->idname =
"SEQUENCER_OT_change_effect_type";
3137 ot->description =
"Replace effect strip with another that takes the same number of inputs";
3151 "Strip effect type");
3168 int minext_frameme, numdigits;
3176 if (use_placeholders) {
3187 if (is_relative_path) {
3200 if (use_placeholders) {
3228 if (sound ==
nullptr) {
3286 ot->name =
"Change Data/Files";
3287 ot->idname =
"SEQUENCER_OT_change_path";
3309 "Use placeholders for missing frames of the strip");
3321 if (
ed ==
nullptr) {
3334 if (scene_seq ==
nullptr) {
3342 strip->
scene = scene_seq;
3371 ot->name =
"Change Scene";
3372 ot->idname =
"SEQUENCER_OT_change_scene";
3373 ot->description =
"Change Scene assigned to Strip";
3399 const Scene *scene =
static_cast<Scene *
>(thunk);
3400 const Strip *strip_a =
static_cast<const Strip *
>(a);
3401 const Strip *strip_b =
static_cast<const Strip *
>(
b);
3407 if (strip_a_start == strip_b_start) {
3411 return (strip_a_start > strip_b_start);
3447 Strip *strip, *strip_next;
3475 if (
ed !=
nullptr) {
3490 for (strip =
static_cast<Strip *
>(text_seq.
first); strip; strip = strip_next) {
3492 char timecode_str_start[32];
3493 char timecode_str_end[32];
3498 sizeof(timecode_str_start),
3501 scene->frames_per_second(),
3505 sizeof(timecode_str_end),
3508 scene->frames_per_second(),
3512 "%d\n%s --> %s\n%s\n\n",
3518 strip_next =
static_cast<Strip *
>(strip->
next);
3547 ot->name =
"Export Subtitles";
3548 ot->idname =
"SEQUENCER_OT_export_subtitles";
3549 ot->description =
"Export .srt file containing text strips";
3581 bool selected =
false;
3585 if (strip->flag &
SELECT) {
3612 scene->
r.
efra = efra;
3625 ot->name =
"Set Range to Strips";
3626 ot->idname =
"SEQUENCER_OT_set_range_to_strips";
3627 ot->description =
"Set the frame range to the selected strips start and end";
3636 prop =
RNA_def_boolean(
ot->srna,
"preview",
false,
"Preview",
"Set the preview range instead");
3657 {
STRIP_TRANSFORM_ALL,
"ALL", 0,
"All",
"Reset strip transform location, scale and rotation"},
3658 {0,
nullptr, 0,
nullptr,
nullptr},
3680 if (use_autokeyframe) {
3683 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3686 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3692 if (use_autokeyframe) {
3695 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3698 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3703 if (use_autokeyframe) {
3706 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3715 if (use_autokeyframe) {
3718 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3721 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3724 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3727 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3730 C, scene, &
ptr, prop, -1, scene->
r.
cfra, only_when_keyed);
3745 ot->name =
"Clear Strip Transform";
3746 ot->idname =
"SEQUENCER_OT_strip_transform_clear";
3747 ot->description =
"Reset image transformation to default value";
3761 "Strip transform property to be reset");
3778 const int timeline_frame = scene->
r.
cfra;
3781 if (strip_elem ==
nullptr) {
3802 ot->name =
"Strip Transform Set Fit";
3803 ot->idname =
"SEQUENCER_OT_strip_transform_fit";
3817 "Mode for fitting the image to the canvas");
3827 if (strip->flag &
SELECT) {
3828 strip->color_tag = color_tag;
3839 if (scene ==
nullptr) {
3844 if (
ed ==
nullptr) {
3848 Strip *act_strip =
ed->act_strip;
3849 return act_strip !=
nullptr;
3855 ot->name =
"Set Color Tag";
3856 ot->idname =
"SEQUENCER_OT_strip_color_tag_set";
3857 ot->description =
"Set a color tag for the selected strips";
3880 float cursor_pixel[2];
3897 float cursor_pixel[2];
3899 ®ion->
v2d, event->
mval[0], event->
mval[1], &cursor_pixel[0], &cursor_pixel[1]);
3909 ot->name =
"Set 2D Cursor";
3910 ot->description =
"Set 2D cursor location";
3911 ot->idname =
"SEQUENCER_OT_cursor_set";
3929 "Cursor location in normalized preview coordinates",
3951 strip->
len = target_scene->
r.
efra - target_scene->
r.
sfra + 1;
3969 ot->name =
"Update Scene Frame Range";
3970 ot->description =
"Update frame range of scene strip";
3971 ot->idname =
"SEQUENCER_OT_scene_frame_range_update";
Functions for backward compatibility with the legacy Action API.
WorkSpace * CTX_wm_workspace(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Object * CTX_data_active_object(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)
wmWindowManager * CTX_wm_manager(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
const char * BKE_idtype_idcode_to_name(short idcode)
const char * BKE_idtype_idcode_to_name_plural(short idcode)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
void * BKE_sound_add_scene_sound_defaults(struct Scene *scene, struct Strip *sequence)
void BKE_sound_load(struct Main *bmain, struct bSound *sound)
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)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(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
char * STRNCPY(char(&dst)[N], const char *src)
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
size_t BLI_string_split_name_number(const char *name, char delim, char *r_name_left, int *r_number) 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
@ ID_RECALC_ANIMATION_NO_FLUSH
#define ID_IS_EDITABLE(_id)
@ STRIP_IGNORE_CHANNEL_LOCK
@ STRIP_TYPE_GAUSSIAN_BLUR
@ SEQ_SINGLE_FRAME_CONTENT
#define STRIP_HAS_PATH(_strip)
@ SEQ_VIEW_SEQUENCE_PREVIEW
#define FRAMENUMBER_MIN_CLAMP(cfra)
@ AUTOKEY_FLAG_INSERTAVAILABLE
@ WORKSPACE_SYNC_SCENE_TIME
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)
bScreen * ED_screen_animation_playing(const wmWindowManager *wm)
void ED_workspace_status_text(bContext *C, const char *str)
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define RNA_BEGIN(sptr, itemptr, propname)
const EnumPropertyItem * RNA_scene_without_sequencer_scene_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
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()
float UI_view2d_scale_get_x(const View2D *v2d)
#define ND_SPACE_SEQUENCER
#define ND_RENDER_OPTIONS
BMesh const char void * data
constexpr bool is_empty() const
constexpr const char * data() const
void add_multiple(Span< Key > keys)
int64_t remove_if(Predicate &&predicate)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
Vector< FCurve * > fcurves_for_assigned_action(AnimData *adt)
bool is_autokey_on(const Scene *scene)
bool autokeyframe_property(bContext *C, Scene *scene, PointerRNA *ptr, PropertyRNA *prop, int rnaindex, float cfra, bool only_if_property_keyed)
bool is_keying_flag(const Scene *scene, eKeying_Flag flag)
bool mode_set(bContext *C, eObjectMode mode)
static wmOperatorStatus sequencer_split_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus sequencer_unmute_exec(bContext *C, wmOperator *op)
static float slip_apply_clamp(const Scene *scene, const SlipData *data, float *r_offset)
void SEQUENCER_OT_meta_toggle(wmOperatorType *ot)
static void slip_update_header(const Scene *scene, ScrArea *area, SlipData *data, const float offset)
bool sequencer_edit_poll(bContext *C)
void SEQUENCER_OT_meta_make(wmOperatorType *ot)
static void sequencer_split_ui(bContext *, wmOperator *op)
static wmOperatorStatus sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
static int sequence_split_side_for_exec_get(wmOperator *op)
void SEQUENCER_OT_images_separate(wmOperatorType *ot)
void SEQUENCER_OT_snap(wmOperatorType *ot)
static bool sequencer_strip_change_scene_poll(bContext *C)
void SEQUENCER_OT_swap_inputs(wmOperatorType *ot)
static wmOperatorStatus sequencer_split_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_export_subtitles_invoke(bContext *C, wmOperator *op, const wmEvent *)
static wmOperatorStatus sequencer_delete_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQUENCER_OT_offset_clear(wmOperatorType *ot)
static void sequencer_delete_strip_data(bContext *C, Strip *strip)
static void slip_cleanup(bContext *C, wmOperator *op, Scene *scene)
bool has_playback_animation(const Scene *scene)
bool check_show_strip(const SpaceSeq &sseq)
void SEQUENCER_OT_copy(wmOperatorType *ot)
static wmOperatorStatus sequencer_mute_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_separate_images_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus sequencer_clipboard_copy_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_gap_insert_exec(bContext *C, wmOperator *op)
void sequencer_image_strip_reserve_frames(wmOperator *op, StripElem *se, int len, int minframe, int numdigits)
static wmOperatorStatus sequencer_snap_invoke(bContext *C, wmOperator *op, const wmEvent *)
void SEQUENCER_OT_gap_remove(wmOperatorType *ot)
static void slip_handle_num_input(bContext *C, wmOperator *op, ScrArea *area, SlipData *data, Scene *scene)
void SEQUENCER_OT_gap_insert(wmOperatorType *ot)
static wmOperatorStatus sequencer_separate_images_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_change_scene(wmOperatorType *ot)
static wmOperatorStatus sequencer_swap_inputs_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_refresh_all(wmOperatorType *ot)
static wmOperatorStatus sequencer_change_path_exec(bContext *C, wmOperator *op)
blender::VectorSet< Strip * > all_strips_from_context(bContext *C)
bool is_scene_time_sync_needed(const bContext &C)
static const EnumPropertyItem transform_reset_properties[]
static wmOperatorStatus sequencer_reload_exec(bContext *C, wmOperator *op)
static bool sequencer_strip_is_text_poll(bContext *C)
blender::VectorSet< Strip * > selected_strips_from_context(bContext *C)
void SEQUENCER_OT_strip_transform_clear(wmOperatorType *ot)
static wmOperatorStatus sequencer_snap_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_lock(wmOperatorType *ot)
static wmOperatorStatus sequencer_delete_exec(bContext *C, wmOperator *op)
const EnumPropertyItem sequencer_prop_effect_types[]
static wmOperatorStatus sequencer_set_2d_cursor_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_set_2d_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SEQUENCER_OT_mute(wmOperatorType *ot)
static SlipData * slip_data_init(bContext *C, const wmOperator *op, const wmEvent *event)
static wmOperatorStatus sequencer_change_scene_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem prop_side_lr_types[]
static wmOperatorStatus sequencer_refresh_all_exec(bContext *C, wmOperator *)
bool maskedit_poll(bContext *C)
bool sequencer_editing_initialized_and_active(bContext *C)
static wmOperatorStatus sequencer_gap_remove_exec(bContext *C, wmOperator *op)
static bool sequencer_fcurves_targets_color_strip(const FCurve *fcurve)
void sync_active_scene_and_time_with_scene_strip(bContext &C)
static bool strip_get_text_strip_cb(Strip *strip, void *user_data)
static wmOperatorStatus sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus sequencer_change_path_invoke(bContext *C, wmOperator *op, const wmEvent *)
void SEQUENCER_OT_strip_color_tag_set(wmOperatorType *ot)
StringRef effect_inputs_validate(const VectorSet< Strip * > &inputs, int num_inputs)
void SEQUENCER_OT_slip(wmOperatorType *ot)
static wmOperatorStatus sequencer_disconnect_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_unmute(wmOperatorType *ot)
static Strip * find_next_prev_strip(Scene *scene, Strip *test, int lr, int sel)
VectorSet< Strip * > strip_effect_get_new_inputs(const Scene *scene, int num_inputs, bool ignore_active)
const Strip * get_scene_strip_for_time_sync(const Scene *sequence_scene)
static wmOperatorStatus sequencer_change_effect_type_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_connect(wmOperatorType *ot)
static int strip_cmp_time_startdisp_channel(void *thunk, const void *a, const void *b)
static wmOperatorStatus sequencer_strip_transform_fit_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_change_effect_type(wmOperatorType *ot)
void SEQUENCER_OT_paste(wmOperatorType *ot)
bool sequencer_edit_with_channel_region_poll(bContext *C)
Strip * strip_under_mouse_get(const Scene *scene, const View2D *v2d, const int mval[2])
static wmOperatorStatus sequencer_meta_separate_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_rendersize(wmOperatorType *ot)
void SEQUENCER_OT_scene_frame_range_update(wmOperatorType *ot)
static Scene * get_sequencer_scene_for_time_sync(const bContext &C)
void sequencer_select_do_updates(const bContext *C, Scene *scene)
void SEQUENCER_OT_reload(wmOperatorType *ot)
void SEQUENCER_OT_strip_transform_fit(wmOperatorType *ot)
bool sequencer_view_preview_only_poll(const bContext *C)
bool sequencer_strip_editable_poll(bContext *C)
void SEQUENCER_OT_change_path(wmOperatorType *ot)
static wmOperatorStatus sequencer_rendersize_exec(bContext *C, wmOperator *)
static void slip_strips_delta(bContext *C, wmOperator *op, Scene *scene, SlipData *data, const float delta)
static wmOperatorStatus sequencer_strip_jump_exec(bContext *C, wmOperator *op)
static void swap_strips(Scene *scene, Strip *strip_a, Strip *strip_b)
bool maskedit_mask_poll(bContext *C)
static wmOperatorStatus sequencer_offset_clear_exec(bContext *C, wmOperator *)
static wmOperatorStatus sequencer_connect_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_meta_make_exec(bContext *C, wmOperator *)
static int mouse_frame_side(View2D *v2d, short mouse_x, int frame)
static void slip_draw_status(bContext *C, const wmOperator *op)
void SEQUENCER_OT_set_range_to_strips(wmOperatorType *ot)
void SEQUENCER_OT_reassign_inputs(wmOperatorType *ot)
void SEQUENCER_OT_unlock(wmOperatorType *ot)
bool deselect_all_strips(const Scene *scene)
static bool sequencer_strip_jump_poll(bContext *C)
static wmOperatorStatus sequencer_set_range_to_strips_exec(bContext *C, wmOperator *op)
bool sequencer_view_has_preview_poll(bContext *C)
bool check_show_imbuf(const SpaceSeq &sseq)
static wmOperatorStatus sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
static wmOperatorStatus sequencer_meta_toggle_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_swap(wmOperatorType *ot)
void SEQUENCER_OT_duplicate(wmOperatorType *ot)
static wmOperatorStatus sequencer_scene_frame_range_update_exec(bContext *C, wmOperator *)
static const EnumPropertyItem prop_split_types[]
wmOperatorStatus sequencer_clipboard_paste_exec(bContext *C, wmOperator *op)
wmOperatorStatus sequencer_clipboard_paste_invoke(bContext *C, wmOperator *op, const wmEvent *event)
@ STRIP_TRANSFORM_ROTATION
@ STRIP_TRANSFORM_POSITION
const EnumPropertyItem prop_side_types[]
static bool sequencer_scene_frame_range_update_poll(bContext *C)
void SEQUENCER_OT_delete(wmOperatorType *ot)
static wmOperatorStatus sequencer_strip_transform_clear_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
static void sequencer_report_duplicates(wmOperator *op, ListBase *duplicated_strips)
static bool sequencer_effect_poll(bContext *C)
bool sequencer_view_strips_poll(bContext *C)
static wmOperatorStatus sequencer_lock_exec(bContext *C, wmOperator *)
static bool strip_is_parent(const Strip *par, const Strip *strip)
void slip_modal_keymap(wmKeyConfig *keyconf)
static wmOperatorStatus sequencer_slip_exec(bContext *C, wmOperator *op)
@ SLIP_MODAL_PRECISION_DISABLE
@ SLIP_MODAL_CLAMP_TOGGLE
@ SLIP_MODAL_PRECISION_ENABLE
void SEQUENCER_OT_export_subtitles(wmOperatorType *ot)
static bool sequencer_swap_inputs_poll(bContext *C)
static wmOperatorStatus sequencer_change_scene_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus sequencer_unlock_exec(bContext *C, wmOperator *)
bool sequencer_strip_has_path_poll(bContext *C)
static wmOperatorStatus sequencer_swap_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_swap_data(wmOperatorType *ot)
void SEQUENCER_OT_disconnect(wmOperatorType *ot)
int sequencer_image_strip_get_minmax_frame(wmOperator *op, int sfra, int *r_minframe, int *r_numdigits)
void SEQUENCER_OT_split(wmOperatorType *ot)
static bool strip_jump_internal(Scene *scene, const short side, const bool do_skip_mute, const bool do_center)
static bool sequencer_strip_color_tag_set_poll(bContext *C)
bool check_show_maskedit(SpaceSeq *sseq, Scene *scene)
static bool sequencer_refresh_all_poll(bContext *C)
static wmOperatorStatus sequencer_swap_data_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_cursor_set(wmOperatorType *ot)
void SEQUENCER_OT_strip_jump(wmOperatorType *ot)
static wmOperatorStatus sequencer_strip_color_tag_set_exec(bContext *C, wmOperator *op)
bool render_is_muted(const ListBase *channels, const Strip *strip)
void relations_strip_free_anim(Strip *strip)
void prefetch_stop(Scene *scene)
int time_right_handle_frame_get(const Scene *scene, const Strip *strip)
void foreach_strip(ListBase *seqbase, ForEachFunc callback, void *user_data)
bool disconnect(Strip *strip)
void relations_invalidate_cache(Scene *scene, Strip *strip)
EffectHandle strip_effect_handle_get(Strip *strip)
bool are_strips_connected_together(blender::VectorSet< Strip * > &strip_list)
SeqTimelineChannel * channel_get_by_index(const ListBase *channels, const int channel_index)
ListBase * channels_displayed_get(const Editing *ed)
void edit_remove_flagged_strips(Scene *scene, ListBase *seqbase)
float time_content_end_frame_get(const Scene *scene, const Strip *strip)
bool relations_render_loop_check(Strip *strip_main, Strip *strip)
void thumbnail_cache_invalidate_strip(Scene *scene, const Strip *strip)
void edit_flag_for_removal(Scene *scene, ListBase *seqbase, Strip *strip)
VectorSet< Strip * > query_selected_strips(ListBase *seqbase)
void transform_translate_strip(Scene *evil_scene, Strip *strip, int delta)
void strip_channel_set(Strip *strip, int channel)
void media_presence_free(Scene *scene)
float give_frame_index(const Scene *scene, const Strip *strip, float timeline_frame)
bool transform_test_overlap(const Scene *scene, Strip *strip1, Strip *strip2)
Editing * editing_get(const Scene *scene)
void meta_stack_set(const Scene *scene, Strip *dst)
void edit_strip_name_set(Scene *scene, Strip *strip, const char *new_name)
int time_left_handle_frame_get(const Scene *, const Strip *strip)
void animation_duplicate_backup_to_scene(Scene *scene, Strip *strip, AnimationBackup *backup)
void offset_animdata(const Scene *scene, Strip *strip, float ofs)
const char * strip_give_name(const Strip *strip)
void relations_invalidate_cache_raw(Scene *scene, Strip *strip)
void connect(Strip *strip1, Strip *strip2)
float time_start_frame_get(const Strip *strip)
bool transform_single_image_check(const Strip *strip)
blender::VectorSet< Strip * > connected_strips_get(const Strip *strip)
void add_reload_new_file(Main *bmain, Scene *scene, Strip *strip, const bool lock_range)
Strip * select_active_get(const Scene *scene)
static void query_strips_recursive_at_frame(const Scene *scene, const ListBase *seqbase, const int timeline_frame, VectorSet< Strip * > &strips)
void iterator_set_expand(const Scene *scene, ListBase *seqbase, VectorSet< Strip * > &strips, void strip_query_func(const Scene *scene, Strip *strip_reference, ListBase *seqbase, VectorSet< Strip * > &strips))
bool select_active_get_pair(Scene *scene, Strip **r_strip_act, Strip **r_strip_other)
bool time_strip_intersects_frame(const Scene *scene, const Strip *strip, const int timeline_frame)
void time_slip_strip(const Scene *scene, Strip *strip, int frame_delta, float subframe_delta, bool slip_keyframes)
void time_handles_frame_set(const Scene *scene, Strip *strip, int left_handle_timeline_frame, int right_handle_timeline_frame)
void transform_offset_after_frame(Scene *scene, ListBase *seqbase, const int delta, const int timeline_frame)
const char * get_default_stripname_by_type(int type)
void animation_backup_original(Scene *scene, AnimationBackup *backup)
void select_active_set(Scene *scene, Strip *strip)
void cache_cleanup(Scene *scene)
bool edit_strip_swap(Scene *scene, Strip *strip_a, Strip *strip_b, const char **r_error_str)
bool transform_is_locked(ListBase *channels, const Strip *strip)
void strip_unique_name_set(Scene *scene, ListBase *seqbasep, Strip *strip)
void animation_restore_original(Scene *scene, AnimationBackup *backup)
void time_left_handle_frame_set(const Scene *scene, Strip *strip, int timeline_frame)
Strip * strip_duplicate_recursive(Main *bmain, const Scene *scene_src, Scene *scene_dst, ListBase *new_seq_list, Strip *strip, const StripDuplicate dupe_flag)
void query_strip_connected_and_effect_chain(const Scene *scene, Strip *reference_strip, ListBase *seqbase, VectorSet< Strip * > &r_strips)
ListBase * active_seqbase_get(const Editing *ed)
void time_right_handle_frame_set(const Scene *scene, Strip *strip, int timeline_frame)
Strip * meta_stack_pop(Editing *ed)
bool transform_strip_can_be_translated(const Strip *strip)
void relations_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render)
Strip * strip_alloc(ListBase *lb, int timeline_frame, int channel, int type)
Strip * edit_strip_split(Main *bmain, Scene *scene, ListBase *seqbase, Strip *strip, const int timeline_frame, const eSplitMethod method, const bool ignore_connections, const char **r_error)
void strip_lookup_invalidate(const Editing *ed)
void ensure_unique_name(Strip *strip, Scene *scene)
Mask * active_mask_get(Scene *scene)
bool edit_remove_gaps(Scene *scene, ListBase *seqbase, const int initial_frame, const bool remove_all_gaps)
bool transform_seqbase_shuffle(ListBase *seqbasep, Strip *test, Scene *evil_scene)
int 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)
void set_scale_to_fit(const Strip *strip, const int image_width, const int image_height, const int preview_width, const int preview_height, const eSeqImageFitMethod fit_method)
StripElem * render_give_stripelem(const Scene *scene, const Strip *strip, int timeline_frame)
void seqbase_duplicate_recursive(Main *bmain, const Scene *scene_src, Scene *scene_dst, ListBase *nseqbase, const ListBase *seqbase, const StripDuplicate dupe_flag, const int flag)
float2 image_preview_unit_from_px(const Scene *scene, const float2 co_src)
int effect_get_num_inputs(int strip_type)
VecBase< float, 2 > float2
static blender::bke::bNodeSocketTemplate inputs[]
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_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)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
std::string RNA_string_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_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
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[]
const EnumPropertyItem rna_enum_strip_scale_method_items[]
StripTransform * transform
struct Object * scene_camera
struct Scene * sequencer_scene
struct wmTimer * animtimer
VectorSet< Strip * > strips
void(* free)(Strip *strip, bool do_id_user)
void(* init)(Strip *strip)
void use_property_decorate_set(bool is_sep)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
uiLayout & row(bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
struct ReportList * reports
struct wmOperatorType * type
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)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
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)
wmOperatorStatus WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *)
wmOperatorStatus 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, std::optional< std::string > message)
void WM_window_set_active_scene(Main *bmain, bContext *C, wmWindow *win, Scene *scene)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)
bScreen * WM_window_get_active_screen(const wmWindow *win)