Ejemplo n.º 1
0
static void draw_tracks_curves(View2D *v2d, SpaceClip *sc)
{
	MovieClip *clip= ED_space_clip(sc);
	MovieTracking *tracking= &clip->tracking;
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
	int width, height;
	struct { MovieTrackingTrack *act_track; int sel; float xscale, yscale, hsize; } userdata;

	BKE_movieclip_get_size(clip, &sc->user, &width, &height);

	if(!width || !height)
		return;

	/* non-selected knot handles */
	userdata.hsize= UI_GetThemeValuef(TH_HANDLE_VERTEX_SIZE);
	userdata.sel= 0;
	userdata.act_track= act_track;
	UI_view2d_getscale(v2d, &userdata.xscale, &userdata.yscale);
	clip_graph_tracking_values_iterate(sc, &userdata, tracking_segment_knot_cb, NULL, NULL);

	/* draw graph lines */
	glEnable(GL_BLEND);
	clip_graph_tracking_values_iterate(sc, act_track, tracking_segment_point_cb, tracking_segment_start_cb, tracking_segment_end_cb);
	glDisable(GL_BLEND);

	/* selected knot handles on top of curves */
	userdata.sel= 1;
	clip_graph_tracking_values_iterate(sc, &userdata, tracking_segment_knot_cb, NULL, NULL);
}
Ejemplo n.º 2
0
static int delete_curve_exec(bContext *C, wmOperator *UNUSED(op))
{
	SpaceClip *sc= CTX_wm_space_clip(C);
	MovieClip *clip= ED_space_clip(sc);
	MovieTracking *tracking= &clip->tracking;
	ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);

	if(act_track)
		clip_delete_track(C, clip, tracksbase, act_track);

	return OPERATOR_FINISHED;
}
Ejemplo n.º 3
0
static int mouse_select_knot(bContext *C, float co[2], int extend)
{
	SpaceClip *sc= CTX_wm_space_clip(C);
	MovieClip *clip= ED_space_clip(sc);
	ARegion *ar= CTX_wm_region(C);
	View2D *v2d= &ar->v2d;
	MovieTracking *tracking= &clip->tracking;
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
	static const int delta= 6;

	if(act_track) {
		MouseSelectUserData userdata;

		mouse_select_init_data(&userdata, co);
		clip_graph_tracking_values_iterate_track(sc, act_track,
					&userdata, find_nearest_tracking_knot_cb, NULL, NULL);

		if(userdata.marker) {
			int x1, y1, x2, y2;

			UI_view2d_view_to_region(v2d, co[0], co[1], &x1, &y1);
			UI_view2d_view_to_region(v2d, userdata.min_co[0], userdata.min_co[1], &x2, &y2);

			if(abs(x2-x1)<=delta && abs(y2-y1)<=delta) {
				if(!extend) {
					SelectUserData selectdata = {SEL_DESELECT};
					clip_graph_tracking_iterate(sc, &selectdata, toggle_selection_cb);
				}

				if(userdata.coord==0)
					userdata.marker->flag|= MARKER_GRAPH_SEL_X;
				else
					userdata.marker->flag|= MARKER_GRAPH_SEL_Y;

				return 1;
			}
		}
	}

	return 0;
}
Ejemplo n.º 4
0
static int mouse_select_curve(bContext *C, float co[2], int extend)
{
	SpaceClip *sc= CTX_wm_space_clip(C);
	MovieClip *clip= ED_space_clip(sc);
	MovieTracking *tracking= &clip->tracking;
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
	MouseSelectUserData userdata;

	mouse_select_init_data(&userdata, co);
	clip_graph_tracking_values_iterate(sc, &userdata, find_nearest_tracking_segment_cb, NULL, find_nearest_tracking_segment_end_cb);

	if(userdata.track) {
		if(extend) {
			if(act_track==userdata.track) {
				/* currently only single curve can be selected (selected curve represents active track) */
				act_track= NULL;
			}
		}
		else if(act_track!=userdata.track) {
			MovieTrackingMarker *marker;
			SelectUserData selectdata = {SEL_DESELECT};

			tracking->act_track= userdata.track;

			/* make active track be centered to screen */
			marker= BKE_tracking_get_marker(userdata.track, sc->user.framenr);

			clip_view_center_to_point(sc, marker->pos[0], marker->pos[1]);

			/* deselect all knots on newly selected curve */
			clip_graph_tracking_iterate(sc, &selectdata, toggle_selection_cb);
		}

		return 1;
	}

	return 0;
}
Ejemplo n.º 5
0
static int delete_knot_exec(bContext *C, wmOperator *UNUSED(op))
{
	SpaceClip *sc= CTX_wm_space_clip(C);
	MovieClip *clip= ED_space_clip(sc);
	MovieTracking *tracking= &clip->tracking;
	ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);

	if(act_track) {
		int a= 0;

		while(a<act_track->markersnr) {
			MovieTrackingMarker *marker= &act_track->markers[a];

			if(marker->flag & (MARKER_GRAPH_SEL_X|MARKER_GRAPH_SEL_Y))
				clip_delete_marker(C, clip, tracksbase, act_track, marker);
			else
				a++;
		}
	}

	return OPERATOR_FINISHED;
}
Ejemplo n.º 6
0
void clip_delete_track(bContext *C, MovieClip *clip, ListBase *tracksbase, MovieTrackingTrack *track)
{
	MovieTracking *tracking= &clip->tracking;
	MovieTrackingStabilization *stab= &tracking->stabilization;
	MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);

	int has_bundle= 0, update_stab= 0;

	if(track==act_track)
		tracking->act_track= NULL;

	if(track==stab->rot_track) {
		stab->rot_track= NULL;

		update_stab= 1;
	}

	/* handle reconstruction display in 3d viewport */
	if(track->flag&TRACK_HAS_BUNDLE)
		has_bundle= 1;

	BKE_tracking_free_track(track);
	BLI_freelinkN(tracksbase, track);

	WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);

	if(update_stab) {
		tracking->stabilization.ok= 0;

		DAG_id_tag_update(&clip->id, 0);
		WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, clip);
	}

	if(has_bundle)
		WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
