diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-06-26 08:45:09 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-06-26 08:45:09 +0300 |
commit | c74255181e59d21e8d580d1694bc15359bfa1e6d (patch) | |
tree | ab132f3aaa93e5fe43930b1d81ee53e2354d25ab /source/blender/editors/transform/transform_conversions.c | |
parent | 2cdcb1c1716180c00c23feb8332f17c2bab74864 (diff) |
Cleanup: transform aspect
Transform code had duplicate aspect checking,
now store aspect in TransInfo.aspect for reuse.
Diffstat (limited to 'source/blender/editors/transform/transform_conversions.c')
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 133 |
1 files changed, 64 insertions, 69 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index abaa55e3e9c..c9e7e085a96 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2727,7 +2727,6 @@ static void createTransUVs(bContext *C, TransInfo *t) BLI_bitmap *island_enabled = NULL; struct { float co[2]; int co_num; } *island_center = NULL; int count = 0, countsel = 0, count_rejected = 0; - float aspect[2]; const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0; const bool is_prop_connected = (t->flag & T_PROP_CONNECTED) != 0; const bool is_island_center = (t->around == V3D_LOCAL); @@ -2798,14 +2797,12 @@ static void createTransUVs(bContext *C, TransInfo *t) goto finally; } - ED_space_image_get_uv_aspect(sima, &aspect[0], &aspect[1]); - if (is_island_center) { int i; for (i = 0; i < elementmap->totalIslands; i++) { mul_v2_fl(island_center[i].co, 1.0f / island_center[i].co_num); - mul_v2_v2(island_center[i].co, aspect); + mul_v2_v2(island_center[i].co, t->aspect); } } @@ -2852,7 +2849,7 @@ static void createTransUVs(bContext *C, TransInfo *t) BM_elem_flag_enable(l, BM_ELEM_TAG); luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - UVsToTransData(aspect, td++, td2d++, luv->uv, center, selected); + UVsToTransData(t->aspect, td++, td2d++, luv->uv, center, selected); } } @@ -2882,22 +2879,28 @@ void flushTransUVs(TransInfo *t) { SpaceImage *sima = t->sa->spacedata.first; TransData2D *td; - int a, width, height; - float aspx, aspy, invx, invy; + int a; + float aspect_inv[2], size[2]; + const bool use_pixel_snap = ((sima->flag & SI_PIXELSNAP) && (t->state != TRANS_CANCEL)); - ED_space_image_get_uv_aspect(sima, &aspx, &aspy); - ED_space_image_get_size(sima, &width, &height); - invx = 1.0f / aspx; - invy = 1.0f / aspy; + aspect_inv[0] = 1.0f / t->aspect[0]; + aspect_inv[1] = 1.0f / t->aspect[1]; + + if (use_pixel_snap) { + int size_i[2]; + ED_space_image_get_size(sima, &size_i[0], &size_i[1]); + size[0] = size_i[0]; + size[1] = size_i[1]; + } /* flush to 2d vector from internally used 3d vector */ for (a = 0, td = t->data2d; a < t->total; a++, td++) { - td->loc2d[0] = td->loc[0] * invx; - td->loc2d[1] = td->loc[1] * invy; + td->loc2d[0] = td->loc[0] * aspect_inv[0]; + td->loc2d[1] = td->loc[1] * aspect_inv[1]; - if ((sima->flag & SI_PIXELSNAP) && (t->state != TRANS_CANCEL)) { - td->loc2d[0] = roundf(width * td->loc2d[0]) / width; - td->loc2d[1] = roundf(height * td->loc2d[1]) / height; + if (use_pixel_snap) { + td->loc2d[0] = roundf(td->loc2d[0] * size[0]) / size[0]; + td->loc2d[1] = roundf(td->loc2d[1] * size[1]) / size[1]; } } } @@ -2905,44 +2908,45 @@ void flushTransUVs(TransInfo *t) bool clipUVTransform(TransInfo *t, float vec[2], const bool resize) { TransData *td; - int a, clipx = 1, clipy = 1; - float aspx, aspy, min[2], max[2]; + int a; + bool clipx = true, clipy = true; + float min[2], max[2]; - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); min[0] = min[1] = 0.0f; - max[0] = aspx; max[1] = aspy; + max[0] = t->aspect[0]; + max[1] = t->aspect[1]; for (a = 0, td = t->data; a < t->total; a++, td++) { minmax_v2v2_v2(min, max, td->loc); } if (resize) { - if (min[0] < 0.0f && t->center[0] > 0.0f && t->center[0] < aspx * 0.5f) + if (min[0] < 0.0f && t->center[0] > 0.0f && t->center[0] < t->aspect[0] * 0.5f) vec[0] *= t->center[0] / (t->center[0] - min[0]); - else if (max[0] > aspx && t->center[0] < aspx) - vec[0] *= (t->center[0] - aspx) / (t->center[0] - max[0]); + else if (max[0] > t->aspect[0] && t->center[0] < t->aspect[0]) + vec[0] *= (t->center[0] - t->aspect[0]) / (t->center[0] - max[0]); else clipx = 0; - if (min[1] < 0.0f && t->center[1] > 0.0f && t->center[1] < aspy * 0.5f) + if (min[1] < 0.0f && t->center[1] > 0.0f && t->center[1] < t->aspect[1] * 0.5f) vec[1] *= t->center[1] / (t->center[1] - min[1]); - else if (max[1] > aspy && t->center[1] < aspy) - vec[1] *= (t->center[1] - aspy) / (t->center[1] - max[1]); + else if (max[1] > t->aspect[1] && t->center[1] < t->aspect[1]) + vec[1] *= (t->center[1] - t->aspect[1]) / (t->center[1] - max[1]); else clipy = 0; } else { if (min[0] < 0.0f) vec[0] -= min[0]; - else if (max[0] > aspx) - vec[0] -= max[0] - aspx; + else if (max[0] > t->aspect[0]) + vec[0] -= max[0] - t->aspect[0]; else clipx = 0; if (min[1] < 0.0f) vec[1] -= min[1]; - else if (max[1] > aspy) - vec[1] -= max[1] - aspy; + else if (max[1] > t->aspect[1]) + vec[1] -= max[1] - t->aspect[1]; else clipy = 0; } @@ -2954,9 +2958,6 @@ void clipUVData(TransInfo *t) { TransData *td = NULL; int a; - float aspx, aspy; - - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); for (a = 0, td = t->data; a < t->total; a++, td++) { if (td->flag & TD_NOACTION) @@ -2965,8 +2966,8 @@ void clipUVData(TransInfo *t) if ((td->flag & TD_SKIP) || (!td->loc)) continue; - td->loc[0] = min_ff(max_ff(0.0f, td->loc[0]), aspx); - td->loc[1] = min_ff(max_ff(0.0f, td->loc[1]), aspy); + td->loc[0] = min_ff(max_ff(0.0f, td->loc[0]), t->aspect[0]); + td->loc[1] = min_ff(max_ff(0.0f, td->loc[1]), t->aspect[1]); } } @@ -6577,22 +6578,22 @@ typedef struct TransDataTracking { static void markerToTransDataInit(TransData *td, TransData2D *td2d, TransDataTracking *tdt, MovieTrackingTrack *track, MovieTrackingMarker *marker, - int area, float loc[2], float rel[2], const float off[2], float aspx, float aspy) + int area, float loc[2], float rel[2], const float off[2], const float aspect[2]) { int anchor = area == TRACK_AREA_POINT && off; tdt->mode = transDataTracking_ModeTracks; if (anchor) { - td2d->loc[0] = rel[0] * aspx; /* hold original location */ - td2d->loc[1] = rel[1] * aspy; + td2d->loc[0] = rel[0] * aspect[0]; /* hold original location */ + td2d->loc[1] = rel[1] * aspect[1]; tdt->loc = loc; td2d->loc2d = loc; /* current location */ } else { - td2d->loc[0] = loc[0] * aspx; /* hold original location */ - td2d->loc[1] = loc[1] * aspy; + td2d->loc[0] = loc[0] * aspect[0]; /* hold original location */ + td2d->loc[1] = loc[1] * aspect[1]; td2d->loc2d = loc; /* current location */ } @@ -6607,8 +6608,8 @@ static void markerToTransDataInit(TransData *td, TransData2D *td2d, TransDataTra if (rel) { if (!anchor) { - td2d->loc[0] += rel[0] * aspx; - td2d->loc[1] += rel[1] * aspy; + td2d->loc[0] += rel[0] * aspect[0]; + td2d->loc[1] += rel[1] * aspect[1]; } copy_v2_v2(tdt->srelative, rel); @@ -6623,8 +6624,8 @@ static void markerToTransDataInit(TransData *td, TransData2D *td2d, TransDataTra //copy_v3_v3(td->center, td->loc); td->flag |= TD_INDIVIDUAL_SCALE; - td->center[0] = marker->pos[0] * aspx; - td->center[1] = marker->pos[1] * aspy; + td->center[0] = marker->pos[0] * aspect[0]; + td->center[1] = marker->pos[1] * aspect[1]; memset(td->axismtx, 0, sizeof(td->axismtx)); td->axismtx[2][2] = 1.0f; @@ -6639,8 +6640,9 @@ static void markerToTransDataInit(TransData *td, TransData2D *td2d, TransDataTra unit_m3(td->smtx); } -static void trackToTransData(const int framenr, TransData *td, TransData2D *td2d, - TransDataTracking *tdt, MovieTrackingTrack *track, float aspx, float aspy) +static void trackToTransData( + const int framenr, TransData *td, TransData2D *td2d, + TransDataTracking *tdt, MovieTrackingTrack *track, const float aspect[2]) { MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr); @@ -6648,11 +6650,11 @@ static void trackToTransData(const int framenr, TransData *td, TransData2D *td2d marker->flag &= ~(MARKER_DISABLED | MARKER_TRACKED); markerToTransDataInit(td++, td2d++, tdt++, track, marker, TRACK_AREA_POINT, - track->offset, marker->pos, track->offset, aspx, aspy); + track->offset, marker->pos, track->offset, aspect); if (track->flag & SELECT) { markerToTransDataInit(td++, td2d++, tdt++, track, marker, TRACK_AREA_POINT, - marker->pos, NULL, NULL, aspx, aspy); + marker->pos, NULL, NULL, aspect); } if (track->pat_flag & SELECT) { @@ -6660,28 +6662,28 @@ static void trackToTransData(const int framenr, TransData *td, TransData2D *td2d for (a = 0; a < 4; a++) { markerToTransDataInit(td++, td2d++, tdt++, track, marker, TRACK_AREA_PAT, - marker->pattern_corners[a], marker->pos, NULL, aspx, aspy); + marker->pattern_corners[a], marker->pos, NULL, aspect); } } if (track->search_flag & SELECT) { markerToTransDataInit(td++, td2d++, tdt++, track, marker, TRACK_AREA_SEARCH, - marker->search_min, marker->pos, NULL, aspx, aspy); + marker->search_min, marker->pos, NULL, aspect); markerToTransDataInit(td++, td2d++, tdt++, track, marker, TRACK_AREA_SEARCH, - marker->search_max, marker->pos, NULL, aspx, aspy); + marker->search_max, marker->pos, NULL, aspect); } } static void planeMarkerToTransDataInit(TransData *td, TransData2D *td2d, TransDataTracking *tdt, MovieTrackingPlaneTrack *plane_track, float corner[2], - float aspx, float aspy) + const float aspect[2]) { tdt->mode = transDataTracking_ModePlaneTracks; tdt->plane_track = plane_track; - td2d->loc[0] = corner[0] * aspx; /* hold original location */ - td2d->loc[1] = corner[1] * aspy; + td2d->loc[0] = corner[0] * aspect[0]; /* hold original location */ + td2d->loc[1] = corner[1] * aspect[1]; td2d->loc2d = corner; /* current location */ td2d->loc[2] = 0.0f; @@ -6706,7 +6708,7 @@ static void planeMarkerToTransDataInit(TransData *td, TransData2D *td2d, TransDa static void planeTrackToTransData(const int framenr, TransData *td, TransData2D *td2d, TransDataTracking *tdt, MovieTrackingPlaneTrack *plane_track, - float aspx, float aspy) + const float aspect[2]) { MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_ensure(plane_track, framenr); int i; @@ -6715,7 +6717,7 @@ static void planeTrackToTransData(const int framenr, TransData *td, TransData2D plane_marker->flag &= ~PLANE_MARKER_TRACKED; for (i = 0; i < 4; i++) { - planeMarkerToTransDataInit(td++, td2d++, tdt++, plane_track, plane_marker->corners[i], aspx, aspy); + planeMarkerToTransDataInit(td++, td2d++, tdt++, plane_track, plane_marker->corners[i], aspect); } } @@ -6744,7 +6746,6 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t) MovieTrackingPlaneTrack *plane_track; TransDataTracking *tdt; int framenr = ED_space_clip_get_clip_frame_number(sc); - float aspx, aspy; /* count */ t->total = 0; @@ -6779,8 +6780,6 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t) if (t->total == 0) return; - ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy); - td = t->data = MEM_callocN(t->total * sizeof(TransData), "TransTracking TransData"); td2d = t->data2d = MEM_callocN(t->total * sizeof(TransData2D), "TransTracking TransData2D"); tdt = t->customData = MEM_callocN(t->total * sizeof(TransDataTracking), "TransTracking TransDataTracking"); @@ -6791,7 +6790,7 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t) track = tracksbase->first; while (track) { if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) { - trackToTransData(framenr, td, td2d, tdt, track, aspx, aspy); + trackToTransData(framenr, td, td2d, tdt, track, t->aspect); /* offset */ td++; @@ -6825,7 +6824,7 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t) plane_track = plane_track->next) { if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { - planeTrackToTransData(framenr, td, td2d, tdt, plane_track, aspx, aspy); + planeTrackToTransData(framenr, td, td2d, tdt, plane_track, t->aspect); td += 4; td2d += 4; tdt += 4; @@ -7037,14 +7036,10 @@ static void cancelTransTracking(TransInfo *t) void flushTransTracking(TransInfo *t) { - SpaceClip *sc = t->sa->spacedata.first; TransData *td; TransData2D *td2d; TransDataTracking *tdt; int a; - float aspx, aspy; - - ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy); if (t->state == TRANS_CANCEL) cancelTransTracking(t); @@ -7058,8 +7053,8 @@ void flushTransTracking(TransInfo *t) continue; } - loc2d[0] = td2d->loc[0] / aspx; - loc2d[1] = td2d->loc[1] / aspy; + loc2d[0] = td2d->loc[0] / t->aspect[0]; + loc2d[1] = td2d->loc[1] / t->aspect[1]; if (t->flag & T_ALT_TRANSFORM) { if (t->mode == TFM_RESIZE) { @@ -7101,8 +7096,8 @@ void flushTransTracking(TransInfo *t) 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] / aspx; - td2d->loc2d[1] = td2d->loc[1] / aspy; + td2d->loc2d[0] = td2d->loc[0] / t->aspect[0]; + td2d->loc2d[1] = td2d->loc[1] / t->aspect[1]; } } } |