158 lines
5.2 KiB
C++
158 lines
5.2 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2016 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup spclip
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "BKE_tracking.h"
|
|
|
|
struct ListBase;
|
|
struct MovieClip;
|
|
struct SpaceClip;
|
|
struct bContext;
|
|
struct MovieTrackingTrack;
|
|
struct MovieTrackingMarker;
|
|
struct MovieTrackingPlaneTrack;
|
|
struct MovieTrackingPlaneMarker;
|
|
|
|
/* tracking_utils.c */
|
|
|
|
void clip_tracking_clear_invisible_track_selection(struct SpaceClip *sc, struct MovieClip *clip);
|
|
|
|
void clip_tracking_show_cursor(struct bContext *C);
|
|
void clip_tracking_hide_cursor(struct bContext *C);
|
|
|
|
/* tracking_select.h */
|
|
|
|
void ed_tracking_deselect_all_tracks(struct ListBase *tracks_base);
|
|
void ed_tracking_deselect_all_plane_tracks(struct ListBase *plane_tracks_base);
|
|
|
|
typedef struct TrackPickOptions {
|
|
/* Ignore tracks which are not selected */
|
|
bool selected_only;
|
|
|
|
/* Ignore tracks which are locked. */
|
|
bool unlocked_only;
|
|
|
|
/* Ignore markers which are disabled. */
|
|
bool enabled_only;
|
|
} TrackPickOptions;
|
|
|
|
BLI_INLINE TrackPickOptions ed_tracking_pick_options_defaults(void)
|
|
{
|
|
TrackPickOptions options = {false};
|
|
return options;
|
|
}
|
|
|
|
typedef enum eTrackPickAreaDetail {
|
|
TRACK_PICK_AREA_DETAIL_NONE,
|
|
|
|
/* Position of the marker (when area is TRACK_AREA_POINT).
|
|
* Position of the pattern corner when area is TRACK_AREA_PAT and corner != -1. */
|
|
TRACK_PICK_AREA_DETAIL_POSITION,
|
|
|
|
/* Size and offset of the search area. */
|
|
TRACK_PICK_AREA_DETAIL_SIZE,
|
|
TRACK_PICK_AREA_DETAIL_OFFSET,
|
|
|
|
/* "Widget" used to define pattern rotation and scale. */
|
|
TRACK_PICK_AREA_DETAIL_TILT_SIZE,
|
|
|
|
/* Edge of pattern or search area. */
|
|
TRACK_PICK_AREA_DETAIL_EDGE,
|
|
} eTrackPickAreaDetail;
|
|
|
|
typedef struct PointTrackPick {
|
|
struct MovieTrackingTrack *track;
|
|
struct MovieTrackingMarker *marker;
|
|
|
|
/* Picked area of the track. Is a single element from eTrackArea (no multiple choices are
|
|
* possible). */
|
|
eTrackArea area;
|
|
eTrackPickAreaDetail area_detail;
|
|
|
|
/* When a pattern corner is picked is 0-based index of the corner.
|
|
* Otherwise is -1. */
|
|
int corner_index;
|
|
|
|
/* Distance to the pick measured in squared pixels. */
|
|
float distance_px_squared;
|
|
} PointTrackPick;
|
|
|
|
/* Pick point track which is closest to the given coordinate.
|
|
* Operates in the original non-stabilized and non-un-distorted coordinates. */
|
|
PointTrackPick ed_tracking_pick_point_track(const TrackPickOptions *options,
|
|
struct bContext *C,
|
|
const float co[2]);
|
|
|
|
/* Returns true when the pick did not pick anything. */
|
|
BLI_INLINE bool ed_tracking_point_track_pick_empty(const PointTrackPick *pick)
|
|
{
|
|
return pick->track == NULL;
|
|
}
|
|
|
|
/* Check whether the point track pick corresponds to a part of the marker which can be sued
|
|
* for slide operation. */
|
|
bool ed_tracking_point_track_pick_can_slide(const SpaceClip *space_clip,
|
|
const PointTrackPick *pick);
|
|
|
|
typedef struct PlaneTrackPick {
|
|
struct MovieTrackingPlaneTrack *plane_track;
|
|
struct MovieTrackingPlaneMarker *plane_marker;
|
|
|
|
/* When not equal to -1 denotes the index of the corner which was the closest to the requested
|
|
* coordinate. */
|
|
int corner_index;
|
|
|
|
/* Distance to the pick measured in squared pixels. */
|
|
float distance_px_squared;
|
|
} PlaneTrackPick;
|
|
|
|
/* Pick plane track which is closest to the given coordinate.
|
|
* Operates in the original non-stabilized and non-un-distorted coordinates. */
|
|
PlaneTrackPick ed_tracking_pick_plane_track(const TrackPickOptions *options,
|
|
struct bContext *C,
|
|
const float co[2]);
|
|
|
|
/* Returns true when the pick did not pick anything. */
|
|
BLI_INLINE bool ed_tracking_plane_track_pick_empty(const PlaneTrackPick *pick)
|
|
{
|
|
return pick->plane_track == NULL;
|
|
}
|
|
|
|
/* Check whether the plane track pick corresponds to a part of the marker which can be sued
|
|
* for slide operation. */
|
|
bool ed_tracking_plane_track_pick_can_slide(const PlaneTrackPick *pick);
|
|
|
|
typedef struct TrackingPick {
|
|
/* NOTE: At maximum one of these picks will have a track. */
|
|
PointTrackPick point_track_pick;
|
|
PlaneTrackPick plane_track_pick;
|
|
} TrackingPick;
|
|
|
|
/* Pick closest point or plane track (whichever is the closest to the given coordinate).
|
|
* Operates in the original non-stabilized and non-un-distorted coordinates. */
|
|
TrackingPick ed_tracking_pick_closest(const TrackPickOptions *options,
|
|
bContext *C,
|
|
const float co[2]);
|
|
|
|
/* Returns true when the pick did not pick anything. */
|
|
BLI_INLINE bool ed_tracking_pick_empty(const TrackingPick *pick)
|
|
{
|
|
return ed_tracking_point_track_pick_empty(&pick->point_track_pick) &&
|
|
ed_tracking_plane_track_pick_empty(&pick->plane_track_pick);
|
|
}
|
|
|
|
/* Check whether any of the pick can be used for the marker slide operation. */
|
|
BLI_INLINE bool ed_tracking_pick_can_slide(const struct SpaceClip *space_clip,
|
|
const struct TrackingPick *pick)
|
|
{
|
|
return ed_tracking_point_track_pick_can_slide(space_clip, &pick->point_track_pick) ||
|
|
ed_tracking_plane_track_pick_can_slide(&pick->plane_track_pick);
|
|
}
|