forked from bartvdbraak/blender
Support transformation around 2D cursor in movie clip editor.
This commit is contained in:
parent
113997a03c
commit
7e73620a98
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user