void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene) { MovieClip *clip= ED_space_clip(sc); View2D *v2d= &ar->v2d; View2DGrid *grid; short unitx= V2D_UNIT_FRAMESCALE, unity= V2D_UNIT_VALUES; /* grid */ grid= UI_view2d_grid_calc(scene, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy); UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL); UI_view2d_grid_free(grid); if(clip) { if(sc->flag&SC_SHOW_GRAPH_TRACKS) draw_tracks_curves(v2d, sc); if(sc->flag&SC_SHOW_GRAPH_FRAMES) draw_frame_curves(sc); } /* frame range */ draw_graph_sfra_efra(scene, v2d); /* current frame */ draw_graph_cfra(sc, ar, scene); }
static int dopesheet_select_channel_exec(bContext *C, wmOperator *op) { SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip(sc); MovieTracking *tracking = &clip->tracking; MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; MovieTrackingDopesheetChannel *channel; float location[2]; int extend = RNA_boolean_get(op->ptr, "extend"); int current_channel_index = 0, channel_index; RNA_float_get_array(op->ptr, "location", location); channel_index = -(location[1] - (CHANNEL_FIRST + CHANNEL_HEIGHT_HALF)) / CHANNEL_STEP; for (channel = dopesheet->channels.first; channel; channel = channel->next) { MovieTrackingTrack *track = channel->track; if (current_channel_index == channel_index) { if (extend) track->flag ^= TRACK_DOPE_SEL; else track->flag |= TRACK_DOPE_SEL; } else if (!extend) track->flag &= ~TRACK_DOPE_SEL; current_channel_index++; } WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL); return OPERATOR_FINISHED; }
void clip_graph_tracking_iterate(SpaceClip *sc, void *userdata, void (*func) (void *userdata, MovieTrackingMarker *marker)) { MovieClip *clip= ED_space_clip(sc); MovieTracking *tracking= &clip->tracking; MovieTrackingTrack *track; track= tracking->tracks.first; while(track) { if(TRACK_VIEW_SELECTED(sc, track)) { int i; for(i= 0; i<track->markersnr; i++) { MovieTrackingMarker *marker= &track->markers[i]; if(marker->flag&MARKER_DISABLED) continue; if(func) func(userdata, marker); } } track= track->next; } }
static void draw_frame_curves(SpaceClip *sc) { MovieClip *clip= ED_space_clip(sc); MovieTracking *tracking= &clip->tracking; MovieTrackingReconstruction *reconstruction= BKE_tracking_get_reconstruction(tracking); int i, lines= 0, prevfra= 0; glColor3f(0.0f, 0.0f, 1.0f); for(i= 0; i<reconstruction->camnr; i++) { MovieReconstructedCamera *camera= &reconstruction->cameras[i]; if(lines && camera->framenr!=prevfra+1) { glEnd(); lines= 0; } if(!lines) { glBegin(GL_LINE_STRIP); lines= 1; } glVertex2f(camera->framenr, camera->error); prevfra= camera->framenr; } if(lines) glEnd(); }
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); }
void clip_graph_tracking_values_iterate_track(SpaceClip *sc, MovieTrackingTrack *track, void *userdata, void (*func) (void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, float val), void (*segment_start) (void *userdata, MovieTrackingTrack *track, int coord), void (*segment_end) (void *userdata)) { MovieClip *clip= ED_space_clip(sc); int width, height, coord; BKE_movieclip_get_size(clip, &sc->user, &width, &height); for(coord= 0; coord<2; coord++) { int i, open= 0, prevfra= 0; float prevval= 0.0f; for(i= 0; i<track->markersnr; i++) { MovieTrackingMarker *marker= &track->markers[i]; float val; if(marker->flag&MARKER_DISABLED) { if(open) { if(segment_end) segment_end(userdata); open= 0; } continue; } if(!open) { if(segment_start) segment_start(userdata, track, coord); open= 1; prevval= marker->pos[coord]; } /* value is a pixels per frame speed */ val= (marker->pos[coord] - prevval) * ((i==0) ? (width) : (height)); val/= marker->framenr-prevfra; if(func) func(userdata, track, marker, coord, val); prevval= marker->pos[coord]; prevfra= marker->framenr; } if(open) { if(segment_end) segment_end(userdata); } } }
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; }
void clip_graph_tracking_values_iterate(SpaceClip *sc, void *userdata, void (*func) (void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, float val), void (*segment_start) (void *userdata, MovieTrackingTrack *track, int coord), void (*segment_end) (void *userdata)) { MovieClip *clip= ED_space_clip(sc); MovieTracking *tracking= &clip->tracking; MovieTrackingTrack *track; track= tracking->tracks.first; while(track) { if(TRACK_VIEW_SELECTED(sc, track)) { clip_graph_tracking_values_iterate_track(sc, track, userdata, func, segment_start, segment_end); } track= track->next; } }
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; }
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; }
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; }