Blender V4.3
transform_convert_sequencer_retiming.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "MEM_guardedalloc.h"
10
11#include "DNA_screen_types.h"
12#include "DNA_sequence_types.h"
13#include "DNA_space_types.h"
14
15#include "BLI_math_matrix.h"
16#include "BLI_math_vector.h"
17
18#include "BKE_context.hh"
19
20#include "SEQ_iterator.hh"
21#include "SEQ_relations.hh"
22#include "SEQ_retiming.hh"
23#include "SEQ_sequencer.hh"
24#include "SEQ_transform.hh"
25
26#include "transform.hh"
27#include "transform_convert.hh"
28
30typedef struct TransDataSeq {
33 int key_index; /* Some actions may need to destroy original data, use index to access it. */
35
36static TransData *SeqToTransData(const Scene *scene,
37 Sequence *seq,
38 const SeqRetimingKey *key,
39 TransData *td,
40 TransData2D *td2d,
41 TransDataSeq *tdseq)
42{
43
44 td2d->loc[0] = SEQ_retiming_key_timeline_frame_get(scene, seq, key);
45 td2d->loc[1] = key->retiming_factor;
46 td2d->loc2d = nullptr;
47 td->loc = td2d->loc;
48 copy_v3_v3(td->iloc, td->loc);
49 copy_v3_v3(td->center, td->loc);
50 memset(td->axismtx, 0, sizeof(td->axismtx));
51 td->axismtx[2][2] = 1.0f;
52 unit_m3(td->mtx);
53 unit_m3(td->smtx);
54
55 tdseq->seq = seq;
57 tdseq->key_index = SEQ_retiming_key_index_get(seq, key);
58
59 td->extra = static_cast<void *>(tdseq);
60 td->ext = nullptr;
61 td->flag |= TD_SELECTED;
62 td->dist = 0.0;
63
64 return td;
65}
66
67static void freeSeqData(TransInfo *t, TransDataContainer *tc, TransCustomData * /*custom_data*/)
68{
69 const TransData *const td = (TransData *)tc->data;
70 Scene *scene = t->scene;
71 const Editing *ed = SEQ_editing_get(t->scene);
72
73 /* Handle overlapping strips. */
74
75 blender::VectorSet<Sequence *> transformed_strips;
76 for (int i = 0; i < tc->data_len; i++) {
77 Sequence *seq = ((TransDataSeq *)(td + i)->extra)->seq;
78 transformed_strips.add(seq);
79 }
80
81 ListBase *seqbasep = SEQ_active_seqbase_get(ed);
82 SEQ_iterator_set_expand(scene, seqbasep, transformed_strips, SEQ_query_strip_effect_chain);
83
85 dependant.add_multiple(transformed_strips);
86 dependant.remove_if(
87 [&](Sequence *seq) { return SEQ_transform_sequence_can_be_translated(seq); });
88
89 if (seq_transform_check_overlap(transformed_strips)) {
90 const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag &
91 SEQ_MARKER_TRANS) != 0;
92 SEQ_transform_handle_overlap(scene, seqbasep, transformed_strips, dependant, use_sync_markers);
93 }
94
95 MEM_freeN(td->extra);
96}
97
99{
100 const Editing *ed = SEQ_editing_get(t->scene);
101 if (ed == nullptr) {
102 return;
103 }
104
106
107 if (selection.is_empty()) {
108 return;
109 }
110
113
114 tc->data_len = selection.size();
115 tc->data = MEM_cnew_array<TransData>(tc->data_len, "TransSeq TransData");
116 tc->data_2d = MEM_cnew_array<TransData2D>(tc->data_len, "TransSeq TransData2D");
117 TransDataSeq *tdseq = MEM_cnew_array<TransDataSeq>(tc->data_len, "TransSeq TransDataSeq");
118 TransData *td = tc->data;
119 TransData2D *td2d = tc->data_2d;
120
121 for (auto item : selection.items()) {
122 SeqToTransData(t->scene, item.value, item.key, td++, td2d++, tdseq++);
123 }
124}
125
127{
129 const TransData *td = nullptr;
130 const TransData2D *td2d = nullptr;
131 int i;
132
133 blender::VectorSet<Sequence *> transformed_strips;
134
135 for (i = 0, td = tc->data, td2d = tc->data_2d; i < tc->data_len; i++, td++, td2d++) {
136 const TransDataSeq *tdseq = static_cast<TransDataSeq *>(td->extra);
137 Sequence *seq = tdseq->seq;
138
139 transformed_strips.add(seq);
140
141 /* Calculate translation. */
142
144 SeqRetimingKey *key = &keys[tdseq->key_index];
145
148 {
150 }
151 else {
152 SEQ_retiming_key_timeline_frame_set(t->scene, seq, key, td2d->loc[0]);
153 }
154
156 }
157
158 /* Test overlap, displays red outline. */
159 Editing *ed = SEQ_editing_get(t->scene);
161 t->scene, SEQ_active_seqbase_get(ed), transformed_strips, SEQ_query_strip_effect_chain);
162 for (Sequence *seq : transformed_strips) {
163 seq->flag &= ~SEQ_OVERLAP;
165 seq->flag |= SEQ_OVERLAP;
166 }
167 }
168}
169
MINLINE int round_fl_to_int(float a)
void unit_m3(float m[3][3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
@ SEQ_OVERLAP
@ SEQ_MARKER_TRANS
Read Guarded memory(de)allocation.
bool add(const Key &key)
void add_multiple(Span< Key > keys)
int64_t remove_if(Predicate &&predicate)
void SEQ_iterator_set_expand(const Scene *scene, ListBase *seqbase, VectorSet< Sequence * > &strips, void seq_query_func(const Scene *scene, Sequence *seq_reference, ListBase *seqbase, VectorSet< Sequence * > &strips))
Definition iterator.cc:61
void SEQ_query_strip_effect_chain(const Scene *scene, Sequence *reference_strip, ListBase *seqbase, VectorSet< Sequence * > &strips)
Definition iterator.cc:210
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Definition sequencer.cc:416
Editing * SEQ_editing_get(const Scene *scene)
Definition sequencer.cc:262
void SEQ_relations_invalidate_cache_preprocessed(Scene *scene, Sequence *seq)
MutableSpan< SeqRetimingKey > SEQ_retiming_keys_get(const Sequence *seq)
bool SEQ_retiming_key_is_transition_type(const SeqRetimingKey *key)
int SEQ_retiming_key_index_get(const Sequence *seq, const SeqRetimingKey *key)
void SEQ_retiming_key_timeline_frame_set(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int timeline_frame)
int SEQ_retiming_key_timeline_frame_get(const Scene *scene, const Sequence *seq, const SeqRetimingKey *key)
blender::Map< SeqRetimingKey *, Sequence * > SEQ_retiming_selection_get(const Editing *ed)
void SEQ_retiming_transition_key_frame_set(const Scene *scene, const Sequence *seq, SeqRetimingKey *key, const int timeline_frame)
bool SEQ_retiming_selection_has_whole_transition(const Editing *ed, SeqRetimingKey *key)
bool SEQ_transform_test_overlap(const Scene *scene, ListBase *seqbasep, Sequence *test)
void SEQ_transform_handle_overlap(Scene *scene, ListBase *seqbasep, blender::Span< Sequence * > transformed_strips, bool use_sync_markers)
bool SEQ_transform_sequence_can_be_translated(const Sequence *seq)
void * first
ListBase spacedata
TransCustomData type
Definition transform.hh:425
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:409
TransCustomDataContainer custom
Definition transform.hh:501
TransData * data
Definition transform.hh:445
TransData2D * data_2d
Definition transform.hh:449
float smtx[3][3]
float axismtx[3][3]
float mtx[3][3]
TransDataExtension * ext
Scene * scene
Definition transform.hh:654
ScrArea * area
Definition transform.hh:651
@ T_2D_EDIT
Definition transform.hh:104
@ T_POINTS
Definition transform.hh:93
#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t)
Definition transform.hh:851
conversion and adaptation of different datablocks to a common struct.
bool seq_transform_check_overlap(blender::Span< Sequence * > transformed_strips)
static void recalcData_sequencer_retiming(TransInfo *t)
struct TransDataSeq TransDataSeq
static TransData * SeqToTransData(const Scene *scene, Sequence *seq, const SeqRetimingKey *key, TransData *td, TransData2D *td2d, TransDataSeq *tdseq)
static void freeSeqData(TransInfo *t, TransDataContainer *tc, TransCustomData *)
TransConvertTypeInfo TransConvertType_SequencerRetiming
static void createTransSeqRetimingData(bContext *, TransInfo *t)
@ TD_SELECTED