Ejemplo n.º 7
0
void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClipScopes *scopes)
{
    if (scopes->ok)
        return;

    if (scopes->track_preview) {
        IMB_freeImBuf(scopes->track_preview);
        scopes->track_preview = NULL;
    }

    scopes->marker = NULL;
    scopes->track = NULL;

    if (clip) {
        MovieTrackingTrack *act_track = BKE_tracking_active_track(&clip->tracking);

        if (act_track) {
            MovieTrackingTrack *track = act_track;
            MovieTrackingMarker *marker = BKE_tracking_get_marker(track, user->framenr);

            if (marker->flag & MARKER_DISABLED) {
                scopes->track_disabled = TRUE;
            }
            else {
                ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user);

                scopes->track_disabled = FALSE;

                if (ibuf && (ibuf->rect || ibuf->rect_float)) {
                    ImBuf *tmpibuf;
                    MovieTrackingMarker undist_marker = *marker;

                    if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
                        int width, height;
                        float aspy = 1.0f / clip->tracking.camera.pixel_aspect;

                        BKE_movieclip_get_size(clip, user, &width, &height);

                        undist_marker.pos[0] *= width;
                        undist_marker.pos[1] *= height * aspy;

                        BKE_tracking_invert_intrinsics(&clip->tracking, undist_marker.pos, undist_marker.pos);

                        undist_marker.pos[0] /= width;
                        undist_marker.pos[1] /= height * aspy;
                    }

                    /* NOTE: margin should be kept in sync with value from ui_draw_but_TRACKPREVIEW */
                    tmpibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, &undist_marker, 3 /* margin */,
                              1 /* anchor */, scopes->track_pos, NULL);

                    if (tmpibuf->rect_float)
                        IMB_rect_from_float(tmpibuf);

                    if (tmpibuf->rect)
                        scopes->track_preview = tmpibuf;
                    else
                        IMB_freeImBuf(tmpibuf);
                }

                IMB_freeImBuf(ibuf);
            }

            if ((track->flag & TRACK_LOCKED) == 0) {
                scopes->marker = marker;
                scopes->track = track;
                scopes->slide_scale[0] = track->pat_max[0] - track->pat_min[0];
                scopes->slide_scale[1] = track->pat_max[1] - track->pat_min[1];
            }
        }
    }

    scopes->framenr = user->framenr;
    scopes->ok = TRUE;
}