diff options
Diffstat (limited to 'source/blender/editors/space_clip/clip_draw.c')
-rw-r--r-- | source/blender/editors/space_clip/clip_draw.c | 232 |
1 files changed, 217 insertions, 15 deletions
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index d1fd5093974..eb58bdc7696 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -111,6 +111,57 @@ static void draw_keyframe(int frame, int cfra, int sfra, float framelen, int wid } } +static int generic_track_get_markersnr(MovieTrackingTrack *track, MovieTrackingPlaneTrack *plane_track) +{ + if (track) { + return track->markersnr; + } + else if (plane_track) { + return plane_track->markersnr; + } + + return 0; +} + +static int generic_track_get_marker_framenr(MovieTrackingTrack *track, MovieTrackingPlaneTrack *plane_track, + int marker_index) +{ + if (track) { + return track->markers[marker_index].framenr; + } + else if (plane_track) { + return plane_track->markers[marker_index].framenr; + } + + return 0; +} + +static bool generic_track_is_marker_enabled(MovieTrackingTrack *track, MovieTrackingPlaneTrack *plane_track, + int marker_index) +{ + if (track) { + return (track->markers[marker_index].flag & MARKER_DISABLED) == 0; + } + else if (plane_track) { + return true; + } + + return false; +} + +static bool generic_track_is_marker_keyframed(MovieTrackingTrack *track, MovieTrackingPlaneTrack *plane_track, + int marker_index) +{ + if (track) { + return (track->markers[marker_index].flag & MARKER_TRACKED) == 0; + } + else if (plane_track) { + return (plane_track->markers[marker_index].flag & PLANE_MARKER_TRACKED) == 0; + } + + return false; +} + static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Scene *scene) { float x; @@ -119,6 +170,7 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc MovieTracking *tracking = &clip->tracking; MovieTrackingObject *act_object = BKE_tracking_object_get_active(tracking); MovieTrackingTrack *act_track = BKE_tracking_track_get_active(&clip->tracking); + MovieTrackingPlaneTrack *act_plane_track = BKE_tracking_plane_track_get_active(&clip->tracking); MovieTrackingReconstruction *reconstruction = BKE_tracking_get_active_reconstruction(tracking); glEnable(GL_BLEND); @@ -143,34 +195,29 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc } /* track */ - if (act_track) { - MovieTrackingTrack *track = act_track; - + if (act_track || act_plane_track) { for (i = sfra - clip->start_frame + 1, a = 0; i <= efra - clip->start_frame + 1; i++) { int framenr; - MovieTrackingMarker *marker; + int markersnr = generic_track_get_markersnr(act_track, act_plane_track); - while (a < track->markersnr) { - if (track->markers[a].framenr >= i) + while (a < markersnr) { + int marker_framenr = generic_track_get_marker_framenr(act_track, act_plane_track, a); + + if (marker_framenr >= i) break; - if (a < track->markersnr - 1 && track->markers[a + 1].framenr > i) + if (a < markersnr - 1 && generic_track_get_marker_framenr(act_track, act_plane_track, a + 1) > i) break; a++; } - if (a < track->markersnr) - marker = &track->markers[a]; - else - marker = &track->markers[track->markersnr - 1]; - - if ((marker->flag & MARKER_DISABLED) == 0) { - framenr = marker->framenr; + if (generic_track_is_marker_enabled(act_track, act_plane_track, a)) { + framenr = generic_track_get_marker_framenr(act_track, act_plane_track, a); if (framenr != i) glColor4ub(128, 128, 0, 96); - else if ((marker->flag & MARKER_TRACKED) == 0) + else if (generic_track_is_marker_keyframed(act_track, act_plane_track, a)) glColor4ub(255, 255, 0, 196); else glColor4ub(255, 255, 0, 96); @@ -961,13 +1008,159 @@ static void view2d_to_region_float(View2D *v2d, float x, float y, float *regionx *regiony = v2d->mask.ymin + y * BLI_rcti_size_y(&v2d->mask); } +static void plane_track_colors(bool is_active, float color[3], float selected_color[3]) +{ + UI_GetThemeColor3fv(TH_MARKER, color); + + if (is_active) + UI_GetThemeColor3fv(TH_ACT_MARKER, selected_color); + else + UI_GetThemeColor3fv(TH_SEL_MARKER, selected_color); +} + +static void getArrowEndPoint(const int width, const int height, const float zoom, + const float start_corner[2], const float end_corner[2], + float end_point[2]) +{ + float direction[2]; + float max_length; + + sub_v2_v2v2(direction, end_corner, start_corner); + + direction[0] *= width; + direction[1] *= height; + max_length = len_v2(direction); + normalize_v2(direction); + mul_v2_fl(direction, min_ff(32.0f / zoom, max_length)); + direction[0] /= width; + direction[1] /= height; + + add_v2_v2v2(end_point, start_corner, direction); +} + +static void draw_plane_marker_ex(SpaceClip *sc, MovieTrackingPlaneTrack *plane_track, + MovieTrackingPlaneMarker *plane_marker, bool is_active_track, + bool draw_outline, int width, int height) +{ + bool tiny = (sc->flag & SC_SHOW_TINY_MARKER) != 0; + bool is_selected_track = plane_track->flag & SELECT; + float px[2]; + + if (draw_outline) { + UI_ThemeColor(TH_MARKER_OUTLINE); + } + else { + float color[3], selected_color[3]; + plane_track_colors(is_active_track, color, selected_color); + if (is_selected_track) { + glColor3fv(selected_color); + } + else { + glColor3fv(color); + } + } + + px[0] = 1.0f / width / sc->zoom; + px[1] = 1.0f / height / sc->zoom; + + if (draw_outline) { + if (!tiny) { + glLineWidth(3.0f); + } + } + else if (tiny) { + glLineStipple(3, 0xaaaa); + glEnable(GL_LINE_STIPPLE); + glEnable(GL_COLOR_LOGIC_OP); + glLogicOp(GL_NOR); + } + + /* Draw rectangle itself. */ + glBegin(GL_LINE_LOOP); + glVertex2fv(plane_marker->corners[0]); + glVertex2fv(plane_marker->corners[1]); + glVertex2fv(plane_marker->corners[2]); + glVertex2fv(plane_marker->corners[3]); + glEnd(); + + /* Draw axis. */ + if (!draw_outline) { + float end_point[2]; + glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT); + + getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[1], end_point); + glColor3f(1.0, 0.0, 0.0f); + glBegin(GL_LINES); + glVertex2fv(plane_marker->corners[0]); + glVertex2fv(end_point); + glEnd(); + + getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[3], end_point); + glColor3f(0.0, 1.0, 0.0f); + glBegin(GL_LINES); + glVertex2fv(plane_marker->corners[0]); + glVertex2fv(end_point); + glEnd(); + + glPopAttrib(); + } + + /* Draw sliders. */ + if (is_selected_track) { + int i; + for (i = 0; i < 4; i++) { + draw_marker_slide_square(plane_marker->corners[i][0], plane_marker->corners[i][1], + 3.0f * px[0], 3.0f * px[1], draw_outline, px); + } + } + + if (draw_outline) { + if (!tiny) { + glLineWidth(1.0f); + } + } + else if (tiny) { + glDisable(GL_COLOR_LOGIC_OP); + glDisable(GL_LINE_STIPPLE); + glLineStipple(3, 0xaaaa); + glEnable(GL_LINE_STIPPLE); + } +} + +static void draw_plane_marker_outline(SpaceClip *sc, MovieTrackingPlaneTrack *plane_track, + MovieTrackingPlaneMarker *plane_marker, int width, int height) +{ + draw_plane_marker_ex(sc, plane_track, plane_marker, false, true, width, height); +} + +static void draw_plane_marker(SpaceClip *sc, MovieTrackingPlaneTrack *plane_track, + MovieTrackingPlaneMarker *plane_marker, bool is_active_track, + int width, int height) +{ + draw_plane_marker_ex(sc, plane_track, plane_marker, is_active_track, false, width, height); +} + +static void draw_plane_track(SpaceClip *sc, MovieTrackingPlaneTrack *plane_track, + int framenr, bool is_active_track, int width, int height) +{ + MovieTrackingPlaneMarker *plane_marker; + + plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr); + + draw_plane_marker_outline(sc, plane_track, plane_marker, width, height); + draw_plane_marker(sc, plane_track, plane_marker, is_active_track, width, height); +} + +/* Draw all kind of tracks. */ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip, int width, int height, float zoomx, float zoomy) { float x, y; MovieTracking *tracking = &clip->tracking; ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); MovieTrackingTrack *track, *act_track; + MovieTrackingPlaneTrack *plane_track, *active_plane_track; MovieTrackingMarker *marker; int framenr = ED_space_clip_get_clip_frame_number(sc); int undistort = sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT; @@ -1160,6 +1353,15 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip, glDisable(GL_POINT_SMOOTH); } + /* Draw plane tracks */ + active_plane_track = BKE_tracking_plane_track_get_active(tracking); + for (plane_track = plane_tracks_base->first; + plane_track; + plane_track = plane_track->next) + { + draw_plane_track(sc, plane_track, framenr, plane_track == active_plane_track, width, height); + } + glPopMatrix(); if (sc->flag & SC_SHOW_NAMES) { |