Cleanup: Refactor marker area clamping

Switch from a single function with a lot of branching at its top level
to dedicated function calls with own documentation.
This commit is contained in:
Sergey Sharybin 2022-05-12 10:58:22 +02:00
parent 58fe38af9f
commit 66dada123c
6 changed files with 80 additions and 61 deletions

View File

@ -32,12 +32,6 @@ struct rcti;
* Common types and constants.
*/
enum {
CLAMP_PAT_POS = 2,
CLAMP_SEARCH_DIM = 3,
CLAMP_SEARCH_POS = 4,
};
typedef enum eTrackArea {
TRACK_AREA_POINT = (1 << 0),
TRACK_AREA_PAT = (1 << 1),
@ -292,7 +286,35 @@ struct MovieTrackingMarker *BKE_tracking_marker_insert(struct MovieTrackingTrack
struct MovieTrackingMarker *marker);
void BKE_tracking_marker_delete(struct MovieTrackingTrack *track, int framenr);
void BKE_tracking_marker_clamp(struct MovieTrackingMarker *marker, int event);
/**
* If the pattern area is outside of the search area its position will be modified in a way that it
* is within the pattern is within the search area.
*
* If the pattern area is already within the search area nothing happens.
*
* If the pattern area is bigger than the search area the behavior is undefined.
*
* Search area is never modified.
*/
void BKE_tracking_marker_clamp_pattern_position(struct MovieTrackingMarker *marker);
/**
* If the search size is such that pattern area is (partially) outside of the search area make the
* search area bigger so that the pattern is within the search area.
*
* Pattern area is never modified.
*/
void BKE_tracking_marker_clamp_search_size(struct MovieTrackingMarker *marker);
/**
* If the search position is such that pattern area is (partially) outside of the search area move
* the search area so that the pattern is within the search area.
*
* If the search area is smaller than the pattern the behavior is undefined.
*
* Pattern area is never modified.
*/
void BKE_tracking_marker_clamp_search_position(struct MovieTrackingMarker *marker);
/**
* Get marker closest to the given frame number.

View File

@ -1367,53 +1367,52 @@ void BKE_tracking_marker_delete(MovieTrackingTrack *track, int framenr)
}
}
void BKE_tracking_marker_clamp(MovieTrackingMarker *marker, int event)
void BKE_tracking_marker_clamp_pattern_position(MovieTrackingMarker *marker)
{
float pat_min[2], pat_max[2];
BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
if (event == CLAMP_PAT_POS) {
float dim[2];
sub_v2_v2v2(dim, pat_max, pat_min);
for (int a = 0; a < 2; a++) {
/* pattern shouldn't be moved outside of search */
if (pat_min[a] < marker->search_min[a]) {
for (int b = 0; b < 4; b++) {
marker->pattern_corners[b][a] += marker->search_min[a] - pat_min[a];
}
for (int a = 0; a < 2; a++) {
if (pat_min[a] < marker->search_min[a]) {
for (int b = 0; b < 4; b++) {
marker->pattern_corners[b][a] += marker->search_min[a] - pat_min[a];
}
if (pat_max[a] > marker->search_max[a]) {
for (int b = 0; b < 4; b++) {
marker->pattern_corners[b][a] -= pat_max[a] - marker->search_max[a];
}
}
if (pat_max[a] > marker->search_max[a]) {
for (int b = 0; b < 4; b++) {
marker->pattern_corners[b][a] -= pat_max[a] - marker->search_max[a];
}
}
}
else if (event == CLAMP_SEARCH_DIM) {
for (int a = 0; a < 2; a++) {
/* search shouldn't be resized smaller than pattern */
marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]);
marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]);
}
}
void BKE_tracking_marker_clamp_search_size(MovieTrackingMarker *marker)
{
float pat_min[2], pat_max[2];
BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
for (int a = 0; a < 2; a++) {
marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]);
marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]);
}
else if (event == CLAMP_SEARCH_POS) {
float dim[2];
}
sub_v2_v2v2(dim, marker->search_max, marker->search_min);
void BKE_tracking_marker_clamp_search_position(MovieTrackingMarker *marker)
{
float pat_min[2], pat_max[2];
BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
for (int a = 0; a < 2; a++) {
/* search shouldn't be moved inside pattern */
if (marker->search_min[a] > pat_min[a]) {
marker->search_min[a] = pat_min[a];
marker->search_max[a] = marker->search_min[a] + dim[a];
}
if (marker->search_max[a] < pat_max[a]) {
marker->search_max[a] = pat_max[a];
marker->search_min[a] = marker->search_max[a] - dim[a];
}
float dim[2];
sub_v2_v2v2(dim, marker->search_max, marker->search_min);
for (int a = 0; a < 2; a++) {
if (marker->search_min[a] > pat_min[a]) {
marker->search_min[a] = pat_min[a];
marker->search_max[a] = marker->search_min[a] + dim[a];
}
if (marker->search_max[a] < pat_max[a]) {
marker->search_max[a] = pat_max[a];
marker->search_min[a] = marker->search_max[a] - dim[a];
}
}
}

View File

@ -303,7 +303,7 @@ static void marker_block_handler(bContext *C, void *arg_cb, int event)
cb->marker->pattern_corners[a][1] *= scale_y;
}
BKE_tracking_marker_clamp(cb->marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(cb->marker);
ok = true;
}
@ -319,7 +319,7 @@ static void marker_block_handler(bContext *C, void *arg_cb, int event)
sub_v2_v2v2(cb->marker->search_min, delta, side);
add_v2_v2v2(cb->marker->search_max, delta, side);
BKE_tracking_marker_clamp(cb->marker, CLAMP_SEARCH_POS);
BKE_tracking_marker_clamp_search_position(cb->marker);
ok = true;
}
@ -340,7 +340,7 @@ static void marker_block_handler(bContext *C, void *arg_cb, int event)
cb->marker->search_max[0] += dim[0];
cb->marker->search_max[1] += dim[1];
BKE_tracking_marker_clamp(cb->marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(cb->marker);
ok = true;
}

