Blender V4.3
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
9#include "DNA_space_types.h"
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_math_vector.h"
14
15#include "BKE_context.hh"
16#include "BKE_movieclip.h"
18#include "BKE_tracking.h"
19#include "BLI_math_matrix.h"
20
21#include "ED_clip.hh"
22
23#include "WM_api.hh"
24
25#include "transform.hh"
26#include "transform_convert.hh"
27
29 int flag;
30
31 /* Marker transformation from curves editor. */
32 float *prev_pos;
33 float scale;
34 short coord;
35
37};
38
39/* -------------------------------------------------------------------- */
44 TransData2D *td2d,
46 MovieTrackingTrack *track,
47 MovieTrackingMarker *marker,
48 MovieTrackingMarker *prev_marker,
49 short coord,
50 float size)
51{
52 float frames_delta = (marker->framenr - prev_marker->framenr);
53
54 tdt->flag = marker->flag;
55 marker->flag &= ~MARKER_TRACKED;
56
57 tdt->coord = coord;
58 tdt->scale = 1.0f / size * frames_delta;
59 tdt->prev_pos = prev_marker->pos;
60 tdt->track = track;
61
62 /* Calculate values depending on marker's speed. */
63 td2d->loc[0] = marker->framenr;
64 td2d->loc[1] = (marker->pos[coord] - prev_marker->pos[coord]) * size / frames_delta;
65 td2d->loc[2] = 0.0f;
66
67 td2d->loc2d = marker->pos; /* Current location. */
68
69 td->flag = 0;
70 td->loc = td2d->loc;
71 copy_v3_v3(td->center, td->loc);
72 copy_v3_v3(td->iloc, td->loc);
73
74 memset(td->axismtx, 0, sizeof(td->axismtx));
75 td->axismtx[2][2] = 1.0f;
76
77 td->ext = nullptr;
78 td->val = nullptr;
79
80 td->flag |= TD_SELECTED;
81 td->dist = 0.0;
82
83 unit_m3(td->mtx);
84 unit_m3(td->smtx);
85}
86
88{
89 TransData *td;
90 TransData2D *td2d;
93 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
95
96 int width, height;
97 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
98
100
101 /* Count. */
102 tc->data_len = 0;
103
104 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
105 return;
106 }
107
108 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
109 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
110 for (int i = 1; i < track->markersnr; i++) {
111 const MovieTrackingMarker *marker = &track->markers[i];
112 const MovieTrackingMarker *prev_marker = &track->markers[i - 1];
113
114 if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
115 continue;
116 }
117
118 if (marker->flag & MARKER_GRAPH_SEL_X) {
119 tc->data_len += 1;
120 }
121
122 if (marker->flag & MARKER_GRAPH_SEL_Y) {
123 tc->data_len += 1;
124 }
125 }
126 }
127 }
128
129 if (tc->data_len == 0) {
130 return;
131 }
132
133 td = tc->data = static_cast<TransData *>(
134 MEM_callocN(tc->data_len * sizeof(TransData), "TransTracking TransData"));
135 td2d = tc->data_2d = static_cast<TransData2D *>(
136 MEM_callocN(tc->data_len * sizeof(TransData2D), "TransTracking TransData2D"));
137 tc->custom.type.data = tdt = static_cast<TransDataTrackingCurves *>(MEM_callocN(
138 tc->data_len * sizeof(TransDataTrackingCurves), "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. */
194 BLI_assert(CTX_wm_region(C)->regiontype == RGN_TYPE_PREVIEW);
196}
197
200/* -------------------------------------------------------------------- */
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
279/* -------------------------------------------------------------------- */
284{
285 SpaceClip *sc = static_cast<SpaceClip *>(t->area->spacedata.first);
287 if (t->scene->nodetree != 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_main(bmain, nullptr);
296 }
297 }
298}
299
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};
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(Main *bmain, 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:50
#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_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 NC_SCENE
Definition WM_types.hh:345
#define ND_NODES
Definition WM_types.hh:403
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void * first
MovieTrackingMarker * markers
struct bNodeTree * nodetree
ListBase spacedata
struct MovieClipUser user
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
eTState state
Definition transform.hh:527
Scene * scene
Definition transform.hh:654
bContext * context
Definition transform.hh:649
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
@ TRANS_CANCEL
Definition transform.hh:210
conversion and adaptation of different datablocks to a common struct.
static void special_aftertrans_update__movieclip_for_curves(bContext *C, TransInfo *t)
static void flushTransTrackingCurves(TransInfo *t)
static void markerToTransCurveDataInit(TransData *td, TransData2D *td2d, TransDataTrackingCurves *tdt, MovieTrackingTrack *track, MovieTrackingMarker *marker, MovieTrackingMarker *prev_marker, short coord, float size)
TransConvertTypeInfo TransConvertType_TrackingCurves
static void createTransTrackingCurvesData(bContext *C, TransInfo *t)
static void recalcData_tracking_curves(TransInfo *t)
static void createTransTrackingCurves(bContext *C, TransInfo *t)
static void cancelTransTrackingCurves(TransInfo *t)
@ TD_SELECTED
void WM_event_add_notifier(const bContext *C, uint type, void *reference)