Blender V5.0
transform_convert_tracking_curves.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_space_types.h"
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_listbase.h"
14#include "BLI_math_vector.h"
15
16#include "BKE_context.hh"
17#include "BKE_movieclip.h"
19#include "BKE_tracking.h"
20#include "BLI_math_matrix.h"
21
22#include "ED_clip.hh"
23
24#include "WM_api.hh"
25
26#include "transform.hh"
27#include "transform_convert.hh"
28
29namespace blender::ed::transform {
30
32 int flag;
33
34 /* Marker transformation from curves editor. */
35 float *prev_pos;
36 float scale;
37 short coord;
38
40};
41
42/* -------------------------------------------------------------------- */
45
47 TransData2D *td2d,
49 MovieTrackingTrack *track,
50 MovieTrackingMarker *marker,
51 MovieTrackingMarker *prev_marker,
52 short coord,
53 float size)
54{
55 float frames_delta = (marker->framenr - prev_marker->framenr);
56
57 tdt->flag = marker->flag;
58 marker->flag &= ~MARKER_TRACKED;
59
60 tdt->coord = coord;
61 tdt->scale = 1.0f / size * frames_delta;
62 tdt->prev_pos = prev_marker->pos;
63 tdt->track = track;
64
65 /* Calculate values depending on marker's speed. */
66 td2d->loc[0] = marker->framenr;
67 td2d->loc[1] = (marker->pos[coord] - prev_marker->pos[coord]) * size / frames_delta;
68 td2d->loc[2] = 0.0f;
69
70 td2d->loc2d = marker->pos; /* Current location. */
71
72 td->flag = 0;
73 td->loc = td2d->loc;
74 copy_v3_v3(td->center, td->loc);
75 copy_v3_v3(td->iloc, td->loc);
76
77 memset(td->axismtx, 0, sizeof(td->axismtx));
78 td->axismtx[2][2] = 1.0f;
79
80 td->val = nullptr;
81
82 td->flag |= TD_SELECTED;
83 td->dist = 0.0;
84
85 unit_m3(td->mtx);
86 unit_m3(td->smtx);
87}
88
90{
91 TransData *td;
92 TransData2D *td2d;
95 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
97
98 int width, height;
99 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
100
102
103 /* Count. */
104 tc->data_len = 0;
105
106 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
107 return;
108 }
109
110 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
111 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
112 for (int i = 1; i < track->markersnr; i++) {
113 const MovieTrackingMarker *marker = &track->markers[i];
114 const MovieTrackingMarker *prev_marker = &track->markers[i - 1];
115
116 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
117 continue;
118 }
119
120 if (marker->flag & MARKER_GRAPH_SEL_X) {
121 tc->data_len += 1;
122 }
123
124 if (marker->flag & MARKER_GRAPH_SEL_Y) {
125 tc->data_len += 1;
126 }
127 }
128 }
129 }
130
131 if (tc->data_len == 0) {
132 return;
133 }
134
135 td = tc->data = MEM_calloc_arrayN<TransData>(tc->data_len, "TransTracking TransData");
136 td2d = tc->data_2d = MEM_calloc_arrayN<TransData2D>(tc->data_len, "TransTracking TransData2D");
138 tc->data_len, "TransTracking TransDataTracking");
139 tc->custom.type.free_cb = nullptr;
140
141 /* Create actual data. */
142 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
143 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
144 for (int i = 1; i < track->markersnr; i++) {
145 MovieTrackingMarker *marker = &track->markers[i];
146 MovieTrackingMarker *prev_marker = &track->markers[i - 1];
147
148 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
149 continue;
150 }
151
152 if (marker->flag & MARKER_GRAPH_SEL_X) {
154 td, td2d, tdt, track, marker, &track->markers[i - 1], 0, width);
155 td += 1;
156 td2d += 1;
157 tdt += 1;
158 }
159
160 if (marker->flag & MARKER_GRAPH_SEL_Y) {
162 td, td2d, tdt, track, marker, &track->markers[i - 1], 1, height);
163
164 td += 1;
165 td2d += 1;
166 tdt += 1;
167 }
168 }
169 }
170 }
171}
172
174{
177 int width, height;
178
180
181 tc->data_len = 0;
182
183 if (!clip) {
184 return;
185 }
186
187 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
188
189 if (width == 0 || height == 0) {
190 return;
191 }
192
193 /* Transformation was called from graph editor. */
196}
197
199
200/* -------------------------------------------------------------------- */
203
205{
207 TransDataTrackingCurves *tdt_array = static_cast<TransDataTrackingCurves *>(
208 tc->custom.type.data);
209
210 int i = 0;
211 while (i < tc->data_len) {
212 TransDataTrackingCurves *tdt = &tdt_array[i];
213
214 {
215 MovieTrackingTrack *track = tdt->track;
216 MovieTrackingMarker *marker, *prev_marker;
217 int a;
218
219 for (a = 1; a < track->markersnr; a++) {
220 marker = &track->markers[a];
221 prev_marker = &track->markers[a - 1];
222
223 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
224 continue;
225 }
226
227 if (marker->flag & (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)) {
228 marker->flag = tdt->flag;
229 }
230 }
231 }
232
233 i++;
234 }
235}
236
238{
239 TransData *td;
240 TransData2D *td2d;
242 int td_index;
243
244 if (t->state == TRANS_CANCEL) {
246 }
247
249
250 /* Flush to 2d vector from internally used 3d vector. */
251 for (td_index = 0,
252 td = tc->data,
253 td2d = tc->data_2d,
254 tdt = static_cast<TransDataTrackingCurves *>(tc->custom.type.data);
255 td_index < tc->data_len;
256 td_index++, td2d++, td++, tdt++)
257 {
258 {
259 td2d->loc2d[tdt->coord] = tdt->prev_pos[tdt->coord] + td2d->loc[1] * tdt->scale;
260 }
261 }
262}
263
265{
266 SpaceClip *sc = static_cast<SpaceClip *>(t->area->spacedata.first);
267
270
272
273 DEG_id_tag_update(&clip->id, 0);
274 }
275}
276
278
279/* -------------------------------------------------------------------- */
282
284{
285 SpaceClip *sc = static_cast<SpaceClip *>(t->area->spacedata.first);
287 if (t->scene->compositing_node_group != nullptr) {
288 /* Tracks can be used for stabilization nodes,
289 * flush update for such nodes.
290 */
291 if (t->context != nullptr) {
292 Main *bmain = CTX_data_main(C);
293 BKE_ntree_update_tag_id_changed(bmain, &clip->id);
294 BKE_ntree_update(*bmain);
296 }
297 }
298}
299
301
303 /*flags*/ (T_POINTS | T_2D_EDIT),
304 /*create_trans_data*/ createTransTrackingCurves,
305 /*recalc_data*/ recalcData_tracking_curves,
306 /*special_aftertrans_update*/ special_aftertrans_update__movieclip_for_curves,
307};
308
309} // namespace blender::ed::transform
Main * CTX_data_main(const bContext *C)
SpaceClip * CTX_wm_space_clip(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_movieclip_get_size(struct MovieClip *clip, const struct MovieClipUser *user, int *r_width, int *r_height)
void BKE_ntree_update(Main &bmain, std::optional< blender::Span< bNodeTree * > > modified_trees=std::nullopt, const NodeTreeUpdateExtraParams &params={})
void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id)
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
#define TRACK_VIEW_SELECTED(sc, track)
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
void unit_m3(float m[3][3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
@ RGN_TYPE_PREVIEW
@ SC_SHOW_GRAPH_TRACKS_MOTION
@ TRACK_LOCKED
@ MARKER_GRAPH_SEL_X
@ MARKER_GRAPH_SEL_Y
@ MARKER_TRACKED
@ MARKER_DISABLED
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
bool ED_space_clip_check_show_trackedit(const SpaceClip *sc)
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
#define NC_SCENE
Definition WM_types.hh:378
#define ND_NODES
Definition WM_types.hh:436
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
static void recalcData_tracking_curves(TransInfo *t)
static void markerToTransCurveDataInit(TransData *td, TransData2D *td2d, TransDataTrackingCurves *tdt, MovieTrackingTrack *track, MovieTrackingMarker *marker, MovieTrackingMarker *prev_marker, short coord, float size)
static void special_aftertrans_update__movieclip_for_curves(bContext *C, TransInfo *t)
static void flushTransTrackingCurves(TransInfo *t)
static void createTransTrackingCurves(bContext *C, TransInfo *t)
static void cancelTransTrackingCurves(TransInfo *t)
static void createTransTrackingCurvesData(bContext *C, TransInfo *t)
void * first
struct MovieTracking tracking
MovieTrackingMarker * markers
struct bNodeTree * compositing_node_group
ListBase spacedata
struct MovieClipUser user
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:633
i
Definition text_draw.cc:230
#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t)
Definition transform.hh:39
conversion and adaptation of different datablocks to a common struct.
void WM_event_add_notifier(const bContext *C, uint type, void *reference)