VSE: Remove still frame offsets
To clarify term still frame: This is portion of strip that displays static image. This area can exist before or after strip movie content. Still frames were implemented as strip property, but this was never displayed in panel. Only way to set still frames was to drag strip handle with mouse or using python API. This would set either `seq->*still` or `seq->*ofs` where * stands for `start` or `end`. When strip had offset, it can't have still frames and vice versa, but this had to be enforced in RNA functions and everywhere in code where these fields are set directly. Strip can not have negative offset or negative number of still frames. This is not very practical approach and still frames can be simply implemented as applying negative offset. Merging these offsets would simplify offset calculations for example in D14962 and could make it easier to also deprecate usage `seq->*disp` and necessity to call update functions to recalculate strip boundaries. For users only functional change is ability to set negative strip offset using property in side panel. Reviewed By: sergey Differential Revision: https://developer.blender.org/D14976
This commit is contained in:
parent
47dbdf8dd5
commit
8ca9ce0986
|
@ -1217,6 +1217,15 @@ static bool version_fix_seq_meta_range(Sequence *seq, void *user_data)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool version_merge_still_offsets(Sequence *seq, void *UNUSED(user_data))
|
||||
{
|
||||
seq->startofs -= seq->startstill;
|
||||
seq->endofs -= seq->endstill;
|
||||
seq->startstill = 0;
|
||||
seq->endstill = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Those `version_liboverride_rnacollections_*` functions mimic the old, pre-3.0 code to find
|
||||
* anchor and source items in the given list of modifiers, constraints etc., using only the
|
||||
* `subitem_local` data of the override property operation.
|
||||
|
@ -3045,5 +3054,13 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Merge still offsets into start/end offsets. */
|
||||
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
if (ed != NULL) {
|
||||
SEQ_for_each_callback(&ed->seqbase, version_merge_still_offsets, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1109,15 +1109,15 @@ static void draw_seq_background(Scene *scene,
|
|||
}
|
||||
|
||||
/* Draw background for hold still regions. */
|
||||
if (!is_single_image && (seq->startstill || seq->endstill)) {
|
||||
if (!is_single_image && SEQ_time_has_still_frames(seq)) {
|
||||
UI_GetColorPtrShade3ubv(col, col, -35);
|
||||
immUniformColor4ubv(col);
|
||||
|
||||
if (seq->startstill) {
|
||||
if (SEQ_time_has_left_still_frames(seq)) {
|
||||
const float content_start = min_ff(seq->enddisp, seq->start);
|
||||
immRectf(pos, seq->startdisp, y1, content_start, y2);
|
||||
}
|
||||
if (seq->endstill) {
|
||||
if (SEQ_time_has_right_still_frames(seq)) {
|
||||
const float content_end = max_ff(seq->startdisp, seq->start + seq->len);
|
||||
immRectf(pos, content_end, y1, seq->enddisp, y2);
|
||||
}
|
||||
|
@ -1336,9 +1336,9 @@ static void draw_seq_strip(const bContext *C,
|
|||
SEQ_TIMELINE_SHOW_STRIP_COLOR_TAG);
|
||||
|
||||
/* Draw strip body. */
|
||||
x1 = (seq->startstill) ? seq->start : seq->startdisp;
|
||||
x1 = SEQ_time_has_left_still_frames(seq) ? seq->start : seq->startdisp;
|
||||
y1 = seq->machine + SEQ_STRIP_OFSBOTTOM;
|
||||
x2 = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
|
||||
x2 = SEQ_time_has_right_still_frames(seq) ? (seq->start + seq->len) : seq->enddisp;
|
||||
y2 = seq->machine + SEQ_STRIP_OFSTOP;
|
||||
|
||||
/* Limit body to strip bounds. Meta strip can end up with content outside of strip range. */
|
||||
|
|
|
@ -77,7 +77,6 @@
|
|||
|
||||
typedef struct TransSeq {
|
||||
int start, machine;
|
||||
int startstill, endstill;
|
||||
int startdisp, enddisp;
|
||||
int startofs, endofs;
|
||||
int anim_startofs, anim_endofs;
|
||||
|
@ -358,8 +357,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
|
|||
if (seq->flag & SELECT && !SEQ_transform_is_locked(channels, seq) &&
|
||||
SEQ_transform_sequence_can_be_translated(seq)) {
|
||||
if ((seq->flag & (SEQ_LEFTSEL + SEQ_RIGHTSEL)) == 0) {
|
||||
SEQ_transform_translate_sequence(
|
||||
scene, seq, (snap_frame - seq->startofs + seq->startstill) - seq->start);
|
||||
SEQ_transform_translate_sequence(scene, seq, (snap_frame - seq->startofs) - seq->start);
|
||||
}
|
||||
else {
|
||||
if (seq->flag & SEQ_LEFTSEL) {
|
||||
|
@ -479,8 +477,6 @@ static void transseq_backup(TransSeq *ts, Sequence *seq)
|
|||
{
|
||||
ts->start = seq->start;
|
||||
ts->machine = seq->machine;
|
||||
ts->startstill = seq->startstill;
|
||||
ts->endstill = seq->endstill;
|
||||
ts->startdisp = seq->startdisp;
|
||||
ts->enddisp = seq->enddisp;
|
||||
ts->startofs = seq->startofs;
|
||||
|
@ -494,8 +490,6 @@ static void transseq_restore(TransSeq *ts, Sequence *seq)
|
|||
{
|
||||
seq->start = ts->start;
|
||||
seq->machine = ts->machine;
|
||||
seq->startstill = ts->startstill;
|
||||
seq->endstill = ts->endstill;
|
||||
seq->startdisp = ts->startdisp;
|
||||
seq->enddisp = ts->enddisp;
|
||||
seq->startofs = ts->startofs;
|
||||
|
@ -596,11 +590,8 @@ static int sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *eve
|
|||
return OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
||||
static bool sequencer_slip_recursively(Scene *scene, SlipData *data, int offset)
|
||||
static void sequencer_slip_recursively(Scene *scene, SlipData *data, int offset)
|
||||
{
|
||||
/* Only data types supported for now. */
|
||||
bool changed = false;
|
||||
|
||||
/* Iterate in reverse so meta-strips are iterated after their children. */
|
||||
for (int i = data->num_seq - 1; i >= 0; i--) {
|
||||
Sequence *seq = data->seq_array[i];
|
||||
|
@ -614,33 +605,13 @@ static bool sequencer_slip_recursively(Scene *scene, SlipData *data, int offset)
|
|||
endframe = seq->start + seq->len;
|
||||
|
||||
/* Compute the sequence offsets. */
|
||||
if (endframe > seq->enddisp) {
|
||||
seq->endstill = 0;
|
||||
seq->endofs = endframe - seq->enddisp;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
seq->endstill = seq->enddisp - endframe;
|
||||
seq->endofs = 0;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (seq->start > seq->startdisp) {
|
||||
seq->startstill = seq->start - seq->startdisp;
|
||||
seq->startofs = 0;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
seq->startstill = 0;
|
||||
seq->startofs = seq->startdisp - seq->start;
|
||||
changed = true;
|
||||
}
|
||||
seq->endofs = endframe - seq->enddisp;
|
||||
seq->startofs = seq->startdisp - seq->start;
|
||||
}
|
||||
else {
|
||||
/* No transform data (likely effect strip). Only move start and end. */
|
||||
seq->startdisp = data->ts[i].startdisp + offset;
|
||||
seq->enddisp = data->ts[i].enddisp + offset;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
/* Effects are only added if we they are in a meta-strip.
|
||||
|
@ -652,13 +623,11 @@ static bool sequencer_slip_recursively(Scene *scene, SlipData *data, int offset)
|
|||
SEQ_time_update_sequence(scene, seqbase, seq);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
for (int i = data->num_seq - 1; i >= 0; i--) {
|
||||
Sequence *seq = data->seq_array[i];
|
||||
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
|
||||
}
|
||||
|
||||
for (int i = data->num_seq - 1; i >= 0; i--) {
|
||||
Sequence *seq = data->seq_array[i];
|
||||
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
/* Make sure, that each strip contains at least 1 frame of content. */
|
||||
|
@ -688,7 +657,6 @@ static int sequencer_slip_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
int offset = RNA_int_get(op->ptr, "offset");
|
||||
bool success = false;
|
||||
|
||||
/* Recursively count the trimmed elements. */
|
||||
int num_seq = slip_count_sequences_recursive(ed->seqbasep, true);
|
||||
|
@ -710,19 +678,16 @@ static int sequencer_slip_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
|
||||
sequencer_slip_apply_limits(data, &offset);
|
||||
success = sequencer_slip_recursively(scene, data, offset);
|
||||
sequencer_slip_recursively(scene, data, offset);
|
||||
|
||||
MEM_freeN(data->seq_array);
|
||||
MEM_freeN(data->trim);
|
||||
MEM_freeN(data->ts);
|
||||
MEM_freeN(data);
|
||||
|
||||
if (success) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
return OPERATOR_CANCELLED;
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static void sequencer_slip_update_header(Scene *scene, ScrArea *area, SlipData *data, int offset)
|
||||
|
@ -763,9 +728,8 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even
|
|||
|
||||
RNA_int_set(op->ptr, "offset", offset);
|
||||
|
||||
if (sequencer_slip_recursively(scene, data, offset)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
}
|
||||
sequencer_slip_recursively(scene, data, offset);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
@ -796,9 +760,8 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even
|
|||
|
||||
RNA_int_set(op->ptr, "offset", offset);
|
||||
|
||||
if (sequencer_slip_recursively(scene, data, offset)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
}
|
||||
sequencer_slip_recursively(scene, data, offset);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -876,9 +839,8 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even
|
|||
|
||||
RNA_int_set(op->ptr, "offset", offset);
|
||||
|
||||
if (sequencer_slip_recursively(scene, data, offset)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
}
|
||||
sequencer_slip_recursively(scene, data, offset);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
|
||||
}
|
||||
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
|
@ -1822,7 +1784,7 @@ static int sequencer_offset_clear_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
/* For effects, try to find a replacement input. */
|
||||
for (seq = ed->seqbasep->first; seq; seq = seq->next) {
|
||||
if ((seq->type & SEQ_TYPE_EFFECT) == 0 && (seq->flag & SELECT)) {
|
||||
seq->startofs = seq->endofs = seq->startstill = seq->endstill = 0;
|
||||
seq->startofs = seq->endofs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1908,7 +1870,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
|
|||
seq_new->start = start_ofs;
|
||||
seq_new->type = SEQ_TYPE_IMAGE;
|
||||
seq_new->len = 1;
|
||||
seq_new->endstill = step - 1;
|
||||
seq_new->endofs = 1 - step;
|
||||
|
||||
/* New strip. */
|
||||
strip_new = seq_new->strip;
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "SEQ_relations.h"
|
||||
#include "SEQ_render.h"
|
||||
#include "SEQ_sequencer.h"
|
||||
#include "SEQ_time.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
|
@ -443,7 +444,8 @@ void draw_seq_strip_thumbnail(View2D *v2d,
|
|||
float thumb_y_end = y1 + thumb_height;
|
||||
|
||||
float cut_off = 0;
|
||||
float upper_thumb_bound = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
|
||||
float upper_thumb_bound = SEQ_time_has_right_still_frames(seq) ? (seq->start + seq->len) :
|
||||
seq->enddisp;
|
||||
if (seq->type == SEQ_TYPE_IMAGE) {
|
||||
upper_thumb_bound = seq->enddisp;
|
||||
}
|
||||
|
|
|
@ -161,7 +161,7 @@ typedef struct Sequence {
|
|||
* Frames that use the first frame before data begins,
|
||||
* frames that use the last frame after data ends.
|
||||
*/
|
||||
int startstill, endstill;
|
||||
int startstill DNA_DEPRECATED, endstill DNA_DEPRECATED;
|
||||
/** Machine: the strip channel */
|
||||
int machine;
|
||||
int _pad3;
|
||||
|
|
|
@ -376,24 +376,6 @@ static void rna_Sequence_frame_offset_end_set(PointerRNA *ptr, int value)
|
|||
seq->endofs = value;
|
||||
}
|
||||
|
||||
static void rna_Sequence_frame_still_start_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
Sequence *seq = (Sequence *)ptr->data;
|
||||
Scene *scene = (Scene *)ptr->owner_id;
|
||||
|
||||
SEQ_relations_invalidate_cache_composite(scene, seq);
|
||||
seq->startstill = value;
|
||||
}
|
||||
|
||||
static void rna_Sequence_frame_still_end_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
Sequence *seq = (Sequence *)ptr->data;
|
||||
Scene *scene = (Scene *)ptr->owner_id;
|
||||
|
||||
SEQ_relations_invalidate_cache_composite(scene, seq);
|
||||
seq->endstill = value;
|
||||
}
|
||||
|
||||
static void rna_Sequence_anim_startofs_final_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
Sequence *seq = (Sequence *)ptr->data;
|
||||
|
@ -2032,22 +2014,6 @@ static void rna_def_sequence(BlenderRNA *brna)
|
|||
prop, NULL, "rna_Sequence_frame_offset_end_set", "rna_Sequence_frame_offset_end_range");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update");
|
||||
|
||||
prop = RNA_def_property(srna, "frame_still_start", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_int_sdna(prop, NULL, "startstill");
|
||||
// RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* overlap tests */
|
||||
RNA_def_property_range(prop, 0, MAXFRAME);
|
||||
RNA_def_property_ui_text(prop, "Start Still", "");
|
||||
RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_frame_still_start_set", NULL);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update");
|
||||
|
||||
prop = RNA_def_property(srna, "frame_still_end", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_int_sdna(prop, NULL, "endstill");
|
||||
// RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* overlap tests */
|
||||
RNA_def_property_range(prop, 0, MAXFRAME);
|
||||
RNA_def_property_ui_text(prop, "End Still", "");
|
||||
RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_frame_still_end_set", NULL);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update");
|
||||
|
||||
prop = RNA_def_property(srna, "channel", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_sdna(prop, NULL, "machine");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
|
|
|
@ -60,6 +60,9 @@ void SEQ_time_update_recursive(struct Scene *scene, struct Sequence *changed_seq
|
|||
*/
|
||||
bool SEQ_time_strip_intersects_frame(const struct Sequence *seq, int timeline_frame);
|
||||
void SEQ_time_update_meta_strip_range(struct Scene *scene, struct Sequence *seq_meta);
|
||||
bool SEQ_time_has_still_frames(const struct Sequence *seq);
|
||||
bool SEQ_time_has_left_still_frames(const struct Sequence *seq);
|
||||
bool SEQ_time_has_right_still_frames(const struct Sequence *seq);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -523,9 +523,7 @@ void SEQ_proxy_rebuild(SeqIndexBuildContext *context,
|
|||
SeqRenderState state;
|
||||
seq_render_state_init(&state);
|
||||
|
||||
for (timeline_frame = seq->startdisp + seq->startstill;
|
||||
timeline_frame < seq->enddisp - seq->endstill;
|
||||
timeline_frame++) {
|
||||
for (timeline_frame = seq->startdisp; timeline_frame < seq->enddisp; timeline_frame++) {
|
||||
if (context->size_flags & IMB_PROXY_25) {
|
||||
seq_proxy_build_frame(&render_context, &state, seq, timeline_frame, 25, overwrite);
|
||||
}
|
||||
|
@ -539,8 +537,7 @@ void SEQ_proxy_rebuild(SeqIndexBuildContext *context,
|
|||
seq_proxy_build_frame(&render_context, &state, seq, timeline_frame, 100, overwrite);
|
||||
}
|
||||
|
||||
*progress = (float)(timeline_frame - seq->startdisp - seq->startstill) /
|
||||
(seq->enddisp - seq->endstill - seq->startdisp - seq->startstill);
|
||||
*progress = (float)(timeline_frame - seq->startdisp) / (seq->enddisp - seq->startdisp);
|
||||
*do_update = true;
|
||||
|
||||
if (*stop || G.is_break) {
|
||||
|
|
|
@ -2088,7 +2088,8 @@ void SEQ_render_thumbnails(const SeqRenderData *context,
|
|||
|
||||
/* Adding the hold offset value (seq->anim_startofs) to the start frame. Position of image not
|
||||
* affected, but frame loaded affected. */
|
||||
float upper_thumb_bound = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
|
||||
float upper_thumb_bound = SEQ_time_has_right_still_frames(seq) ? (seq->start + seq->len) :
|
||||
seq->enddisp;
|
||||
upper_thumb_bound = (upper_thumb_bound > view_area->xmax) ? view_area->xmax + frame_step :
|
||||
upper_thumb_bound;
|
||||
|
||||
|
@ -2121,7 +2122,9 @@ void SEQ_render_thumbnails(const SeqRenderData *context,
|
|||
|
||||
int SEQ_render_thumbnails_guaranteed_set_frame_step_get(const Sequence *seq)
|
||||
{
|
||||
const int content_len = (seq->enddisp - seq->startdisp - seq->startstill - seq->endstill);
|
||||
const int content_start = max_ii(seq->startdisp, seq->start);
|
||||
const int content_end = min_ii(seq->enddisp, seq->start + seq->len);
|
||||
const int content_len = content_end - content_start;
|
||||
|
||||
/* Arbitrary, but due to performance reasons should be as low as possible. */
|
||||
const int thumbnails_base_set_count = min_ii(content_len / 100, 30);
|
||||
|
|
|
@ -83,8 +83,6 @@ int SEQ_edit_sequence_swap(Sequence *seq_a, Sequence *seq_b, const char **error_
|
|||
SWAP(int, seq_a->start, seq_b->start);
|
||||
SWAP(int, seq_a->startofs, seq_b->startofs);
|
||||
SWAP(int, seq_a->endofs, seq_b->endofs);
|
||||
SWAP(int, seq_a->startstill, seq_b->startstill);
|
||||
SWAP(int, seq_a->endstill, seq_b->endstill);
|
||||
SWAP(int, seq_a->machine, seq_b->machine);
|
||||
SWAP(int, seq_a->startdisp, seq_b->startdisp);
|
||||
SWAP(int, seq_a->enddisp, seq_b->enddisp);
|
||||
|
@ -278,20 +276,22 @@ static void seq_split_set_left_hold_offset(Sequence *seq, int timeline_frame)
|
|||
{
|
||||
/* Adjust within range of extended stillframes before strip. */
|
||||
if (timeline_frame < seq->start) {
|
||||
seq->start = timeline_frame - 1;
|
||||
seq->anim_endofs += seq->len - 1;
|
||||
seq->startstill = timeline_frame - seq->startdisp - 1;
|
||||
seq->endstill = 0;
|
||||
SEQ_transform_set_left_handle_frame(seq, timeline_frame);
|
||||
}
|
||||
/* Adjust within range of strip contents. */
|
||||
else if ((timeline_frame >= seq->start) && (timeline_frame <= (seq->start + seq->len))) {
|
||||
seq->endofs = 0;
|
||||
seq->endstill = 0;
|
||||
seq->anim_endofs += (seq->start + seq->len) - timeline_frame;
|
||||
seq->anim_startofs += timeline_frame - seq->start;
|
||||
seq->start = timeline_frame;
|
||||
seq->startofs = 0;
|
||||
}
|
||||
/* Adjust within range of extended stillframes after strip. */
|
||||
else if ((seq->start + seq->len) < timeline_frame) {
|
||||
seq->endstill = timeline_frame - seq->start - seq->len;
|
||||
const int right_handle_backup = SEQ_transform_get_right_handle_frame(seq);
|
||||
seq->start += timeline_frame - seq->start;
|
||||
seq->anim_startofs += seq->len - 1;
|
||||
seq->len = 1;
|
||||
SEQ_transform_set_left_handle_frame(seq, timeline_frame);
|
||||
SEQ_transform_set_right_handle_frame(seq, right_handle_backup);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -299,22 +299,19 @@ static void seq_split_set_right_hold_offset(Sequence *seq, int timeline_frame)
|
|||
{
|
||||
/* Adjust within range of extended stillframes before strip. */
|
||||
if (timeline_frame < seq->start) {
|
||||
seq->startstill = seq->start - timeline_frame;
|
||||
const int left_handle_backup = SEQ_transform_get_left_handle_frame(seq);
|
||||
seq->start = timeline_frame - 1;
|
||||
SEQ_transform_set_left_handle_frame(seq, left_handle_backup);
|
||||
SEQ_transform_set_right_handle_frame(seq, timeline_frame);
|
||||
}
|
||||
/* Adjust within range of strip contents. */
|
||||
else if ((timeline_frame >= seq->start) && (timeline_frame <= (seq->start + seq->len))) {
|
||||
seq->anim_startofs += timeline_frame - seq->start;
|
||||
seq->start = timeline_frame;
|
||||
seq->startstill = 0;
|
||||
seq->startofs = 0;
|
||||
seq->anim_endofs += seq->start + seq->len - timeline_frame;
|
||||
seq->endofs = 0;
|
||||
}
|
||||
/* Adjust within range of extended stillframes after strip. */
|
||||
else if ((seq->start + seq->len) < timeline_frame) {
|
||||
seq->start = timeline_frame;
|
||||
seq->startofs = 0;
|
||||
seq->anim_startofs += seq->len - 1;
|
||||
seq->endstill = seq->enddisp - timeline_frame - 1;
|
||||
seq->startstill = 0;
|
||||
SEQ_transform_set_right_handle_frame(seq, timeline_frame);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -322,28 +319,23 @@ static void seq_split_set_right_offset(Sequence *seq, int timeline_frame)
|
|||
{
|
||||
/* Adjust within range of extended stillframes before strip. */
|
||||
if (timeline_frame < seq->start) {
|
||||
const int content_offset = seq->start - timeline_frame + 1;
|
||||
seq->start = timeline_frame - 1;
|
||||
seq->startstill = timeline_frame - seq->startdisp - 1;
|
||||
seq->endofs = seq->len - 1;
|
||||
}
|
||||
/* Adjust within range of extended stillframes after strip. */
|
||||
else if ((seq->start + seq->len) < timeline_frame) {
|
||||
seq->endstill -= seq->enddisp - timeline_frame;
|
||||
seq->startofs += content_offset;
|
||||
}
|
||||
|
||||
SEQ_transform_set_right_handle_frame(seq, timeline_frame);
|
||||
}
|
||||
|
||||
static void seq_split_set_left_offset(Sequence *seq, int timeline_frame)
|
||||
{
|
||||
/* Adjust within range of extended stillframes before strip. */
|
||||
if (timeline_frame < seq->start) {
|
||||
seq->startstill = seq->start - timeline_frame;
|
||||
}
|
||||
/* Adjust within range of extended stillframes after strip. */
|
||||
if ((seq->start + seq->len) < timeline_frame) {
|
||||
seq->start = timeline_frame - seq->len + 1;
|
||||
seq->endstill = seq->enddisp - timeline_frame - 1;
|
||||
if (timeline_frame > seq->start + seq->len) {
|
||||
const int content_offset = timeline_frame - (seq->start + seq->len) + 1;
|
||||
seq->start += content_offset;
|
||||
seq->endofs += content_offset;
|
||||
}
|
||||
|
||||
SEQ_transform_set_left_handle_frame(seq, timeline_frame);
|
||||
}
|
||||
|
||||
|
|
|
@ -139,15 +139,8 @@ void seq_update_sound_bounds_recursive(Scene *scene, Sequence *metaseq)
|
|||
|
||||
static void seq_time_update_sequence_bounds(Scene *scene, Sequence *seq)
|
||||
{
|
||||
if (seq->startofs && seq->startstill) {
|
||||
seq->startstill = 0;
|
||||
}
|
||||
if (seq->endofs && seq->endstill) {
|
||||
seq->endstill = 0;
|
||||
}
|
||||
|
||||
seq->startdisp = seq->start + seq->startofs - seq->startstill;
|
||||
seq->enddisp = seq->start + seq->len - seq->endofs + seq->endstill;
|
||||
seq->startdisp = seq->start + seq->startofs;
|
||||
seq->enddisp = seq->start + seq->len - seq->endofs;
|
||||
|
||||
if (seq->type == SEQ_TYPE_META) {
|
||||
seq_update_sound_bounds_recursive(scene, seq);
|
||||
|
@ -204,7 +197,7 @@ void SEQ_time_update_sequence(Scene *scene, ListBase *seqbase, Sequence *seq)
|
|||
/* effects and meta: automatic start and end */
|
||||
if (seq->type & SEQ_TYPE_EFFECT) {
|
||||
if (seq->seq1) {
|
||||
seq->startofs = seq->endofs = seq->startstill = seq->endstill = 0;
|
||||
seq->startofs = seq->endofs = 0;
|
||||
if (seq->seq3) {
|
||||
seq->start = seq->startdisp = max_iii(
|
||||
seq->seq1->startdisp, seq->seq2->startdisp, seq->seq3->startdisp);
|
||||
|
@ -516,3 +509,18 @@ bool SEQ_time_strip_intersects_frame(const Sequence *seq, const int timeline_fra
|
|||
{
|
||||
return (seq->startdisp <= timeline_frame) && (seq->enddisp > timeline_frame);
|
||||
}
|
||||
|
||||
bool SEQ_time_has_left_still_frames(const Sequence *seq)
|
||||
{
|
||||
return seq->startofs < 0;
|
||||
}
|
||||
|
||||
bool SEQ_time_has_right_still_frames(const Sequence *seq)
|
||||
{
|
||||
return seq->endofs < 0;
|
||||
}
|
||||
|
||||
bool SEQ_time_has_still_frames(const Sequence *seq)
|
||||
{
|
||||
return SEQ_time_has_right_still_frames(seq) || SEQ_time_has_left_still_frames(seq);
|
||||
}
|
||||
|
|
|
@ -40,35 +40,21 @@ static int seq_tx_get_end(Sequence *seq)
|
|||
|
||||
int SEQ_transform_get_left_handle_frame(Sequence *seq)
|
||||
{
|
||||
return (seq->start - seq->startstill) + seq->startofs;
|
||||
return seq->start + seq->startofs;
|
||||
}
|
||||
int SEQ_transform_get_right_handle_frame(Sequence *seq)
|
||||
{
|
||||
return ((seq->start + seq->len) + seq->endstill) - seq->endofs;
|
||||
return seq->start + seq->len - seq->endofs;
|
||||
}
|
||||
|
||||
void SEQ_transform_set_left_handle_frame(Sequence *seq, int val)
|
||||
{
|
||||
if (val < (seq)->start) {
|
||||
seq->startstill = abs(val - (seq)->start);
|
||||
seq->startofs = 0;
|
||||
}
|
||||
else {
|
||||
seq->startofs = abs(val - (seq)->start);
|
||||
seq->startstill = 0;
|
||||
}
|
||||
seq->startofs = val - seq->start;
|
||||
}
|
||||
|
||||
void SEQ_transform_set_right_handle_frame(Sequence *seq, int val)
|
||||
{
|
||||
if (val > (seq)->start + (seq)->len) {
|
||||
seq->endstill = abs(val - (seq->start + (seq)->len));
|
||||
seq->endofs = 0;
|
||||
}
|
||||
else {
|
||||
seq->endofs = abs(val - ((seq)->start + (seq)->len));
|
||||
seq->endstill = 0;
|
||||
}
|
||||
seq->endofs = seq->start + seq->len - val;
|
||||
}
|
||||
|
||||
bool SEQ_transform_single_image_check(Sequence *seq)
|
||||
|
@ -157,8 +143,8 @@ void SEQ_transform_handle_xlimits(Sequence *seq, int leftflag, int rightflag)
|
|||
|
||||
/* sounds cannot be extended past their endpoints */
|
||||
if (seq->type == SEQ_TYPE_SOUND_RAM) {
|
||||
seq->startstill = 0;
|
||||
seq->endstill = 0;
|
||||
CLAMP(seq->startofs, 0, MAXFRAME);
|
||||
CLAMP(seq->endofs, 0, MAXFRAME);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue