From 7e73620a980c81ce87f6f5b1621639a31281c9b5 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 29 Aug 2013 13:04:12 +0000 Subject: Support transformation around 2D cursor in movie clip editor. --- source/blender/editors/space_clip/clip_ops.c | 2 +- source/blender/editors/space_clip/space_clip.c | 37 +++++++++++----------- .../blender/editors/transform/transform_generics.c | 33 +++++++++++++++---- source/blender/makesrna/intern/rna_space.c | 1 + 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index bed230a342c..dca8f985f45 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -1493,7 +1493,7 @@ void CLIP_OT_cursor_set(wmOperatorType *ot) /* api callbacks */ ot->exec = clip_set_2d_cursor_exec; ot->invoke = clip_set_2d_cursor_invoke; - ot->poll = ED_space_clip_maskedit_mask_poll; + ot->poll = ED_space_clip_poll; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index a9bbd348135..feb35f869d6 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -1121,6 +1121,8 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar) /* draw entirely, view changes should be handled here */ SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip_get_clip(sc); + float aspx, aspy, zoomx, zoomy, x, y; + int width, height; /* if tracking is in progress, we should synchronize framenr from clipuser * so latest tracked frame would be shown */ @@ -1152,36 +1154,35 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar) clip_draw_main(C, sc, ar); - if (sc->mode == SC_MODE_MASKEDIT) { + /* TODO(sergey): would be nice to find a way to de-duplicate all this space conversions */ + UI_view2d_to_region_float(&ar->v2d, 0.0f, 0.0f, &x, &y); + ED_space_clip_get_size(sc, &width, &height); + ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy); + ED_space_clip_get_aspect(sc, &aspx, &aspy); + if (sc->mode == SC_MODE_MASKEDIT) { Mask *mask = CTX_data_edit_mask(C); if (mask) { ScrArea *sa = CTX_wm_area(C); - int width, height; - float aspx, aspy, zoomx, zoomy, x, y; - ED_mask_get_size(sa, &width, &height); - ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy); - ED_space_clip_get_aspect(sc, &aspx, &aspy); + int mask_width, mask_height; + ED_mask_get_size(sa, &mask_width, &mask_height); ED_mask_draw_region(mask, ar, sc->mask_info.draw_flag, sc->mask_info.draw_type, - width, height, + mask_width, mask_height, aspx, aspy, TRUE, TRUE, sc->stabmat, C); - - /* TODO(sergey): would be nice to find a way to de-duplicate all this space conversions */ - UI_view2d_to_region_float(&ar->v2d, 0.0f, 0.0f, &x, &y); - - glPushMatrix(); - glTranslatef(x, y, 0); - glScalef(zoomx, zoomy, 0); - glMultMatrixf(sc->stabmat); - glScalef(width, height, 0); - draw_image_cursor(ar, sc->cursor); - glPopMatrix(); } } + glPushMatrix(); + glTranslatef(x, y, 0); + glScalef(zoomx, zoomy, 0); + glMultMatrixf(sc->stabmat); + glScalef(width, height, 0); + draw_image_cursor(ar, sc->cursor); + glPopMatrix(); + if (sc->flag & SC_SHOW_GPENCIL) { /* Grease Pencil */ clip_draw_grease_pencil((bContext *)C, TRUE); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 99aff4530ab..359f6425126 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1523,7 +1523,6 @@ void calculateCenterCursor2D(TransInfo *t) if (t->spacetype == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)t->sa->spacedata.first; - /* only space supported right now but may change */ if (t->options & CTX_MASK) { ED_space_image_get_aspect(sima, &aspx, &aspy); } @@ -1532,17 +1531,37 @@ void calculateCenterCursor2D(TransInfo *t) } 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]; float frame_size[2]; - SpaceImage *sima = (SpaceImage *)t->sa->spacedata.first; - ED_space_image_get_size_fl(sima, frame_size); - - BKE_mask_coord_from_frame(co, cursor, frame_size); - ED_space_image_get_aspect(sima, &aspx, &aspy); + if (t->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)t->sa->spacedata.first; + ED_space_image_get_size_fl(sima, frame_size); + BKE_mask_coord_from_frame(co, cursor, frame_size); + ED_space_image_get_aspect(sima, &aspx, &aspy); + } + else if (t->spacetype == SPACE_CLIP) { + SpaceClip *space_clip = (SpaceClip *) t->sa->spacedata.first; + ED_space_clip_get_size_fl(space_clip, frame_size); + BKE_mask_coord_from_frame(co, cursor, frame_size); + ED_space_clip_get_aspect(space_clip, &aspx, &aspy); + } + else { + BLI_assert(!"Shall not happen"); + } t->center[0] = co[0] * aspx; t->center[1] = co[1] * aspy; @@ -1621,7 +1640,7 @@ void calculateCenter(TransInfo *t) calculateCenterMedian(t); break; case V3D_CURSOR: - if (t->spacetype == SPACE_IMAGE) + if (ELEM(t->spacetype, SPACE_IMAGE, SPACE_CLIP)) calculateCenterCursor2D(t); else if (t->spacetype == SPACE_IPO) calculateCenterCursorGraph2D(t); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 7b72a29e3bf..29e20c1025e 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -3534,6 +3534,7 @@ static void rna_def_space_clip(BlenderRNA *brna) static EnumPropertyItem pivot_items[] = { {V3D_CENTER, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", "Pivot around bounding box center of selected object(s)"}, + {V3D_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", "Pivot around the 2D cursor"}, {V3D_LOCAL, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, "Individual Origins", "Pivot around each object's own origin"}, {V3D_CENTROID, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point", -- cgit v1.2.3