Transform: split tracking conversion
The conversion of curve tracking points is not integrated into `Tracks` and `PlaneTracks` so its logic can be separated from the file.
This commit is contained in:
@@ -51,6 +51,7 @@ set(SRC
|
||||
transform_convert_sequencer.c
|
||||
transform_convert_sequencer_image.c
|
||||
transform_convert_tracking.c
|
||||
transform_convert_tracking_curves.c
|
||||
transform_draw_cursors.c
|
||||
transform_generics.c
|
||||
transform_gizmo_2d.c
|
||||
|
||||
@@ -932,6 +932,9 @@ static TransConvertTypeInfo *convert_type_get(const TransInfo *t, Object **r_obj
|
||||
}
|
||||
if (t->spacetype == SPACE_CLIP) {
|
||||
if (t->options & CTX_MOVIECLIP) {
|
||||
if (t->region->regiontype == RGN_TYPE_PREVIEW) {
|
||||
return &TransConvertType_TrackingCurves;
|
||||
}
|
||||
return &TransConvertType_Tracking;
|
||||
}
|
||||
if (t->options & CTX_MASK) {
|
||||
|
||||
@@ -276,6 +276,11 @@ extern TransConvertTypeInfo TransConvertType_SequencerImage;
|
||||
|
||||
extern TransConvertTypeInfo TransConvertType_Tracking;
|
||||
|
||||
/* transform_convert_tracking_curves.c */
|
||||
|
||||
extern TransConvertTypeInfo TransConvertType_TrackingCurves;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -9,26 +9,24 @@
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_math.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_movieclip.h"
|
||||
#include "BKE_node.h"
|
||||
#include "BKE_node_tree_update.h"
|
||||
#include "BKE_tracking.h"
|
||||
|
||||
#include "ED_clip.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
|
||||
#include "transform.h"
|
||||
#include "transform_convert.h"
|
||||
|
||||
typedef struct TransDataTracking {
|
||||
int mode, flag;
|
||||
int mode;
|
||||
int flag;
|
||||
|
||||
/* tracks transformation from main window */
|
||||
int area;
|
||||
@@ -41,18 +39,13 @@ typedef struct TransDataTracking {
|
||||
int framenr;
|
||||
MovieTrackingMarker *markers;
|
||||
|
||||
/* marker transformation from curves editor */
|
||||
float *prev_pos, scale;
|
||||
short coord;
|
||||
|
||||
MovieTrackingTrack *track;
|
||||
MovieTrackingPlaneTrack *plane_track;
|
||||
} TransDataTracking;
|
||||
|
||||
enum transDataTracking_Mode {
|
||||
transDataTracking_ModeTracks = 0,
|
||||
transDataTracking_ModeCurves = 1,
|
||||
transDataTracking_ModePlaneTracks = 2,
|
||||
transDataTracking_ModePlaneTracks = 1,
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
@@ -379,139 +372,8 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t)
|
||||
}
|
||||
}
|
||||
|
||||
static void markerToTransCurveDataInit(TransData *td,
|
||||
TransData2D *td2d,
|
||||
TransDataTracking *tdt,
|
||||
MovieTrackingTrack *track,
|
||||
MovieTrackingMarker *marker,
|
||||
MovieTrackingMarker *prev_marker,
|
||||
short coord,
|
||||
float size)
|
||||
{
|
||||
float frames_delta = (marker->framenr - prev_marker->framenr);
|
||||
|
||||
tdt->flag = marker->flag;
|
||||
marker->flag &= ~MARKER_TRACKED;
|
||||
|
||||
tdt->mode = transDataTracking_ModeCurves;
|
||||
tdt->coord = coord;
|
||||
tdt->scale = 1.0f / size * frames_delta;
|
||||
tdt->prev_pos = prev_marker->pos;
|
||||
tdt->track = track;
|
||||
|
||||
/* calculate values depending on marker's speed */
|
||||
td2d->loc[0] = marker->framenr;
|
||||
td2d->loc[1] = (marker->pos[coord] - prev_marker->pos[coord]) * size / frames_delta;
|
||||
td2d->loc[2] = 0.0f;
|
||||
|
||||
td2d->loc2d = marker->pos; /* current location */
|
||||
|
||||
td->flag = 0;
|
||||
td->loc = td2d->loc;
|
||||
copy_v3_v3(td->center, td->loc);
|
||||
copy_v3_v3(td->iloc, td->loc);
|
||||
|
||||
memset(td->axismtx, 0, sizeof(td->axismtx));
|
||||
td->axismtx[2][2] = 1.0f;
|
||||
|
||||
td->ext = NULL;
|
||||
td->val = NULL;
|
||||
|
||||
td->flag |= TD_SELECTED;
|
||||
td->dist = 0.0;
|
||||
|
||||
unit_m3(td->mtx);
|
||||
unit_m3(td->smtx);
|
||||
}
|
||||
|
||||
static void createTransTrackingCurvesData(bContext *C, TransInfo *t)
|
||||
{
|
||||
TransData *td;
|
||||
TransData2D *td2d;
|
||||
SpaceClip *sc = CTX_wm_space_clip(C);
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
|
||||
TransDataTracking *tdt;
|
||||
|
||||
int width, height;
|
||||
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
|
||||
|
||||
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
|
||||
|
||||
/* count */
|
||||
tc->data_len = 0;
|
||||
|
||||
if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
|
||||
if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
|
||||
for (int i = 1; i < track->markersnr; i++) {
|
||||
const MovieTrackingMarker *marker = &track->markers[i];
|
||||
const MovieTrackingMarker *prev_marker = &track->markers[i - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_X) {
|
||||
tc->data_len += 1;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_Y) {
|
||||
tc->data_len += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tc->data_len == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
td = tc->data = MEM_callocN(tc->data_len * sizeof(TransData), "TransTracking TransData");
|
||||
td2d = tc->data_2d = MEM_callocN(tc->data_len * sizeof(TransData2D),
|
||||
"TransTracking TransData2D");
|
||||
tc->custom.type.data = tdt = MEM_callocN(tc->data_len * sizeof(TransDataTracking),
|
||||
"TransTracking TransDataTracking");
|
||||
tc->custom.type.free_cb = transDataTrackingFree;
|
||||
|
||||
/* create actual data */
|
||||
LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
|
||||
if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
|
||||
for (int i = 1; i < track->markersnr; i++) {
|
||||
MovieTrackingMarker *marker = &track->markers[i];
|
||||
MovieTrackingMarker *prev_marker = &track->markers[i - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_X) {
|
||||
markerToTransCurveDataInit(
|
||||
td, td2d, tdt, track, marker, &track->markers[i - 1], 0, width);
|
||||
td += 1;
|
||||
td2d += 1;
|
||||
tdt += 1;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_Y) {
|
||||
markerToTransCurveDataInit(
|
||||
td, td2d, tdt, track, marker, &track->markers[i - 1], 1, height);
|
||||
|
||||
td += 1;
|
||||
td2d += 1;
|
||||
tdt += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void createTransTrackingData(bContext *C, TransInfo *t)
|
||||
{
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
SpaceClip *sc = CTX_wm_space_clip(C);
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
int width, height;
|
||||
@@ -530,13 +392,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
|
||||
return;
|
||||
}
|
||||
|
||||
if (region->regiontype == RGN_TYPE_PREVIEW) {
|
||||
/* transformation was called from graph editor */
|
||||
createTransTrackingCurvesData(C, t);
|
||||
}
|
||||
else {
|
||||
createTransTrackingTracksData(C, t);
|
||||
}
|
||||
createTransTrackingTracksData(C, t);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
@@ -574,24 +430,6 @@ static void cancelTransTracking(TransInfo *t)
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
else if (tdt->mode == transDataTracking_ModeCurves) {
|
||||
MovieTrackingTrack *track = tdt->track;
|
||||
MovieTrackingMarker *marker, *prev_marker;
|
||||
int a;
|
||||
|
||||
for (a = 1; a < track->markersnr; a++) {
|
||||
marker = &track->markers[a];
|
||||
prev_marker = &track->markers[a - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)) {
|
||||
marker->flag = tdt->flag;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (tdt->mode == transDataTracking_ModePlaneTracks) {
|
||||
MovieTrackingPlaneTrack *plane_track = tdt->plane_track;
|
||||
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get_exact(plane_track,
|
||||
@@ -675,9 +513,6 @@ static void flushTransTracking(TransInfo *t)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (tdt->mode == transDataTracking_ModeCurves) {
|
||||
td2d->loc2d[tdt->coord] = tdt->prev_pos[tdt->coord] + td2d->loc[1] * tdt->scale;
|
||||
}
|
||||
else if (tdt->mode == transDataTracking_ModePlaneTracks) {
|
||||
td2d->loc2d[0] = td2d->loc[0] / t->aspect[0];
|
||||
td2d->loc2d[1] = td2d->loc[1] / t->aspect[1];
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
* Copyright 2001-2002 NaN Holding BV. All rights reserved. */
|
||||
|
||||
/** \file
|
||||
* \ingroup edtransform
|
||||
*/
|
||||
|
||||
#include "DNA_space_types.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_math.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_movieclip.h"
|
||||
#include "BKE_node_tree_update.h"
|
||||
#include "BKE_tracking.h"
|
||||
|
||||
#include "ED_clip.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
|
||||
#include "transform.h"
|
||||
#include "transform_convert.h"
|
||||
|
||||
typedef struct TransDataTrackingCurves {
|
||||
int flag;
|
||||
|
||||
/* marker transformation from curves editor */
|
||||
float *prev_pos;
|
||||
float scale;
|
||||
short coord;
|
||||
|
||||
MovieTrackingTrack *track;
|
||||
} TransDataTrackingCurves;
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Clip Editor Motion Tracking Transform Creation
|
||||
* \{ */
|
||||
|
||||
static void markerToTransCurveDataInit(TransData *td,
|
||||
TransData2D *td2d,
|
||||
TransDataTrackingCurves *tdt,
|
||||
MovieTrackingTrack *track,
|
||||
MovieTrackingMarker *marker,
|
||||
MovieTrackingMarker *prev_marker,
|
||||
short coord,
|
||||
float size)
|
||||
{
|
||||
float frames_delta = (marker->framenr - prev_marker->framenr);
|
||||
|
||||
tdt->flag = marker->flag;
|
||||
marker->flag &= ~MARKER_TRACKED;
|
||||
|
||||
tdt->coord = coord;
|
||||
tdt->scale = 1.0f / size * frames_delta;
|
||||
tdt->prev_pos = prev_marker->pos;
|
||||
tdt->track = track;
|
||||
|
||||
/* calculate values depending on marker's speed */
|
||||
td2d->loc[0] = marker->framenr;
|
||||
td2d->loc[1] = (marker->pos[coord] - prev_marker->pos[coord]) * size / frames_delta;
|
||||
td2d->loc[2] = 0.0f;
|
||||
|
||||
td2d->loc2d = marker->pos; /* current location */
|
||||
|
||||
td->flag = 0;
|
||||
td->loc = td2d->loc;
|
||||
copy_v3_v3(td->center, td->loc);
|
||||
copy_v3_v3(td->iloc, td->loc);
|
||||
|
||||
memset(td->axismtx, 0, sizeof(td->axismtx));
|
||||
td->axismtx[2][2] = 1.0f;
|
||||
|
||||
td->ext = NULL;
|
||||
td->val = NULL;
|
||||
|
||||
td->flag |= TD_SELECTED;
|
||||
td->dist = 0.0;
|
||||
|
||||
unit_m3(td->mtx);
|
||||
unit_m3(td->smtx);
|
||||
}
|
||||
|
||||
static void createTransTrackingCurvesData(bContext *C, TransInfo *t)
|
||||
{
|
||||
TransData *td;
|
||||
TransData2D *td2d;
|
||||
SpaceClip *sc = CTX_wm_space_clip(C);
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
|
||||
TransDataTrackingCurves *tdt;
|
||||
|
||||
int width, height;
|
||||
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
|
||||
|
||||
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
|
||||
|
||||
/* count */
|
||||
tc->data_len = 0;
|
||||
|
||||
if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
|
||||
if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
|
||||
for (int i = 1; i < track->markersnr; i++) {
|
||||
const MovieTrackingMarker *marker = &track->markers[i];
|
||||
const MovieTrackingMarker *prev_marker = &track->markers[i - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_X) {
|
||||
tc->data_len += 1;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_Y) {
|
||||
tc->data_len += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tc->data_len == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
td = tc->data = MEM_callocN(tc->data_len * sizeof(TransData), "TransTracking TransData");
|
||||
td2d = tc->data_2d = MEM_callocN(tc->data_len * sizeof(TransData2D),
|
||||
"TransTracking TransData2D");
|
||||
tc->custom.type.data = tdt = MEM_callocN(tc->data_len * sizeof(TransDataTrackingCurves),
|
||||
"TransTracking TransDataTracking");
|
||||
tc->custom.type.free_cb = NULL;
|
||||
|
||||
/* create actual data */
|
||||
LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
|
||||
if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
|
||||
for (int i = 1; i < track->markersnr; i++) {
|
||||
MovieTrackingMarker *marker = &track->markers[i];
|
||||
MovieTrackingMarker *prev_marker = &track->markers[i - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_X) {
|
||||
markerToTransCurveDataInit(
|
||||
td, td2d, tdt, track, marker, &track->markers[i - 1], 0, width);
|
||||
td += 1;
|
||||
td2d += 1;
|
||||
tdt += 1;
|
||||
}
|
||||
|
||||
if (marker->flag & MARKER_GRAPH_SEL_Y) {
|
||||
markerToTransCurveDataInit(
|
||||
td, td2d, tdt, track, marker, &track->markers[i - 1], 1, height);
|
||||
|
||||
td += 1;
|
||||
td2d += 1;
|
||||
tdt += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void createTransTrackingCurves(bContext *C, TransInfo *t)
|
||||
{
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
SpaceClip *sc = CTX_wm_space_clip(C);
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
int width, height;
|
||||
|
||||
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
|
||||
|
||||
tc->data_len = 0;
|
||||
|
||||
if (!clip) {
|
||||
return;
|
||||
}
|
||||
|
||||
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
|
||||
|
||||
if (width == 0 || height == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* transformation was called from graph editor */
|
||||
BLI_assert(region->regiontype == RGN_TYPE_PREVIEW);
|
||||
createTransTrackingCurvesData(C, t);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name recalc Motion Tracking TransData
|
||||
* \{ */
|
||||
|
||||
static void cancelTransTrackingCurves(TransInfo *t)
|
||||
{
|
||||
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
|
||||
TransDataTrackingCurves *tdt_array = tc->custom.type.data;
|
||||
|
||||
int i = 0;
|
||||
while (i < tc->data_len) {
|
||||
TransDataTrackingCurves *tdt = &tdt_array[i];
|
||||
|
||||
{
|
||||
MovieTrackingTrack *track = tdt->track;
|
||||
MovieTrackingMarker *marker, *prev_marker;
|
||||
int a;
|
||||
|
||||
for (a = 1; a < track->markersnr; a++) {
|
||||
marker = &track->markers[a];
|
||||
prev_marker = &track->markers[a - 1];
|
||||
|
||||
if ((marker->flag & MARKER_DISABLED) || (prev_marker->flag & MARKER_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (marker->flag & (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)) {
|
||||
marker->flag = tdt->flag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void flushTransTrackingCurves(TransInfo *t)
|
||||
{
|
||||
TransData *td;
|
||||
TransData2D *td2d;
|
||||
TransDataTrackingCurves *tdt;
|
||||
int td_index;
|
||||
|
||||
if (t->state == TRANS_CANCEL) {
|
||||
cancelTransTrackingCurves(t);
|
||||
}
|
||||
|
||||
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
|
||||
|
||||
/* flush to 2d vector from internally used 3d vector */
|
||||
for (td_index = 0, td = tc->data, td2d = tc->data_2d, tdt = tc->custom.type.data;
|
||||
td_index < tc->data_len;
|
||||
td_index++, td2d++, td++, tdt++) {
|
||||
{
|
||||
td2d->loc2d[tdt->coord] = tdt->prev_pos[tdt->coord] + td2d->loc[1] * tdt->scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void recalcData_tracking_curves(TransInfo *t)
|
||||
{
|
||||
SpaceClip *sc = t->area->spacedata.first;
|
||||
|
||||
if (ED_space_clip_check_show_trackedit(sc)) {
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
|
||||
flushTransTrackingCurves(t);
|
||||
|
||||
DEG_id_tag_update(&clip->id, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Special After Transform Tracking
|
||||
* \{ */
|
||||
|
||||
static void special_aftertrans_update__movieclip_for_curves(bContext *C, TransInfo *t)
|
||||
{
|
||||
SpaceClip *sc = t->area->spacedata.first;
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
if (t->scene->nodetree != NULL) {
|
||||
/* Tracks can be used for stabilization nodes,
|
||||
* flush update for such nodes.
|
||||
*/
|
||||
if (t->context != NULL) {
|
||||
Main *bmain = CTX_data_main(C);
|
||||
BKE_ntree_update_tag_id_changed(bmain, &clip->id);
|
||||
BKE_ntree_update_main(bmain, NULL);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_NODES, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
TransConvertTypeInfo TransConvertType_TrackingCurves = {
|
||||
/*flags*/ (T_POINTS | T_2D_EDIT),
|
||||
/*createTransData*/ createTransTrackingCurves,
|
||||
/*recalcData*/ recalcData_tracking_curves,
|
||||
/*special_aftertrans_update*/ special_aftertrans_update__movieclip_for_curves,
|
||||
};
|
||||
Reference in New Issue
Block a user