View File

@ -849,7 +849,7 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
}
BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(data->marker);
}
else if (data->action == SLIDE_ACTION_OFFSET) {
const float d[2] = {dx, dy};
@ -870,10 +870,8 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
copy_v2_v2(data->pos, spos);
}
/* Currently only patterns are allowed to have such
* combination of event and data.
*/
BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM);
/* Currently only patterns are allowed to have such combination of event and data. */
BKE_tracking_marker_clamp_search_size(data->marker);
}
else if (data->action == SLIDE_ACTION_TILT_SIZE) {
const float mouse_delta[2] = {dx, dy};
@ -917,7 +915,7 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
data->corners[a][1] = (vec[1] * cosf(angle) + vec[0] * sinf(angle)) / data->height;
}
BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(data->marker);
}
}
else if (data->area == TRACK_AREA_SEARCH) {
@ -928,7 +926,7 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
data->min[1] = data->old_search_min[1] + dy;
data->max[1] = data->old_search_max[1] - dy;
BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(data->marker);
}
else if (data->area == TRACK_AREA_SEARCH) {
const float d[2] = {dx, dy};
@ -936,7 +934,7 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
add_v2_v2v2(data->max, data->old_search_max, d);
}
BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_POS);
BKE_tracking_marker_clamp_search_position(data->marker);
}
data->marker->flag &= ~MARKER_TRACKED;

View File

@ -712,23 +712,23 @@ void recalcData_tracking(TransInfo *t)
if (t->mode == TFM_TRANSLATION) {
if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
BKE_tracking_marker_clamp(marker, CLAMP_PAT_POS);
BKE_tracking_marker_clamp_pattern_position(marker);
}
if (TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH)) {
BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_POS);
BKE_tracking_marker_clamp_search_position(marker);
}
}
else if (t->mode == TFM_RESIZE) {
if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(marker);
}
if (TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH)) {
BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(marker);
}
}
else if (t->mode == TFM_ROTATION) {
if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
BKE_tracking_marker_clamp(marker, CLAMP_PAT_POS);
BKE_tracking_marker_clamp_pattern_position(marker);
}
}
}

View File

@ -557,7 +557,7 @@ static void rna_tracking_markerPattern_update(Main *UNUSED(bmain),
{
MovieTrackingMarker *marker = (MovieTrackingMarker *)ptr->data;
BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(marker);
}
static void rna_tracking_markerSearch_update(Main *UNUSED(bmain),
@ -566,7 +566,7 @@ static void rna_tracking_markerSearch_update(Main *UNUSED(bmain),
{
MovieTrackingMarker *marker = (MovieTrackingMarker *)ptr->data;
BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_DIM);
BKE_tracking_marker_clamp_search_size(marker);
}
static void rna_tracking_markerPattern_boundbox_get(PointerRNA *ptr, float *values)