58 const int timeline_frame)
62 if (key_timeline_frame == timeline_frame) {
77 if (key.strip_frame_index > frame_index) {
116 seq->
flag &= ~SEQ_SHOW_RETIMING;
179 return segment_fac_diff / segment_length;
197 double s1_1[2], s1_2[2], s2_1[2], s2_2[2], p1_2[2];
209 std::swap(v1[0], v1[1]);
210 std::swap(
v2[0],
v2[1]);
220 r_center[0] = s1_1[0] + lambda * (s1_2[0] - s1_1[0]);
221 r_center[1] = s1_1[1] + lambda * (s1_2[1] - s1_1[1]);
259 return abs(prev_speed - next_speed) < 0.01f;
267 const float y = c[1] + side *
sqrt(
pow(r, 2) -
pow((frame_index - c[0]), 2));
276 BLI_assert(start_key_index < seq->retiming_keys_num);
282 return std::min(1.0f, start_key->
retiming_factor + segment_step * segment_frame_index);
287 return std::min(1.0f, start_key->
retiming_factor + segment_step * segment_frame_index);
292 BLI_assert(start_key_index < seq->retiming_keys_num - 1);
303 if (frame_index <= 0) {
326 const int new_key_index = start_key - keys + 1;
332 if (new_key_index > 0) {
335 if (new_key_index < keys_count) {
336 memcpy(new_keys + new_key_index + 1,
337 keys + new_key_index,
363 const int timeline_frame)
371 int new_midpoint_offset = new_frame_index - midpoint;
376 SeqRetimingKey *prev_segment_end = key_start - 1, *next_segment_start = key_end + 1;
378 const int offset_max_right = next_segment_start->strip_frame_index - midpoint - 1;
379 new_midpoint_offset =
abs(new_midpoint_offset);
380 new_midpoint_offset =
min_iii(new_midpoint_offset, offset_max_left, offset_max_right);
381 new_midpoint_offset =
max_ii(new_midpoint_offset, 1);
395 key->
flag &= ~SEQ_FREEZE_FRAME_IN;
396 next_key->
flag &= ~SEQ_FREEZE_FRAME_OUT;
400 key->
flag &= ~SEQ_FREEZE_FRAME_OUT;
401 previous_key->
flag &= ~SEQ_FREEZE_FRAME_IN;
417 transitions.append_non_duplicates(key);
418 transitions.append_non_duplicates(key + 1);
421 transitions.append_non_duplicates(key);
422 transitions.append_non_duplicates(key - 1);
433 size_t new_keys_count = keys_count - keys_to_remove.
size() - transitions.size() / 2;
448 if (keys_to_remove.
contains(&key) || transitions.contains(&key)) {
476 memcpy(keys + key_index,
491 transition_start = key - 1;
525 return min_fff(offset, prev_dist - 1, next_dist - 1);
549 if (new_key ==
nullptr) {
551 key->
flag &= ~SEQ_FREEZE_FRAME_OUT;
589 scene, seq, orig_frame_index + clamped_offset);
593 scene, seq, orig_frame_index - clamped_offset);
610 const int frame_index_max = seq->
len - 1;
616 const int fragment_length_retimed = frame_retimed - frame_retimed_prev;
617 const int fragment_length_original = frame_index - frame_index_prev;
619 const float speed =
float(fragment_length_retimed) /
float(fragment_length_original);
644 : start(start_frame), end(end_frame), speed(speed), type(type)
653 : start(start_frame), end(end_frame), speed(speed), type(type)
673 int range_offset = 0, rhs_range_offset = 0;
677 rhs_range_offset = start - rhs_range.
start;
681 new_range.
end = rhs_range.
end;
682 rhs_range_offset = start - rhs_range.
start;
691 new_range.
end = rhs_range.
end;
702 new_range.
speed = 1.0f;
703 const int new_range_len = new_range.
end - new_range.
start;
706 for (
int i = 0; i < new_range_len; i++) {
707 const float range_speed =
speed_table[i + range_offset];
708 const float rhs_range_speed = rhs_range.
speed_table[i + rhs_range_offset];
713 for (
int i = 0; i < new_range_len; i++) {
714 const float range_speed =
speed_table[i + range_offset];
719 for (
int i = 0; i < new_range_len; i++) {
720 const float rhs_range_speed = rhs_range.
speed_table[i + rhs_range_offset];
730 for (
int timeline_frame = start; timeline_frame <=
end; timeline_frame++) {
732 const double normal_step = 1 /
double(seq->
len);
738 const double speed_at_frame = (val - val_prev) / normal_step;
745 if (other.start <= start && other.end >= end) {
748 if (other.start > start && other.start < end && other.end > start && other.end < end) {
751 if (other.start > start && other.start < end) {
754 if (other.end > start && other.end < end) {
767 if (key.strip_frame_index == 0) {
777 ranges.append(range);
783 if (ranges.is_empty()) {
786 rhs_range.start, rhs_range.end, rhs_range.speed, rhs_range.type);
787 ranges.append(range);
792 for (
int i = 0; i < ranges.size(); i++) {
795 if (range.intersect_type(rhs_range) ==
NONE) {
798 else if (range.intersect_type(rhs_range) ==
FULL) {
801 ranges.insert(i, isect);
804 ranges.insert(i, range * rhs_range);
805 ranges.insert(i, range * rhs_range);
806 range.
start = rhs_range.end + 1;
808 else if (range.intersect_type(rhs_range) ==
PARTIAL_END) {
809 ranges.insert(i, range * rhs_range);
810 range.end = rhs_range.start;
812 else if (range.intersect_type(rhs_range) ==
INSIDE) {
814 left_range.
end = rhs_range.start;
815 range.start = rhs_range.end + 1;
817 ranges.insert(i, left_range);
818 ranges.insert(i, range * rhs_range);
831 if (meta_parent ==
nullptr) {
832 return strip_retiming_data;
836 strip_retiming_data *= meta_retiming_data;
837 return strip_retiming_data;
853 for (
int i = 0; i < retiming_data.
ranges.
size(); i++) {
857 const int range_length = range.
end - range.
start;
858 for (
int i = 0; i <= range_length; i++) {
859 const int frame = range.start + i;
861 seq->
scene_sound, frame + sound_offset, range.speed_table[i],
true);
866 seq->
scene_sound, range.start + sound_offset, range.end + sound_offset, range.speed);
890 return min_ii(offset, next_dist - 1);
893 return max_ii(offset, -(prev_dist - 1));
921 const int timeline_frame)
923 int prev_key_timeline_frame = -
MAXFRAME;
924 int next_key_timeline_frame =
MAXFRAME;
937 int clamped_timeline_frame = timeline_frame;
939 if (timeline_frame < orig_timeline_frame) {
940 clamped_timeline_frame =
max_ii(timeline_frame, prev_key_timeline_frame + 1);
942 else if (timeline_frame > orig_timeline_frame) {
943 clamped_timeline_frame =
min_ii(timeline_frame, next_key_timeline_frame - 1);
945 return clamped_timeline_frame;
1006 const int timeline_frame)
1014 scene, seq, key, timeline_frame);
1015 const int offset = clamped_timeline_frame - orig_timeline_frame;
1021 for (
int i = key_index; i < key_count; i++) {
1029 seq->
start += offset;
1030 for (
int i = key_index + 1; i < key_count; i++) {
1052 const float speed_fac = 100.0f / speed;
1054 const int frame_index_max = seq->
len;
1058 const int segment_duration = (frame_retimed - frame_retimed_prev) /
1060 const int new_duration = segment_duration * speed_fac;
1068 if (keep_retiming) {
1070 const int offset = new_timeline_frame - orig_timeline_frame;
1080 bool was_empty =
true;
1085 key.flag &= ~SEQ_KEY_SELECTED;
1100 key->
flag &= ~SEQ_KEY_SELECTED;
1118 selection.add(&key, seq);
1141 bool has_start =
false, has_end =
false;
1145 for (
auto item : selection.items()) {
1146 if (item.key == key_start) {
1149 if (item.key == key_end) {
1152 if (has_start && has_end) {
void BKE_sound_set_scene_sound_pitch_constant_range(void *handle, int frame_start, int frame_end, float pitch)
void BKE_sound_set_scene_sound_pitch_at_frame(void *handle, int frame, float pitch, char animated)
#define LISTBASE_FOREACH(type, var, list)
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 int min_iii(int a, int b, int c)
MINLINE float min_fff(float a, float b, float c)
int isect_seg_seg_v2_lambda_mu_db(const double v1[2], const double v2[2], const double v3[2], const double v4[2], double *r_lambda, double *r_mu)
MINLINE void copy_v2_v2_db(double r[2], const double a[2])
MINLINE double len_v2v2_db(const double v1[2], const double v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v2_v2_db(double r[2], const double a[2])
MINLINE void sub_v2_v2v2_db(double r[2], const double a[2], const double b[2])
#define UNUSED_VARS_NDEBUG(...)
typedef double(DMatrix)[4][4]
@ SEQ_SPEED_TRANSITION_OUT
@ SEQ_SPEED_TRANSITION_IN
struct SeqRetimingKey SeqRetimingKey
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
RetimingRangeData & operator*=(const RetimingRangeData &rhs)
blender::Vector< RetimingRange > ranges
RetimingRangeData(const Sequence *seq)
RetimingRange(const Sequence *seq, int start_frame, int end_frame, float speed, eRangeType type)
const eIntersectType intersect_type(const RetimingRange &other) const
RetimingRange operator*(const RetimingRange &rhs_range)
RetimingRange(int start_frame, int end_frame, float speed, eRangeType type)
void claculate_speed_table_from_seq(const Sequence *seq)
blender::Vector< float > speed_table
RetimingRange duplicate()
void add_multiple(Span< Key > keys)
bool remove(const Key &key)
int64_t remove_if(Predicate &&predicate)
bool contains(const T &value) const
void append(const T &value)
pow(value.r - subtrahend, 2.0)") .do_static_compilation(true)
local_group_size(16, 16) .push_constant(Type rhs
draw_view in_light_buf[] float
void SEQ_iterator_set_expand(const Scene *scene, ListBase *seqbase, VectorSet< Sequence * > &strips, void seq_query_func(const Scene *scene, Sequence *seq_reference, ListBase *seqbase, VectorSet< Sequence * > &strips))
void SEQ_query_strip_effect_chain(const Scene *scene, Sequence *reference_strip, ListBase *seqbase, VectorSet< Sequence * > &strips)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
GPU_SHADER_INTERFACE_INFO(overlay_edit_curve_handle_iface, "vert").flat(Type pos vertex_in(1, Type::UINT, "data") .vertex_out(overlay_edit_curve_handle_iface) .geometry_layout(PrimitiveIn Frequency::GEOMETRY storage_buf(1, Qualifier::READ, "uint", "data[]", Frequency::GEOMETRY) .push_constant(Type Frequency::GEOMETRY selection[]
Sequence * seq_sequence_lookup_meta_by_seq(const Scene *scene, const Sequence *key)
blender::Span< Sequence * > seq_sequence_lookup_effects_by_seq(const Scene *scene, const Sequence *key)
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Editing * SEQ_editing_get(const Scene *scene)
MutableSpan< SeqRetimingKey > SEQ_retiming_keys_get(const Sequence *seq)
int SEQ_retiming_keys_count(const Sequence *seq)
static RetimingRangeData seq_retiming_range_data_get(const Scene *scene, const Sequence *seq)
bool SEQ_retiming_data_is_editable(const Sequence *seq)
bool SEQ_retiming_is_active(const Sequence *seq)
void SEQ_retiming_remove_multiple_keys(Sequence *seq, blender::Vector< SeqRetimingKey * > &keys_to_remove)
bool SEQ_retiming_key_is_freeze_frame(const SeqRetimingKey *key)
static SeqRetimingKey * seq_retiming_remove_transition(const Scene *scene, Sequence *seq, SeqRetimingKey *key)
void SEQ_retiming_key_speed_set(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const float speed, bool keep_retiming)
static float seq_retiming_segment_step_get(const SeqRetimingKey *start_key)
static void seq_retiming_transition_offset(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int offset)
static int seq_retiming_clamp_transition_offset(SeqRetimingKey *start_key, int offset)
bool SEQ_retiming_key_is_transition_type(const SeqRetimingKey *key)
static void seq_retiming_fix_transition(const Scene *scene, Sequence *seq, SeqRetimingKey *key)
bool SEQ_retiming_selection_contains(const Editing *ed, const SeqRetimingKey *key)
int SEQ_retiming_key_index_get(const Sequence *seq, const SeqRetimingKey *key)
void SEQ_retiming_key_timeline_frame_set(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int timeline_frame)
SeqRetimingKey * SEQ_retiming_last_key_get(const Sequence *seq)
SeqRetimingKey * SEQ_retiming_add_freeze_frame(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int offset)
static void seq_retiming_cleanup_freeze_frame(SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_add_transition(const Scene *scene, Sequence *seq, SeqRetimingKey *key, float offset)
void SEQ_retiming_selection_remove(SeqRetimingKey *key)
static SeqRetimingKey * seq_retiming_add_key(const Scene *, Sequence *seq, float frame_index)
static void seq_retiming_segment_as_line_segment(const SeqRetimingKey *start_key, double r_v1[2], double r_v2[2])
bool SEQ_retiming_is_allowed(const Sequence *seq)
int SEQ_retiming_key_timeline_frame_get(const Scene *scene, const Sequence *seq, const SeqRetimingKey *key)
void SEQ_retiming_remove_key(const Scene *scene, Sequence *seq, SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_transition_start_get(SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_find_segment_start_key(const Sequence *seq, float frame_index)
static int seq_retiming_clamp_timeline_frame(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int timeline_frame)
static void seq_retiming_key_offset(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int offset)
void SEQ_retiming_selection_append(SeqRetimingKey *key)
static void retiming_key_overlap(Scene *scene, Sequence *seq)
static void seq_retiming_remove_key_ex(Sequence *seq, SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_key_get_by_timeline_frame(const Scene *scene, const Sequence *seq, const int timeline_frame)
blender::Map< SeqRetimingKey *, Sequence * > SEQ_retiming_selection_get(const Editing *ed)
float SEQ_retiming_key_speed_get(const Sequence *seq, const SeqRetimingKey *key)
static void seq_retiming_line_segments_tangent_circle(const SeqRetimingKey *start_key, double r_center[2], double *radius)
float seq_retiming_evaluate(const Sequence *seq, const float frame_index)
void SEQ_retiming_transition_key_frame_set(const Scene *scene, const Sequence *seq, SeqRetimingKey *key, const int timeline_frame)
void SEQ_retiming_data_ensure(Sequence *seq)
bool SEQ_retiming_is_last_key(const Sequence *seq, const SeqRetimingKey *key)
void SEQ_retiming_data_clear(Sequence *seq)
bool SEQ_retiming_selection_clear(const Editing *ed)
void SEQ_retiming_sound_animation_data_set(const Scene *scene, const Sequence *seq)
static float seq_retiming_clamp_create_offset(SeqRetimingKey *key, float offset)
void SEQ_retiming_reset(Scene *scene, Sequence *seq)
bool SEQ_retiming_key_is_transition_start(const SeqRetimingKey *key)
void SEQ_retiming_selection_copy(SeqRetimingKey *dst, const SeqRetimingKey *src)
static float seq_retiming_evaluate_arc_segment(const SeqRetimingKey *key, const float frame_index)
static void seq_retiming_fix_transitions(const Scene *scene, Sequence *seq, SeqRetimingKey *key)
static bool seq_retiming_transition_is_linear(const Sequence *seq, const SeqRetimingKey *key)
static int seq_retiming_segment_length_get(const SeqRetimingKey *start_key)
SeqRetimingKey * SEQ_retiming_add_key(const Scene *scene, Sequence *seq, const int timeline_frame)
bool SEQ_retiming_selection_has_whole_transition(const Editing *ed, SeqRetimingKey *key)
void SEQ_time_update_meta_strip_range(const Scene *scene, Sequence *seq_meta)
int SEQ_time_get_rounded_sound_offset(const Scene *scene, const Sequence *seq)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
void seq_time_update_effects_strip_range(const Scene *scene, const blender::Span< Sequence * > effects)
float SEQ_time_start_frame_get(const Sequence *seq)
float SEQ_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq)
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)
double original_strip_frame_index
float original_retiming_factor
struct SeqRetimingKey * retiming_keys
ccl_device_inline int abs(int x)