diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c index 35b1367ca1e..d0e80ca21aa 100644 --- a/source/blender/blenloader/intern/versioning_300.c +++ b/source/blender/blenloader/intern/versioning_300.c @@ -587,20 +587,51 @@ static bNodeTree *add_realize_node_tree(Main *bmain) nodeAddLink(node_tree, separate, separate->outputs.first, join, join->inputs.first); nodeAddLink(node_tree, join, join->outputs.first, group_output, group_output->inputs.first); LISTBASE_FOREACH (bNode *, node, &node_tree->nodes) { nodeSetSelected(node, false); } version_socket_update_is_used(node_tree); return node_tree; } +#define SEQ_RNAPATH_MAXSTR ((30 + 2 + (SEQ_NAME_MAXSTR * 2) + 2) + 1) + +static bool seq_speed_factor_set(Sequence *seq, void *user_data) +{ + const Scene *scene = user_data; + if (seq->type == SEQ_TYPE_SOUND_RAM) { + if (scene->adt && scene->adt->action) { + /* Move `pitch` animation to `speed_factor` */ + char name_esc[(sizeof(seq->name) - 2) * 2]; + BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc)); + char *path = BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].pitch", name_esc); + FCurve *fcu = BKE_fcurve_find(&scene->adt->action->curves, path, 0); + if (fcu != NULL) { + MEM_freeN(fcu->rna_path); + fcu->rna_path = BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].speed_factor", + name_esc); + } + MEM_freeN(path); + } + + const float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq); + const float right_handle_frame = SEQ_time_right_handle_frame_get(scene, seq); + SEQ_time_speed_factor_set(scene, seq, seq->pitch); + SEQ_time_right_handle_frame_set(scene, seq, right_handle_frame); + SEQ_time_left_handle_frame_set(scene, seq, left_handle_frame); + } + else { + seq->speed_factor = 1.0f; + } + return true; +} void do_versions_after_linking_300(Main *bmain, ReportList *UNUSED(reports)) { if (MAIN_VERSION_ATLEAST(bmain, 300, 0) && !MAIN_VERSION_ATLEAST(bmain, 300, 1)) { /* Set zero user text objects to have a fake user. */ LISTBASE_FOREACH (Text *, text, &bmain->texts) { if (text->id.us == 0) { id_fake_user_set(&text->id); } } @@ -812,20 +843,31 @@ void do_versions_after_linking_300(Main *bmain, ReportList *UNUSED(reports)) if (timeline_region == NULL) { continue; } timeline_region->v2d.cur.ymax = 8.5f; timeline_region->v2d.align &= ~V2D_ALIGN_NO_NEG_Y; } } } } + + if (!MAIN_VERSION_ATLEAST(bmain, 303, 5)) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + Editing *ed = SEQ_editing_get(scene); + if (ed == NULL) { + continue; + } + SEQ_for_each_callback(&ed->seqbase, seq_speed_factor_set, scene); + } + } + /** * Versioning code until next subversion bump goes here. * * \note Be sure to check when bumping the version: * - #blo_do_versions_300 in this file. * - "versioning_userdef.c", #blo_do_versions_userdef * - "versioning_userdef.c", #do_versions_theme * * \note Keep this message at the bottom of the function. */ @@ -1228,31 +1270,20 @@ static bool version_fix_seq_meta_range(Sequence *seq, void *user_data) 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; } -static bool seq_speed_factor_set(Sequence *seq, void *UNUSED(user_data)) -{ - if (seq->type == SEQ_TYPE_SOUND_RAM) { - seq->speed_factor = seq->pitch; - } - else { - seq->speed_factor = 1.0f; - } - 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. * * Then they convert it into the new, proper `subitem_reference` data for the anchor, and * `subitem_local` for the source. * * NOTE: Here only the stored override ID is available, unlike in the `override_apply` functions. */ @@ -3216,28 +3247,20 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase; ARegion *channels_region = BKE_region_find_in_listbase_by_type(regionbase, RGN_TYPE_CHANNELS); if (channels_region) { BLI_freelinkN(regionbase, channels_region); } } } } - - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - Editing *ed = SEQ_editing_get(scene); - if (ed == NULL) { - continue; - } - SEQ_for_each_callback(&ed->seqbase, seq_speed_factor_set, NULL); - } } /** * Versioning code until next subversion bump goes here. * * \note Be sure to check when bumping the version: * - "versioning_userdef.c", #blo_do_versions_userdef * - "versioning_userdef.c", #do_versions_theme * * \note Keep this message at the bottom of the function. */ diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index f9dfb8544ca..04037a64426 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -2324,21 +2324,20 @@ static void rna_def_editor(BlenderRNA *brna) RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); } static void rna_def_speed_factor(StructRNA *srna) { PropertyRNA *prop = RNA_def_property(srna, "speed_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "speed_factor"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0.1f, FLT_MAX); RNA_def_property_ui_range(prop, 1.0f, 100.0f, 10.0, 3); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Speed Factor", "Multiply playback speed"); RNA_def_property_float_funcs( prop, NULL, "rna_Sequence_speed_factor_set", NULL); /* overlap test */ RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_speed_factor_update"); } static void rna_def_filter_video(StructRNA *srna) { PropertyRNA *prop; diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index d4357fe28b6..aa51813c9b8 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -430,29 +430,34 @@ void seq_time_gap_info_get(const Scene *scene, bool SEQ_time_strip_intersects_frame(const Scene *scene, const Sequence *seq, const int timeline_frame) { return (SEQ_time_left_handle_frame_get(scene, seq) <= timeline_frame) && (SEQ_time_right_handle_frame_get(scene, seq) > timeline_frame); } void SEQ_time_speed_factor_set(const Scene *scene, Sequence *seq, const float speed_factor) { - const float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq); - const float unity_start_offset = seq->startofs * seq->speed_factor; - const float unity_end_offset = seq->endofs * seq->speed_factor; - /* Left handle is pivot point for content scaling - it must always show same frame. */ - seq->speed_factor = speed_factor; - seq->startofs = unity_start_offset / speed_factor; - seq->start = left_handle_frame - seq->startofs; - seq->endofs = unity_end_offset / speed_factor; + if (seq->type == SEQ_TYPE_SOUND_RAM) { + seq->speed_factor = speed_factor; + } + else { + const float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq); + const float unity_start_offset = seq->startofs * seq->speed_factor; + const float unity_end_offset = seq->endofs * seq->speed_factor; + /* Left handle is pivot point for content scaling - it must always show same frame. */ + seq->speed_factor = speed_factor; + seq->startofs = unity_start_offset / speed_factor; + seq->start = left_handle_frame - seq->startofs; + seq->endofs = unity_end_offset / speed_factor; + } SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); } bool SEQ_time_has_left_still_frames(const Scene *scene, const Sequence *seq) { return SEQ_time_left_handle_frame_get(scene, seq) < SEQ_time_start_frame_get(seq); } @@ -464,20 +469,24 @@ bool SEQ_time_has_right_still_frames(const Scene *scene, const Sequence *seq) bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq) { return SEQ_time_has_right_still_frames(scene, seq) || SEQ_time_has_left_still_frames(scene, seq); } /* Length of strip content in frames. This is number of original frames adjusted by playback rate * factor */ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) { + if (seq->type == SEQ_TYPE_SOUND_RAM) { + return seq->len; + } + return seq->len / seq_time_playback_rate_factor_get(scene, seq); } /* Return timeline frame, where strip content starts. */ float SEQ_time_start_frame_get(const Sequence *seq) { return seq->start; } void SEQ_time_start_frame_set(const Scene *scene, Sequence *seq, int timeline_frame)