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:
parent
f8c80fe1fd
commit
c94bed9afa
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user