2020-12-19 06:44:57 +01:00
|
|
|
/*
|
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is Copyright (C) 2004 Blender Foundation.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
|
* \ingroup sequencer
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-05-07 10:25:13 +02:00
|
|
|
#include "BLI_ghash.h"
|
|
|
|
|
|
2020-12-19 06:44:57 +01:00
|
|
|
struct Editing;
|
2021-05-07 10:25:13 +02:00
|
|
|
struct GSet;
|
|
|
|
|
struct GSetIterator;
|
2021-07-16 11:48:54 +10:00
|
|
|
struct Sequence;
|
2020-12-19 06:44:57 +01:00
|
|
|
|
2021-08-27 14:44:12 +02:00
|
|
|
/* Utility macro to construct an unique (within a file) variable name for iterator macro.
|
|
|
|
|
* Use indirect macro evaluation to ensure the `__LINE__` is expanded (rather than being
|
|
|
|
|
* treated as a name token),
|
|
|
|
|
*
|
|
|
|
|
* The `__LINE__` is defined at the invocation of the `SEQ_ITERATOR_FOREACH` and is not changed
|
|
|
|
|
* afterwards. This makes it safe to expand it several times in the `SEQ_ITERATOR_FOREACH`.
|
|
|
|
|
*
|
2021-09-01 21:41:23 +10:00
|
|
|
* This allows to have nested `foreach` loops.
|
2021-08-27 14:44:12 +02:00
|
|
|
*
|
|
|
|
|
* NOTE: Putting nested loop to a wrapper macro is not supported. */
|
|
|
|
|
#define _SEQ_ITERATOR_NAME_JOIN(x, y) x##_##y
|
|
|
|
|
#define _SEQ_ITERATOR_NAME_EVALUATE(x, y) _SEQ_ITERATOR_NAME_JOIN(x, y)
|
|
|
|
|
#define _SEQ_ITERATOR_NAME(prefix) _SEQ_ITERATOR_NAME_EVALUATE(prefix, __LINE__)
|
2021-08-27 12:59:46 +02:00
|
|
|
|
2021-08-27 14:44:12 +02:00
|
|
|
#define SEQ_ITERATOR_FOREACH(var, collection) \
|
|
|
|
|
for (SeqIterator _SEQ_ITERATOR_NAME(iter) = {{{NULL}}}; \
|
|
|
|
|
SEQ_iterator_ensure(collection, &_SEQ_ITERATOR_NAME(iter), &var) && var != NULL; \
|
|
|
|
|
var = SEQ_iterator_yield(&_SEQ_ITERATOR_NAME(iter)))
|
2020-12-19 06:44:57 +01:00
|
|
|
|
2021-05-07 10:25:13 +02:00
|
|
|
typedef struct SeqCollection {
|
|
|
|
|
struct GSet *set;
|
|
|
|
|
} SeqCollection;
|
|
|
|
|
|
|
|
|
|
typedef struct SeqIterator {
|
|
|
|
|
GSetIterator gsi;
|
|
|
|
|
SeqCollection *collection;
|
|
|
|
|
bool iterator_initialized;
|
|
|
|
|
} SeqIterator;
|
|
|
|
|
|
|
|
|
|
bool SEQ_iterator_ensure(SeqCollection *collection,
|
|
|
|
|
SeqIterator *iterator,
|
|
|
|
|
struct Sequence **r_seq);
|
|
|
|
|
struct Sequence *SEQ_iterator_yield(SeqIterator *iterator);
|
|
|
|
|
|
2021-08-20 16:30:34 +02:00
|
|
|
/* Callback format for the for_each function below. */
|
|
|
|
|
typedef bool (*SeqForEachFunc)(struct Sequence *seq, void *user_data);
|
|
|
|
|
|
|
|
|
|
void SEQ_for_each_callback(struct ListBase *seqbase, SeqForEachFunc callback, void *user_data);
|
|
|
|
|
|
2021-07-01 22:14:29 +02:00
|
|
|
SeqCollection *SEQ_collection_create(const char *name);
|
2021-07-26 14:55:14 +02:00
|
|
|
SeqCollection *SEQ_collection_duplicate(SeqCollection *collection);
|
2021-06-30 16:37:14 +10:00
|
|
|
uint SEQ_collection_len(const SeqCollection *collection);
|
2021-08-24 00:46:34 +02:00
|
|
|
bool SEQ_collection_has_strip(const struct Sequence *seq, const SeqCollection *collection);
|
2021-05-07 10:25:13 +02:00
|
|
|
bool SEQ_collection_append_strip(struct Sequence *seq, SeqCollection *data);
|
VSE: Fix rendering inconsistency
Fix issue described in T87678, which was partially a bug and partially
change in intended(at least as far as I can tell) behaior.
Function `evaluate_seq_frame_gen` that was partially responsible for
filtering strips in stack for rendering wasn't working correctly.
Intended functionality seems to be removing all effect inputs from stack
as it is unlikely that user would want these to be blended in. However
there was logic to exclude effects placed into same input, which because
of weak implementation caused, that any effect input, that is effect as
well will be considered to be part of stack to be blended in.
This bug was apparently used to produce effects like glow over original
image.
Even though this is originally unintended, I have kept this logic, but
I have made it explicit.
Another change is request made in T87678 to make it possible to keep
effect inputs as part of stack when they are placed above the effect,
which would imply that blending is intended. This change is again
explicitly defined.
Whole implementation has been refactored, so logic is consolidated
and code should be as explicit as possible and more readable.
`must_render_strip function` may be still quite hard to read, not sure
if I can make it nicer.
Last change is for remove gaps feature code - it used same rendering
code, which may be reason why its logic was split in first place.
Now it uses sequencer iterator, which will definitely be faster than
original code, but I could have used `LISTBASE_FOREACH` in this case.
Reviewed By: sergey
Differential Revision: https://developer.blender.org/D11301
2021-05-19 22:59:33 +02:00
|
|
|
bool SEQ_collection_remove_strip(struct Sequence *seq, SeqCollection *data);
|
2021-05-07 15:57:35 +02:00
|
|
|
void SEQ_collection_free(SeqCollection *collection);
|
2021-05-07 10:25:13 +02:00
|
|
|
void SEQ_collection_merge(SeqCollection *collection_dst, SeqCollection *collection_src);
|
2021-07-26 14:55:14 +02:00
|
|
|
void SEQ_collection_exclude(SeqCollection *collection, SeqCollection *exclude_elements);
|
2021-05-07 10:25:13 +02:00
|
|
|
void SEQ_collection_expand(struct ListBase *seqbase,
|
|
|
|
|
SeqCollection *collection,
|
|
|
|
|
void query_func(struct Sequence *seq_reference,
|
|
|
|
|
struct ListBase *seqbase,
|
|
|
|
|
SeqCollection *collection));
|
|
|
|
|
SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference,
|
|
|
|
|
struct ListBase *seqbase,
|
|
|
|
|
void seq_query_func(struct Sequence *seq_reference,
|
|
|
|
|
struct ListBase *seqbase,
|
|
|
|
|
SeqCollection *collection));
|
|
|
|
|
SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase);
|
2021-08-27 12:59:46 +02:00
|
|
|
SeqCollection *SEQ_query_unselected_strips(struct ListBase *seqbase);
|
2021-08-20 16:30:34 +02:00
|
|
|
SeqCollection *SEQ_query_all_strips(struct ListBase *seqbase);
|
|
|
|
|
SeqCollection *SEQ_query_all_strips_recursive(struct ListBase *seqbase);
|
2021-05-18 23:28:00 +02:00
|
|
|
void SEQ_query_strip_effect_chain(struct Sequence *seq_reference,
|
|
|
|
|
struct ListBase *seqbase,
|
|
|
|
|
SeqCollection *collection);
|
2020-12-19 06:44:57 +01:00
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|