Fix #114859: VSE Retiming versioning was broken

Retiming versioning used incorrect source for strip length, so produced
inverted strips. Also it tried to scale sound strips by `speed_factor`,
but sound strips did not change length when retimed.

Finally, the original versioning code was in versioning_300.cc file,
even though it was released with 4.0 version.

Pull Request: https://projects.blender.org/blender/blender/pulls/123144
This commit is contained in:
Richard Antalik 2024-07-04 23:57:34 +02:00 committed by Richard Antalik
parent f8c80fe1fd
commit c94bed9afa
2 changed files with 34 additions and 31 deletions

@ -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<const Scene *>(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);
}

@ -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<Scene *>(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);
}