diff options
Diffstat (limited to 'source/blender/editors/space_clip')
18 files changed, 941 insertions, 897 deletions
diff --git a/source/blender/editors/space_clip/CMakeLists.txt b/source/blender/editors/space_clip/CMakeLists.txt index 32d48c9c564..8fa4a0de53f 100644 --- a/source/blender/editors/space_clip/CMakeLists.txt +++ b/source/blender/editors/space_clip/CMakeLists.txt @@ -27,6 +27,7 @@ set(INC ../../blenkernel ../../blenlib ../../blentranslation + ../../depsgraph ../../imbuf ../../gpu ../../makesdna diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c index ce97d87d0c4..db5f6c2451c 100644 --- a/source/blender/editors/space_clip/clip_buttons.c +++ b/source/blender/editors/space_clip/clip_buttons.c @@ -47,11 +47,12 @@ #include "BLT_translation.h" #include "BKE_context.h" -#include "BKE_depsgraph.h" #include "BKE_screen.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" +#include "DEG_depsgraph.h" + #include "ED_gpencil.h" #include "UI_interface.h" @@ -236,7 +237,7 @@ static void marker_block_handler(bContext *C, void *arg_cb, int event) marker->pos[1] = cb->marker_pos[1] / height; /* to update position of "parented" objects */ - DAG_id_tag_update(&cb->clip->id, 0); + DEG_id_tag_update(&cb->clip->id, 0); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); ok = true; @@ -321,7 +322,7 @@ static void marker_block_handler(bContext *C, void *arg_cb, int event) sub_v2_v2(cb->track->markers[i].pos, delta); /* to update position of "parented" objects */ - DAG_id_tag_update(&cb->clip->id, 0); + DEG_id_tag_update(&cb->clip->id, 0); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); ok = true; @@ -386,7 +387,7 @@ void uiTemplateMarker(uiLayout *layout, PointerRNA *ptr, const char *propname, P else tip = TIP_("Marker is enabled at current frame"); - bt = uiDefIconButBitI(block, UI_BTYPE_TOGGLE_N, MARKER_DISABLED, 0, ICON_RESTRICT_VIEW_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y, + bt = uiDefIconButBitI(block, UI_BTYPE_TOGGLE_N, MARKER_DISABLED, 0, ICON_HIDE_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y, &cb->marker_flag, 0, 0, 1, 0, tip); UI_but_funcN_set(bt, marker_update_cb, cb, NULL); } diff --git a/source/blender/editors/space_clip/clip_dopesheet_draw.c b/source/blender/editors/space_clip/clip_dopesheet_draw.c index 4bf4c1e7baa..d50d10d5cc3 100644 --- a/source/blender/editors/space_clip/clip_dopesheet_draw.c +++ b/source/blender/editors/space_clip/clip_dopesheet_draw.c @@ -42,8 +42,6 @@ #include "ED_screen.h" #include "ED_clip.h" -#include "BIF_gl.h" - #include "WM_types.h" #include "UI_interface.h" @@ -54,6 +52,10 @@ #include "RNA_access.h" +#include "GPU_draw.h" +#include "GPU_immediate.h" +#include "GPU_state.h" + #include "clip_intern.h" /* own include */ static void track_channel_color(MovieTrackingTrack *track, float default_color[3], float color[3]) @@ -72,72 +74,19 @@ static void track_channel_color(MovieTrackingTrack *track, float default_color[3 } } -static void draw_keyframe_shape(float x, float y, float xscale, float yscale, bool sel, float alpha) +static void draw_keyframe_shape(float x, float y, bool sel, float alpha, + unsigned int pos_id, unsigned int color_id) { - /* coordinates for diamond shape */ - static const float _unit_diamond_shape[4][2] = { - {0.0f, 1.0f}, /* top vert */ - {1.0f, 0.0f}, /* mid-right */ - {0.0f, -1.0f}, /* bottom vert */ - {-1.0f, 0.0f} /* mid-left */ - }; - static GLuint displist1 = 0; - static GLuint displist2 = 0; - int hsize = STRIP_HEIGHT_HALF; - - /* initialize 2 display lists for diamond shape - one empty, one filled */ - if (displist1 == 0) { - displist1 = glGenLists(1); - glNewList(displist1, GL_COMPILE); - - glBegin(GL_LINE_LOOP); - glVertex2fv(_unit_diamond_shape[0]); - glVertex2fv(_unit_diamond_shape[1]); - glVertex2fv(_unit_diamond_shape[2]); - glVertex2fv(_unit_diamond_shape[3]); - glEnd(); - glEndList(); + float color[4] = { 0.91f, 0.91f, 0.91f, alpha }; + if (sel) { + UI_GetThemeColorShadeAlpha4fv(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha), color); } - if (displist2 == 0) { - displist2 = glGenLists(1); - glNewList(displist2, GL_COMPILE); - - glBegin(GL_QUADS); - glVertex2fv(_unit_diamond_shape[0]); - glVertex2fv(_unit_diamond_shape[1]); - glVertex2fv(_unit_diamond_shape[2]); - glVertex2fv(_unit_diamond_shape[3]); - glEnd(); - glEndList(); - } - - glPushMatrix(); - - /* adjust view transform before starting */ - glTranslatef(x, y, 0.0f); - glScalef(1.0f / xscale * hsize, 1.0f / yscale * hsize, 1.0f); - - /* anti-aliased lines for more consistent appearance */ - glEnable(GL_LINE_SMOOTH); - - if (sel) - UI_ThemeColorShadeAlpha(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha)); - else - glColor4f(0.91f, 0.91f, 0.91f, alpha); - glCallList(displist2); - - /* exterior - black frame */ - glColor4f(0.0f, 0.0f, 0.0f, alpha); - glCallList(displist1); - - glDisable(GL_LINE_SMOOTH); - - /* restore view transform */ - glPopMatrix(); + immAttrib4fv(color_id, color); + immVertex2f(pos_id, x, y); } -static void clip_draw_dopesheet_background(ARegion *ar, MovieClip *clip) +static void clip_draw_dopesheet_background(ARegion *ar, MovieClip *clip, unsigned int pos_id) { View2D *v2d = &ar->v2d; MovieTracking *tracking = &clip->tracking; @@ -153,12 +102,13 @@ static void clip_draw_dopesheet_background(ARegion *ar, MovieClip *clip) int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, coverage_segment->end_frame); if (coverage_segment->coverage == TRACKING_COVERAGE_BAD) { - glColor4f(1.0f, 0.0f, 0.0f, 0.07f); + immUniformColor4f(1.0f, 0.0f, 0.0f, 0.07f); + } + else { + immUniformColor4f(1.0f, 1.0f, 0.0f, 0.07f); } - else - glColor4f(1.0f, 1.0f, 0.0f, 0.07f); - glRectf(start_frame, v2d->cur.ymin, end_frame, v2d->cur.ymax); + immRectf(pos_id, start_frame, v2d->cur.ymin, end_frame, v2d->cur.ymax); } } } @@ -175,18 +125,21 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) MovieTracking *tracking = &clip->tracking; MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; MovieTrackingDopesheetChannel *channel; - float y, xscale, yscale; float strip[4], selected_strip[4]; float height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT); + unsigned int keyframe_ct = 0; + + Gwn_VertFormat *format = immVertexFormat(); + unsigned int pos_id = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* don't use totrect set, as the width stays the same * (NOTE: this is ok here, the configuration is pretty straightforward) */ v2d->tot.ymin = (float)(-height); - y = (float) CHANNEL_FIRST; - - UI_view2d_scale_get(v2d, &xscale, &yscale); + float y = (float) CHANNEL_FIRST; /* setup colors for regular and selected strips */ UI_GetThemeColor3fv(TH_STRIP, strip); @@ -195,9 +148,9 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) strip[3] = 0.5f; selected_strip[3] = 1.0f; - glEnable(GL_BLEND); + GPU_blend(true); - clip_draw_dopesheet_background(ar, clip); + clip_draw_dopesheet_background(ar, clip, pos_id); for (channel = dopesheet->channels.first; channel; channel = channel->next) { float yminc = (float) (y - CHANNEL_HEIGHT_HALF); @@ -208,7 +161,6 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax)) { MovieTrackingTrack *track = channel->track; - float alpha; int i; bool sel = (track->flag & TRACK_DOPE_SEL) != 0; @@ -218,32 +170,26 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) float default_color[4] = {0.8f, 0.93f, 0.8f, 0.3f}; track_channel_color(track, default_color, color); - glColor4fv(color); + immUniformColor4fv(color); - glRectf(v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF, - v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF); + immRectf(pos_id, v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF, + v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF); } - alpha = (track->flag & TRACK_LOCKED) ? 0.5f : 1.0f; - /* tracked segments */ for (i = 0; i < channel->tot_segment; i++) { int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i]); int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i + 1]); - if (sel) - glColor4fv(selected_strip); - else - glColor4fv(strip); + immUniformColor4fv(sel ? selected_strip : strip); if (start_frame != end_frame) { - glRectf(start_frame, (float) y - STRIP_HEIGHT_HALF, - end_frame, (float) y + STRIP_HEIGHT_HALF); - draw_keyframe_shape(start_frame, y, xscale, yscale, sel, alpha); - draw_keyframe_shape(end_frame, y, xscale, yscale, sel, alpha); + immRectf(pos_id, start_frame, (float) y - STRIP_HEIGHT_HALF, + end_frame, (float) y + STRIP_HEIGHT_HALF); + keyframe_ct += 2; } else { - draw_keyframe_shape(start_frame, y, xscale, yscale, sel, alpha); + keyframe_ct++; } } @@ -253,9 +199,7 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) MovieTrackingMarker *marker = &track->markers[i]; if ((marker->flag & (MARKER_DISABLED | MARKER_TRACKED)) == 0) { - int framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr); - - draw_keyframe_shape(framenr, y, xscale, yscale, sel, alpha); + keyframe_ct++; } i++; @@ -266,11 +210,78 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) y -= CHANNEL_STEP; } - glDisable(GL_BLEND); - } + immUnbindProgram(); + + if (keyframe_ct > 0) { + /* draw keyframe markers */ + format = immVertexFormat(); + pos_id = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + unsigned int size_id = GWN_vertformat_attr_add(format, "size", GWN_COMP_F32, 1, GWN_FETCH_FLOAT); + unsigned int color_id = GWN_vertformat_attr_add(format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); + unsigned int outline_color_id = GWN_vertformat_attr_add(format, "outlineColor", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT); + + immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND); + GPU_enable_program_point_size(); + immBegin(GWN_PRIM_POINTS, keyframe_ct); + + /* all same size with black outline */ + immAttrib1f(size_id, 2.0f * STRIP_HEIGHT_HALF); + immAttrib4ub(outline_color_id, 0, 0, 0, 255); + + y = (float) CHANNEL_FIRST; /* start again at the top */ + for (channel = dopesheet->channels.first; channel; channel = channel->next) { + float yminc = (float) (y - CHANNEL_HEIGHT_HALF); + float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF); + + /* check if visible */ + if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) || + IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax)) + { + MovieTrackingTrack *track = channel->track; + int i; + bool sel = (track->flag & TRACK_DOPE_SEL) != 0; + float alpha = (track->flag & TRACK_LOCKED) ? 0.5f : 1.0f; + + /* tracked segments */ + for (i = 0; i < channel->tot_segment; i++) { + int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i]); + int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i + 1]); + + if (start_frame != end_frame) { + draw_keyframe_shape(start_frame, y, sel, alpha, pos_id, color_id); + draw_keyframe_shape(end_frame, y, sel, alpha, pos_id, color_id); + } + else { + draw_keyframe_shape(start_frame, y, sel, alpha, pos_id, color_id); + } + } + + /* keyframes */ + i = 0; + while (i < track->markersnr) { + MovieTrackingMarker *marker = &track->markers[i]; + + if ((marker->flag & (MARKER_DISABLED | MARKER_TRACKED)) == 0) { + int framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr); + + draw_keyframe_shape(framenr, y, sel, alpha, pos_id, color_id); + } + + i++; + } + } + + /* adjust y-position for next one */ + y -= CHANNEL_STEP; + } + + immEnd(); + GPU_disable_program_point_size(); + immUnbindProgram(); + } - /* current frame */ - clip_draw_cfra(sc, ar, scene); + GPU_blend(false); + } } void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) @@ -279,22 +290,15 @@ void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) SpaceClip *sc = CTX_wm_space_clip(C); View2D *v2d = &ar->v2d; MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking; - MovieTrackingDopesheet *dopesheet; - MovieTrackingDopesheetChannel *channel; uiStyle *style = UI_style_get(); - uiBlock *block; int fontid = style->widget.uifont_id; - int height; - float y; - PropertyRNA *chan_prop_lock; if (!clip) return; - tracking = &clip->tracking; - dopesheet = &tracking->dopesheet; - height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT); + MovieTracking *tracking = &clip->tracking; + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + int height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT); if (height > BLI_rcti_size_y(&v2d->mask)) { /* don't use totrect set, as the width stays the same @@ -309,6 +313,37 @@ void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) /* loop through channels, and set up drawing depending on their type * first pass: just the standard GL-drawing for backdrop + text */ + float y = (float) CHANNEL_FIRST; + + Gwn_VertFormat *format = immVertexFormat(); + unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + + MovieTrackingDopesheetChannel *channel; + for (channel = dopesheet->channels.first; channel; channel = channel->next) { + float yminc = (float) (y - CHANNEL_HEIGHT_HALF); + float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF); + + /* check if visible */ + if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) || + IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax)) + { + MovieTrackingTrack *track = channel->track; + float color[3]; + track_channel_color(track, NULL, color); + immUniformColor3fv(color); + + immRectf(pos, v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF, + v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF); + } + + /* adjust y-position for next one */ + y -= CHANNEL_STEP; + } + immUnbindProgram(); + + /* second pass: text */ y = (float) CHANNEL_FIRST; BLF_size(fontid, 11.0f * U.pixelsize, U.dpi); @@ -322,21 +357,11 @@ void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax)) { MovieTrackingTrack *track = channel->track; - float font_height, color[3]; bool sel = (track->flag & TRACK_DOPE_SEL) != 0; - track_channel_color(track, NULL, color); - glColor3fv(color); - - glRectf(v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF, - v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF); - - if (sel) - UI_ThemeColor(TH_TEXT_HI); - else - UI_ThemeColor(TH_TEXT); + UI_FontThemeColor(fontid, sel ? TH_TEXT_HI : TH_TEXT); - font_height = BLF_height(fontid, channel->name, sizeof(channel->name)); + float font_height = BLF_height(fontid, channel->name, sizeof(channel->name)); BLF_position(fontid, v2d->cur.xmin + CHANNEL_PAD, y - font_height / 2.0f, 0.0f); BLF_draw(fontid, channel->name, strlen(channel->name)); @@ -346,15 +371,15 @@ void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) y -= CHANNEL_STEP; } - /* second pass: widgets */ - block = UI_block_begin(C, ar, __func__, UI_EMBOSS); + /* third pass: widgets */ + uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS); y = (float) CHANNEL_FIRST; /* get RNA properties (once) */ - chan_prop_lock = RNA_struct_type_find_property(&RNA_MovieTrackingTrack, "lock"); + PropertyRNA *chan_prop_lock = RNA_struct_type_find_property(&RNA_MovieTrackingTrack, "lock"); BLI_assert(chan_prop_lock); - glEnable(GL_BLEND); + GPU_blend(true); for (channel = dopesheet->channels.first; channel; channel = channel->next) { float yminc = (float)(y - CHANNEL_HEIGHT_HALF); float ymaxc = (float)(y + CHANNEL_HEIGHT_HALF); @@ -379,7 +404,7 @@ void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar) /* adjust y-position for next one */ y -= CHANNEL_STEP; } - glDisable(GL_BLEND); + GPU_blend(false); UI_block_end(C, block); UI_block_draw(C, block); diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index a71b2baa96f..c0d17fabe0d 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -55,10 +55,12 @@ #include "ED_mask.h" #include "ED_gpencil.h" -#include "BIF_gl.h" #include "BIF_glutil.h" -#include "GPU_basic_shader.h" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" +#include "GPU_state.h" #include "WM_types.h" @@ -66,26 +68,25 @@ #include "UI_resources.h" #include "UI_view2d.h" - #include "BLF_api.h" #include "clip_intern.h" // own include /*********************** main area drawing *************************/ -static void draw_keyframe(int frame, int cfra, int sfra, float framelen, int width) +static void draw_keyframe(int frame, int cfra, int sfra, float framelen, int width, unsigned int pos) { int height = (frame == cfra) ? 22 : 10; int x = (frame - sfra) * framelen; if (width == 1) { - glBegin(GL_LINES); - glVertex2i(x, 0); - glVertex2i(x, height * UI_DPI_FAC); - glEnd(); + immBegin(GWN_PRIM_LINES, 2); + immVertex2i(pos, x, 0); + immVertex2i(pos, x, height * UI_DPI_FAC); + immEnd(); } else { - glRecti(x, 0, x + width, height * UI_DPI_FAC); + immRecti(pos, x, 0, x + width, height * UI_DPI_FAC); } } @@ -156,8 +157,8 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc MovieTrackingPlaneTrack *act_plane_track = BKE_tracking_plane_track_get_active(&clip->tracking); MovieTrackingReconstruction *reconstruction = BKE_tracking_get_active_reconstruction(tracking); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GPU_blend(true); + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); /* cache background */ ED_region_cache_draw_background(ar); @@ -166,6 +167,9 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc BKE_movieclip_get_cache_segments(clip, &sc->user, &totseg, &points); ED_region_cache_draw_cached_segments(ar, totseg, points, sfra, efra); + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* track */ if (act_track || act_plane_track) { for (i = sfra - clip->start_frame + 1, a = 0; i <= efra - clip->start_frame + 1; i++) { @@ -189,14 +193,17 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc 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 (generic_track_is_marker_keyframed(act_track, act_plane_track, a)) - glColor4ub(255, 255, 0, 196); - else - glColor4ub(255, 255, 0, 96); + if (framenr != i) { + immUniformColor4ub(128, 128, 0, 96); + } + else if (generic_track_is_marker_keyframed(act_track, act_plane_track, a)) { + immUniformColor4ub(255, 255, 0, 196); + } + else { + immUniformColor4ub(255, 255, 0, 96); + } - glRecti((i - sfra + clip->start_frame - 1) * framelen, 0, (i - sfra + clip->start_frame) * framelen, 4 * UI_DPI_FAC); + immRecti(pos, (i - sfra + clip->start_frame - 1) * framelen, 0, (i - sfra + clip->start_frame) * framelen, 4 * UI_DPI_FAC); } } } @@ -206,7 +213,7 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc int n = reconstruction->camnr; MovieReconstructedCamera *cameras = reconstruction->cameras; - glColor4ub(255, 0, 0, 96); + immUniformColor4ub(255, 0, 0, 96); for (i = sfra, a = 0; i <= efra; i++) { bool ok = false; @@ -223,25 +230,33 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc a++; } - if (!ok) - glRecti((i - sfra + clip->start_frame - 1) * framelen, 0, (i - sfra + clip->start_frame) * framelen, 8 * UI_DPI_FAC); + if (!ok) { + immRecti(pos, (i - sfra + clip->start_frame - 1) * framelen, 0, (i - sfra + clip->start_frame) * framelen, 8 * UI_DPI_FAC); + } } } - glDisable(GL_BLEND); + GPU_blend(false); /* current frame */ x = (sc->user.framenr - sfra) / (efra - sfra + 1) * ar->winx; - UI_ThemeColor(TH_CFRAME); - glRecti(x, 0, x + ceilf(framelen), 8 * UI_DPI_FAC); + immUniformThemeColor(TH_CFRAME); + immRecti(pos, x, 0, x + ceilf(framelen), 8 * UI_DPI_FAC); + + immUnbindProgram(); ED_region_cache_draw_curfra_label(sc->user.framenr, x, 8.0f * UI_DPI_FAC); + pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* solver keyframes */ - glColor4ub(175, 255, 0, 255); - draw_keyframe(act_object->keyframe1 + clip->start_frame - 1, CFRA, sfra, framelen, 2); - draw_keyframe(act_object->keyframe2 + clip->start_frame - 1, CFRA, sfra, framelen, 2); + immUniformColor4ub(175, 255, 0, 255); + draw_keyframe(act_object->keyframe1 + clip->start_frame - 1, CFRA, sfra, framelen, 2, pos); + draw_keyframe(act_object->keyframe2 + clip->start_frame - 1, CFRA, sfra, framelen, 2, pos); + + immUnbindProgram(); /* movie clip animation */ if ((sc->mode == SC_MODE_MASKEDIT) && sc->mask_info.mask) { @@ -275,11 +290,16 @@ static void draw_movieclip_muted(ARegion *ar, int width, int height, float zoomx { int x, y; + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* find window pixel coordinates of origin */ UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &x, &y); - glColor3f(0.0f, 0.0f, 0.0f); - glRectf(x, y, x + zoomx * width, y + zoomy * height); + immUniformColor3f(0.0f, 0.0f, 0.0f); + immRectf(pos, x, y, x + zoomx * width, y + zoomy * height); + + immUnbindProgram(); } static void draw_movieclip_buffer(const bContext *C, SpaceClip *sc, ARegion *ar, ImBuf *ibuf, @@ -294,10 +314,10 @@ static void draw_movieclip_buffer(const bContext *C, SpaceClip *sc, ARegion *ar, /* checkerboard for case alpha */ if (ibuf->planes == 32) { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GPU_blend(true); + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); - fdrawcheckerboard(x, y, x + zoomx * ibuf->x, y + zoomy * ibuf->y); + imm_draw_box_checker_2d(x, y, x + zoomx * ibuf->x, y + zoomy * ibuf->y); } /* non-scaled proxy shouldn't use filtering */ @@ -307,13 +327,7 @@ static void draw_movieclip_buffer(const bContext *C, SpaceClip *sc, ARegion *ar, filter = GL_NEAREST; } - /* set zoom */ - glPixelZoom(zoomx * width / ibuf->x, zoomy * height / ibuf->y); - - glaDrawImBuf_glsl_ctx(C, ibuf, x, y, filter); - /* reset zoom */ - glPixelZoom(1.0f, 1.0f); - + glaDrawImBuf_glsl_ctx(C, ibuf, x, y, filter, zoomx * width / ibuf->x, zoomy * height / ibuf->y); if (sc->flag & SC_SHOW_METADATA) { rctf frame; @@ -322,7 +336,7 @@ static void draw_movieclip_buffer(const bContext *C, SpaceClip *sc, ARegion *ar, } if (ibuf->planes == 32) - glDisable(GL_BLEND); + GPU_blend(false); } static void draw_stabilization_border(SpaceClip *sc, ARegion *ar, int width, int height, float zoomx, float zoomy) @@ -335,31 +349,37 @@ static void draw_stabilization_border(SpaceClip *sc, ARegion *ar, int width, int /* draw boundary border for frame if stabilization is enabled */ if (sc->flag & SC_SHOW_STABLE && clip->tracking.stabilization.flag & TRACKING_2D_STABILIZATION) { - glColor3f(0.0f, 0.0f, 0.0f); - - GPU_basic_shader_bind_enable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); - GPU_basic_shader_line_stipple(3, 0xAAAA); + const uint shdr_pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + /* Exclusive OR allows to get orig value when second operand is 0, + * and negative of orig value when second operand is 1. */ glEnable(GL_COLOR_LOGIC_OP); - glLogicOp(GL_NOR); + glLogicOp(GL_XOR); + + gpuPushMatrix(); + gpuTranslate2f(x, y); + + gpuScale2f(zoomx, zoomy); + gpuMultMatrix(sc->stabmat); + + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); + + float viewport_size[4]; + GPU_viewport_size_getf(viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); - glPushMatrix(); - glTranslatef(x, y, 0.0f); + immUniform1i("colors_len", 0); /* "simple" mode */ + immUniformColor4f(1.0f, 1.0f, 1.0f, 0.0f); + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_factor", 0.5f); - glScalef(zoomx, zoomy, 1.0f); - glMultMatrixf(sc->stabmat); + imm_draw_box_wire_2d(shdr_pos, 0.0f, 0.0f, width, height); - glBegin(GL_LINE_LOOP); - glVertex2f(0.0f, 0.0f); - glVertex2f(width, 0.0f); - glVertex2f(width, height); - glVertex2f(0.0f, height); - glEnd(); + immUnbindProgram(); - glPopMatrix(); + gpuPopMatrix(); glDisable(GL_COLOR_LOGIC_OP); - GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); } } @@ -432,53 +452,97 @@ static void draw_track_path(SpaceClip *sc, MovieClip *UNUSED(clip), MovieTrackin i++; } + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + if (!tiny) { - UI_ThemeColor(TH_MARKER_OUTLINE); + immUniformThemeColor(TH_MARKER_OUTLINE); if (TRACK_VIEW_SELECTED(sc, track)) { - glPointSize(5.0f); - glBegin(GL_POINTS); + if ((b - a - 1) >= 1) { + GPU_point_size(5.0f); + + immBegin(GWN_PRIM_POINTS, b - a - 1); + + for (i = a; i < b; i++) { + if (i != curindex) { + immVertex2f(pos, path[i][0], path[i][1]); + } + } + + immEnd(); + } + } + + if ((b - a) >= 2) { + GPU_line_width(3.0f); + + immBegin(GWN_PRIM_LINE_STRIP, b - a); + for (i = a; i < b; i++) { - if (i != curindex) - glVertex2f(path[i][0], path[i][1]); + immVertex2f(pos, path[i][0], path[i][1]); } - glEnd(); + + immEnd(); } + } + + if (TRACK_VIEW_SELECTED(sc, track)) { + GPU_point_size(3.0f); + + if ((curindex - a) >= 1) { + immUniformThemeColor(TH_PATH_BEFORE); - glLineWidth(3.0f); - glBegin(GL_LINE_STRIP); - for (i = a; i < b; i++) - glVertex2f(path[i][0], path[i][1]); - glEnd(); + immBegin(GWN_PRIM_POINTS, curindex - a); + + for (i = a; i < curindex; i++) { + immVertex2f(pos, path[i][0], path[i][1]); + } + + immEnd(); + } + + if ((b - curindex - 1) >= 1) { + immUniformThemeColor(TH_PATH_AFTER); + + immBegin(GWN_PRIM_POINTS, b - curindex - 1); + + for (i = curindex + 1; i < b; i++) { + immVertex2f(pos, path[i][0], path[i][1]); + } + + immEnd(); + } } - UI_ThemeColor(TH_PATH_BEFORE); + GPU_line_width(1); - if (TRACK_VIEW_SELECTED(sc, track)) { - glPointSize(3.0f); - glBegin(GL_POINTS); - for (i = a; i < b; i++) { - if (i == count + 1) - UI_ThemeColor(TH_PATH_AFTER); - - if (i != curindex) - glVertex2f(path[i][0], path[i][1]); + if ((curindex - a + 1) >= 2) { + immUniformThemeColor(TH_PATH_BEFORE); + + immBegin(GWN_PRIM_LINE_STRIP, curindex - a + 1); + + for (i = a; i <= curindex; i++) { + immVertex2f(pos, path[i][0], path[i][1]); } - glEnd(); + + immEnd(); } - UI_ThemeColor(TH_PATH_BEFORE); + if ((b - curindex) >= 2) { + immUniformThemeColor(TH_PATH_AFTER); - glLineWidth(1); + immBegin(GWN_PRIM_LINE_STRIP, b - curindex); - glBegin(GL_LINE_STRIP); - for (i = a; i < b; i++) { - if (i == count + 1) - UI_ThemeColor(TH_PATH_AFTER); + for (i = curindex; i < b; i++) { + immVertex2f(pos, path[i][0], path[i][1]); + } - glVertex2f(path[i][0], path[i][1]); + immEnd(); } - glEnd(); + + immUnbindProgram(); if (path != path_static) { MEM_freeN(path); @@ -487,18 +551,18 @@ static void draw_track_path(SpaceClip *sc, MovieClip *UNUSED(clip), MovieTrackin } static void draw_marker_outline(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker, - const float marker_pos[2], int width, int height) + const float marker_pos[2], int width, int height, unsigned int position) { int tiny = sc->flag & SC_SHOW_TINY_MARKER; bool show_search = false; float px[2]; - UI_ThemeColor(TH_MARKER_OUTLINE); - px[0] = 1.0f / width / sc->zoom; px[1] = 1.0f / height / sc->zoom; - glLineWidth(tiny ? 1.0f : 3.0f); + GPU_line_width(tiny ? 1.0f : 3.0f); + + immUniformThemeColor(TH_MARKER_OUTLINE); if ((marker->flag & MARKER_DISABLED) == 0) { float pos[2]; @@ -513,52 +577,55 @@ static void draw_marker_outline(SpaceClip *sc, MovieTrackingTrack *track, MovieT if (isect_point_quad_v2(p, marker->pattern_corners[0], marker->pattern_corners[1], marker->pattern_corners[2], marker->pattern_corners[3])) { - glPointSize(tiny ? 3.0f : 4.0f); - glBegin(GL_POINTS); - glVertex2f(pos[0], pos[1]); - glEnd(); + GPU_point_size(tiny ? 3.0f : 4.0f); + + immBegin(GWN_PRIM_POINTS, 1); + immVertex2f(position, pos[0], pos[1]); + immEnd(); } else { - glBegin(GL_LINES); - glVertex2f(pos[0] + px[0] * 2, pos[1]); - glVertex2f(pos[0] + px[0] * 8, pos[1]); + immBegin(GWN_PRIM_LINES, 8); + + immVertex2f(position, pos[0] + px[0] * 2, pos[1]); + immVertex2f(position, pos[0] + px[0] * 8, pos[1]); - glVertex2f(pos[0] - px[0] * 2, pos[1]); - glVertex2f(pos[0] - px[0] * 8, pos[1]); + immVertex2f(position, pos[0] - px[0] * 2, pos[1]); + immVertex2f(position, pos[0] - px[0] * 8, pos[1]); - glVertex2f(pos[0], pos[1] - px[1] * 2); - glVertex2f(pos[0], pos[1] - px[1] * 8); + immVertex2f(position, pos[0], pos[1] - px[1] * 2); + immVertex2f(position, pos[0], pos[1] - px[1] * 8); - glVertex2f(pos[0], pos[1] + px[1] * 2); - glVertex2f(pos[0], pos[1] + px[1] * 8); - glEnd(); + immVertex2f(position, pos[0], pos[1] + px[1] * 2); + immVertex2f(position, pos[0], pos[1] + px[1] * 8); + + immEnd(); } } /* pattern and search outline */ - glPushMatrix(); - glTranslate2fv(marker_pos); + gpuPushMatrix(); + gpuTranslate2fv(marker_pos); if (sc->flag & SC_SHOW_MARKER_PATTERN) { - glBegin(GL_LINE_LOOP); - glVertex2fv(marker->pattern_corners[0]); - glVertex2fv(marker->pattern_corners[1]); - glVertex2fv(marker->pattern_corners[2]); - glVertex2fv(marker->pattern_corners[3]); - glEnd(); + immBegin(GWN_PRIM_LINE_LOOP, 4); + immVertex2fv(position, marker->pattern_corners[0]); + immVertex2fv(position, marker->pattern_corners[1]); + immVertex2fv(position, marker->pattern_corners[2]); + immVertex2fv(position, marker->pattern_corners[3]); + immEnd(); } show_search = (TRACK_VIEW_SELECTED(sc, track) && ((marker->flag & MARKER_DISABLED) == 0 || (sc->flag & SC_SHOW_MARKER_PATTERN) == 0)) != 0; + if (sc->flag & SC_SHOW_MARKER_SEARCH && show_search) { - glBegin(GL_LINE_LOOP); - glVertex2f(marker->search_min[0], marker->search_min[1]); - glVertex2f(marker->search_max[0], marker->search_min[1]); - glVertex2f(marker->search_max[0], marker->search_max[1]); - glVertex2f(marker->search_min[0], marker->search_max[1]); - glEnd(); - } - glPopMatrix(); + imm_draw_box_wire_2d(position, marker->search_min[0], + marker->search_min[1], + marker->search_max[0], + marker->search_max[1]); + } + + gpuPopMatrix(); } static void track_colors(MovieTrackingTrack *track, int act, float col[3], float scol[3]) @@ -582,36 +649,48 @@ static void track_colors(MovieTrackingTrack *track, int act, float col[3], float } static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker, - const float marker_pos[2], int width, int height, int act, int sel) + const float marker_pos[2], int width, int height, int act, int sel, const uint shdr_pos) { int tiny = sc->flag & SC_SHOW_TINY_MARKER; bool show_search = false; - float col[3], scol[3], px[2]; + float col[3], scol[3]; + float px[2]; track_colors(track, act, col, scol); px[0] = 1.0f / width / sc->zoom; px[1] = 1.0f / height / sc->zoom; - glLineWidth(1.0f); + GPU_line_width(1.0f); + + /* Since we are switching solid and dashed lines in rather complex logic here, just always go with dashed shader. */ + immUnbindProgram(); + + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); + + float viewport_size[4]; + GPU_viewport_size_getf(viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); + + immUniform1i("colors_len", 0); /* "simple" mode */ /* marker position and offset position */ if ((track->flag & SELECT) == sel && (marker->flag & MARKER_DISABLED) == 0) { float pos[2], p[2]; if (track->flag & TRACK_LOCKED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else if (track->flag & SELECT) - UI_ThemeColorShade(TH_LOCK_MARKER, 64); - else - UI_ThemeColor(TH_LOCK_MARKER); + if (act) { + immUniformThemeColor(TH_ACT_MARKER); + } + else if (track->flag & SELECT) { + immUniformThemeColorShade(TH_LOCK_MARKER, 64); + } + else { + immUniformThemeColor(TH_LOCK_MARKER); + } } else { - if (track->flag & SELECT) - glColor3fv(scol); - else - glColor3fv(col); + immUniformColor3fv((track->flag & SELECT) ? scol : col); } add_v2_v2v2(pos, marker->pos, track->offset); @@ -622,124 +701,115 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra if (isect_point_quad_v2(p, marker->pattern_corners[0], marker->pattern_corners[1], marker->pattern_corners[2], marker->pattern_corners[3])) { - glPointSize(tiny ? 1.0f : 2.0f); - glBegin(GL_POINTS); - glVertex2f(pos[0], pos[1]); - glEnd(); + GPU_point_size(tiny ? 1.0f : 2.0f); + + immUniform1f("dash_factor", 2.0f); /* Solid "line" */ + + immBegin(GWN_PRIM_POINTS, 1); + immVertex2f(shdr_pos, pos[0], pos[1]); + immEnd(); } else { - glBegin(GL_LINES); - glVertex2f(pos[0] + px[0] * 3, pos[1]); - glVertex2f(pos[0] + px[0] * 7, pos[1]); + immUniform1f("dash_factor", 2.0f); /* Solid line */ + + immBegin(GWN_PRIM_LINES, 8); + + immVertex2f(shdr_pos, pos[0] + px[0] * 3, pos[1]); + immVertex2f(shdr_pos, pos[0] + px[0] * 7, pos[1]); + + immVertex2f(shdr_pos, pos[0] - px[0] * 3, pos[1]); + immVertex2f(shdr_pos, pos[0] - px[0] * 7, pos[1]); + + immVertex2f(shdr_pos, pos[0], pos[1] - px[1] * 3); + immVertex2f(shdr_pos, pos[0], pos[1] - px[1] * 7); - glVertex2f(pos[0] - px[0] * 3, pos[1]); - glVertex2f(pos[0] - px[0] * 7, pos[1]); + immVertex2f(shdr_pos, pos[0], pos[1] + px[1] * 3); + immVertex2f(shdr_pos, pos[0], pos[1] + px[1] * 7); - glVertex2f(pos[0], pos[1] - px[1] * 3); - glVertex2f(pos[0], pos[1] - px[1] * 7); + immEnd(); - glVertex2f(pos[0], pos[1] + px[1] * 3); - glVertex2f(pos[0], pos[1] + px[1] * 7); - glEnd(); + immUniformColor4f(1.0f, 1.0f, 1.0f, 0.0f); + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_factor", 0.5f); - glColor3f(0.0f, 0.0f, 0.0f); - GPU_basic_shader_bind_enable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); - GPU_basic_shader_line_stipple(3, 0xAAAA); glEnable(GL_COLOR_LOGIC_OP); - glLogicOp(GL_NOR); + glLogicOp(GL_XOR); - glBegin(GL_LINES); - glVertex2fv(pos); - glVertex2fv(marker_pos); - glEnd(); + immBegin(GWN_PRIM_LINES, 2); + immVertex2fv(shdr_pos, pos); + immVertex2fv(shdr_pos, marker_pos); + immEnd(); glDisable(GL_COLOR_LOGIC_OP); - GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); } } /* pattern */ - glPushMatrix(); - glTranslate2fv(marker_pos); + gpuPushMatrix(); + gpuTranslate2fv(marker_pos); - if (tiny) { - GPU_basic_shader_bind_enable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); - GPU_basic_shader_line_stipple(3, 0xAAAA); - } - else { - GPU_basic_shader_bind_enable(GPU_SHADER_LINE); - } - - if ((track->pat_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_PATTERN)) { - if (track->flag & TRACK_LOCKED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else if (track->pat_flag & SELECT) - UI_ThemeColorShade(TH_LOCK_MARKER, 64); - else UI_ThemeColor(TH_LOCK_MARKER); + if (track->flag & TRACK_LOCKED) { + if (act) { + immUniformThemeColor(TH_ACT_MARKER); } - else if (marker->flag & MARKER_DISABLED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else if (track->pat_flag & SELECT) - UI_ThemeColorShade(TH_DIS_MARKER, 128); - else UI_ThemeColor(TH_DIS_MARKER); + else if (track->pat_flag & SELECT) { + immUniformThemeColorShade(TH_LOCK_MARKER, 64); } else { - if (track->pat_flag & SELECT) - glColor3fv(scol); - else glColor3fv(col); + immUniformThemeColor(TH_LOCK_MARKER); } - - glBegin(GL_LINE_LOOP); - glVertex2fv(marker->pattern_corners[0]); - glVertex2fv(marker->pattern_corners[1]); - glVertex2fv(marker->pattern_corners[2]); - glVertex2fv(marker->pattern_corners[3]); - glEnd(); } - - /* search */ - show_search = (TRACK_VIEW_SELECTED(sc, track) && - ((marker->flag & MARKER_DISABLED) == 0 || (sc->flag & SC_SHOW_MARKER_PATTERN) == 0)) != 0; - if ((track->search_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_SEARCH) && show_search) { - if (track->flag & TRACK_LOCKED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else if (track->search_flag & SELECT) - UI_ThemeColorShade(TH_LOCK_MARKER, 64); - else UI_ThemeColor(TH_LOCK_MARKER); + else if (marker->flag & MARKER_DISABLED) { + if (act) { + immUniformThemeColor(TH_ACT_MARKER); } - else if (marker->flag & MARKER_DISABLED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else if (track->search_flag & SELECT) - UI_ThemeColorShade(TH_DIS_MARKER, 128); - else UI_ThemeColor(TH_DIS_MARKER); + else if (track->pat_flag & SELECT) { + immUniformThemeColorShade(TH_DIS_MARKER, 128); } else { - if (track->search_flag & SELECT) - glColor3fv(scol); - else - glColor3fv(col); + immUniformThemeColor(TH_DIS_MARKER); } - - glBegin(GL_LINE_LOOP); - glVertex2f(marker->search_min[0], marker->search_min[1]); - glVertex2f(marker->search_max[0], marker->search_min[1]); - glVertex2f(marker->search_max[0], marker->search_max[1]); - glVertex2f(marker->search_min[0], marker->search_max[1]); - glEnd(); + } + else { + immUniformColor3fv((track->pat_flag & SELECT) ? scol : col); } if (tiny) { - GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_factor", 0.5f); } else { - GPU_basic_shader_bind_disable(GPU_SHADER_LINE); + immUniform1f("dash_factor", 2.0f); /* Solid line */ + } + + if ((track->pat_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_PATTERN)) { + immBegin(GWN_PRIM_LINE_LOOP, 4); + immVertex2fv(shdr_pos, marker->pattern_corners[0]); + immVertex2fv(shdr_pos, marker->pattern_corners[1]); + immVertex2fv(shdr_pos, marker->pattern_corners[2]); + immVertex2fv(shdr_pos, marker->pattern_corners[3]); + immEnd(); + } + + /* search */ + show_search = (TRACK_VIEW_SELECTED(sc, track) && + ((marker->flag & MARKER_DISABLED) == 0 || (sc->flag & SC_SHOW_MARKER_PATTERN) == 0)) != 0; + + if ((track->search_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_SEARCH) && show_search) { + imm_draw_box_wire_2d(shdr_pos, marker->search_min[0], marker->search_min[1], + marker->search_max[0], marker->search_max[1]); } - glPopMatrix(); + gpuPopMatrix(); + + /* Restore default shader */ + immUnbindProgram(); + + const uint pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + BLI_assert(pos == shdr_pos); + UNUSED_VARS_NDEBUG(pos); + + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); } static float get_shortest_pattern_side(MovieTrackingMarker *marker) @@ -760,7 +830,7 @@ static float get_shortest_pattern_side(MovieTrackingMarker *marker) return sqrtf(len_sq); } -static void draw_marker_slide_square(float x, float y, float dx, float dy, int outline, float px[2]) +static void draw_marker_slide_square(float x, float y, float dx, float dy, int outline, float px[2], unsigned int pos) { float tdx, tdy; @@ -772,15 +842,10 @@ static void draw_marker_slide_square(float x, float y, float dx, float dy, int o tdy += px[1]; } - glBegin(GL_QUADS); - glVertex3f(x - tdx, y + tdy, 0.0f); - glVertex3f(x + tdx, y + tdy, 0.0f); - glVertex3f(x + tdx, y - tdy, 0.0f); - glVertex3f(x - tdx, y - tdy, 0.0f); - glEnd(); + immRectf(pos, x - tdx, y - tdy, x + tdx, y + tdy); } -static void draw_marker_slide_triangle(float x, float y, float dx, float dy, int outline, float px[2]) +static void draw_marker_slide_triangle(float x, float y, float dx, float dy, int outline, float px[2], unsigned int pos) { float tdx, tdy; @@ -792,15 +857,16 @@ static void draw_marker_slide_triangle(float x, float y, float dx, float dy, int tdy += px[1]; } - glBegin(GL_TRIANGLES); - glVertex3f(x, y, 0.0f); - glVertex3f(x - tdx, y, 0.0f); - glVertex3f(x, y + tdy, 0.0f); - glEnd(); + immBegin(GWN_PRIM_TRIS, 3); + immVertex2f(pos, x, y); + immVertex2f(pos, x - tdx, y); + immVertex2f(pos, x, y + tdy); + immEnd(); } static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker, - const float marker_pos[2], int outline, int sel, int act, int width, int height) + const float marker_pos[2], int outline, int sel, int act, + int width, int height, unsigned int pos) { float dx, dy, patdx, patdy, searchdx, searchdy; int tiny = sc->flag & SC_SHOW_TINY_MARKER; @@ -815,11 +881,11 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo track_colors(track, act, col, scol); if (outline) { - UI_ThemeColor(TH_MARKER_OUTLINE); + immUniformThemeColor(TH_MARKER_OUTLINE); } - glPushMatrix(); - glTranslate2fv(marker_pos); + gpuPushMatrix(); + gpuTranslate2fv(marker_pos); dx = 6.0f / width / sc->zoom; dy = 6.0f / height / sc->zoom; @@ -836,17 +902,14 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo if ((sc->flag & SC_SHOW_MARKER_SEARCH) && ((track->search_flag & SELECT) == sel || outline)) { if (!outline) { - if (track->search_flag & SELECT) - glColor3fv(scol); - else - glColor3fv(col); + immUniformColor3fv((track->search_flag & SELECT) ? scol : col); } /* search offset square */ - draw_marker_slide_square(marker->search_min[0], marker->search_max[1], searchdx, searchdy, outline, px); + draw_marker_slide_square(marker->search_min[0], marker->search_max[1], searchdx, searchdy, outline, px, pos); /* search re-sizing triangle */ - draw_marker_slide_triangle(marker->search_max[0], marker->search_min[1], searchdx, searchdy, outline, px); + draw_marker_slide_triangle(marker->search_max[0], marker->search_min[1], searchdx, searchdy, outline, px, pos); } if ((sc->flag & SC_SHOW_MARKER_PATTERN) && ((track->pat_flag & SELECT) == sel || outline)) { @@ -856,16 +919,13 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo float tilt_ctrl[2]; if (!outline) { - if (track->pat_flag & SELECT) - glColor3fv(scol); - else - glColor3fv(col); + immUniformColor3fv((track->pat_flag & SELECT) ? scol : col); } /* pattern's corners sliding squares */ for (i = 0; i < 4; i++) { draw_marker_slide_square(marker->pattern_corners[i][0], marker->pattern_corners[i][1], - patdx / 1.5f, patdy / 1.5f, outline, px); + patdx / 1.5f, patdy / 1.5f, outline, px, pos); } /* ** sliders to control overall pattern ** */ @@ -873,20 +933,18 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); - glLineWidth(outline ? 3.0f : 1.0f); - - glBegin(GL_LINES); - glVertex2f(0.0f, 0.0f); - glVertex2fv(tilt_ctrl); - glEnd(); + GPU_line_width(outline ? 3.0f : 1.0f); - GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); + immBegin(GWN_PRIM_LINES, 2); + immVertex2f(pos, 0.0f, 0.0f); + immVertex2fv(pos, tilt_ctrl); + immEnd(); /* slider to control pattern tilt */ - draw_marker_slide_square(tilt_ctrl[0], tilt_ctrl[1], patdx, patdy, outline, px); + draw_marker_slide_square(tilt_ctrl[0], tilt_ctrl[1], patdx, patdy, outline, px, pos); } - glPopMatrix(); + gpuPopMatrix(); } static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker, @@ -904,16 +962,17 @@ static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTra fontsize = BLF_height_max(fontid); if (marker->flag & MARKER_DISABLED) { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else - UI_ThemeColorShade(TH_DIS_MARKER, 128); + if (act) { + UI_FontThemeColor(fontid, TH_ACT_MARKER); + } + else { + unsigned char color[4]; + UI_GetThemeColorShade4ubv(TH_DIS_MARKER, 128, color); + BLF_color4ubv(fontid, color); + } } else { - if (act) - UI_ThemeColor(TH_ACT_MARKER); - else - UI_ThemeColor(TH_SEL_MARKER); + UI_FontThemeColor(fontid, act ? TH_ACT_MARKER : TH_SEL_MARKER); } if ((sc->flag & SC_SHOW_MARKER_SEARCH) && @@ -974,10 +1033,7 @@ static void plane_track_colors(bool is_active, float color[3], float selected_co { UI_GetThemeColor3fv(TH_MARKER, color); - if (is_active) - UI_GetThemeColor3fv(TH_ACT_MARKER, selected_color); - else - UI_GetThemeColor3fv(TH_SEL_MARKER, selected_color); + UI_GetThemeColor3fv(is_active ? TH_ACT_MARKER : TH_SEL_MARKER, selected_color); } static void getArrowEndPoint(const int width, const int height, const float zoom, @@ -1070,15 +1126,13 @@ static void draw_plane_marker_image(Scene *scene, if (plane_track->image_opacity != 1.0f || ibuf->planes == 32) { transparent = true; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GPU_blend(true); + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } - glColor4f(1.0, 1.0, 1.0, plane_track->image_opacity); - - GPU_basic_shader_bind(GPU_SHADER_TEXTURE_2D | GPU_SHADER_USE_COLOR); glGenTextures(1, (GLuint *)&texid); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -1087,23 +1141,41 @@ static void draw_plane_marker_image(Scene *scene, glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, display_buffer); - glPushMatrix(); - glMultMatrixf(gl_matrix); + gpuPushMatrix(); + gpuMultMatrix(gl_matrix); + + Gwn_VertFormat *imm_format = immVertexFormat(); + unsigned int pos = GWN_vertformat_attr_add(imm_format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + unsigned int texCoord = GWN_vertformat_attr_add(imm_format, "texCoord", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_COLOR); + immUniformColor4f(1.0f, 1.0f, 1.0f, plane_track->image_opacity); + immUniform1i("image", 0); + + immBegin(GWN_PRIM_TRI_FAN, 4); + + immAttrib2f(texCoord, 0.0f, 0.0f); + immVertex2f(pos, 0.0f, 0.0f); + + immAttrib2f(texCoord, 1.0f, 0.0f); + immVertex2f(pos, 1.0f, 0.0f); + + immAttrib2f(texCoord, 1.0f, 1.0f); + immVertex2f(pos, 1.0f, 1.0f); + + immAttrib2f(texCoord, 0.0f, 1.0f); + immVertex2f(pos, 0.0f, 1.0f); + + immEnd(); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); - glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 0.0f); - glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f); - glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f); - glEnd(); + immUnbindProgram(); - glPopMatrix(); + gpuPopMatrix(); glBindTexture(GL_TEXTURE_2D, 0); - GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); if (transparent) { - glDisable(GL_BLEND); + GPU_blend(false); } } @@ -1123,20 +1195,7 @@ static void draw_plane_marker_ex(SpaceClip *sc, Scene *scene, MovieTrackingPlane BKE_image_has_ibuf(plane_track->image, NULL); const bool draw_plane_quad = !has_image || plane_track->image_opacity == 0.0f; 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); - } - } + float color[3], selected_color[3]; px[0] = 1.0f / width / sc->zoom; px[1] = 1.0f / height / sc->zoom; @@ -1146,66 +1205,92 @@ static void draw_plane_marker_ex(SpaceClip *sc, Scene *scene, MovieTrackingPlane draw_plane_marker_image(scene, plane_track, plane_marker); } - if (draw_plane_quad) { + if (draw_plane_quad || is_selected_track) { + const uint shdr_pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); - const bool stipple = !draw_outline && tiny; - const bool thick = draw_outline && !tiny; + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); - if (stipple) { - GPU_basic_shader_bind_enable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); - GPU_basic_shader_line_stipple(3, 0xAAAA); - } - else { - GPU_basic_shader_bind_enable(GPU_SHADER_LINE); - } + float viewport_size[4]; + GPU_viewport_size_getf(viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); - GPU_basic_shader_line_width(thick ? 3.0f : 1.0f); + immUniform1i("colors_len", 0); /* "simple" mode */ - /* 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(); + if (draw_plane_quad) { + const bool stipple = !draw_outline && tiny; + const bool thick = draw_outline && !tiny; - /* Draw axis. */ - if (!draw_outline) { - float end_point[2]; - glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT); + GPU_line_width(thick ? 3.0f : 1.0f); - glBegin(GL_LINES); + if (stipple) { + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_factor", 0.5f); + } + else { + immUniform1f("dash_factor", 2.0f); /* Solid line */ + } - getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[1], end_point); - glColor3f(1.0, 0.0, 0.0f); - glVertex2fv(plane_marker->corners[0]); - glVertex2fv(end_point); + if (draw_outline) { + immUniformThemeColor(TH_MARKER_OUTLINE); + } + else { + plane_track_colors(is_active_track, color, selected_color); + immUniformColor3fv(is_selected_track ? selected_color : color); + } - getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[3], end_point); - glColor3f(0.0, 1.0, 0.0f); - glVertex2fv(plane_marker->corners[0]); - glVertex2fv(end_point); + /* Draw rectangle itself. */ + immBegin(GWN_PRIM_LINE_LOOP, 4); + immVertex2fv(shdr_pos, plane_marker->corners[0]); + immVertex2fv(shdr_pos, plane_marker->corners[1]); + immVertex2fv(shdr_pos, plane_marker->corners[2]); + immVertex2fv(shdr_pos, plane_marker->corners[3]); + immEnd(); - glEnd(); + /* Draw axis. */ + if (!draw_outline) { + float end_point[2]; - glPopAttrib(); - } + immUniformColor3f(1.0f, 0.0f, 0.0f); - if (stipple) { - GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE); - } - else { - GPU_basic_shader_bind_disable(GPU_SHADER_LINE); + immBegin(GWN_PRIM_LINES, 2); + + getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[1], end_point); + immVertex2fv(shdr_pos, plane_marker->corners[0]); + immVertex2fv(shdr_pos, end_point); + + immEnd(); + + immUniformColor3f(0.0f, 1.0f, 0.0f); + + immBegin(GWN_PRIM_LINES, 2); + + getArrowEndPoint(width, height, sc->zoom, plane_marker->corners[0], plane_marker->corners[3], end_point); + immVertex2fv(shdr_pos, plane_marker->corners[0]); + immVertex2fv(shdr_pos, end_point); + + immEnd(); + } } - } - /* 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); + /* Draw sliders. */ + if (is_selected_track) { + immUniform1f("dash_factor", 2.0f); /* Solid line */ + + if (draw_outline) { + immUniformThemeColor(TH_MARKER_OUTLINE); + } + else { + immUniformColor3fv(selected_color); + } + + 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, shdr_pos); + } } + + immUnbindProgram(); } } @@ -1257,13 +1342,13 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie UI_view2d_view_to_region_fl(&ar->v2d, 0.0f, 0.0f, &x, &y); - glPushMatrix(); - glTranslatef(x, y, 0); + gpuPushMatrix(); + gpuTranslate2f(x, y); - glPushMatrix(); - glScalef(zoomx, zoomy, 0); - glMultMatrixf(sc->stabmat); - glScalef(width, height, 0); + gpuPushMatrix(); + gpuScale2f(zoomx, zoomy); + gpuMultMatrix(sc->stabmat); + gpuScale2f(width, height); act_track = BKE_tracking_track_get_active(tracking); @@ -1329,6 +1414,10 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie } } + unsigned int position = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* markers outline and non-selected areas */ track = tracksbase->first; fp = marker_pos; @@ -1339,10 +1428,10 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie if (MARKER_VISIBLE(sc, track, marker)) { copy_v2_v2(cur_pos, fp ? fp : marker->pos); - draw_marker_outline(sc, track, marker, cur_pos, width, height); - draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 0); - draw_marker_slide_zones(sc, track, marker, cur_pos, 1, 0, 0, width, height); - draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 0, 0, width, height); + draw_marker_outline(sc, track, marker, cur_pos, width, height, position); + draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 0, position); + draw_marker_slide_zones(sc, track, marker, cur_pos, 1, 0, 0, width, height, position); + draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 0, 0, width, height, position); if (fp) fp += 2; @@ -1365,8 +1454,8 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie if (!act) { copy_v2_v2(cur_pos, fp ? fp : marker->pos); - draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 1); - draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 1, 0, width, height); + draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 1, position); + draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 1, 0, width, height, position); } if (fp) @@ -1385,8 +1474,8 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie if (MARKER_VISIBLE(sc, act_track, marker)) { copy_v2_v2(cur_pos, active_pos ? active_pos : marker->pos); - draw_marker_areas(sc, act_track, marker, cur_pos, width, height, 1, 1); - draw_marker_slide_zones(sc, act_track, marker, cur_pos, 0, 1, 1, width, height); + draw_marker_areas(sc, act_track, marker, cur_pos, width, height, 1, 1, position); + draw_marker_slide_zones(sc, act_track, marker, cur_pos, 0, 1, 1, width, height, position); } } } @@ -1395,8 +1484,7 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); float pos[4], vec[4], mat[4][4], aspy; - glEnable(GL_POINT_SMOOTH); - glPointSize(3.0f); + GPU_point_size(3.0f); aspy = 1.0f / clip->tracking.camera.pixel_aspect; BKE_tracking_get_projection_matrix(tracking, object, framenr, width, height, mat); @@ -1424,28 +1512,34 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie sub_v2_v2(vec, npos); - if (len_squared_v2(vec) < (3.0f * 3.0f)) - glColor3f(0.0f, 1.0f, 0.0f); - else - glColor3f(1.0f, 0.0f, 0.0f); + if (len_squared_v2(vec) < (3.0f * 3.0f)) { + immUniformColor3f(0.0f, 1.0f, 0.0f); + } + else { + immUniformColor3f(1.0f, 0.0f, 0.0f); + } - glBegin(GL_POINTS); - if (undistort) - glVertex3f(pos[0] / width, pos[1] / (height * aspy), 0); - else - glVertex3f(npos[0] / width, npos[1] / (height * aspy), 0); - glEnd(); + immBegin(GWN_PRIM_POINTS, 1); + + if (undistort) { + immVertex2f(position, pos[0] / width, pos[1] / (height * aspy)); + } + else { + immVertex2f(position, npos[0] / width, npos[1] / (height * aspy)); + } + + immEnd(); } } } track = track->next; } - - glDisable(GL_POINT_SMOOTH); } - glPopMatrix(); + immUnbindProgram(); + + gpuPopMatrix(); if (sc->flag & SC_SHOW_NAMES) { /* scaling should be cleared before drawing texts, otherwise font would also be scaled */ @@ -1471,7 +1565,7 @@ static void draw_tracking_tracks(SpaceClip *sc, Scene *scene, ARegion *ar, Movie } } - glPopMatrix(); + gpuPopMatrix(); if (marker_pos) MEM_freeN(marker_pos); @@ -1498,11 +1592,15 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, UI_view2d_view_to_region_fl(&ar->v2d, 0.0f, 0.0f, &x, &y); - glPushMatrix(); - glTranslatef(x, y, 0); - glScalef(zoomx, zoomy, 0); - glMultMatrixf(sc->stabmat); - glScalef(width, height, 0); + gpuPushMatrix(); + gpuTranslate2f(x, y); + gpuScale2f(zoomx, zoomy); + gpuMultMatrix(sc->stabmat); + gpuScale2f(width, height); + + unsigned int position = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); /* grid */ if (sc->flag & SC_SHOW_GRID) { @@ -1574,22 +1672,26 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, pos[1] += dy; } - glColor3f(1.0f, 0.0f, 0.0f); + immUniformColor3f(1.0f, 0.0f, 0.0f); for (i = 0; i <= n; i++) { - glBegin(GL_LINE_STRIP); + immBegin(GWN_PRIM_LINE_STRIP, n + 1); + for (j = 0; j <= n; j++) { - glVertex2fv(grid[i][j]); + immVertex2fv(position, grid[i][j]); } - glEnd(); + + immEnd(); } for (j = 0; j <= n; j++) { - glBegin(GL_LINE_STRIP); + immBegin(GWN_PRIM_LINE_STRIP, n + 1); + for (i = 0; i <= n; i++) { - glVertex2fv(grid[i][j]); + immVertex2fv(position, grid[i][j]); } - glEnd(); + + immEnd(); } } @@ -1608,9 +1710,10 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, continue; } - glColor4fv(layer->color); - glLineWidth(layer->thickness); - glPointSize((float)(layer->thickness + 2)); + immUniformColor4fv(layer->color); + + GPU_line_width(layer->thickness); + GPU_point_size((float)(layer->thickness + 2)); while (frame) { bGPDstroke *stroke = frame->strokes.first; @@ -1618,7 +1721,6 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, while (stroke) { if (stroke->flag & GP_STROKE_2DSPACE) { if (stroke->totpoints > 1) { - glBegin(GL_LINE_STRIP); for (i = 0; i < stroke->totpoints - 1; i++) { float npos[2], dpos[2], len; int steps; @@ -1641,19 +1743,22 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, sub_v2_v2v2(dpos, npos, pos); mul_v2_fl(dpos, 1.0f / steps); + immBegin(GWN_PRIM_LINE_STRIP, steps + 1); + for (j = 0; j <= steps; j++) { BKE_tracking_distort_v2(tracking, pos, tpos); - glVertex2f(tpos[0] / width, tpos[1] / (height * aspy)); + immVertex2f(position, tpos[0] / width, tpos[1] / (height * aspy)); add_v2_v2(pos, dpos); } + + immEnd(); } - glEnd(); } else if (stroke->totpoints == 1) { - glBegin(GL_POINTS); - glVertex2f(stroke->points[0].x + offsx, stroke->points[0].y + offsy); - glEnd(); + immBegin(GWN_PRIM_POINTS, 1); + immVertex2f(position, stroke->points[0].x + offsx, stroke->points[0].y + offsy); + immEnd(); } } @@ -1667,7 +1772,9 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, } } - glPopMatrix(); + immUnbindProgram(); + + gpuPopMatrix(); } void clip_draw_main(const bContext *C, SpaceClip *sc, ARegion *ar) @@ -1764,8 +1871,8 @@ void clip_draw_grease_pencil(bContext *C, int onlyv2d) * associated with the clip is already drawn in draw_distortion */ if ((sc->flag & SC_MANUAL_CALIBRATION) == 0 || is_track_source) { - glPushMatrix(); - glMultMatrixf(sc->unistabmat); + gpuPushMatrix(); + gpuMultMatrix(sc->unistabmat); if (is_track_source) { MovieTrackingTrack *track = BKE_tracking_track_get_active(&sc->clip->tracking); @@ -1774,13 +1881,13 @@ void clip_draw_grease_pencil(bContext *C, int onlyv2d) int framenr = ED_space_clip_get_clip_frame_number(sc); MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - glTranslate2fv(marker->pos); + gpuTranslate2fv(marker->pos); } } ED_gpencil_draw_2dimage(C); - glPopMatrix(); + gpuPopMatrix(); } } else { diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index 2a218df2a44..67aa7e19de7 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -305,15 +305,12 @@ bool ED_space_clip_color_sample(SpaceClip *sc, ARegion *ar, int mval[2], float r void ED_clip_update_frame(const Main *mainp, int cfra) { - wmWindowManager *wm; - wmWindow *win; - /* image window, compo node users */ - for (wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */ - for (win = wm->windows.first; win; win = win->next) { - ScrArea *sa; + for (wmWindowManager *wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */ + for (wmWindow *win = wm->windows.first; win; win = win->next) { + bScreen *screen = WM_window_get_active_screen(win); - for (sa = win->screen->areabase.first; sa; sa = sa->next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { if (sa->spacetype == SPACE_CLIP) { SpaceClip *sc = sa->spacedata.first; diff --git a/source/blender/editors/space_clip/clip_graph_draw.c b/source/blender/editors/space_clip/clip_graph_draw.c index 424d25defdd..d463f585470 100644 --- a/source/blender/editors/space_clip/clip_graph_draw.c +++ b/source/blender/editors/space_clip/clip_graph_draw.c @@ -42,7 +42,10 @@ #include "ED_screen.h" #include "ED_clip.h" -#include "BIF_gl.h" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" +#include "GPU_state.h" #include "WM_types.h" @@ -53,76 +56,54 @@ #include "clip_intern.h" // own include -static void draw_curve_knot(float x, float y, float xscale, float yscale, float hsize) -{ - static GLuint displist = 0; - - /* initialize round circle shape */ - if (displist == 0) { - GLUquadricObj *qobj; - - displist = glGenLists(1); - glNewList(displist, GL_COMPILE); - - qobj = gluNewQuadric(); - gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); - gluDisk(qobj, 0, 0.7, 8, 1); - gluDeleteQuadric(qobj); - - glEndList(); - } - - glPushMatrix(); - - glTranslatef(x, y, 0.0f); - glScalef(1.0f / xscale * hsize, 1.0f / yscale * hsize, 1.0f); - glCallList(displist); - - glPopMatrix(); -} +typedef struct TrackMotionCurveUserData { + MovieTrackingTrack *act_track; + bool sel; + float xscale, yscale, hsize; + unsigned int pos; +} TrackMotionCurveUserData; -static void tracking_segment_point_cb(void *UNUSED(userdata), MovieTrackingTrack *UNUSED(track), +static void tracking_segment_point_cb(void *userdata, MovieTrackingTrack *UNUSED(track), MovieTrackingMarker *UNUSED(marker), int UNUSED(coord), int scene_framenr, float val) { - glVertex2f(scene_framenr, val); + TrackMotionCurveUserData *data = (TrackMotionCurveUserData *) userdata; + + immVertex2f(data->pos, scene_framenr, val); } -static void tracking_segment_start_cb(void *userdata, MovieTrackingTrack *track, int coord) +static void tracking_segment_start_cb(void *userdata, MovieTrackingTrack *track, int coord, bool is_point) { - const float colors[2][3] = { - {1.0f, 0.0f, 0.0f}, - {0.0f, 1.0f, 0.0f}, - }; - float col[4]; + TrackMotionCurveUserData *data = (TrackMotionCurveUserData *) userdata; + float col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - copy_v3_v3(col, colors[coord]); + col[coord] = 1.0f; - if (track == userdata) { + if (track == data->act_track) { col[3] = 1.0f; - glLineWidth(2.0f); + GPU_line_width(2.0f); } else { col[3] = 0.5f; - glLineWidth(1.0f); + GPU_line_width(1.0f); } - glColor4fv(col); + immUniformColor4fv(col); - glBegin(GL_LINE_STRIP); + if (is_point) { + immBeginAtMost(GWN_PRIM_POINTS, 1); + } + else { + /* Graph can be composed of smaller segments, if any marker is disabled */ + immBeginAtMost(GWN_PRIM_LINE_STRIP, track->markersnr); + } } static void tracking_segment_end_cb(void *UNUSED(userdata), int UNUSED(coord)) { - glEnd(); + immEnd(); } -typedef struct TrackMotionCurveUserData { - MovieTrackingTrack *act_track; - bool sel; - float xscale, yscale, hsize; -} TrackMotionCurveUserData; - static void tracking_segment_knot_cb(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, int scene_framenr, float val) { @@ -136,16 +117,19 @@ static void tracking_segment_knot_cb(void *userdata, MovieTrackingTrack *track, sel = (marker->flag & sel_flag) ? 1 : 0; if (sel == data->sel) { - if (sel) - UI_ThemeColor(TH_HANDLE_VERTEX_SELECT); - else - UI_ThemeColor(TH_HANDLE_VERTEX); + immUniformThemeColor(sel ? TH_HANDLE_VERTEX_SELECT : TH_HANDLE_VERTEX); + + gpuPushMatrix(); + gpuTranslate2f(scene_framenr, val); + gpuScale2f(1.0f / data->xscale * data->hsize, 1.0f / data->yscale * data->hsize); + + imm_draw_circle_wire_2d(data->pos, 0, 0, 0.7, 8); - draw_curve_knot(scene_framenr, val, data->xscale, data->yscale, data->hsize); + gpuPopMatrix(); } } -static void draw_tracks_motion_curves(View2D *v2d, SpaceClip *sc) +static void draw_tracks_motion_curves(View2D *v2d, SpaceClip *sc, unsigned int pos) { MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; @@ -162,20 +146,20 @@ static void draw_tracks_motion_curves(View2D *v2d, SpaceClip *sc) userdata.hsize = UI_GetThemeValuef(TH_HANDLE_VERTEX_SIZE); userdata.sel = false; userdata.act_track = act_track; + userdata.pos = pos; UI_view2d_scale_get(v2d, &userdata.xscale, &userdata.yscale); clip_graph_tracking_values_iterate(sc, (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0, (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0, &userdata, tracking_segment_knot_cb, NULL, NULL); - /* draw graph lines */ - glEnable(GL_BLEND); + GPU_blend(true); clip_graph_tracking_values_iterate(sc, (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0, (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0, - act_track, tracking_segment_point_cb, tracking_segment_start_cb, + &userdata, tracking_segment_point_cb, tracking_segment_start_cb, tracking_segment_end_cb); - glDisable(GL_BLEND); + GPU_blend(false); /* selected knot handles on top of curves */ userdata.sel = true; @@ -195,6 +179,7 @@ typedef struct TrackErrorCurveUserData { float projection_matrix[4][4]; int width, height; float aspy; + unsigned int pos; } TrackErrorCurveUserData; static void tracking_error_segment_point_cb(void *userdata, @@ -230,11 +215,11 @@ static void tracking_error_segment_point_cb(void *userdata, sub_v2_v2v2(delta, reprojected_position, marker_position); reprojection_error = len_v2(delta) * weight; - glVertex2f(scene_framenr, reprojection_error); + immVertex2f(data->pos, scene_framenr, reprojection_error); } } -static void tracking_error_segment_start_cb(void *userdata, MovieTrackingTrack *track, int coord) +static void tracking_error_segment_start_cb(void *userdata, MovieTrackingTrack *track, int coord, bool is_point) { if (coord == 1) { TrackErrorCurveUserData *data = (TrackErrorCurveUserData *) userdata; @@ -242,27 +227,33 @@ static void tracking_error_segment_start_cb(void *userdata, MovieTrackingTrack * if (track == data->active_track) { col[3] = 1.0f; - glLineWidth(2.0f); + GPU_line_width(2.0f); } else { col[3] = 0.5f; - glLineWidth(1.0f); + GPU_line_width(1.0f); } - glColor4fv(col); + immUniformColor4fv(col); - glBegin(GL_LINE_STRIP); + if (is_point) { /* This probably never happens here, but just in case... */ + immBeginAtMost(GWN_PRIM_POINTS, 1); + } + else { + /* Graph can be composed of smaller segments, if any marker is disabled */ + immBeginAtMost(GWN_PRIM_LINE_STRIP, track->markersnr); + } } } static void tracking_error_segment_end_cb(void *UNUSED(userdata), int coord) { if (coord == 1) { - glEnd(); + immEnd(); } } -static void draw_tracks_error_curves(SpaceClip *sc) +static void draw_tracks_error_curves(SpaceClip *sc, unsigned int pos) { MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; @@ -273,6 +264,7 @@ static void draw_tracks_error_curves(SpaceClip *sc) data.tracking_object = BKE_tracking_object_get_active(tracking); data.active_track = BKE_tracking_track_get_active(tracking); data.matrix_initialized = false; + data.pos = pos; BKE_movieclip_get_size(clip, &sc->user, &data.width, &data.height); data.aspy = 1.0f / tracking->camera.pixel_aspect; @@ -289,37 +281,38 @@ static void draw_tracks_error_curves(SpaceClip *sc) tracking_error_segment_end_cb); } -static void draw_frame_curves(SpaceClip *sc) +static void draw_frame_curves(SpaceClip *sc, unsigned int pos) { MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; MovieTrackingReconstruction *reconstruction = BKE_tracking_get_active_reconstruction(tracking); int i, lines = 0, prevfra = 0; - glColor3f(0.0f, 0.0f, 1.0f); + immUniformColor3f(0.0f, 0.0f, 1.0f); for (i = 0; i < reconstruction->camnr; i++) { MovieReconstructedCamera *camera = &reconstruction->cameras[i]; int framenr; if (lines && camera->framenr != prevfra + 1) { - glEnd(); + immEnd(); lines = 0; } if (!lines) { - glBegin(GL_LINE_STRIP); + immBeginAtMost(GWN_PRIM_LINE_STRIP, reconstruction->camnr); lines = 1; } framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, camera->framenr); - glVertex2f(framenr, camera->error); + immVertex2f(pos, framenr, camera->error); prevfra = camera->framenr; } - if (lines) - glEnd(); + if (lines) { + immEnd(); + } } void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene) @@ -335,19 +328,26 @@ void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene) UI_view2d_grid_free(grid); if (clip) { - if (sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) - draw_tracks_motion_curves(v2d, sc); + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + + GPU_point_size(3.0f); + + if (sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) { + draw_tracks_motion_curves(v2d, sc, pos); + } - if (sc->flag & SC_SHOW_GRAPH_TRACKS_ERROR) - draw_tracks_error_curves(sc); + if (sc->flag & SC_SHOW_GRAPH_TRACKS_ERROR) { + draw_tracks_error_curves(sc, pos); + } - if (sc->flag & SC_SHOW_GRAPH_FRAMES) - draw_frame_curves(sc); + if (sc->flag & SC_SHOW_GRAPH_FRAMES) { + draw_frame_curves(sc, pos); + } + + immUnbindProgram(); } /* frame range */ clip_draw_sfra_efra(v2d, scene); - - /* current frame */ - clip_draw_cfra(sc, ar, scene); } diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c index b572e1893ae..02ea340eb57 100644 --- a/source/blender/editors/space_clip/clip_graph_ops.c +++ b/source/blender/editors/space_clip/clip_graph_ops.c @@ -37,7 +37,8 @@ #include "BKE_context.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" + +#include "DEG_depsgraph.h" #include "WM_api.h" #include "WM_types.h" @@ -691,7 +692,7 @@ static int graph_disable_markers_exec(bContext *C, wmOperator *op) } } - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h index ae15834a1d9..e5c4f567d5c 100644 --- a/source/blender/editors/space_clip/clip_intern.h +++ b/source/blender/editors/space_clip/clip_intern.h @@ -125,12 +125,12 @@ void ED_clip_tool_props_register(struct ARegionType *art); /* clip_utils.c */ void clip_graph_tracking_values_iterate_track(struct SpaceClip *sc, struct MovieTrackingTrack *track, void *userdata, void (*func)(void *userdata, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker, int coord, int scene_framenr, float val), - void (*segment_start)(void *userdata, struct MovieTrackingTrack *track, int coord), + void (*segment_start)(void *userdata, struct MovieTrackingTrack *track, int coord, bool is_point), void (*segment_end)(void *userdata, int coord)); void clip_graph_tracking_values_iterate(struct SpaceClip *sc, bool selected_only, bool include_hidden, void *userdata, void (*func)(void *userdata, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker, int coord, int scene_framenr, float val), - void (*segment_start)(void *userdata, struct MovieTrackingTrack *track, int coord), + void (*segment_start)(void *userdata, struct MovieTrackingTrack *track, int coord, bool is_point), void (*segment_end)(void *userdata, int coord)); void clip_graph_tracking_iterate(struct SpaceClip *sc, bool selected_only, bool include_hidden, void *userdata, @@ -143,9 +143,10 @@ void clip_delete_plane_track(struct bContext *C, struct MovieClip *clip, struct void clip_view_center_to_point(SpaceClip *sc, 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); +void clip_on_marker_selection_changed(struct bContext *C); + /* tracking_ops.c */ struct MovieTrackingTrack *tracking_marker_check_slide(struct bContext *C, const struct wmEvent *event, int *area_r, int *action_r, int *corner_r); diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 172ea0f8554..c026ce8d063 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -56,7 +56,6 @@ #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_depsgraph.h" #include "BKE_report.h" #include "BKE_library.h" #include "BKE_main.h" @@ -83,6 +82,8 @@ #include "PIL_time.h" +#include "DEG_depsgraph_build.h" + #include "clip_intern.h" // own include /******************** view navigation utilities *********************/ @@ -249,7 +250,7 @@ static int open_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_MOVIECLIP | NA_ADDED, clip); - DAG_relations_tag_update(bmain); + DEG_relations_tag_update(bmain); MEM_freeN(op->customdata); return OPERATOR_FINISHED; @@ -467,7 +468,7 @@ static void view_pan_cancel(bContext *C, wmOperator *op) void CLIP_OT_view_pan(wmOperatorType *ot) { /* identifiers */ - ot->name = "View Pan"; + ot->name = "Pan View"; ot->idname = "CLIP_OT_view_pan"; ot->description = "Pan the view"; diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c index d2a7244eded..3e4d0cd5bb4 100644 --- a/source/blender/editors/space_clip/clip_toolbar.c +++ b/source/blender/editors/space_clip/clip_toolbar.c @@ -32,6 +32,7 @@ #include <string.h> #include "DNA_windowmanager_types.h" +#include "DNA_workspace_types.h" #include "MEM_guardedalloc.h" @@ -105,7 +106,7 @@ static int properties_exec(bContext *C, wmOperator *UNUSED(op)) void CLIP_OT_properties(wmOperatorType *ot) { /* identifiers */ - ot->name = "Properties"; + ot->name = "Toggle Sidebar"; ot->description = "Toggle the properties region visibility"; ot->idname = "CLIP_OT_properties"; @@ -118,19 +119,17 @@ void CLIP_OT_properties(wmOperatorType *ot) static ARegion *clip_has_tools_region(ScrArea *sa) { - ARegion *ar, *artool = NULL, *arprops = NULL, *arhead; + ARegion *ar, *artool = NULL, *arhead; for (ar = sa->regionbase.first; ar; ar = ar->next) { if (ar->regiontype == RGN_TYPE_TOOLS) artool = ar; - - if (ar->regiontype == RGN_TYPE_TOOL_PROPS) - arprops = ar; } /* tool region hide/unhide also hides props */ - if (arprops && artool) + if (artool) { return artool; + } if (artool == NULL) { /* add subdiv level; after header */ @@ -149,15 +148,6 @@ static ARegion *clip_has_tools_region(ScrArea *sa) artool->flag = RGN_FLAG_HIDDEN; } - if (arprops == NULL) { - /* add extra subdivided region for tool properties */ - arprops = MEM_callocN(sizeof(ARegion), "tool props for clip"); - - BLI_insertlinkafter(&sa->regionbase, artool, arprops); - arprops->regiontype = RGN_TYPE_TOOL_PROPS; - arprops->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV; - } - return artool; } @@ -180,7 +170,7 @@ static int tools_exec(bContext *C, wmOperator *UNUSED(op)) void CLIP_OT_tools(wmOperatorType *ot) { /* identifiers */ - ot->name = "Tools"; + ot->name = "Toggle Toolbar"; ot->description = "Toggle clip tools panel"; ot->idname = "CLIP_OT_tools"; @@ -188,78 +178,3 @@ void CLIP_OT_tools(wmOperatorType *ot) ot->exec = tools_exec; ot->poll = tools_poll; } - -/************************** redo panel ******************************/ - -static void clip_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOperator *op) -{ - uiTemplateOperatorPropertyButs(C, pa->layout, op, NULL, 'V', 0); -} - -static void clip_panel_operator_redo_header(const bContext *C, Panel *pa) -{ - wmOperator *op = WM_operator_last_redo(C); - - if (op) - BLI_strncpy(pa->drawname, RNA_struct_ui_name(op->type->srna), sizeof(pa->drawname)); - else - BLI_strncpy(pa->drawname, IFACE_("Operator"), sizeof(pa->drawname)); -} - -static void clip_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOperator *op) -{ - if (op->type->flag & OPTYPE_MACRO) { - for (op = op->macro.first; op; op = op->next) { - uiItemL(pa->layout, RNA_struct_ui_name(op->type->srna), ICON_NONE); - clip_panel_operator_redo_operator(C, pa, op); - } - } - else { - clip_panel_operator_redo_buts(C, pa, op); - } -} - -/* TODO de-duplicate redo panel functions - campbell */ -static void clip_panel_operator_redo(const bContext *C, Panel *pa) -{ - wmOperator *op = WM_operator_last_redo(C); - ARegion *ar; - ARegion *ar1; - - if (op == NULL) - return; - - /* keep in sync with logic in ED_undo_operator_repeat() */ - ar = CTX_wm_region(C); - ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); - if (ar1) - CTX_wm_region_set((bContext *)C, ar1); - - if (WM_operator_poll((bContext *)C, op->type)) { - uiBlock *block = uiLayoutGetBlock(pa->layout); - - if (!WM_operator_check_ui_enabled(C, op->type->name)) - uiLayoutSetEnabled(pa->layout, false); - - /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ - UI_block_func_handle_set(block, ED_undo_operator_repeat_cb_evt, op); - - clip_panel_operator_redo_operator(C, pa, op); - } - - /* set region back */ - CTX_wm_region_set((bContext *)C, ar); -} - -void ED_clip_tool_props_register(ARegionType *art) -{ - PanelType *pt; - - pt = MEM_callocN(sizeof(PanelType), "spacetype clip panel last operator"); - strcpy(pt->idname, "CLIP_PT_last_operator"); - strcpy(pt->label, N_("Operator")); - strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); - pt->draw_header = clip_panel_operator_redo_header; - pt->draw = clip_panel_operator_redo; - BLI_addtail(&art->paneltypes, pt); -} diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index b5b193804b1..c3208260b3b 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -41,10 +41,12 @@ #include "BKE_context.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" -#include "BIF_gl.h" -#include "BIF_glutil.h" +#include "DEG_depsgraph.h" + +#include "GPU_immediate.h" +#include "GPU_matrix.h" +#include "GPU_state.h" #include "WM_api.h" #include "WM_types.h" @@ -52,7 +54,6 @@ #include "ED_screen.h" #include "ED_clip.h" - #include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -63,7 +64,7 @@ void clip_graph_tracking_values_iterate_track( SpaceClip *sc, MovieTrackingTrack *track, void *userdata, void (*func)(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, int scene_framenr, float val), - void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord), + void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord, bool is_point), void (*segment_end)(void *userdata, int coord)) { MovieClip *clip = ED_space_clip_get_clip(sc); @@ -92,8 +93,14 @@ void clip_graph_tracking_values_iterate_track( } if (!open) { - if (segment_start) - segment_start(userdata, track, coord); + if (segment_start) { + if ((i + 1) == track->markersnr) { + segment_start(userdata, track, coord, true); + } + else { + segment_start(userdata, track, coord, (track->markers[i + 1].flag & MARKER_DISABLED)); + } + } open = true; prevval = marker->pos[coord]; @@ -124,7 +131,7 @@ void clip_graph_tracking_values_iterate( SpaceClip *sc, bool selected_only, bool include_hidden, void *userdata, void (*func)(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, int scene_framenr, float val), - void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord), + void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord, bool is_point), void (*segment_end)(void *userdata, int coord)) { MovieClip *clip = ED_space_clip_get_clip(sc); @@ -204,11 +211,11 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) if (used_for_stabilization) { WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } + /* Inform dependency graph. */ + DEG_id_tag_update(&clip->id, 0); if (has_bundle) { WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); } - /* Inform dependency graph. */ - DAG_id_tag_update(&clip->id, 0); } void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, @@ -243,7 +250,7 @@ void clip_delete_plane_track(bContext *C, /* TODO(sergey): Any notifiers to be sent here? */ (void) C; /* Inform dependency graph. */ - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); } void clip_view_center_to_point(SpaceClip *sc, float x, float y) @@ -258,51 +265,34 @@ void clip_view_center_to_point(SpaceClip *sc, float x, float y) sc->yof = (y - 0.5f) * height * aspy; } -void clip_draw_cfra(SpaceClip *sc, ARegion *ar, Scene *scene) -{ - View2D *v2d = &ar->v2d; - float xscale, yscale; - - /* Draw a light green line to indicate current frame */ - UI_ThemeColor(TH_CFRAME); - - float x = (float)(sc->user.framenr * scene->r.framelen); - - glLineWidth(2.0); - - glBegin(GL_LINES); - glVertex2f(x, v2d->cur.ymin); - glVertex2f(x, v2d->cur.ymax); - glEnd(); - - UI_view2d_view_orthoSpecial(ar, v2d, 1); - - /* because the frame number text is subject to the same scaling as the contents of the view */ - UI_view2d_scale_get(v2d, &xscale, &yscale); - glScalef(1.0f / xscale, 1.0f, 1.0f); - - ED_region_cache_draw_curfra_label(sc->user.framenr, (float)sc->user.framenr * xscale, 18); - - /* restore view transform */ - glScalef(xscale, 1.0, 1.0); -} - void clip_draw_sfra_efra(View2D *v2d, Scene *scene) { UI_view2d_view_ortho(v2d); /* currently clip editor supposes that editing clip length is equal to scene frame range */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glColor4f(0.0f, 0.0f, 0.0f, 0.4f); + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + GPU_blend(true); + + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + + immUniformColor4f(0.0f, 0.0f, 0.0f, 0.4f); + immRectf(pos, v2d->cur.xmin, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax); + immRectf(pos, (float)EFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); - glRectf(v2d->cur.xmin, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax); - glRectf((float)EFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); - glDisable(GL_BLEND); + GPU_blend(false); - UI_ThemeColorShade(TH_BACK, -60); + immUniformThemeColorShade(TH_BACK, -60); /* thin lines where the actual frames are */ - fdrawline((float)SFRA, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax); - fdrawline((float)EFRA, v2d->cur.ymin, (float)EFRA, v2d->cur.ymax); + GPU_line_width(1.0f); + + immBegin(GWN_PRIM_LINES, 4); + immVertex2f(pos, (float)SFRA, v2d->cur.ymin); + immVertex2f(pos, (float)SFRA, v2d->cur.ymax); + immVertex2f(pos, (float)EFRA, v2d->cur.ymin); + immVertex2f(pos, (float)EFRA, v2d->cur.ymax); + immEnd(); + + immUnbindProgram(); } diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 58930fa2cf2..e9acd7320d0 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -51,6 +51,7 @@ #include "IMB_imbuf_types.h" +#include "ED_anim_api.h" /* for timeline cursor drawing */ #include "ED_mask.h" #include "ED_space_api.h" #include "ED_screen.h" @@ -60,7 +61,9 @@ #include "IMB_imbuf.h" -#include "BIF_gl.h" +#include "GPU_glew.h" +#include "GPU_matrix.h" +#include "GPU_framebuffer.h" #include "WM_api.h" #include "WM_types.h" @@ -74,12 +77,8 @@ #include "clip_intern.h" /* own include */ -static void init_preview_region(const bContext *C, ARegion *ar) +static void init_preview_region(const Scene *scene, const ScrArea *sa, const SpaceClip *sc, ARegion *ar) { - Scene *scene = CTX_data_scene(C); - ScrArea *sa = CTX_wm_area(C); - SpaceClip *sc = CTX_wm_space_clip(C); - ar->regiontype = RGN_TYPE_PREVIEW; ar->alignment = RGN_ALIGN_TOP; ar->flag |= RGN_FLAG_HIDDEN; @@ -137,15 +136,17 @@ static void init_preview_region(const bContext *C, ARegion *ar) static void reinit_preview_region(const bContext *C, ARegion *ar) { + Scene *scene = CTX_data_scene(C); + ScrArea *sa = CTX_wm_area(C); SpaceClip *sc = CTX_wm_space_clip(C); if (sc->view == SC_VIEW_DOPESHEET) { if ((ar->v2d.flag & V2D_VIEWSYNC_AREA_VERTICAL) == 0) - init_preview_region(C, ar); + init_preview_region(scene, sa, sc, ar); } else { if (ar->v2d.flag & V2D_VIEWSYNC_AREA_VERTICAL) - init_preview_region(C, ar); + init_preview_region(scene, sa, sc, ar); } } @@ -167,7 +168,7 @@ static ARegion *ED_clip_has_preview_region(const bContext *C, ScrArea *sa) arnew = MEM_callocN(sizeof(ARegion), "clip preview region"); BLI_insertlinkbefore(&sa->regionbase, ar, arnew); - init_preview_region(C, arnew); + init_preview_region(CTX_data_scene(C), sa, CTX_wm_space_clip(C), arnew); return arnew; } @@ -227,7 +228,7 @@ static void clip_scopes_check_gpencil_change(ScrArea *sa) /* ******************** default callbacks for clip space ***************** */ -static SpaceLink *clip_new(const bContext *C) +static SpaceLink *clip_new(const ScrArea *sa, const Scene *scene) { ARegion *ar; SpaceClip *sc; @@ -246,7 +247,7 @@ static SpaceLink *clip_new(const bContext *C) BLI_addtail(&sc->regionbase, ar); ar->regiontype = RGN_TYPE_HEADER; - ar->alignment = RGN_ALIGN_BOTTOM; + ar->alignment = RGN_ALIGN_TOP; /* tools view */ ar = MEM_callocN(sizeof(ARegion), "tools for clip"); @@ -255,13 +256,6 @@ static SpaceLink *clip_new(const bContext *C) ar->regiontype = RGN_TYPE_TOOLS; ar->alignment = RGN_ALIGN_LEFT; - /* tool properties */ - ar = MEM_callocN(sizeof(ARegion), "tool properties for clip"); - - BLI_addtail(&sc->regionbase, ar); - ar->regiontype = RGN_TYPE_TOOL_PROPS; - ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV; - /* properties view */ ar = MEM_callocN(sizeof(ARegion), "properties for clip"); @@ -283,7 +277,7 @@ static SpaceLink *clip_new(const bContext *C) ar = MEM_callocN(sizeof(ARegion), "preview for clip"); BLI_addtail(&sc->regionbase, ar); - init_preview_region(C, ar); + init_preview_region(scene, sa, sc, ar); /* main region */ ar = MEM_callocN(sizeof(ARegion), "main region for clip"); @@ -329,7 +323,8 @@ static SpaceLink *clip_duplicate(SpaceLink *sl) return (SpaceLink *)scn; } -static void clip_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) +static void clip_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Scene *UNUSED(scene), + WorkSpace *UNUSED(workspace)) { /* context changes */ switch (wmn->category) { @@ -667,7 +662,9 @@ static void clip_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CLIP_OT_add_marker_slide", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", DELKEY, KM_PRESS, KM_SHIFT, 0); +#ifdef USE_WM_KEYMAP_27X WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", XKEY, KM_PRESS, KM_SHIFT, 0); +#endif WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 0, 0); @@ -676,7 +673,9 @@ static void clip_keymap(struct wmKeyConfig *keyconf) /* tracks */ WM_keymap_add_item(keymap, "CLIP_OT_delete_track", DELKEY, KM_PRESS, 0, 0); +#ifdef USE_WM_KEYMAP_27X WM_keymap_add_item(keymap, "CLIP_OT_delete_track", XKEY, KM_PRESS, 0, 0); +#endif kmi = WM_keymap_add_item(keymap, "CLIP_OT_lock_tracks", LKEY, KM_PRESS, KM_CTRL, 0); RNA_enum_set(kmi->ptr, "action", 0); /* lock */ @@ -776,10 +775,14 @@ static void clip_keymap(struct wmKeyConfig *keyconf) /* delete */ WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0); +#ifdef USE_WM_KEYMAP_27X WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", XKEY, KM_PRESS, 0, 0); +#endif WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", DELKEY, KM_PRESS, KM_SHIFT, 0); +#ifdef USE_WM_KEYMAP_27X WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", XKEY, KM_PRESS, KM_SHIFT, 0); +#endif /* view */ WM_keymap_add_item(keymap, "CLIP_OT_graph_view_all", HOMEKEY, KM_PRESS, 0, 0); @@ -887,12 +890,11 @@ static void clip_refresh(const bContext *C, ScrArea *sa) SpaceClip *sc = (SpaceClip *)sa->spacedata.first; ARegion *ar_main = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); ARegion *ar_tools = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS); - ARegion *ar_tool_props = BKE_area_find_region_type(sa, RGN_TYPE_TOOL_PROPS); ARegion *ar_preview = ED_clip_has_preview_region(C, sa); ARegion *ar_properties = ED_clip_has_properties_region(sa); ARegion *ar_channels = ED_clip_has_channels_region(sa); bool main_visible = false, preview_visible = false, tools_visible = false; - bool tool_props_visible = false, properties_visible = false, channels_visible = false; + bool properties_visible = false, channels_visible = false; bool view_changed = false; switch (sc->view) { @@ -900,7 +902,6 @@ static void clip_refresh(const bContext *C, ScrArea *sa) main_visible = true; preview_visible = false; tools_visible = true; - tool_props_visible = true; properties_visible = true; channels_visible = false; break; @@ -908,7 +909,6 @@ static void clip_refresh(const bContext *C, ScrArea *sa) main_visible = false; preview_visible = true; tools_visible = false; - tool_props_visible = false; properties_visible = false; channels_visible = false; @@ -918,7 +918,6 @@ static void clip_refresh(const bContext *C, ScrArea *sa) main_visible = false; preview_visible = true; tools_visible = false; - tool_props_visible = false; properties_visible = false; channels_visible = true; @@ -999,30 +998,6 @@ static void clip_refresh(const bContext *C, ScrArea *sa) } } - if (tool_props_visible) { - if (ar_tool_props && (ar_tool_props->flag & RGN_FLAG_HIDDEN)) { - ar_tool_props->flag &= ~RGN_FLAG_HIDDEN; - ar_tool_props->v2d.flag &= ~V2D_IS_INITIALISED; - view_changed = true; - } - if (ar_tool_props && (ar_tool_props->alignment != (RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV))) { - ar_tool_props->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV; - view_changed = true; - } - } - else { - if (ar_tool_props && !(ar_tool_props->flag & RGN_FLAG_HIDDEN)) { - ar_tool_props->flag |= RGN_FLAG_HIDDEN; - ar_tool_props->v2d.flag &= ~V2D_IS_INITIALISED; - WM_event_remove_handlers((bContext *)C, &ar_tool_props->handlers); - view_changed = true; - } - if (ar_tool_props && ar_tool_props->alignment != RGN_ALIGN_NONE) { - ar_tool_props->alignment = RGN_ALIGN_NONE; - view_changed = true; - } - } - if (preview_visible) { if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { ar_preview->flag &= ~RGN_FLAG_HIDDEN; @@ -1180,7 +1155,7 @@ static void clip_main_region_draw(const bContext *C, ARegion *ar) /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); - glClear(GL_COLOR_BUFFER_BIT); + GPU_clear(GPU_COLOR_BIT); /* data... */ movieclip_main_area_set_view2d(C, ar); @@ -1214,13 +1189,13 @@ static void clip_main_region_draw(const bContext *C, ARegion *ar) show_cursor |= sc->around == V3D_AROUND_CURSOR; if (show_cursor) { - glPushMatrix(); - glTranslatef(x, y, 0); - glScalef(zoomx, zoomy, 0); - glMultMatrixf(sc->stabmat); - glScalef(width, height, 0); + gpuPushMatrix(); + gpuTranslate2f(x, y); + gpuScale2f(zoomx, zoomy); + gpuMultMatrix(sc->stabmat); + gpuScale2f(width, height); ED_image_draw_cursor(ar, sc->cursor); - glPopMatrix(); + gpuPopMatrix(); } clip_draw_cache_and_notes(C, sc, ar); @@ -1239,7 +1214,9 @@ static void clip_main_region_draw(const bContext *C, ARegion *ar) } } -static void clip_main_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) +static void clip_main_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, + wmNotifier *wmn, const Scene *UNUSED(scene)) { /* context changes */ switch (wmn->category) { @@ -1278,19 +1255,24 @@ static void graph_region_draw(const bContext *C, ARegion *ar) SpaceClip *sc = CTX_wm_space_clip(C); Scene *scene = CTX_data_scene(C); short unitx, unity; + short cfra_flag = 0; if (sc->flag & SC_LOCK_TIMECURSOR) ED_clip_graph_center_current_frame(scene, ar); /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); - glClear(GL_COLOR_BUFFER_BIT); + GPU_clear(GPU_COLOR_BIT); UI_view2d_view_ortho(v2d); /* data... */ clip_draw_graph(sc, ar, scene); + /* current frame indicator line */ + if (sc->flag & SC_SHOW_SECONDS) cfra_flag |= DRAWCFRA_UNIT_SECONDS; + ANIM_draw_cfra(C, v2d, cfra_flag); + /* reset view matrix */ UI_view2d_view_restore(C); @@ -1300,6 +1282,11 @@ static void graph_region_draw(const bContext *C, ARegion *ar) scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP); UI_view2d_scrollers_draw(C, v2d, scrollers); UI_view2d_scrollers_free(scrollers); + + /* currnt frame indicator */ + if (sc->flag & SC_SHOW_SECONDS) cfra_flag |= DRAWCFRA_UNIT_SECONDS; + UI_view2d_view_orthoSpecial(ar, v2d, 1); + ANIM_draw_cfra_number(C, v2d, cfra_flag); } static void dopesheet_region_draw(const bContext *C, ARegion *ar) @@ -1310,14 +1297,14 @@ static void dopesheet_region_draw(const bContext *C, ARegion *ar) View2D *v2d = &ar->v2d; View2DGrid *grid; View2DScrollers *scrollers; - short unit = 0; + short unit = 0, cfra_flag = 0; if (clip) BKE_tracking_dopesheet_update(&clip->tracking); /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); - glClear(GL_COLOR_BUFFER_BIT); + GPU_clear(GPU_COLOR_BIT); UI_view2d_view_ortho(v2d); @@ -1331,6 +1318,10 @@ static void dopesheet_region_draw(const bContext *C, ARegion *ar) /* data... */ clip_draw_dopesheet_main(sc, ar, scene); + /* current frame indicator line */ + if (sc->flag & SC_SHOW_SECONDS) cfra_flag |= DRAWCFRA_UNIT_SECONDS; + ANIM_draw_cfra(C, v2d, cfra_flag); + /* reset view matrix */ UI_view2d_view_restore(C); @@ -1338,6 +1329,10 @@ static void dopesheet_region_draw(const bContext *C, ARegion *ar) scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY); UI_view2d_scrollers_draw(C, v2d, scrollers); UI_view2d_scrollers_free(scrollers); + + /* currnt frame number indicator */ + UI_view2d_view_orthoSpecial(ar, v2d, 1); + ANIM_draw_cfra_number(C, v2d, cfra_flag); } static void clip_preview_region_draw(const bContext *C, ARegion *ar) @@ -1350,7 +1345,9 @@ static void clip_preview_region_draw(const bContext *C, ARegion *ar) dopesheet_region_draw(C, ar); } -static void clip_preview_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn)) +static void clip_preview_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), + wmNotifier *UNUSED(wmn), const Scene *UNUSED(scene)) { } @@ -1380,7 +1377,7 @@ static void clip_channels_region_draw(const bContext *C, ARegion *ar) /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); - glClear(GL_COLOR_BUFFER_BIT); + GPU_clear(GPU_COLOR_BIT); UI_view2d_view_ortho(v2d); @@ -1391,7 +1388,9 @@ static void clip_channels_region_draw(const bContext *C, ARegion *ar) UI_view2d_view_restore(C); } -static void clip_channels_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn)) +static void clip_channels_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), + wmNotifier *UNUSED(wmn), const Scene *UNUSED(scene)) { } @@ -1408,7 +1407,9 @@ static void clip_header_region_draw(const bContext *C, ARegion *ar) ED_region_header(C, ar); } -static void clip_header_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) +static void clip_header_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, + wmNotifier *wmn, const Scene *UNUSED(scene)) { /* context changes */ switch (wmn->category) { @@ -1443,12 +1444,14 @@ static void clip_tools_region_init(wmWindowManager *wm, ARegion *ar) static void clip_tools_region_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, NULL, -1, true); + ED_region_panels(C, ar); } /****************** tool properties region ******************/ -static void clip_props_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) +static void clip_props_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, + wmNotifier *wmn, const Scene *UNUSED(scene)) { /* context changes */ switch (wmn->category) { @@ -1490,10 +1493,12 @@ static void clip_properties_region_draw(const bContext *C, ARegion *ar) BKE_movieclip_update_scopes(sc->clip, &sc->user, &sc->scopes); - ED_region_panels(C, ar, NULL, -1, true); + ED_region_panels(C, ar); } -static void clip_properties_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) +static void clip_properties_region_listener( + bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, + wmNotifier *wmn, const Scene *UNUSED(scene)) { /* context changes */ switch (wmn->category) { @@ -1593,19 +1598,6 @@ void ED_spacetype_clip(void) BLI_addhead(&st->regiontypes, art); - /* tool properties */ - art = MEM_callocN(sizeof(ARegionType), "spacetype clip tool properties region"); - art->regionid = RGN_TYPE_TOOL_PROPS; - art->prefsizex = 0; - art->prefsizey = 120; - art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI; - art->listener = clip_props_region_listener; - art->init = clip_tools_region_init; - art->draw = clip_tools_region_draw; - ED_clip_tool_props_register(art); - - BLI_addhead(&st->regiontypes, art); - /* regions: header */ art = MEM_callocN(sizeof(ARegionType), "spacetype clip region"); art->regionid = RGN_TYPE_HEADER; diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 50f21c8891c..1572b9b8f78 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -42,10 +42,11 @@ #include "BKE_context.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" #include "BKE_report.h" #include "BKE_sound.h" +#include "DEG_depsgraph.h" + #include "WM_api.h" #include "WM_types.h" @@ -154,8 +155,8 @@ static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { - ED_area_headerprint( - CTX_wm_area(C), + ED_workspace_status_text( + C, IFACE_("Use LMB click to define location where place the marker")); /* Add modal handler for ESC. */ @@ -179,7 +180,7 @@ static int add_marker_at_click_modal(bContext *C, ARegion *ar = CTX_wm_region(C); float pos[2]; - ED_area_headerprint(CTX_wm_area(C), NULL); + ED_workspace_status_text(C, NULL); ED_clip_point_stable_pos(sc, ar, event->x - ar->winrct.xmin, @@ -195,7 +196,7 @@ static int add_marker_at_click_modal(bContext *C, } case ESCKEY: - ED_area_headerprint(CTX_wm_area(C), NULL); + ED_workspace_status_text(C, NULL); return OPERATOR_CANCELLED; } @@ -675,7 +676,7 @@ MovieTrackingTrack *tracking_marker_check_slide(bContext *C, * the mouse. */ if (sc->flag & SC_SHOW_MARKER_PATTERN) { - int current_corner; + int current_corner = -1; distance_squared = mouse_to_closest_pattern_corner_distance_squared( marker, @@ -898,7 +899,7 @@ static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event) } WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); - DAG_id_tag_update(&sc->clip->id, 0); + DEG_id_tag_update(&sc->clip->id, 0); } else if (data->area == TRACK_AREA_PAT) { if (data->action == SLIDE_ACTION_SIZE) { @@ -1193,7 +1194,7 @@ static int disable_markers_exec(bContext *C, wmOperator *op) } } - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); diff --git a/source/blender/editors/space_clip/tracking_ops_orient.c b/source/blender/editors/space_clip/tracking_ops_orient.c index 8c5be7c9d04..3db52e6a39b 100644 --- a/source/blender/editors/space_clip/tracking_ops_orient.c +++ b/source/blender/editors/space_clip/tracking_ops_orient.c @@ -42,10 +42,12 @@ #include "BKE_context.h" #include "BKE_constraint.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" +#include "BKE_layer.h" #include "BKE_object.h" #include "BKE_report.h" +#include "DEG_depsgraph.h" + #include "WM_api.h" #include "WM_types.h" @@ -68,17 +70,16 @@ static Object *get_camera_with_movieclip(Scene *scene, MovieClip *clip) return camera; } - for (Base *base = scene->base.first; - base != NULL; - base = base->next) + FOREACH_SCENE_OBJECT_BEGIN(scene, ob) { - if (base->object->type == OB_CAMERA) { - if (BKE_object_movieclip_get(scene, base->object, false) == clip) { - camera = base->object; + if (ob->type == OB_CAMERA) { + if (BKE_object_movieclip_get(scene, ob, false) == clip) { + camera = ob; break; } } } + FOREACH_SCENE_OBJECT_END; return camera; } @@ -86,6 +87,7 @@ static Object *get_camera_with_movieclip(Scene *scene, MovieClip *clip) static Object *get_orientation_object(bContext *C) { Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; @@ -96,7 +98,7 @@ static Object *get_orientation_object(bContext *C) object = get_camera_with_movieclip(scene, clip); } else { - object = OBACT; + object = OBACT(view_layer); } if (object != NULL && object->parent != NULL) { @@ -110,7 +112,7 @@ static int set_orientation_poll(bContext *C) { SpaceClip *sc = CTX_wm_space_clip(C); if (sc != NULL) { - Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); MovieClip *clip = ED_space_clip_get_clip(sc); if (clip != NULL) { MovieTracking *tracking = &clip->tracking; @@ -119,7 +121,7 @@ static int set_orientation_poll(bContext *C) return true; } else { - return OBACT != NULL; + return OBACT(view_layer) != NULL; } } } @@ -143,7 +145,8 @@ static int count_selected_bundles(bContext *C) return tot; } -static void object_solver_inverted_matrix(Scene *scene, +static void object_solver_inverted_matrix(Depsgraph *depsgraph, + Scene *scene, Object *ob, float invmat[4][4]) { @@ -160,7 +163,7 @@ static void object_solver_inverted_matrix(Scene *scene, bObjectSolverConstraint *data = (bObjectSolverConstraint *)con->data; if (!found) { Object *cam = data->camera ? data->camera : scene->camera; - BKE_object_where_is_calc_mat4(scene, cam, invmat); + BKE_object_where_is_calc_mat4(depsgraph, scene, cam, invmat); } mul_m4_m4m4(invmat, invmat, data->invmat); found = true; @@ -198,6 +201,7 @@ static int set_origin_exec(bContext *C, wmOperator *op) MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; Scene *scene = CTX_data_scene(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); Object *camera = get_camera_with_movieclip(scene, clip); int selected_count = count_selected_bundles(C); @@ -234,20 +238,20 @@ static int set_origin_exec(bContext *C, wmOperator *op) mul_v3_fl(median, 1.0f / selected_count); float mat[4][4], vec[3]; - BKE_tracking_get_camera_object_matrix(scene, camera, mat); + BKE_tracking_get_camera_object_matrix(depsgraph, scene, camera, mat); mul_v3_m4v3(vec, mat, median); if (tracking_object->flag & TRACKING_OBJECT_CAMERA) { sub_v3_v3(object->loc, vec); } else { - object_solver_inverted_matrix(scene, object, mat); + object_solver_inverted_matrix(depsgraph, scene, object, mat); mul_v3_m4v3(vec, mat, vec); copy_v3_v3(object->loc, vec); } - DAG_id_tag_update(&clip->id, 0); - DAG_id_tag_update(&object->id, OB_RECALC_OB); + DEG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&object->id, OB_RECALC_OB); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); @@ -276,7 +280,8 @@ void CLIP_OT_set_origin(wmOperatorType *ot) /********************** set floor operator *********************/ -static void set_axis(Scene *scene, +static void set_axis(Depsgraph *depsgraph, + Scene *scene, Object *ob, MovieClip *clip, MovieTrackingObject *tracking_object, @@ -290,14 +295,14 @@ static void set_axis(Scene *scene, BKE_object_to_mat4(ob, obmat); - BKE_tracking_get_camera_object_matrix(scene, camera, mat); + BKE_tracking_get_camera_object_matrix(depsgraph, scene, camera, mat); mul_v3_m4v3(vec, mat, track->bundle_pos); copy_v3_v3(dvec, vec); if (!is_camera) { float imat[4][4]; - object_solver_inverted_matrix(scene, ob, imat); + object_solver_inverted_matrix(depsgraph, scene, ob, imat); mul_v3_m4v3(vec, imat, vec); invert_m4_m4(imat, obmat); @@ -403,6 +408,7 @@ static int set_plane_exec(bContext *C, wmOperator *op) ListBase *tracksbase; Object *object; Object *camera = get_camera_with_movieclip(scene, clip); + Depsgraph *depsgraph = CTX_data_depsgraph(C); int tot = 0; float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3] = {0.0f, 0.0f, 0.0f}; int plane = RNA_enum_get(op->ptr, "plane"); @@ -427,7 +433,7 @@ static int set_plane_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - BKE_tracking_get_camera_object_matrix(scene, camera, mat); + BKE_tracking_get_camera_object_matrix(depsgraph, scene, camera, mat); /* Get 3 bundles to use as reference. */ track = tracksbase->first; @@ -489,11 +495,11 @@ static int set_plane_exec(bContext *C, wmOperator *op) BKE_object_apply_mat4(object, mat, 0, 0); } - BKE_object_where_is_calc(scene, object); - set_axis(scene, object, clip, tracking_object, axis_track, 'X'); + BKE_object_where_is_calc(depsgraph, scene, object); + set_axis(depsgraph, scene, object, clip, tracking_object, axis_track, 'X'); - DAG_id_tag_update(&clip->id, 0); - DAG_id_tag_update(&object->id, OB_RECALC_OB); + DEG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&object->id, OB_RECALC_OB); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); @@ -536,6 +542,7 @@ static int set_axis_exec(bContext *C, wmOperator *op) MovieTracking *tracking = &clip->tracking; MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking); Scene *scene = CTX_data_scene(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); Object *object; int axis = RNA_enum_get(op->ptr, "axis"); @@ -564,10 +571,10 @@ static int set_axis_exec(bContext *C, wmOperator *op) track = track->next; } - set_axis(scene, object, clip, tracking_object, track, axis == 0 ? 'X' : 'Y'); + set_axis(depsgraph, scene, object, clip, tracking_object, track, axis == 0 ? 'X' : 'Y'); - DAG_id_tag_update(&clip->id, 0); - DAG_id_tag_update(&object->id, OB_RECALC_OB); + DEG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&object->id, OB_RECALC_OB); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); @@ -615,6 +622,7 @@ static int do_set_scale(bContext *C, MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking); MovieTrackingTrack *track; Scene *scene = CTX_data_scene(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); Object *object = NULL; Object *camera = get_camera_with_movieclip(scene, clip); ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); @@ -639,7 +647,7 @@ static int do_set_scale(bContext *C, } } - BKE_tracking_get_camera_object_matrix(scene, camera, mat); + BKE_tracking_get_camera_object_matrix(depsgraph, scene, camera, mat); track = tracksbase->first; while (track) { @@ -693,10 +701,10 @@ static int do_set_scale(bContext *C, tracking_object->scale = scale; } - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); if (object) - DAG_id_tag_update(&object->id, OB_RECALC_OB); + DEG_id_tag_update(&object->id, OB_RECALC_OB); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); diff --git a/source/blender/editors/space_clip/tracking_ops_plane.c b/source/blender/editors/space_clip/tracking_ops_plane.c index aa8518befaa..6c85bdfc4ec 100644 --- a/source/blender/editors/space_clip/tracking_ops_plane.c +++ b/source/blender/editors/space_clip/tracking_ops_plane.c @@ -39,9 +39,10 @@ #include "BKE_context.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" #include "BKE_report.h" +#include "DEG_depsgraph.h" + #include "WM_api.h" #include "WM_types.h" @@ -372,7 +373,7 @@ static int slide_plane_marker_modal(bContext *C, data->previous_mval[1] = event->mval[1]; copy_v2_v2(data->previous_corner, data->corner); - DAG_id_tag_update(&sc->clip->id, 0); + DEG_id_tag_update(&sc->clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); @@ -390,7 +391,7 @@ static int slide_plane_marker_modal(bContext *C, clip_tracking_show_cursor(C); - DAG_id_tag_update(&sc->clip->id, 0); + DEG_id_tag_update(&sc->clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_clip/tracking_ops_solve.c b/source/blender/editors/space_clip/tracking_ops_solve.c index 5c74c1947e3..89dfadc8974 100644 --- a/source/blender/editors/space_clip/tracking_ops_solve.c +++ b/source/blender/editors/space_clip/tracking_ops_solve.c @@ -43,10 +43,11 @@ #include "BKE_movieclip.h" #include "BKE_tracking.h" #include "BKE_global.h" -#include "BKE_depsgraph.h" #include "BKE_report.h" #include "BKE_library.h" +#include "DEG_depsgraph.h" + #include "WM_api.h" #include "WM_types.h" @@ -180,7 +181,7 @@ static void solve_camera_freejob(void *scv) MEM_freeN(tracking->stats); tracking->stats = NULL; - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_main_add_notifier(NC_MOVIECLIP | NA_EVALUATED, clip); WM_main_add_notifier(NC_OBJECT | ND_TRANSFORM, NULL); @@ -327,7 +328,7 @@ static int clear_solution_exec(bContext *C, wmOperator *UNUSED(op)) reconstruction->camnr = 0; reconstruction->flag &= ~TRACKING_RECONSTRUCTED; - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); diff --git a/source/blender/editors/space_clip/tracking_ops_stabilize.c b/source/blender/editors/space_clip/tracking_ops_stabilize.c index a83e5f2af02..cb9b40f8a10 100644 --- a/source/blender/editors/space_clip/tracking_ops_stabilize.c +++ b/source/blender/editors/space_clip/tracking_ops_stabilize.c @@ -38,7 +38,8 @@ #include "BKE_context.h" #include "BKE_tracking.h" -#include "BKE_depsgraph.h" + +#include "DEG_depsgraph.h" #include "WM_api.h" #include "WM_types.h" @@ -84,7 +85,7 @@ static int stabilize_2d_add_exec(bContext *C, wmOperator *UNUSED(op)) } if (update) { - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } @@ -138,7 +139,7 @@ static int stabilize_2d_remove_exec(bContext *C, wmOperator *UNUSED(op)) } if (update) { - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } @@ -227,7 +228,7 @@ static int stabilize_2d_rotation_add_exec(bContext *C, wmOperator *UNUSED(op)) } if (update) { - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } @@ -281,7 +282,7 @@ static int stabilize_2d_rotation_remove_exec(bContext *C, wmOperator *UNUSED(op) } if (update) { - DAG_id_tag_update(&clip->id, 0); + DEG_id_tag_update(&clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c index 0dd0ee8c7d4..cd8e92c9b9c 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.c +++ b/source/blender/editors/space_clip/tracking_ops_track.c @@ -297,7 +297,8 @@ static void track_markers_endjob(void *tmv) tmj->scene->r.cfra = BKE_movieclip_remap_clip_to_scene_frame(tmj->clip, tmj->lastfra); if (wm != NULL) { - ED_update_for_newframe(tmj->main, tmj->scene, 0); + // XXX: ... + // ED_update_for_newframe(tmj->main, tmj->scene); } BKE_autotrack_context_sync(tmj->context); |