[Bf-blender-cvs] [9c78c8469f4] temp-vse-preview-transform: Limit transform and gizmos to strips that are selected and visible at current frame
Richard Antalik
noreply at git.blender.org
Mon Aug 30 00:01:29 CEST 2021
Commit: 9c78c8469f427185c6622f8e7e575827c91155cf
Author: Richard Antalik
Date: Thu Aug 26 08:49:50 2021 +0200
Branches: temp-vse-preview-transform
https://developer.blender.org/rB9c78c8469f427185c6622f8e7e575827c91155cf
Limit transform and gizmos to strips that are selected and visible at current frame
===================================================================
M source/blender/editors/transform/transform.h
M source/blender/editors/transform/transform_convert_sequencer_image.c
M source/blender/editors/transform/transform_gizmo_2d.c
M source/blender/sequencer/SEQ_iterator.h
M source/blender/sequencer/intern/iterator.c
M source/blender/sequencer/intern/render.c
===================================================================
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 383953f0d5e..7094ca2ea38 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -97,7 +97,6 @@ typedef enum {
CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14),
/** Enable edge scrolling in 2D views */
CTX_VIEW2D_EDGE_PAN = (1 << 15),
- /* test */
} eTContext;
/** #TransInfo.flag */
diff --git a/source/blender/editors/transform/transform_convert_sequencer_image.c b/source/blender/editors/transform/transform_convert_sequencer_image.c
index 55d69da1a2d..28ae7914b2f 100644
--- a/source/blender/editors/transform/transform_convert_sequencer_image.c
+++ b/source/blender/editors/transform/transform_convert_sequencer_image.c
@@ -96,11 +96,12 @@ void createTransSeqImageData(TransInfo *t)
{
Editing *ed = SEQ_editing_get(t->scene, false);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
- SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+ SeqCollection *strips = Seq_query_rendered_strips(seqbase, t->scene->r.cfra, 0);
+ SEQ_filter_selected_strips(strips);
- const int count = SEQ_collection_len(selected_strips);
+ const int count = SEQ_collection_len(strips);
if (ed == NULL || count == 0) {
- SEQ_collection_free(selected_strips);
+ SEQ_collection_free(strips);
return;
}
@@ -112,13 +113,13 @@ void createTransSeqImageData(TransInfo *t)
TransDataSeq *tdseq = MEM_callocN(tc->data_len * sizeof(TransDataSeq), "TransSeq TransDataSeq");
Sequence *seq;
- SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+ SEQ_ITERATOR_FOREACH (seq, strips) {
SeqToTransData(seq, td++, td2d++, tdseq++, 0);
SeqToTransData(seq, td++, td2d++, tdseq++, 1);
SeqToTransData(seq, td++, td2d++, tdseq++, 2);
}
- SEQ_collection_free(selected_strips);
+ SEQ_collection_free(strips);
}
void recalcData_sequencer_image(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index f86d757294c..ce71c50a5ed 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -51,6 +51,7 @@
#include "SEQ_iterator.h"
#include "SEQ_sequencer.h"
+#include "SEQ_time.h"
#include "transform.h" /* own include */
@@ -247,18 +248,19 @@ static float gizmo2d_calc_rotation(const bContext *C)
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene, false);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
- SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+ SeqCollection *strips = Seq_query_rendered_strips(seqbase, scene->r.cfra, 0);
+ SEQ_filter_selected_strips(strips);
Sequence *seq;
- SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+ SEQ_ITERATOR_FOREACH (seq, strips) {
if (seq == ed->act_seq) {
StripTransform *transform = seq->strip->transform;
- SEQ_collection_free(selected_strips);
+ SEQ_collection_free(strips);
return transform->rotation;
}
}
- SEQ_collection_free(selected_strips);
+ SEQ_collection_free(strips);
return 0.0f;
}
@@ -276,24 +278,25 @@ static bool gizmo2d_calc_center(const bContext *C, float r_center[2])
else if (area->spacetype == SPACE_SEQ) {
Scene *scene = CTX_data_scene(C);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene, false));
- SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+ SeqCollection *strips = Seq_query_rendered_strips(seqbase, scene->r.cfra, 0);
+ SEQ_filter_selected_strips(strips);
- if (SEQ_collection_len(selected_strips) <= 0) {
- SEQ_collection_free(selected_strips);
+ if (SEQ_collection_len(strips) <= 0) {
+ SEQ_collection_free(strips);
return false;
}
has_select = true;
Sequence *seq;
- SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+ SEQ_ITERATOR_FOREACH (seq, strips) {
StripTransform *transform = seq->strip->transform;
r_center[0] += transform->xofs;
r_center[1] += transform->yofs;
}
- r_center[0] /= SEQ_collection_len(selected_strips);
- r_center[1] /= SEQ_collection_len(selected_strips);
+ r_center[0] /= SEQ_collection_len(strips);
+ r_center[1] /= SEQ_collection_len(strips);
- SEQ_collection_free(selected_strips);
+ SEQ_collection_free(strips);
}
return has_select;
}
diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h
index 9fca25653e1..e17544b3973 100644
--- a/source/blender/sequencer/SEQ_iterator.h
+++ b/source/blender/sequencer/SEQ_iterator.h
@@ -82,11 +82,15 @@ SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference,
SeqCollection *collection));
SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase);
SeqCollection *SEQ_query_unselected_strips(struct ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips(struct ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips_recursive(struct ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips(ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase);
+SeqCollection *Seq_query_rendered_strips(ListBase *seqbase,
+ const int timeline_frame,
+ const int displayed_channel);
void SEQ_query_strip_effect_chain(struct Sequence *seq_reference,
struct ListBase *seqbase,
SeqCollection *collection);
+void SEQ_filter_selected_strips(SeqCollection *collection);
#ifdef __cplusplus
}
diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c
index 58f68205f51..b1b66b7c1b5 100644
--- a/source/blender/sequencer/intern/iterator.c
+++ b/source/blender/sequencer/intern/iterator.c
@@ -37,6 +37,8 @@
#include "BKE_scene.h"
#include "SEQ_iterator.h"
+#include "SEQ_time.h"
+#include "render.h"
/* -------------------------------------------------------------------- */
/** \Iterator API
@@ -340,6 +342,114 @@ SeqCollection *SEQ_query_selected_strips(ListBase *seqbase)
return collection;
}
+static SeqCollection *query_strips_at_frame(ListBase *seqbase, const int timeline_frame)
+{
+ SeqCollection *collection = SEQ_collection_create(__func__);
+
+ LISTBASE_FOREACH (Sequence *, seq, seqbase) {
+ if (SEQ_time_strip_intersects_frame(seq, timeline_frame)) {
+ SEQ_collection_append_strip(seq, collection);
+ }
+ }
+ return collection;
+}
+
+static void collection_filter_channel_up_to_incl(SeqCollection *collection, const int channel)
+{
+ Sequence *seq;
+ SEQ_ITERATOR_FOREACH (seq, collection) {
+ if (seq->machine <= channel) {
+ continue;
+ }
+ SEQ_collection_remove_strip(seq, collection);
+ }
+}
+
+static bool seq_is_effect_of(const Sequence *seq_effect, const Sequence *possibly_input)
+{
+ if (seq_effect->seq1 == possibly_input || seq_effect->seq2 == possibly_input ||
+ seq_effect->seq3 == possibly_input) {
+ return true;
+ }
+ return false;
+}
+
+/* Check if seq must be rendered. This depends on whole stack in some cases, not only seq itself.
+ * Order of applying these conditions is important. */
+static bool must_render_strip(const Sequence *seq, SeqCollection *strips_at_timeline_frame)
+{
+ bool seq_have_effect_in_stack = false;
+ Sequence *seq_iter;
+ SEQ_ITERATOR_FOREACH (seq_iter, strips_at_timeline_frame) {
+ /* Strips is below another strip with replace blending are not rendered. */
+ if (seq_iter->blend_mode == SEQ_BLEND_REPLACE && seq->machine < seq_iter->machine) {
+ return false;
+ }
+
+ if ((seq_iter->type & SEQ_TYPE_EFFECT) != 0 && seq_is_effect_of(seq_iter, seq)) {
+ /* Strips in same channel or higher than its effect are rendered. */
+ if (seq->machine >= seq_iter->machine) {
+ return true;
+ }
+ /* Mark that this strip has effect in stack, that is above the strip. */
+ seq_have_effect_in_stack = true;
+ }
+ }
+
+ /* All effects are rendered (with respect to conditions above). */
+ if ((seq->type & SEQ_TYPE_EFFECT) != 0) {
+ return true;
+ }
+
+ /* If strip has effects in stack, and all effects are above this strip, it is not rendered. */
+ if (seq_have_effect_in_stack) {
+ return false;
+ }
+
+ return true;
+}
+
+/* Remove strips we don't want to render from collection. */
+static void collection_filter_rendered_strips(SeqCollection *collection)
+{
+ Sequence *seq;
+
+ /* Remove sound strips and muted strips from collection, because these are not rendered.
+ * Function #must_render_strip() don't have to check for these strips anymore. */
+ SEQ_ITERATOR_FOREACH (seq, collection) {
+ if (seq->type == SEQ_TYPE_SOUND_RAM || (seq->flag & SEQ_MUTE) != 0) {
+ SEQ_collection_remove_strip(seq, collection);
+ }
+ }
+
+ SEQ_ITERATOR_FOREACH (seq, collection) {
+ if (must_render_strip(seq, collection)) {
+ continue;
+ }
+ SEQ_collection_remove_strip(seq, collection);
+ }
+}
+
+/**
+ * Query strips that are rendered at \a timeline_frame when \a displayed channel is viewed
+ *
+ * \param seqbase: ListBase in which strips are queried
+ * \param timeline_frame: viewed frame
+ * \param displayed_channel: viewed channel. when set to 0, no channel filter is applied
+ * \return strip collection
+ */
+SeqCollection *Seq_query_rendered_strips(ListBase *seqbase,
+ const int timeline_frame,
+ const int displayed_channel)
+{
+ SeqCollection *collection = query_strips_at_frame(seqbase, timeline_frame);
+ if (displayed_channel != 0) {
+ collection_filter_channel_up_to_incl(collection, displayed_channel);
+ }
+ collection_filter_rendered_strips(collection);
+ return collection;
+}
+
/**
* Query all unselected strips in seqbase.
*
@@ -396,3 +506,13 @@ void SEQ_query_strip_effect_chain(Sequence *seq_reference,
}
}
}
+
+void SEQ_filter_selected_strips(SeqCollection *collection)
+{
+ Sequence *seq;
+ SEQ_IT
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list