Changeset View
Changeset View
Standalone View
Standalone View
source/blender/sequencer/intern/strip_relations.c
| Show First 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | if (seq->effectdata && seq->type == SEQ_TYPE_SPEED) { | ||||
| seq_effect_speed_rebuild_map(scene, seq, true); | seq_effect_speed_rebuild_map(scene, seq, true); | ||||
| } | } | ||||
| sequence_do_invalidate_dependent(scene, seq, &ed->seqbase); | sequence_do_invalidate_dependent(scene, seq, &ed->seqbase); | ||||
| DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); | DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); | ||||
| SEQ_prefetch_stop(scene); | SEQ_prefetch_stop(scene); | ||||
| } | } | ||||
| /* Find metastrips that contain invalidated_seq and invalidate them. */ | |||||
| static bool seq_relations_find_and_invalidate_metas(Scene *scene, | |||||
| Sequence *invalidated_seq, | |||||
| Sequence *meta_seq) | |||||
| { | |||||
| ListBase *seqbase; | |||||
| if (meta_seq == NULL) { | |||||
| Editing *ed = SEQ_editing_get(scene, false); | |||||
| seqbase = &ed->seqbase; | |||||
| } | |||||
| else { | |||||
| seqbase = &meta_seq->seqbase; | |||||
| } | |||||
| LISTBASE_FOREACH (Sequence *, seq, seqbase) { | |||||
| if (seq->type == SEQ_TYPE_META) { | |||||
| if (seq_relations_find_and_invalidate_metas(scene, invalidated_seq, seq)) { | |||||
| sequence_invalidate_cache(scene, seq, true, SEQ_CACHE_ALL_TYPES); | |||||
| return true; | |||||
| } | |||||
| } | |||||
sergey: Seems like the code will not work correct if there are multiple metas which contain… | |||||
ISSAuthorUnsubmitted Done Inline ActionsThat must never happen - it is forbidden by design ISS: That must never happen - it is forbidden by design | |||||
sergeyUnsubmitted Not Done Inline ActionsAh, right. Got confused with something else. sergey: Ah, right. Got confused with something else. | |||||
| if (seq == invalidated_seq && meta_seq != NULL) { | |||||
| sequence_invalidate_cache(scene, meta_seq, true, SEQ_CACHE_ALL_TYPES); | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| void SEQ_relations_invalidate_cache_in_range(Scene *scene, | void SEQ_relations_invalidate_cache_in_range(Scene *scene, | ||||
| Sequence *seq, | Sequence *seq, | ||||
| Sequence *range_mask, | Sequence *range_mask, | ||||
| int invalidate_types) | int invalidate_types) | ||||
| { | { | ||||
| seq_cache_cleanup_sequence(scene, seq, range_mask, invalidate_types, true); | seq_cache_cleanup_sequence(scene, seq, range_mask, invalidate_types, true); | ||||
| } | } | ||||
| void SEQ_relations_invalidate_cache_raw(Scene *scene, Sequence *seq) | void SEQ_relations_invalidate_cache_raw(Scene *scene, Sequence *seq) | ||||
| { | { | ||||
| sequence_invalidate_cache(scene, seq, true, SEQ_CACHE_ALL_TYPES); | sequence_invalidate_cache(scene, seq, true, SEQ_CACHE_ALL_TYPES); | ||||
| seq_relations_find_and_invalidate_metas(scene, seq, NULL); | |||||
| } | } | ||||
| void SEQ_relations_invalidate_cache_preprocessed(Scene *scene, Sequence *seq) | void SEQ_relations_invalidate_cache_preprocessed(Scene *scene, Sequence *seq) | ||||
| { | { | ||||
| sequence_invalidate_cache(scene, | sequence_invalidate_cache(scene, | ||||
| seq, | seq, | ||||
| true, | true, | ||||
| SEQ_CACHE_STORE_PREPROCESSED | SEQ_CACHE_STORE_COMPOSITE | | SEQ_CACHE_STORE_PREPROCESSED | SEQ_CACHE_STORE_COMPOSITE | | ||||
| SEQ_CACHE_STORE_FINAL_OUT); | SEQ_CACHE_STORE_FINAL_OUT); | ||||
| seq_relations_find_and_invalidate_metas(scene, seq, NULL); | |||||
| } | } | ||||
| void SEQ_relations_invalidate_cache_composite(Scene *scene, Sequence *seq) | void SEQ_relations_invalidate_cache_composite(Scene *scene, Sequence *seq) | ||||
| { | { | ||||
| if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { | if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { | ||||
| return; | return; | ||||
| } | } | ||||
| sequence_invalidate_cache( | sequence_invalidate_cache( | ||||
| scene, seq, true, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); | scene, seq, true, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); | ||||
| seq_relations_find_and_invalidate_metas(scene, seq, NULL); | |||||
| } | } | ||||
| void SEQ_relations_invalidate_dependent(Scene *scene, Sequence *seq) | void SEQ_relations_invalidate_dependent(Scene *scene, Sequence *seq) | ||||
| { | { | ||||
| if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { | if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { | ||||
| return; | return; | ||||
| } | } | ||||
| sequence_invalidate_cache( | sequence_invalidate_cache( | ||||
| scene, seq, false, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); | scene, seq, false, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT); | ||||
| seq_relations_find_and_invalidate_metas(scene, seq, NULL); | |||||
| } | } | ||||
| static void invalidate_scene_strips(Scene *scene, Scene *scene_target, ListBase *seqbase) | static void invalidate_scene_strips(Scene *scene, Scene *scene_target, ListBase *seqbase) | ||||
| { | { | ||||
| for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) { | for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) { | ||||
| if (seq->scene == scene_target) { | if (seq->scene == scene_target) { | ||||
| SEQ_relations_invalidate_cache_raw(scene, seq); | SEQ_relations_invalidate_cache_raw(scene, seq); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 295 Lines • Show Last 20 Lines | |||||
Seems like the code will not work correct if there are multiple metas which contain invalidated_seq.