From c74255181e59d21e8d580d1694bc15359bfa1e6d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Jun 2015 15:45:09 +1000 Subject: Cleanup: transform aspect Transform code had duplicate aspect checking, now store aspect in TransInfo.aspect for reuse. --- source/blender/editors/transform/transform.c | 139 ++++++++------------- source/blender/editors/transform/transform.h | 3 + .../editors/transform/transform_constraints.c | 14 +-- .../editors/transform/transform_conversions.c | 133 ++++++++++---------- .../blender/editors/transform/transform_generics.c | 24 +--- source/blender/editors/transform/transform_snap.c | 58 ++++----- 6 files changed, 153 insertions(+), 218 deletions(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index cba620c6264..1c8c21cadd1 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -239,6 +239,38 @@ void setTransformViewMatrices(TransInfo *t) calculateCenter2D(t); } +void setTransformViewAspect(TransInfo *t, float r_aspect[3]) +{ + copy_v3_fl(r_aspect, 1.0f); + + if (t->spacetype == SPACE_IMAGE) { + SpaceImage *sima = t->sa->spacedata.first; + + if (t->options & CTX_MASK) { + ED_space_image_get_aspect(sima, &r_aspect[0], &r_aspect[1]); + } + else if (t->options & CTX_PAINT_CURVE) { + /* pass */ + } + else { + ED_space_image_get_uv_aspect(sima, &r_aspect[0], &r_aspect[1]); + } + } + else if (t->spacetype == SPACE_CLIP) { + SpaceClip *sclip = t->sa->spacedata.first; + + if (t->options & CTX_MOVIECLIP) { + ED_space_clip_get_aspect_dimension_aware(sclip, &r_aspect[0], &r_aspect[1]); + } + else { + ED_space_clip_get_aspect(sclip, &r_aspect[0], &r_aspect[1]); + } + } + else if (t->spacetype == SPACE_IPO) { + /* depemds on context of usage */ + } +} + static void convertViewVec2D(View2D *v2d, float r_vec[3], int dx, int dy) { float divx, divy; @@ -292,25 +324,19 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy) } } else if (t->spacetype == SPACE_IMAGE) { - float aspx, aspy; - if (t->options & CTX_MASK) { convertViewVec2D_mask(t->view, r_vec, dx, dy); - ED_space_image_get_aspect(t->sa->spacedata.first, &aspx, &aspy); } else if (t->options & CTX_PAINT_CURVE) { r_vec[0] = dx; r_vec[1] = dy; - - aspx = aspy = 1.0; } else { convertViewVec2D(t->view, r_vec, dx, dy); - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); } - r_vec[0] *= aspx; - r_vec[1] *= aspy; + r_vec[0] *= t->aspect[0]; + r_vec[1] *= t->aspect[1]; } else if (ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) { convertViewVec2D(t->view, r_vec, dx, dy); @@ -319,8 +345,6 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy) convertViewVec2D(&t->ar->v2d, r_vec, dx, dy); } else if (t->spacetype == SPACE_CLIP) { - float aspx, aspy; - if (t->options & CTX_MASK) { convertViewVec2D_mask(t->view, r_vec, dx, dy); } @@ -328,21 +352,8 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy) convertViewVec2D(t->view, r_vec, dx, dy); } - if (t->options & CTX_MOVIECLIP) { - ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy); - } - else if (t->options & CTX_MASK) { - /* TODO - NOT WORKING, this isnt so bad since its only display aspect */ - ED_space_clip_get_aspect(t->sa->spacedata.first, &aspx, &aspy); - } - else { - /* should never happen, quiet warnings */ - BLI_assert(0); - aspx = aspy = 1.0f; - } - - r_vec[0] *= aspx; - r_vec[1] *= aspy; + r_vec[0] *= t->aspect[0]; + r_vec[1] *= t->aspect[1]; } else { printf("%s: called in an invalid context\n", __func__); @@ -364,15 +375,10 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr SpaceImage *sima = t->sa->spacedata.first; if (t->options & CTX_MASK) { - float aspx, aspy; float v[2]; - ED_space_image_get_aspect(sima, &aspx, &aspy); - - copy_v2_v2(v, vec); - - v[0] = v[0] / aspx; - v[1] = v[1] / aspy; + v[0] = vec[0] / t->aspect[0]; + v[1] = vec[1] / t->aspect[1]; BKE_mask_coord_to_image(sima->image, &sima->iuser, v, v); @@ -386,11 +392,10 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr adr[1] = vec[1]; } else { - float aspx, aspy, v[2]; + float v[2]; - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); - v[0] = vec[0] / aspx; - v[1] = vec[1] / aspy; + v[0] = vec[0] / t->aspect[0]; + v[1] = vec[1] / t->aspect[1]; UI_view2d_view_to_region(t->view, v[0], v[1], &adr[0], &adr[1]); } @@ -435,15 +440,10 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr MovieClip *clip = ED_space_clip_get_clip(sc); if (clip) { - float aspx, aspy; float v[2]; - ED_space_clip_get_aspect(sc, &aspx, &aspy); - - copy_v2_v2(v, vec); - - v[0] = v[0] / aspx; - v[1] = v[1] / aspy; + v[0] = vec[0] / t->aspect[0]; + v[1] = vec[1] / t->aspect[1]; BKE_mask_coord_to_movieclip(sc->clip, &sc->user, v, v); @@ -458,13 +458,10 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr } } else if (t->options & CTX_MOVIECLIP) { - float v[2], aspx, aspy; - - copy_v2_v2(v, vec); - ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy); + float v[2]; - v[0] /= aspx; - v[1] /= aspy; + v[0] = vec[0] / t->aspect[0]; + v[1] = vec[1] / t->aspect[1]; UI_view2d_view_to_region(t->view, v[0], v[1], &adr[0], &adr[1]); } @@ -520,7 +517,6 @@ void applyAspectRatio(TransInfo *t, float vec[2]) { if ((t->spacetype == SPACE_IMAGE) && (t->mode == TFM_TRANSLATION) && !(t->options & CTX_PAINT_CURVE)) { SpaceImage *sima = t->sa->spacedata.first; - float aspx, aspy; if ((sima->flag & SI_COORDFLOATS) == 0) { int width, height; @@ -530,28 +526,13 @@ void applyAspectRatio(TransInfo *t, float vec[2]) vec[1] *= height; } - ED_space_image_get_uv_aspect(sima, &aspx, &aspy); - vec[0] /= aspx; - vec[1] /= aspy; + vec[0] /= t->aspect[0]; + vec[1] /= t->aspect[1]; } else if ((t->spacetype == SPACE_CLIP) && (t->mode == TFM_TRANSLATION)) { if (t->options & (CTX_MOVIECLIP | CTX_MASK)) { - SpaceClip *sc = t->sa->spacedata.first; - float aspx, aspy; - - - if (t->options & CTX_MOVIECLIP) { - ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy); - - vec[0] /= aspx; - vec[1] /= aspy; - } - else if (t->options & CTX_MASK) { - ED_space_clip_get_aspect(sc, &aspx, &aspy); - - vec[0] /= aspx; - vec[1] /= aspy; - } + vec[0] /= t->aspect[0]; + vec[1] /= t->aspect[1]; } } } @@ -560,7 +541,6 @@ void removeAspectRatio(TransInfo *t, float vec[2]) { if ((t->spacetype == SPACE_IMAGE) && (t->mode == TFM_TRANSLATION)) { SpaceImage *sima = t->sa->spacedata.first; - float aspx, aspy; if ((sima->flag & SI_COORDFLOATS) == 0) { int width, height; @@ -570,24 +550,13 @@ void removeAspectRatio(TransInfo *t, float vec[2]) vec[1] /= height; } - ED_space_image_get_uv_aspect(sima, &aspx, &aspy); - vec[0] *= aspx; - vec[1] *= aspy; + vec[0] *= t->aspect[0]; + vec[1] *= t->aspect[1]; } else if ((t->spacetype == SPACE_CLIP) && (t->mode == TFM_TRANSLATION)) { if (t->options & (CTX_MOVIECLIP | CTX_MASK)) { - SpaceClip *sc = t->sa->spacedata.first; - float aspx = 1.0f, aspy = 1.0f; - - if (t->options & CTX_MOVIECLIP) { - ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy); - } - else if (t->options & CTX_MASK) { - ED_space_clip_get_aspect(sc, &aspx, &aspy); - } - - vec[0] *= aspx; - vec[1] *= aspy; + vec[0] *= t->aspect[0]; + vec[1] *= t->aspect[1]; } } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 418fb8e1961..af82f416db8 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -357,6 +357,8 @@ typedef struct TransInfo { eRedrawFlag redraw; /* redraw flag */ float prop_size; /* proportional circle radius */ char proptext[20]; /* proportional falloff text */ + float aspect[3]; /* spaces using non 1:1 aspect, (uv's, f-curve, movie-clip... etc) + * use for conversion and snapping. */ float center[3]; /* center of transformation */ float center2d[2]; /* center in screen coordinates */ int imval[2]; /* initial mouse position */ @@ -542,6 +544,7 @@ void transformApply(struct bContext *C, TransInfo *t); int transformEnd(struct bContext *C, TransInfo *t); void setTransformViewMatrices(TransInfo *t); +void setTransformViewAspect(TransInfo *t, float r_aspect[3]); void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy); void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DProjTest flag); void projectIntView(TransInfo *t, const float vec[3], int adr[2]); diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 03d626fe179..50c255bc9db 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -751,19 +751,7 @@ void drawPropCircle(const struct bContext *C, TransInfo *t) mul_m4_v3(t->obedit->obmat, center); /* because t->center is in local space */ } else if (t->spacetype == SPACE_IMAGE) { - float aspx, aspy; - - if (t->options & CTX_MASK) { - /* untested - mask aspect is TODO */ - ED_space_image_get_aspect(t->sa->spacedata.first, &aspx, &aspy); - } - else if (t->options & CTX_PAINT_CURVE) { - aspx = aspy = 1.0f; - } - else { - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); - } - glScalef(1.0f / aspx, 1.0f / aspy, 1.0f); + glScalef(1.0f / t->aspect[0], 1.0f / t->aspect[1], 1.0f); } else if (ELEM(t->spacetype, SPACE_IPO, SPACE_ACTION)) { /* only scale y */ 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]; } } } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 637b6c7c248..f958e520c0d 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1401,6 +1401,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve #endif setTransformViewMatrices(t); + setTransformViewAspect(t, t->aspect); initNumInput(&t->num); } @@ -1595,30 +1596,17 @@ void calculateCenterCursor(TransInfo *t, float r_center[3]) void calculateCenterCursor2D(TransInfo *t, float r_center[2]) { - float aspx = 1.0, aspy = 1.0; const float *cursor = NULL; if (t->spacetype == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)t->sa->spacedata.first; - if (t->options & CTX_MASK) { - ED_space_image_get_aspect(sima, &aspx, &aspy); - } - else { - ED_space_image_get_uv_aspect(sima, &aspx, &aspy); - } cursor = sima->cursor; } else if (t->spacetype == SPACE_CLIP) { SpaceClip *space_clip = (SpaceClip *) t->sa->spacedata.first; - if (t->options & CTX_MOVIECLIP) { - ED_space_clip_get_aspect_dimension_aware(space_clip, &aspx, &aspy); - } - else { - ED_space_clip_get_aspect(space_clip, &aspx, &aspy); - } cursor = space_clip->cursor; } - + if (cursor) { if (t->options & CTX_MASK) { float co[2]; @@ -1635,8 +1623,8 @@ void calculateCenterCursor2D(TransInfo *t, float r_center[2]) BLI_assert(!"Shall not happen"); } - r_center[0] = co[0] * aspx; - r_center[1] = co[1] * aspy; + r_center[0] = co[0] * t->aspect[0]; + r_center[1] = co[1] * t->aspect[1]; } else if (t->options & CTX_PAINT_CURVE) { if (t->spacetype == SPACE_IMAGE) { @@ -1645,8 +1633,8 @@ void calculateCenterCursor2D(TransInfo *t, float r_center[2]) } } else { - r_center[0] = cursor[0] * aspx; - r_center[1] = cursor[1] * aspy; + r_center[0] = cursor[0] * t->aspect[0]; + r_center[1] = cursor[1] * t->aspect[1]; } } } diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index d9cc9588d49..db6620b0d46 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -1045,14 +1045,13 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec)) else if (t->spacetype == SPACE_IMAGE && t->obedit != NULL && t->obedit->type == OB_MESH) { /* same as above but for UV's */ Image *ima = ED_space_image(t->sa->spacedata.first); - float aspx, aspy, co[2]; + float co[2]; UI_view2d_region_to_view(&t->ar->v2d, t->mval[0], t->mval[1], &co[0], &co[1]); if (ED_uvedit_nearest_uv(t->scene, t->obedit, ima, co, t->tsnap.snapPoint)) { - ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); - t->tsnap.snapPoint[0] *= aspx; - t->tsnap.snapPoint[1] *= aspy; + t->tsnap.snapPoint[0] *= t->aspect[0]; + t->tsnap.snapPoint[1] *= t->aspect[1]; t->tsnap.status |= POINT_INIT; } @@ -2449,42 +2448,35 @@ void snapSequenceBounds(TransInfo *t, const int mval[2]) static void applyGridIncrement(TransInfo *t, float *val, int max_index, const float fac[3], GearsType action) { + float asp_local[3] = {1, 1, 1}; + const bool use_aspect = ELEM(t->mode, TFM_TRANSLATION); + const float *asp = use_aspect ? t->aspect : asp_local; int i; - float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3) - if (max_index > 2) { - printf("applyGridIncrement: invalid index %d, clamping\n", max_index); - max_index = 2; - } + BLI_assert(max_index <= 2); - // Early bailing out if no need to snap - if (fac[action] == 0.0f) + /* Early bailing out if no need to snap */ + if (fac[action] == 0.0f) { return; - - /* evil hack - snapping needs to be adapted for image aspect ratio */ - if ((t->spacetype == SPACE_IMAGE) && (t->mode == TFM_TRANSLATION)) { - if (t->options & CTX_MASK) { - ED_space_image_get_aspect(t->sa->spacedata.first, asp, asp + 1); - } - else if (t->options & CTX_PAINT_CURVE) { - asp[0] = asp[1] = 1.0; - } - else { - ED_space_image_get_uv_aspect(t->sa->spacedata.first, asp, asp + 1); - } } - else if ((t->spacetype == SPACE_IPO) && (t->mode == TFM_TRANSLATION)) { - View2D *v2d = &t->ar->v2d; - View2DGrid *grid; - SpaceIpo *sipo = t->sa->spacedata.first; - int unity = V2D_UNIT_VALUES; - int unitx = (sipo->flag & SIPO_DRAWTIME) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMESCALE; - /* grid */ - grid = UI_view2d_grid_calc(t->scene, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, t->ar->winx, t->ar->winy); + if (use_aspect) { + /* custom aspect for fcurve */ + if (t->spacetype == SPACE_IPO) { + View2D *v2d = &t->ar->v2d; + View2DGrid *grid; + SpaceIpo *sipo = t->sa->spacedata.first; + int unity = V2D_UNIT_VALUES; + int unitx = (sipo->flag & SIPO_DRAWTIME) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMESCALE; + + /* grid */ + grid = UI_view2d_grid_calc(t->scene, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, t->ar->winx, t->ar->winy); - UI_view2d_grid_size(grid, &asp[0], &asp[1]); - UI_view2d_grid_free(grid); + UI_view2d_grid_size(grid, &asp_local[0], &asp_local[1]); + UI_view2d_grid_free(grid); + + asp = asp_local; + } } for (i = 0; i <= max_index; i++) { -- cgit v1.2.3