diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index e0ca819919b..5ea624a3dcf 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -676,25 +676,6 @@ static bool seq_speed_factor_set(Sequence *seq, void *user_data) return true; } -static bool do_versions_sequencer_init_retiming_tool_data(Sequence *seq, void *user_data) -{ - const Scene *scene = static_cast(user_data); - - if (seq->speed_factor == 1 || !SEQ_retiming_is_allowed(seq)) { - return true; - } - - const int content_length = SEQ_time_strip_length_get(scene, seq); - - SEQ_retiming_data_ensure(seq); - - SeqRetimingKey *key = &seq->retiming_keys[seq->retiming_keys_num - 1]; - key->strip_frame_index = round_fl_to_int(content_length / seq->speed_factor); - seq->speed_factor = 1.0f; - - return true; -} - static void version_geometry_nodes_replace_transfer_attribute_node(bNodeTree *ntree) { using namespace blender; @@ -1380,18 +1361,6 @@ void do_versions_after_linking_300(FileData * /*fd*/, Main *bmain) FOREACH_NODETREE_END; } - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 306, 6)) { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - Editing *ed = SEQ_editing_get(scene); - if (ed == nullptr) { - continue; - } - - SEQ_for_each_callback( - &scene->ed->seqbase, do_versions_sequencer_init_retiming_tool_data, scene); - } - } - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 306, 13)) { version_nla_action_strip_hold(bmain); } diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 9338d3445f9..d3d68f1e543 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -67,7 +67,9 @@ #include "IMB_imbuf_enums.h" #include "SEQ_iterator.hh" +#include "SEQ_retiming.hh" #include "SEQ_sequencer.hh" +#include "SEQ_time.hh" #include "ANIM_armature_iter.hh" #include "ANIM_bone_collections.hh" @@ -777,6 +779,29 @@ static void version_nla_tweakmode_incomplete(Main *bmain) } } +static bool versioning_convert_strip_speed_factor(Sequence *seq, void *user_data) +{ + const Scene *scene = static_cast(user_data); + const float speed_factor = seq->speed_factor; + + if (speed_factor == 1.0f || !SEQ_retiming_is_allowed(seq) || SEQ_retiming_keys_count(seq) > 0) { + return true; + } + + SEQ_retiming_data_ensure(seq); + SeqRetimingKey *last_key = &SEQ_retiming_keys_get(seq)[1]; + + last_key->strip_frame_index = (seq->len) / speed_factor; + + if (seq->type == SEQ_TYPE_SOUND_RAM) { + const int prev_length = seq->len - seq->startofs - seq->endofs; + const float left_handle = SEQ_time_left_handle_frame_get(scene, seq); + SEQ_time_right_handle_frame_set(scene, seq, left_handle + prev_length); + } + + return true; +} + void do_versions_after_linking_400(FileData *fd, Main *bmain) { if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 9)) { @@ -857,6 +882,15 @@ void do_versions_after_linking_400(FileData *fd, Main *bmain) FOREACH_NODETREE_END; } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 27)) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + Editing *ed = SEQ_editing_get(scene); + if (ed != nullptr) { + SEQ_for_each_callback(&ed->seqbase, versioning_convert_strip_speed_factor, scene); + } + } + } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 34)) { BKE_mesh_legacy_face_map_to_generic(bmain); }