Blender V4.5
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->ext = nullptr;
81 td->val = nullptr;
82
83 td->flag |= TD_SELECTED;
84 td->dist = 0.0;
85
86 unit_m3(td->mtx);
87 unit_m3(td->smtx);
88}
89
91{
92 TransData *td;
93 TransData2D *td2d;
96 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
98
99 int width, height;
100 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
101
103
104 /* Count. */
105 tc->data_len = 0;
106
107 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
108 return;
109 }
110
111 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
112 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
113 for (int i = 1; i < track->markersnr; i++) {
114 const MovieTrackingMarker *marker = &track->markers[i];
115 const MovieTrackingMarker *prev_marker = &track->markers[i - 1];
116
117 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
118 continue;
119 }
120
121 if (marker->flag & MARKER_GRAPH_SEL_X) {
122 tc->data_len += 1;
123 }
124
125 if (marker->flag & MARKER_GRAPH_SEL_Y) {
126 tc->data_len += 1;
127 }
128 }
129 }
130 }
131
132 if (tc->data_len == 0) {
133 return;
134 }
135
136 td = tc->data = MEM_calloc_arrayN<TransData>(tc->data_len, "TransTracking TransData");
137 td2d = tc->data_2d = MEM_calloc_arrayN<TransData2D>(tc->data_len, "TransTracking TransData2D");
139 tc->data_len, "TransTracking TransDataTracking");
140 tc->custom.type.free_cb = nullptr;
141
142 /* Create actual data. */
143 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
144 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
145 for (int i = 1; i < track->markersnr; i++) {
146 MovieTrackingMarker *marker = &track->markers[i];
147 MovieTrackingMarker *prev_marker = &track->markers[i - 1];
148
149 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
150 continue;
151 }
152
153 if (marker->flag & MARKER_GRAPH_SEL_X) {
155 td, td2d, tdt, track, marker, &track->markers[i - 1], 0, width);
156 td += 1;
157 td2d += 1;
158 tdt += 1;
159 }
160
161 if (marker->flag & MARKER_GRAPH_SEL_Y) {
163 td, td2d, tdt, track, marker, &track->markers[i - 1], 1, height);
164
165 td += 1;
166 td2d += 1;
167 tdt += 1;
168 }
169 }
170 }
171 }
172}
173
175{
178 int width, height;
179
181
182 tc->data_len = 0;
183
184 if (!clip) {
185 return;
186 }
187
188 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
189
190 if (width == 0 || height == 0) {
191 return;
192 }
193
194 /* Transformation was called from graph editor. */
197}
198
200
201/* -------------------------------------------------------------------- */
204
206{
208 TransDataTrackingCurves *tdt_array = static_cast<TransDataTrackingCurves *>(
209 tc->custom.type.data);
210
211 int i = 0;
212 while (i < tc->data_len) {
213 TransDataTrackingCurves *tdt = &tdt_array[i];
214
215 {
216 MovieTrackingTrack *track = tdt->track;
217 MovieTrackingMarker *marker, *prev_marker;
218 int a;
219
220 for (a = 1; a < track->markersnr; a++) {
221 marker = &track->markers[a];
222 prev_marker = &track->markers[a - 1];
223
224 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
225 continue;
226 }
227
228 if (marker->flag & (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)) {
229 marker->flag = tdt->flag;
230 }
231 }
232 }
233
234 i++;
235 }
236}
237
239{
240 TransData *td;
241 TransData2D *td2d;
243 int td_index;
244
245 if (t->state == TRANS_CANCEL) {
247 }
248
250
251 /* Flush to 2d vector from internally used 3d vector. */
252 for (td_index = 0,
253 td = tc->data,
254 td2d = tc->data_2d,
255 tdt = static_cast<TransDataTrackingCurves *>(tc->custom.type.data);
256 td_index < tc->data_len;
257 td_index++, td2d++, td++, tdt++)
258 {
259 {
260 td2d->loc2d[tdt->coord] = tdt->prev_pos[tdt->coord] + td2d->loc[1] * tdt->scale;
261 }
262 }
263}
264
266{
267 SpaceClip *sc = static_cast<SpaceClip *>(t->area->spacedata.first);
268
271
273
274 DEG_id_tag_update(&clip->id, 0);
275 }
276}
277
279
280/* -------------------------------------------------------------------- */
283
285{
286 SpaceClip *sc = static_cast<SpaceClip *>(t->area->spacedata.first);
288 if (t->scene->nodetree != nullptr) {
289 /* Tracks can be used for stabilization nodes,
290 * flush update for such nodes.
291 */
292 if (t->context != nullptr) {
293 Main *bmain = CTX_data_main(C);
294 BKE_ntree_update_tag_id_changed(bmain, &clip->id);
295 BKE_ntree_update(*bmain);
297 }
298 }
299}
300
302
304 /*flags*/ (T_POINTS | T_2D_EDIT),
305 /*create_trans_data*/ createTransTrackingCurves,
306 /*recalc_data*/ recalcData_tracking_curves,
307 /*special_aftertrans_update*/ special_aftertrans_update__movieclip_for_curves,
308};
309
310} // 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
@ MARKER_GRAPH_SEL_X
@ MARKER_GRAPH_SEL_Y
@ MARKER_TRACKED
@ MARKER_DISABLED
@ TRACK_LOCKED
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:375
#define ND_NODES
Definition WM_types.hh:433
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 * nodetree
ListBase spacedata
struct MovieClipUser user
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:628
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)