Merging r48110 through r48114 from trunk into soc-2011-tomato
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 20 Jun 2012 12:06:48 +0000 (12:06 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 20 Jun 2012 12:06:48 +0000 (12:06 +0000)
20 files changed:
source/blender/blenkernel/BKE_movieclip.h
source/blender/blenkernel/intern/mask.c
source/blender/blenkernel/intern/movieclip.c
source/blender/editors/gpencil/gpencil_paint.c
source/blender/editors/include/ED_clip.h
source/blender/editors/mask/mask_edit.c
source/blender/editors/mask/mask_relationships.c
source/blender/editors/mask/mask_select.c
source/blender/editors/space_clip/clip_draw.c
source/blender/editors/space_clip/clip_editor.c
source/blender/editors/space_clip/clip_intern.h
source/blender/editors/space_clip/clip_ops.c
source/blender/editors/space_clip/clip_utils.c
source/blender/editors/space_clip/space_clip.c
source/blender/editors/space_clip/tracking_ops.c
source/blender/editors/space_clip/tracking_select.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/makesrna/intern/rna_mask.c

index 221ae99a0ec57490925bff111281b3087d983ed2..739b63ca174a13536bc5206c1fef826374e07e4d 100644 (file)
@@ -63,8 +63,8 @@ void BKE_movieclip_get_cache_segments(struct MovieClip *clip, struct MovieClipUs
 void BKE_movieclip_build_proxy_frame(struct MovieClip *clip, int clip_flag, struct MovieDistortion *distortion,
                                      int cfra, int *build_sizes, int build_count, int undistorted);
 
-int BKE_movieclip_remap_scene_to_clip_frame(struct MovieClip *clip, int framenr);
-int BKE_movieclip_remap_clip_to_scene_frame(struct MovieClip *clip, int framenr);
+float BKE_movieclip_remap_scene_to_clip_frame(struct MovieClip *clip, float framenr);
+float BKE_movieclip_remap_clip_to_scene_frame(struct MovieClip *clip, float framenr);
 
 /* cacheing flags */
 #define MOVIECLIP_CACHE_SKIP        (1 << 0)
index 48db916b4ba34c938f13a94f5ee2997b76364fdb..c80a240f7e3ff0de6db2df81e6e314ac532c36a2 100644 (file)
@@ -1160,12 +1160,13 @@ static int BKE_mask_evaluate_parent(MaskParent *parent, float ctime, float r_co[
 
                        if (ob) {
                                MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, ob, parent->sub_parent);
+                               float clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, ctime);
 
                                MovieClipUser user = {0};
                                user.framenr = ctime;
 
                                if (track) {
-                                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, ctime);
+                                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_framenr);
                                        float marker_pos_ofs[2];
                                        add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
                                        BKE_mask_coord_from_movieclip(clip, &user, r_co, marker_pos_ofs);
index 04edc58157b046a28e8eaa280b72ef1f2d077da9..44169cd3d6a990e3772725e1e63a14e039ba731b 100644 (file)
@@ -1270,12 +1270,12 @@ void BKE_movieclip_unlink(Main *bmain, MovieClip *clip)
        clip->id.us = 0;
 }
 
-int BKE_movieclip_remap_scene_to_clip_frame(MovieClip *clip, int framenr)
+float BKE_movieclip_remap_scene_to_clip_frame(MovieClip *clip, float framenr)
 {
-       return framenr - clip->start_frame + 1;
+       return framenr - (float) clip->start_frame + 1.0f;
 }
 
-int BKE_movieclip_remap_clip_to_scene_frame(MovieClip *clip, int framenr)
+float BKE_movieclip_remap_clip_to_scene_frame(MovieClip *clip, float framenr)
 {
-       return framenr + clip->start_frame - 1;
+       return framenr + (float) clip->start_frame - 1.0f;
 }
index 6d90824668e4fc41e35b2f7a57a6cb88ca928564..12b002ef612c1319264f85c8ad4f0dead0ca475b 100644 (file)
@@ -56,6 +56,7 @@
 #include "ED_gpencil.h"
 #include "ED_screen.h"
 #include "ED_view3d.h"
+#include "ED_clip.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -1032,8 +1033,9 @@ static int gp_session_initdata(bContext *C, tGPsdata *p)
                        p->custom_color[3] = 0.9f;
                        
                        if (sc->gpencil_src == SC_GPENCIL_SRC_TRACK) {
-                               int framenr = sc->user.framenr;
-                               MovieTrackingTrack *track = BKE_tracking_track_get_active(&sc->clip->tracking);
+                               MovieClip *clip = ED_space_clip_get_clip(sc);
+                               int framenr = ED_space_clip_get_clip_frame_number(sc);
+                               MovieTrackingTrack *track = BKE_tracking_track_get_active(&clip->tracking);
                                MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
                                
                                p->imat[3][0] -= marker->pos[0];
index 3a9d73ccf10aa3d9fba1d189af330aba41677a98..2670fb5b04203fa51f089998ec885030ecb2f78e 100644 (file)
@@ -42,6 +42,8 @@ struct SpaceClip;
 struct wmEvent;
 
 /*  ** clip_editor.c ** */
+
+/* common poll functions */
 int ED_space_clip_poll(struct bContext *C);
 
 int ED_space_clip_view_clip_poll(struct bContext *C);
@@ -50,14 +52,10 @@ int ED_space_clip_tracking_poll(struct bContext *C);
 int ED_space_clip_maskedit_poll(struct bContext *C);
 int ED_space_clip_maskedit_mask_poll(bContext *C);
 
-struct MovieClip *ED_space_clip_get_clip(struct SpaceClip *sc);
-void ED_space_clip_set_clip(struct bContext *C, struct bScreen *screen, struct SpaceClip *sc, struct MovieClip *clip);
-
-void ED_space_clip_get_zoom(struct SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy);
-
-void ED_space_clip_get_clip_size(struct SpaceClip *sc, int *width, int *height);
-void ED_space_clip_get_clip_aspect(struct SpaceClip *sc, float *aspx, float *aspy);
-void ED_space_clip_get_clip_aspect_dimension_aware(struct SpaceClip *sc, float *aspx, float *aspy);
+void ED_space_clip_get_size(const struct bContext *C, int *width, int *height);
+void ED_space_clip_get_zoom(const struct bContext *C, float *zoomx, float *zoomy);
+void ED_space_clip_get_aspect(struct SpaceClip *sc, float *aspx, float *aspy);
+void ED_space_clip_get_aspect_dimension_aware(struct SpaceClip *sc, float *aspx, float *aspy);
 
 int ED_space_clip_get_clip_frame_number(struct SpaceClip *sc);
 
@@ -65,18 +63,18 @@ struct ImBuf *ED_space_clip_get_buffer(struct SpaceClip *sc);
 struct ImBuf *ED_space_clip_get_stable_buffer(struct SpaceClip *sc, float loc[2], float *scale, float *angle);
 
 void ED_clip_update_frame(const struct Main *mainp, int cfra);
-int ED_clip_view_selection(struct SpaceClip *sc, struct ARegion *ar, int fit);
+int ED_clip_view_selection(const struct bContext *C, struct ARegion *ar, int fit);
 
 void ED_clip_point_undistorted_pos(SpaceClip *sc, const float co[2], float r_co[2]);
 void ED_clip_point_stable_pos(const struct bContext *C, float x, float y, float *xr, float *yr);
-void ED_clip_point_stable_pos__reverse(SpaceClip *sc, ARegion *ar, const float co[2], float r_co[2]);
+void ED_clip_point_stable_pos__reverse(const struct bContext *C, const float co[2], float r_co[2]);
 void ED_clip_mouse_pos(const struct bContext *C, struct wmEvent *event, float co[2]);
 
 int ED_space_clip_check_show_trackedit(struct SpaceClip *sc);
 int ED_space_clip_check_show_maskedit(struct SpaceClip *sc);
 
-void ED_space_clip_get_mask_size(struct SpaceClip *sc, int *width, int *height);
-void ED_space_clip_get_mask_aspect(struct SpaceClip *sc, float *aspx, float *aspy);
+struct MovieClip *ED_space_clip_get_clip(struct SpaceClip *sc);
+void ED_space_clip_set_clip(struct bContext *C, struct bScreen *screen, struct SpaceClip *sc, struct MovieClip *clip);
 
 struct Mask *ED_space_clip_get_mask(struct SpaceClip *sc);
 void ED_space_clip_set_mask(struct bContext *C, struct SpaceClip *sc, struct Mask *mask);
index fdf720434646e2aca8d9317a5599819e74a797c1..76fc7126cf2d4d553f97372bef6202750c35696d 100644 (file)
@@ -121,7 +121,7 @@ void ED_mask_point_pos__reverse(const bContext *C, float x, float y, float *xr,
                co[0] = x;
                co[1] = y;
                BKE_mask_coord_to_movieclip(sc->clip, &sc->user, co, co);
-               ED_clip_point_stable_pos__reverse(sc, ar, co, co);
+               ED_clip_point_stable_pos__reverse(C, co, co);
        }
        else {
                /* possible other spaces from which mask editing is available */
@@ -137,8 +137,7 @@ void ED_mask_size(const bContext *C, int *width, int *height)
        ScrArea *sa = CTX_wm_area(C);
        if (sa && sa->spacedata.first) {
                if (sa->spacetype == SPACE_CLIP) {
-                       SpaceClip *sc = sa->spacedata.first;
-                       ED_space_clip_get_mask_size(sc, width, height);
+                       ED_space_clip_get_size(C, width, height);
                        return;
                }
                else if (sa->spacetype == SPACE_SEQ) {
@@ -159,7 +158,7 @@ void ED_mask_aspect(const bContext *C, float *aspx, float *aspy)
        SpaceClip *sc = CTX_wm_space_clip(C);
 
        if (sc) {
-               ED_space_clip_get_mask_aspect(sc, aspx, aspy);
+               ED_space_clip_get_aspect(sc, aspx, aspy);
        }
        else {
                /* possible other spaces from which mask editing is available */
@@ -173,13 +172,12 @@ void ED_mask_pixelspace_factor(const bContext *C, float *scalex, float *scaley)
        SpaceClip *sc = CTX_wm_space_clip(C);
 
        if (sc) {
-               ARegion *ar = CTX_wm_region(C);
                int width, height;
                float zoomx, zoomy, aspx, aspy;
 
-               ED_space_clip_get_clip_size(sc, &width, &height);
-               ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
-               ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
+               ED_space_clip_get_size(C, &width, &height);
+               ED_space_clip_get_zoom(C, &zoomx, &zoomy);
+               ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
                *scalex = ((float)width * aspx) * zoomx;
                *scaley = ((float)height * aspy) * zoomy;
index 7ba3c27e18df68d76df7755bace197fd2b2976c7..a1f2539ce7c02718c6de776dac0c4a5bb19d8fce 100644 (file)
@@ -44,6 +44,7 @@
 #include "WM_types.h"
 
 #include "ED_screen.h"
+#include "ED_clip.h"  /* frame remapping functions */
 #include "ED_mask.h"  /* own include */
 
 #include "mask_intern.h"  /* own include */
@@ -104,21 +105,25 @@ static int mask_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
        MovieClip *clip;
        MovieTrackingTrack *track;
        MovieTrackingMarker *marker;
-       MovieTrackingObject *tracking;
+       MovieTrackingObject *tracking_object;
        /* done */
 
+       int framenr;
+
        float marker_pos_ofs[2];
        float parmask_pos[2];
 
        if ((NULL == (sc = CTX_wm_space_clip(C))) ||
            (NULL == (clip = sc->clip)) ||
            (NULL == (track = clip->tracking.act_track)) ||
-           (NULL == (marker = BKE_tracking_marker_get(track, sc->user.framenr))) ||
-           (NULL == (tracking = BKE_tracking_object_get_active(&clip->tracking))))
+           (NULL == (tracking_object = BKE_tracking_object_get_active(&clip->tracking))))
        {
                return OPERATOR_CANCELLED;
        }
 
+       framenr = ED_space_clip_get_clip_frame_number(sc);
+       marker = BKE_tracking_marker_get(track, framenr);
+
        add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
 
        BKE_mask_coord_from_movieclip(clip, &sc->user, parmask_pos, marker_pos_ofs);
@@ -138,7 +143,7 @@ static int mask_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
                                if (MASKPOINT_ISSEL_ANY(point)) {
                                        point->parent.id_type = ID_MC;
                                        point->parent.id = &clip->id;
-                                       strcpy(point->parent.parent, tracking->name);
+                                       strcpy(point->parent.parent, tracking_object->name);
                                        strcpy(point->parent.sub_parent, track->name);
 
                                        copy_v2_v2(point->parent.parent_orig, parmask_pos);
index e34823278cb1e7d653af9a5a96fee341d466eed3..e619277456e3966a517005d7bc20dacf529ee840 100644 (file)
@@ -581,8 +581,6 @@ static int circle_select_exec(bContext *C, wmOperator *op)
        MaskLayer *masklay;
        int i;
 
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
        int x, y, radius, width, height, mode, change = FALSE;
        float zoomx, zoomy, offset[2], ellipse[2];
 
@@ -595,8 +593,8 @@ static int circle_select_exec(bContext *C, wmOperator *op)
 
        /* TODO - make generic! - this is SpaceClip only! */
        /* compute ellipse and position in unified coordinates */
-       ED_space_clip_get_clip_size(sc, &width, &height);
-       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
        width = height = MAX2(width, height);
 
        ellipse[0] = width * zoomx / radius;
index 9b9e2223ae6265cf6649570b71577ca2e0f6cc79..37da40e11b392d6900ca8d45449e06aef5245092 100644 (file)
@@ -1318,7 +1318,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip,
                MovieTrackingTrack *track = BKE_tracking_track_get_active(&sc->clip->tracking);
 
                if (track) {
-                       int framenr = sc->user.framenr;
+                       int framenr = ED_space_clip_get_clip_frame_number(sc);
                        MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
 
                        offsx = marker->pos[0];
@@ -1408,19 +1408,23 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip,
        glPopMatrix();
 }
 
-void clip_draw_main(SpaceClip *sc, ARegion *ar, Scene *scene)
+void clip_draw_main(const bContext *C, ARegion *ar)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
+       Scene *scene = CTX_data_scene(C);
        ImBuf *ibuf;
        int width, height;
        float zoomx, zoomy;
 
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
+
        /* if no clip, nothing to do */
-       if (!clip)
+       if (!clip) {
+               ED_region_grid_draw(ar, zoomx, zoomy);
                return;
-
-       ED_space_clip_get_clip_size(sc, &width, &height);
-       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
+       }
 
        if (sc->flag & SC_SHOW_STABLE) {
                float smat[4][4], ismat[4][4];
@@ -1492,12 +1496,10 @@ void clip_draw_grease_pencil(bContext *C, int onlyv2d)
                                MovieTrackingTrack *track = BKE_tracking_track_get_active(&sc->clip->tracking);
 
                                if (track) {
-                                       int framenr = sc->user.framenr;
-                                       /* don't get the exact marker since it may not exist for the frame */
+                                       int framenr = ED_space_clip_get_clip_frame_number(sc);
                                        MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
-                                       if (marker) {
-                                               glTranslatef(marker->pos[0], marker->pos[1], 0.0f);
-                                       }
+
+                                       glTranslatef(marker->pos[0], marker->pos[1], 0.0f);
                                }
                        }
 
index 4dd2f82df02e37c219d4fc627d6805eaef41ae6f..b57b16707d42b7c76e061239e1341b7a0de64990 100644 (file)
@@ -122,90 +122,12 @@ int ED_space_clip_maskedit_mask_poll(bContext *C)
        return FALSE;
 }
 
-/* ******** editing functions ******** */
+/* ******** common editing functions ******** */
 
-void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip)
+void ED_space_clip_get_size(const bContext *C, int *width, int *height)
 {
-       MovieClip *old_clip;
-
-       if (!screen && C)
-               screen = CTX_wm_screen(C);
-
-       old_clip = sc->clip;
-       sc->clip = clip;
-
-       if (sc->clip && sc->clip->id.us == 0)
-               sc->clip->id.us = 1;
-
-       if (screen && sc->view == SC_VIEW_CLIP) {
-               ScrArea *area;
-               SpaceLink *sl;
-
-               for (area = screen->areabase.first; area; area = area->next) {
-                       for (sl = area->spacedata.first; sl; sl = sl->next) {
-                               if (sl->spacetype == SPACE_CLIP) {
-                                       SpaceClip *cur_sc = (SpaceClip *) sl;
-
-                                       if (cur_sc != sc && cur_sc->view != SC_VIEW_CLIP) {
-                                               if (cur_sc->clip == old_clip || cur_sc->clip == NULL) {
-                                                       cur_sc->clip = clip;
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if (C)
-               WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip);
-}
-
-MovieClip *ED_space_clip_get_clip(SpaceClip *sc)
-{
-       return sc->clip;
-}
-
-Mask *ED_space_clip_get_mask(SpaceClip *sc)
-{
-       return sc->mask;
-}
-
-ImBuf *ED_space_clip_get_buffer(SpaceClip *sc)
-{
-       if (sc->clip) {
-               ImBuf *ibuf;
-
-               ibuf = BKE_movieclip_get_postprocessed_ibuf(sc->clip, &sc->user, sc->postproc_flag);
-
-               if (ibuf && (ibuf->rect || ibuf->rect_float))
-                       return ibuf;
-
-               if (ibuf)
-                       IMB_freeImBuf(ibuf);
-       }
-
-       return NULL;
-}
-
-ImBuf *ED_space_clip_get_stable_buffer(SpaceClip *sc, float loc[2], float *scale, float *angle)
-{
-       if (sc->clip) {
-               ImBuf *ibuf;
-
-               ibuf = BKE_movieclip_get_stable_ibuf(sc->clip, &sc->user, loc, scale, angle, sc->postproc_flag);
-
-               if (ibuf && (ibuf->rect || ibuf->rect_float))
-                       return ibuf;
-
-               if (ibuf)
-                       IMB_freeImBuf(ibuf);
-       }
-
-       return NULL;
-}
+       SpaceClip *sc = CTX_wm_space_clip(C);
 
-void ED_space_clip_get_clip_size(SpaceClip *sc, int *width, int *height)
-{
        if (!sc->clip) {
                *width = *height = 0;
        }
@@ -214,40 +136,25 @@ void ED_space_clip_get_clip_size(SpaceClip *sc, int *width, int *height)
        }
 }
 
-void ED_space_clip_get_mask_size(SpaceClip *sc, int *width, int *height)
+void ED_space_clip_get_zoom(const bContext *C, float *zoomx, float *zoomy)
 {
-       /* quite the same as ED_space_clip_size, but it also runs aspect correction on output resolution
-        * this is needed because mask should be rasterized with exactly the same resolution as
-        * currently displaying frame and it doesn't have access to aspect correction currently
-        * used for display. (sergey)
-        */
-
-       if (!sc->mask) {
-               *width = 0;
-               *height = 0;
-       } else {
-               float aspx, aspy;
+       ARegion *ar = CTX_wm_region(C);
+       int width, height;
 
-               ED_space_clip_get_clip_size(sc, width, height);
-               ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
+       ED_space_clip_get_size(C, &width, &height);
 
-               *width *= aspx;
-               *height *= aspy;
-       }
+       *zoomx = (float)(ar->winrct.xmax - ar->winrct.xmin + 1) / (float)((ar->v2d.cur.xmax - ar->v2d.cur.xmin) * width);
+       *zoomy = (float)(ar->winrct.ymax - ar->winrct.ymin + 1) / (float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin) * height);
 }
 
-void ED_space_clip_get_mask_aspect(SpaceClip *sc, float *aspx, float *aspy)
+void ED_space_clip_get_aspect(SpaceClip *sc, float *aspx, float *aspy)
 {
-       int w, h;
-
-       ED_space_clip_get_clip_aspect(sc, aspx, aspy);
-       ED_space_clip_get_clip_size(sc, &w, &h);
+       MovieClip *clip = ED_space_clip_get_clip(sc);
 
-       /* now this is not accounted for! */
-#if 0
-       *aspx *= (float)w;
-       *aspy *= (float)h;
-#endif
+       if (clip)
+               BKE_movieclip_aspect(clip, aspx, aspy);
+       else
+               *aspx = *aspy = 1.0f;
 
        if (*aspx < *aspy) {
                *aspy = *aspy / *aspx;
@@ -259,27 +166,7 @@ void ED_space_clip_get_mask_aspect(SpaceClip *sc, float *aspx, float *aspy)
        }
 }
 
-void ED_space_clip_get_zoom(SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy)
-{
-       int width, height;
-
-       ED_space_clip_get_clip_size(sc, &width, &height);
-
-       *zoomx = (float)(ar->winrct.xmax - ar->winrct.xmin + 1) / (float)((ar->v2d.cur.xmax - ar->v2d.cur.xmin) * width);
-       *zoomy = (float)(ar->winrct.ymax - ar->winrct.ymin + 1) / (float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin) * height);
-}
-
-void ED_space_clip_get_clip_aspect(SpaceClip *sc, float *aspx, float *aspy)
-{
-       MovieClip *clip = ED_space_clip_get_clip(sc);
-
-       if (clip)
-               BKE_movieclip_aspect(clip, aspx, aspy);
-       else
-               *aspx = *aspy = 1.0f;
-}
-
-void ED_space_clip_get_clip_aspect_dimension_aware(SpaceClip *sc, float *aspx, float *aspy)
+void ED_space_clip_get_aspect_dimension_aware(SpaceClip *sc, float *aspx, float *aspy)
 {
        int w, h;
 
@@ -290,11 +177,11 @@ void ED_space_clip_get_clip_aspect_dimension_aware(SpaceClip *sc, float *aspx, f
         * mainly this is sued for transformation stuff
         */
 
-       ED_space_clip_get_clip_aspect(sc, aspx, aspy);
-       ED_space_clip_get_clip_size(sc, &w, &h);
+       ED_space_clip_get_aspect(sc, aspx, aspy);
+       BKE_movieclip_get_size(sc->clip, &sc->user, &w, &h);
 
-       *aspx *= (float)w;
-       *aspy *= (float)h;
+       *aspx *= (float) w;
+       *aspy *= (float) h;
 
        if (*aspx < *aspy) {
                *aspy = *aspy / *aspx;
@@ -306,6 +193,48 @@ void ED_space_clip_get_clip_aspect_dimension_aware(SpaceClip *sc, float *aspx, f
        }
 }
 
+/* return current frame number in clip space */
+int ED_space_clip_get_clip_frame_number(SpaceClip *sc)
+{
+       MovieClip *clip = ED_space_clip_get_clip(sc);
+
+       return BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
+}
+
+ImBuf *ED_space_clip_get_buffer(SpaceClip *sc)
+{
+       if (sc->clip) {
+               ImBuf *ibuf;
+
+               ibuf = BKE_movieclip_get_postprocessed_ibuf(sc->clip, &sc->user, sc->postproc_flag);
+
+               if (ibuf && (ibuf->rect || ibuf->rect_float))
+                       return ibuf;
+
+               if (ibuf)
+                       IMB_freeImBuf(ibuf);
+       }
+
+       return NULL;
+}
+
+ImBuf *ED_space_clip_get_stable_buffer(SpaceClip *sc, float loc[2], float *scale, float *angle)
+{
+       if (sc->clip) {
+               ImBuf *ibuf;
+
+               ibuf = BKE_movieclip_get_stable_ibuf(sc->clip, &sc->user, loc, scale, angle, sc->postproc_flag);
+
+               if (ibuf && (ibuf->rect || ibuf->rect_float))
+                       return ibuf;
+
+               if (ibuf)
+                       IMB_freeImBuf(ibuf);
+       }
+
+       return NULL;
+}
+
 void ED_clip_update_frame(const Main *mainp, int cfra)
 {
        wmWindowManager *wm;
@@ -329,29 +258,23 @@ void ED_clip_update_frame(const Main *mainp, int cfra)
        }
 }
 
-/* return current frame number in clip space */
-int ED_space_clip_get_clip_frame_number(SpaceClip *sc)
-{
-       MovieClip *clip = ED_space_clip_get_clip(sc);
-
-       return BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
-}
-
-static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
+static int selected_boundbox(const bContext *C, float min[2], float max[2])
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
        MovieTrackingTrack *track;
        int width, height, ok = FALSE;
        ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
+       int framenr = ED_space_clip_get_clip_frame_number(sc);
 
        INIT_MINMAX2(min, max);
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        track = tracksbase->first;
        while (track) {
                if (TRACK_VIEW_SELECTED(sc, track)) {
-                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, sc->user.framenr);
+                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
 
                        if (marker) {
                                float pos[3];
@@ -383,22 +306,23 @@ static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
        return ok;
 }
 
-int ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
+int ED_clip_view_selection(const bContext *C, ARegion *ar, int fit)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        int w, h, frame_width, frame_height;
        float min[2], max[2];
 
-       ED_space_clip_get_clip_size(sc, &frame_width, &frame_height);
+       ED_space_clip_get_size(C, &frame_width, &frame_height);
 
        if (frame_width == 0 || frame_height == 0)
                return FALSE;
 
-       if (!selected_boundbox(sc, min, max))
+       if (!selected_boundbox(C, min, max))
                return FALSE;
 
        /* center view */
-       clip_view_center_to_point(sc, (max[0] + min[0]) / (2 * frame_width),
-                                 (max[1] + min[1]) / (2 * frame_height));
+       clip_view_center_to_point(C, (max[0] + min[0]) / (2 * frame_width),
+                                    (max[1] + min[1]) / (2 * frame_height));
 
        w = max[0] - min[0];
        h = max[1] - min[1];
@@ -408,7 +332,7 @@ int ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
                int width, height;
                float zoomx, zoomy, newzoom, aspx, aspy;
 
-               ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
+               ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
                width = ar->winrct.xmax - ar->winrct.xmin + 1;
                height = ar->winrct.ymax - ar->winrct.ymin + 1;
@@ -434,7 +358,7 @@ void ED_clip_point_undistorted_pos(SpaceClip *sc, const float co[2], float r_co[
                float aspy = 1.0f / clip->tracking.camera.pixel_aspect;
                int width, height;
 
-               ED_space_clip_get_clip_size(sc, &width, &height);
+               BKE_movieclip_get_size(sc->clip, &sc->user, &width, &height);
 
                r_co[0] *= width;
                r_co[1] *= height * aspy;
@@ -453,8 +377,8 @@ void ED_clip_point_stable_pos(const bContext *C, float x, float y, float *xr, fl
        int sx, sy, width, height;
        float zoomx, zoomy, pos[3], imat[4][4];
 
-       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
+       ED_space_clip_get_size(C, &width, &height);
 
        UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &sx, &sy);
 
@@ -485,16 +409,18 @@ void ED_clip_point_stable_pos(const bContext *C, float x, float y, float *xr, fl
  * \brief the reverse of ED_clip_point_stable_pos(), gets the marker region coords.
  * better name here? view_to_track / track_to_view or so?
  */
-void ED_clip_point_stable_pos__reverse(SpaceClip *sc, ARegion *ar, const float co[2], float r_co[2])
+void ED_clip_point_stable_pos__reverse(const bContext *C, const float co[2], float r_co[2])
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
+       ARegion *ar = CTX_wm_region(C);
        float zoomx, zoomy;
        float pos[3];
        int width, height;
        int sx, sy;
 
        UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &sx, &sy);
-       ED_space_clip_get_clip_size(sc, &width, &height);
-       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
 
        ED_clip_point_undistorted_pos(sc, co, pos);
        pos[2] = 0.0f;
@@ -511,6 +437,87 @@ void ED_clip_mouse_pos(const bContext *C, wmEvent *event, float co[2])
        ED_clip_point_stable_pos(C, event->mval[0], event->mval[1], &co[0], &co[1]);
 }
 
+int ED_space_clip_check_show_trackedit(SpaceClip *sc)
+{
+       if (sc) {
+               return ELEM3(sc->mode, SC_MODE_TRACKING, SC_MODE_RECONSTRUCTION, SC_MODE_DISTORTION);
+       }
+
+       return FALSE;
+}
+
+int ED_space_clip_check_show_maskedit(SpaceClip *sc)
+{
+       if (sc) {
+               return sc->mode == SC_MODE_MASKEDIT;
+       }
+
+       return FALSE;
+}
+
+/* ******** clip editing functions ******** */
+
+MovieClip *ED_space_clip_get_clip(SpaceClip *sc)
+{
+       return sc->clip;
+}
+
+void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip)
+{
+       MovieClip *old_clip;
+
+       if (!screen && C)
+               screen = CTX_wm_screen(C);
+
+       old_clip = sc->clip;
+       sc->clip = clip;
+
+       if (sc->clip && sc->clip->id.us == 0)
+               sc->clip->id.us = 1;
+
+       if (screen && sc->view == SC_VIEW_CLIP) {
+               ScrArea *area;
+               SpaceLink *sl;
+
+               for (area = screen->areabase.first; area; area = area->next) {
+                       for (sl = area->spacedata.first; sl; sl = sl->next) {
+                               if (sl->spacetype == SPACE_CLIP) {
+                                       SpaceClip *cur_sc = (SpaceClip *) sl;
+
+                                       if (cur_sc != sc && cur_sc->view != SC_VIEW_CLIP) {
+                                               if (cur_sc->clip == old_clip || cur_sc->clip == NULL) {
+                                                       cur_sc->clip = clip;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       if (C)
+               WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip);
+}
+
+/* ******** masking editing functions ******** */
+
+Mask *ED_space_clip_get_mask(SpaceClip *sc)
+{
+       return sc->mask;
+}
+
+void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask)
+{
+       sc->mask = mask;
+
+       if (sc->mask && sc->mask->id.us == 0) {
+               sc->clip->id.us = 1;
+       }
+
+       if (C) {
+               WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask);
+       }
+}
+
 /* OpenGL draw context */
 
 typedef struct SpaceClipDrawContext {
@@ -654,36 +661,3 @@ void ED_space_clip_free_texture_buffer(SpaceClip *sc)
                MEM_freeN(context);
        }
 }
-
-/* ******** masking editing related functions ******** */
-
-int ED_space_clip_check_show_trackedit(SpaceClip *sc)
-{
-       if (sc) {
-               return ELEM3(sc->mode, SC_MODE_TRACKING, SC_MODE_RECONSTRUCTION, SC_MODE_DISTORTION);
-       }
-
-       return FALSE;
-}
-
-int ED_space_clip_check_show_maskedit(SpaceClip *sc)
-{
-       if (sc) {
-               return sc->mode == SC_MODE_MASKEDIT;
-       }
-
-       return FALSE;
-}
-
-void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask)
-{
-       sc->mask = mask;
-
-       if (sc->mask && sc->mask->id.us == 0) {
-               sc->clip->id.us = 1;
-       }
-
-       if (C) {
-               WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask);
-       }
-}
index 5bc195a1ae286d281efaf7524974d1880f9f8601..c61a0baa82e3b9ebc538454e4eb2c943f0fc073f 100644 (file)
@@ -69,7 +69,7 @@ void clip_draw_dopesheet_channels(const struct bContext *C, struct ARegion *ar);
 void CLIP_OT_dopesheet_select_channel(struct wmOperatorType *ot);
 
 /* clip_draw.c */
-void clip_draw_main(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
+void clip_draw_main(const struct bContext *C, struct ARegion *ar);
 void clip_draw_grease_pencil(struct bContext *C, int onlyv2d);
 void clip_draw_curfra_label(struct SpaceClip *sc, float x, float y);
 
@@ -125,7 +125,7 @@ void clip_graph_tracking_iterate(struct SpaceClip *sc, int selected_only, int in
 void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct ListBase *tracksbase, struct MovieTrackingTrack *track);
 void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct ListBase *tracksbase, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
 
-void clip_view_center_to_point(struct SpaceClip *sc, float x, float y);
+void clip_view_center_to_point(const struct bContext *C, float x, float y);
 
 void clip_draw_cfra(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
 void clip_draw_sfra_efra(struct View2D *v2d, struct Scene *scene);
index b3f7b221af018d7f87b6da561b5e2578d16de818..e76edcf0290c30701673bbceef7836983fc4324e 100644 (file)
 
 /******************** view navigation utilities *********************/
 
-static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom, float location[2])
+static void sclip_zoom_set(const bContext *C, float zoom, float location[2])
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
+       ARegion *ar = CTX_wm_region(C);
        float oldzoom = sc->zoom;
        int width, height;
 
@@ -78,7 +80,7 @@ static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom, float locatio
 
        if (sc->zoom < 0.1f || sc->zoom > 4.0f) {
                /* check zoom limits */
-               ED_space_clip_get_clip_size(sc, &width, &height);
+               ED_space_clip_get_size(C, &width, &height);
 
                width *= sc->zoom;
                height *= sc->zoom;
@@ -92,22 +94,22 @@ static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom, float locatio
        }
 
        if ((U.uiflag & USER_ZOOM_TO_MOUSEPOS) && location) {
-               ED_space_clip_get_clip_size(sc, &width, &height);
+               ED_space_clip_get_size(C, &width, &height);
 
                sc->xof += ((location[0] - 0.5f) * width - sc->xof) * (sc->zoom - oldzoom) / sc->zoom;
                sc->yof += ((location[1] - 0.5f) * height - sc->yof) * (sc->zoom - oldzoom) / sc->zoom;
        }
 }
 
-static void sclip_zoom_set_factor(SpaceClip *sc, ARegion *ar, float zoomfac, float location[2])
+static void sclip_zoom_set_factor(const bContext *C, float zoomfac, float location[2])
 {
-       sclip_zoom_set(sc, ar, sc->zoom*zoomfac, location);
+       SpaceClip *sc = CTX_wm_space_clip(C);
+
+       sclip_zoom_set(C, sc->zoom * zoomfac, location);
 }
 
 static void sclip_zoom_set_factor_exec(bContext *C, wmEvent *event, float factor)
 {
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
        float location[2], *mpos = NULL;
 
        if (event) {
@@ -115,7 +117,7 @@ static void sclip_zoom_set_factor_exec(bContext *C, wmEvent *event, float factor
                mpos = location;
        }
 
-       sclip_zoom_set_factor(sc, ar, factor, mpos);
+       sclip_zoom_set_factor(C, factor, mpos);
 
        ED_region_tag_redraw(CTX_wm_region(C));
 }
@@ -494,10 +496,7 @@ static void view_zoom_exit(bContext *C, wmOperator *op, int cancel)
 
 static int view_zoom_exec(bContext *C, wmOperator *op)
 {
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
-
-       sclip_zoom_set_factor(sc, ar, RNA_float_get(op->ptr, "factor"), NULL);
+       sclip_zoom_set_factor(C, RNA_float_get(op->ptr, "factor"), NULL);
 
        ED_region_tag_redraw(CTX_wm_region(C));
 
@@ -525,8 +524,6 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
 
 static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
 {
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
        ViewZoomData *vpd = op->customdata;
        float factor;
 
@@ -534,7 +531,7 @@ static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
                case MOUSEMOVE:
                        factor = 1.0f + (vpd->x - event->x + vpd->y - event->y) / 300.0f;
                        RNA_float_set(op->ptr, "factor", factor);
-                       sclip_zoom_set(sc, ar, vpd->zoom * factor, vpd->location);
+                       sclip_zoom_set(C, vpd->zoom * factor, vpd->location);
                        ED_region_tag_redraw(CTX_wm_region(C));
                        break;
                default:
@@ -582,13 +579,11 @@ void CLIP_OT_view_zoom(wmOperatorType *ot)
 
 static int view_zoom_in_exec(bContext *C, wmOperator *op)
 {
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
        float location[2];
 
        RNA_float_get_array(op->ptr, "location", location);
 
-       sclip_zoom_set_factor(sc, ar, 1.25f, location);
+       sclip_zoom_set_factor(C, 1.25f, location);
 
        ED_region_tag_redraw(CTX_wm_region(C));
 
@@ -624,13 +619,11 @@ void CLIP_OT_view_zoom_in(wmOperatorType *ot)
 
 static int view_zoom_out_exec(bContext *C, wmOperator *op)
 {
-       SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
        float location[2];
 
        RNA_float_get_array(op->ptr, "location", location);
 
-       sclip_zoom_set_factor(sc, ar, 0.8f, location);
+       sclip_zoom_set_factor(C, 0.8f, location);
 
        ED_region_tag_redraw(CTX_wm_region(C));
 
@@ -669,9 +662,8 @@ void CLIP_OT_view_zoom_out(wmOperatorType *ot)
 static int view_zoom_ratio_exec(bContext *C, wmOperator *op)
 {
        SpaceClip *sc = CTX_wm_space_clip(C);
-       ARegion *ar = CTX_wm_region(C);
 
-       sclip_zoom_set(sc, ar, RNA_float_get(op->ptr, "ratio"), NULL);
+       sclip_zoom_set(C, RNA_float_get(op->ptr, "ratio"), NULL);
 
        /* ensure pixel exact locations for draw */
        sc->xof = (int) sc->xof;
@@ -713,8 +705,8 @@ static int view_all_exec(bContext *C, wmOperator *op)
        sc = CTX_wm_space_clip(C);
        ar = CTX_wm_region(C);
 
-       ED_space_clip_get_clip_size(sc, &w, &h);
-       ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
+       ED_space_clip_get_size(C, &w, &h);
+       ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
        w = w * aspx;
        h = h * aspy;
@@ -729,7 +721,7 @@ static int view_all_exec(bContext *C, wmOperator *op)
                zoomx = (float) width / (w + 2 * margin);
                zoomy = (float) height / (h + 2 * margin);
 
-               sclip_zoom_set(sc, ar, MIN2(zoomx, zoomy), NULL);
+               sclip_zoom_set(C, MIN2(zoomx, zoomy), NULL);
        }
        else {
                if ((w >= width || h >= height) && (width > 0 && height > 0)) {
@@ -737,10 +729,10 @@ static int view_all_exec(bContext *C, wmOperator *op)
                        zoomy = (float) height / h;
 
                        /* find the zoom value that will fit the image in the image space */
-                       sclip_zoom_set(sc, ar, 1.0f / power_of_2(1.0f / MIN2(zoomx, zoomy)), NULL);
+                       sclip_zoom_set(C, 1.0f / power_of_2(1.0f / MIN2(zoomx, zoomy)), NULL);
                }
                else
-                       sclip_zoom_set(sc, ar, 1.0f, NULL);
+                       sclip_zoom_set(C, 1.0f, NULL);
        }
 
        sc->xof = sc->yof = 0.0f;
@@ -775,7 +767,7 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
        sc->xlockof = 0.0f;
        sc->ylockof = 0.0f;
 
-       ED_clip_view_selection(sc, ar, 1);
+       ED_clip_view_selection(C, ar, 1);
        ED_region_tag_redraw(CTX_wm_region(C));
 
        return OPERATOR_FINISHED;
index 1c040c69fa90b349f10a1224d5e5955d653e7bcc..d9c9f63e4a387e298506b133e75b2b266998ccf9 100644 (file)
@@ -223,13 +223,14 @@ void clip_delete_marker(bContext *C, MovieClip *clip, ListBase *tracksbase,
        }
 }
 
-void clip_view_center_to_point(SpaceClip *sc, float x, float y)
+void clip_view_center_to_point(const bContext *C, float x, float y)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        int width, height;
        float aspx, aspy;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
-       ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
        sc->xof = (x - 0.5f) * width * aspx;
        sc->yof = (y - 0.5f) * height * aspy;
index 49ee6b65256407e1d61ef06287632056310aa07b..0a6a4af6960cd3fc52d37eae1e4550fa8f9f903f 100644 (file)
@@ -1008,13 +1008,14 @@ static void clip_refresh(const bContext *C, ScrArea *sa)
 /********************* main region ********************/
 
 /* sets up the fields of the View2D from zoom and offset */
-static void movieclip_main_area_set_view2d(SpaceClip *sc, ARegion *ar)
+static void movieclip_main_area_set_view2d(const bContext *C, ARegion *ar)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
        float x1, y1, w, h;
        int width, height, winx, winy;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        w = width;
        h = height;
@@ -1074,11 +1075,54 @@ static void clip_main_area_init(wmWindowManager *wm, ARegion *ar)
        WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
 }
 
+static void clip_main_area_draw_mask(const bContext *C, ARegion *ar)
+{
+       SpaceClip *sc = CTX_wm_space_clip(C);
+       int x, y;
+       int width, height;
+       float zoomx, zoomy;
+
+       /* frame image */
+       float maxdim;
+       float xofs, yofs;
+
+       /* find window pixel coordinates of origin */
+       UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &x, &y);
+
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
+
+       /* frame the image */
+       maxdim = maxf(width, height);
+       if (width == height) {
+               xofs = yofs = 0;
+       }
+       else if (width < height) {
+               xofs = ((height - width) / -2.0f) * zoomx;
+               yofs = 0.0f;
+       }
+       else { /* (width > height) */
+               xofs = 0.0f;
+               yofs = ((width - height) / -2.0f) * zoomy;
+       }
+
+       /* apply transformation so mask editing tools will assume drawing from the origin in normalized space */
+       glPushMatrix();
+       glTranslatef(x + xofs, y + yofs, 0);
+       glScalef(maxdim * zoomx, maxdim * zoomy, 0);
+       glMultMatrixf(sc->stabmat);
+
+       ED_mask_draw(C, sc->mask_draw_flag, sc->mask_draw_type);
+
+       ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
+
+       glPopMatrix();
+}
+
 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);
-       Scene *scene = CTX_data_scene(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
 
        /* if tracking is in progress, we should synchronize framenr from clipuser
@@ -1093,7 +1137,7 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar)
                        tmpibuf = ED_space_clip_get_stable_buffer(sc, NULL, NULL, NULL);
                }
 
-               if (ED_clip_view_selection(sc, ar, 0)) {
+               if (ED_clip_view_selection(C, ar, 0)) {
                        sc->xof += sc->xlockof;
                        sc->yof += sc->ylockof;
                }
@@ -1107,51 +1151,12 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar)
        glClear(GL_COLOR_BUFFER_BIT);
 
        /* data... */
-       movieclip_main_area_set_view2d(sc, ar);
+       movieclip_main_area_set_view2d(C, ar);
 
-       clip_draw_main(sc, ar, scene);
+       clip_draw_main(C, ar);
 
        if (sc->mode == SC_MODE_MASKEDIT) {
-               int x, y;
-               int width, height;
-               float zoomx, zoomy, aspx, aspy;
-
-               /* frame image */
-               float maxdim;
-               float xofs, yofs;
-
-               /* find window pixel coordinates of origin */
-               UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &x, &y);
-
-               ED_space_clip_get_clip_size(sc, &width, &height);
-               ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
-               ED_space_clip_get_clip_aspect(sc, &aspx, &aspy);
-
-               /* frame the image */
-               maxdim = maxf(width, height);
-               if (width == height) {
-                       xofs = yofs = 0;
-               }
-               else if (width < height) {
-                       xofs = ((height - width) / -2.0f) * zoomx;
-                       yofs = 0.0f;
-               }
-               else { /* (width > height) */
-                       xofs = 0.0f;
-                       yofs = ((width - height) / -2.0f) * zoomy;
-               }
-
-               /* apply transformation so mask editing tools will assume drawing from the origin in normalized space */
-               glPushMatrix();
-               glTranslatef(x + xofs, y + yofs, 0);
-               glScalef(maxdim * zoomx, maxdim * zoomy, 0);
-               glMultMatrixf(sc->stabmat);
-
-               ED_mask_draw(C, sc->mask_draw_flag, sc->mask_draw_type);
-
-               ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
-
-               glPopMatrix();
+               clip_main_area_draw_mask(C, ar);
        }
 
        /* Grease Pencil */
index 8f58df1cb2c4d19d25f2e9c73bad3729ec531199..af2847492ad7482031b7595ad3e7af4f9f4efe5d 100644 (file)
@@ -81,8 +81,9 @@
 
 /********************** add marker operator *********************/
 
-static void add_marker(SpaceClip *sc, float x, float y)
+static void add_marker(const bContext *C, float x, float y)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
        MovieTracking *tracking = &clip->tracking;
        ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
@@ -90,7 +91,7 @@ static void add_marker(SpaceClip *sc, float x, float y)
        int width, height;
        int framenr = ED_space_clip_get_clip_frame_number(sc);
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        track = BKE_tracking_track_add(tracking, tracksbase, x, y, framenr, width, height);
 
@@ -106,14 +107,14 @@ static int add_marker_exec(bContext *C, wmOperator *op)
        float pos[2];
        int width, height;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        if (!width || !height)
                return OPERATOR_CANCELLED;
 
        RNA_float_get_array(op->ptr, "location", pos);
 
-       add_marker(sc, pos[0], pos[1]);
+       add_marker(C, pos[0], pos[1]);
 
        /* reset offset from locked position, so frame jumping wouldn't be so confusing */
        sc->xlockof = 0;
@@ -532,7 +533,7 @@ MovieTrackingTrack *tracking_marker_check_slide(bContext *C, wmEvent *event, int
        int framenr = ED_space_clip_get_clip_frame_number(sc);
        int action = -1, area = 0, corner = -1;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        if (width == 0 || height == 0)
                return NULL;
@@ -628,7 +629,7 @@ static void *slide_marker_customdata(bContext *C, wmEvent *event)
        int framenr = ED_space_clip_get_clip_frame_number(sc);
        int area, action, corner;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        if (width == 0 || height == 0)
                return NULL;
index f8f786e549c4efc8dfed49613afdf0aae096818e..0ebb84b3953624d467c58564076c277ec0b3d90d 100644 (file)
@@ -110,15 +110,16 @@ static int mouse_on_crns(float co[2], float pos[2], float crns[4][2], float epsx
        return dist < MAX2(epsx, epsy);
 }
 
-static int track_mouse_area(SpaceClip *sc, float co[2], MovieTrackingTrack *track)
+static int track_mouse_area(const bContext *C, float co[2], MovieTrackingTrack *track)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        int framenr = ED_space_clip_get_clip_frame_number(sc);
        MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
        float pat_min[2], pat_max[2];
        float epsx, epsy;
        int width, height;
 
-       ED_space_clip_get_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(C, &width, &height);
 
        BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
 
@@ -235,7 +236,7 @@ static int mouse_select(bContext *C, float co[2], int extend)
        track = find_nearest_track(sc, tracksbase, co);
 
        if (track) {
-               int area = track_mouse_area(sc, co, track);
+               int area = track_mouse_area(C, co, track);
 
                if (!extend || !TRACK_VIEW_SELECTED(sc, track))
                        area = TRACK_AREA_ALL;
@@ -412,7 +413,6 @@ void CLIP_OT_select_border(wmOperatorType *ot)
 
 static int do_lasso_select_marker(bContext *C, int mcords[][2], short moves, short select)
 {
-       ARegion *ar = CTX_wm_region(C);
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
        MovieTracking *tracking = &clip->tracking;
@@ -435,7 +435,7 @@ static int do_lasso_select_marker(bContext *C, int mcords[][2], short moves, sho
                                float screen_co[2];
 
                                /* marker in screen coords */
-                               ED_clip_point_stable_pos__reverse(sc, ar, marker->pos, screen_co);
+                               ED_clip_point_stable_pos__reverse(C, marker->pos, screen_co);
 
                                if (BLI_in_rcti(&rect, screen_co[0], screen_co[1]) &&
                                    BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], V2D_IS_CLIPPED))
@@ -520,7 +520,6 @@ static int circle_select_exec(bContext *C, wmOperator *op)
 {
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
-       ARegion *ar = CTX_wm_region(C);
        MovieTracking *tracking = &clip->tracking;
        MovieTrackingTrack *track;
        ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
@@ -536,8 +535,8 @@ static int circle_select_exec(bContext *C, wmOperator *op)
        mode = RNA_int_get(op->ptr, "gesture_mode");
 
        /* compute ellipse and position in unified coordinates */
-       ED_space_clip_get_clip_size(sc, &width, &height);
-       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
+       ED_space_clip_get_size(C, &width, &height);
+       ED_space_clip_get_zoom(C, &zoomx, &zoomy);
 
        ellipse[0] = width * zoomx / radius;
        ellipse[1] = height * zoomy / radius;
index 67e87afc5c36ae9a2610e327aaed75f25c0b9af5..cedb09e187c84d4286beae5cb3dd9aa939409d78 100644 (file)
@@ -183,11 +183,11 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy)
                r_vec[2] = 0.0f;
 
                if (t->options & CTX_MOVIECLIP) {
-                       ED_space_clip_get_clip_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy);
+                       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_mask_aspect(t->sa->spacedata.first, &aspx, &aspy);
+                       ED_space_clip_get_aspect(t->sa->spacedata.first, &aspx, &aspy);
                }
 
                r_vec[0] *= aspx;
@@ -254,9 +254,9 @@ void projectIntView(TransInfo *t, const float vec[3], int adr[2])
                copy_v2_v2(v, vec);
 
                if (t->options & CTX_MOVIECLIP)
-                       ED_space_clip_get_clip_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy);
+                       ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy);
                else if (t->options & CTX_MASK)
-                       ED_space_clip_get_mask_aspect(t->sa->spacedata.first, &aspx, &aspy);
+                       ED_space_clip_get_aspect(t->sa->spacedata.first, &aspx, &aspy);
 
                v[0] /= aspx;
                v[1] /= aspy;
@@ -317,13 +317,13 @@ void applyAspectRatio(TransInfo *t, float vec[2])
 
 
                        if (t->options & CTX_MOVIECLIP) {
-                               ED_space_clip_get_clip_aspect_dimension_aware(sc, &aspx, &aspy);
+                               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_mask_aspect(sc, &aspx, &aspy);
+                               ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
                                vec[0] /= aspx;
                                vec[1] /= aspy;
@@ -356,10 +356,10 @@ void removeAspectRatio(TransInfo *t, float vec[2])
                        float aspx = 1.0f, aspy = 1.0f;
 
                        if (t->options & CTX_MOVIECLIP) {
-                               ED_space_clip_get_clip_aspect_dimension_aware(sc, &aspx, &aspy);
+                               ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy);
                        }
                        else if (t->options & CTX_MASK) {
-                               ED_space_clip_get_mask_aspect(sc, &aspx, &aspy);
+                               ED_space_clip_get_aspect(sc, &aspx, &aspy);
                        }
 
                        vec[0] *= aspx;
index a9716483db72f6d198a875091808b0def8099714..e924ce15286658a87a0cfcef86df84776e962179 100644 (file)
@@ -5736,7 +5736,7 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t)
        if (t->total == 0)
                return;
 
-       ED_space_clip_get_clip_aspect_dimension_aware(sc, &aspx, &aspy);
+       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");
@@ -5992,7 +5992,7 @@ void flushTransTracking(TransInfo *t)
        int a;
        float aspx, aspy;
 
-       ED_space_clip_get_clip_aspect_dimension_aware(sc, &aspx, &aspy);
+       ED_space_clip_get_aspect_dimension_aware(sc, &aspx, &aspy);
 
        if (t->state == TRANS_CANCEL)
                cancelTransTracking(t);
@@ -6072,7 +6072,7 @@ static void MaskPointToTransData(SpaceClip *sc, MaskSplinePoint *point,
        tdm->point = point;
        copy_m3_m3(tdm->vec, bezt->vec);
 
-       ED_space_clip_get_mask_aspect(sc, &aspx, &aspy);
+       ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
        if (propmode || is_sel_point) {
                int i;
@@ -6250,7 +6250,7 @@ void flushTransMasking(TransInfo *t)
        int a;
        float aspx, aspy, invx, invy;
 
-       ED_space_clip_get_mask_aspect(sc, &aspx, &aspy);
+       ED_space_clip_get_aspect(sc, &aspx, &aspy);
        invx = 1.0f / aspx;
        invy = 1.0f / aspy;
 
index 0ecfa2695e06eb8fd542974a6604daf75d3015e4..9f335b4afe784bc15dc5f18f513e4375e7a18b51 100644 (file)
@@ -643,7 +643,7 @@ static void recalcData_spaceclip(TransInfo *t)
                MovieClip *clip = ED_space_clip_get_clip(sc);
                ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
                MovieTrackingTrack *track;
-               int framenr = sc->user.framenr;
+               int framenr = ED_space_clip_get_clip_frame_number(sc);
 
                flushTransTracking(t);
 
index dfcbbe0653b549752b9252c0213243d16883c20b..51dfa020bea940e661035947a2e947b75cdbc2b8 100644 (file)
 #ifdef RNA_RUNTIME
 
 #include "DNA_mask_types.h"
+#include "DNA_movieclip_types.h"
 
 #include "BKE_depsgraph.h"
 #include "BKE_mask.h"
+#include "BKE_tracking.h"
+
+#include "BLI_math.h"
 
 #include "RNA_access.h"
 
@@ -66,6 +70,40 @@ static void rna_Mask_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
        DAG_id_tag_update( &mask->id, 0);
 }
 
+static void rna_Mask_update_parent(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       MaskParent *parent = ptr->data;
+
+       if (parent->id) {
+               if (GS(parent->id->name) == ID_MC) {
+                       MovieClip *clip = (MovieClip *) parent->id;
+                       MovieTracking *tracking = &clip->tracking;
+                       MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, parent->parent);
+
+                       if (object) {
+                               MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, object, parent->sub_parent);
+
+                               if (track) {
+                                       int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scene->r.cfra);
+                                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_framenr);
+                                       float marker_pos_ofs[2], parmask_pos[2];
+                                       MovieClipUser user = {0};
+
+                                       BKE_movieclip_user_set_frame(&user, scene->r.cfra);
+
+                                       add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
+
+                                       BKE_mask_coord_from_movieclip(clip, &user, parmask_pos, marker_pos_ofs);
+
+                                       copy_v2_v2(parent->parent_orig, parmask_pos);
+                               }
+                       }
+               }
+       }
+
+       rna_Mask_update_data(bmain, scene, ptr);
+}
+
 /* note: this function exists only to avoid id refcounting */
 static void rna_MaskParent_id_set(PointerRNA *ptr, PointerRNA value)
 {
@@ -357,7 +395,7 @@ static void rna_def_maskParent(BlenderRNA *brna)
        /* note: custom set function is ONLY to avoid rna setting a user for this. */
        RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskParent_id_set", "rna_MaskParent_id_typef", NULL);
        RNA_def_property_ui_text(prop, "ID", "ID-block to which masking element would be parented to or to it's property");
-       RNA_def_property_update(prop, 0, "rna_Mask_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
 
        prop = RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "id_type");
@@ -366,19 +404,19 @@ static void rna_def_maskParent(BlenderRNA *brna)
        RNA_def_property_enum_funcs(prop, NULL, "rna_MaskParent_id_type_set", NULL);
        //RNA_def_property_editable_func(prop, "rna_MaskParent_id_type_editable");
        RNA_def_property_ui_text(prop, "ID Type", "Type of ID-block that can be used");
-       RNA_def_property_update(prop, 0, "rna_Mask_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
 
        /* parent */
        prop = RNA_def_property(srna, "parent", PROP_STRING, PROP_NONE);
        RNA_def_property_ui_text(prop, "Parent", "Name of parent object in specified data block to which parenting happens");
        RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
-       RNA_def_property_update(prop, 0, "rna_Mask_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
 
        /* sub_parent */
        prop = RNA_def_property(srna, "sub_parent", PROP_STRING, PROP_NONE);
        RNA_def_property_ui_text(prop, "Sub Parent", "Name of parent sub-object in specified data block to which parenting happens");
        RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
-       RNA_def_property_update(prop, 0, "rna_Mask_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
 }
 
 static void rna_def_maskSplinePointUW(BlenderRNA *brna)