[Bf-blender-cvs] [ba4f47ce8eb] blender2.8: Getting rid of setlinestyle: Clip drawing code.

Bastien Montagne noreply at git.blender.org
Fri Apr 28 19:23:05 CEST 2017


Commit: ba4f47ce8eb00284da7d6b17bf9c3f02506617e3
Author: Bastien Montagne
Date:   Fri Apr 28 19:20:14 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBba4f47ce8eb00284da7d6b17bf9c3f02506617e3

Getting rid of setlinestyle: Clip drawing code.

This one has been painful, it's doing lots of nifty conditional drawing
of all kind... Also, very nice illustration of how cumbersome it is to
use dashed shader currently, we really need to find a simpler way at
some point imho. But this is not critical issue either, for now we can
live with some uglyness like that. :/

===================================================================

M	source/blender/editors/space_clip/clip_draw.c

===================================================================

diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index ed0cf861e39..7edd5ca45d1 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -348,10 +348,14 @@ 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) {
-		setlinestyle(3);
+		VertexFormat *format = immVertexFormat();
+		const uint shdr_dashed_pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+		const uint shdr_dashed_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_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);
@@ -359,20 +363,24 @@ static void draw_stabilization_border(SpaceClip *sc, ARegion *ar, int width, int
 		gpuScale2f(zoomx, zoomy);
 		gpuMultMatrix(sc->stabmat);
 
-		unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
+		immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
 
-		immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-		immUniformColor3f(0.0f, 0.0f, 0.0f);
+		float viewport_size[4];
+		glGetFloatv(GL_VIEWPORT, viewport_size);
+		immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
+
+		immUniform4f("color1", 1.0f, 1.0f, 1.0f, 0.0f);
+		immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f);
+		immUniform1f("dash_width", 6.0f);
+		immUniform1f("dash_width_on", 3.0f);
 
-		imm_draw_line_box(pos, 0.0f, 0.0f, width, height);
+		imm_draw_line_box_dashed(shdr_dashed_pos, shdr_dashed_origin, 0.0f, 0.0f, width, height);
 
 		immUnbindProgram();
 
 		gpuPopMatrix();
 
 		glDisable(GL_COLOR_LOGIC_OP);
-
-		setlinestyle(0);
 	}
 }
 
@@ -628,11 +636,16 @@ 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, unsigned int position)
+                              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 *curr_col, other_col[3], col[3], scol[3];
+	float px[2];
+	bool is_dashed_shader = false;
+
+	/* Vertex attributes ids for dashed shader... */
+	uint shdr_dashed_pos, shdr_dashed_origin;
 
 	track_colors(track, act, col, scol);
 
@@ -647,18 +660,20 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
 
 		if (track->flag & TRACK_LOCKED) {
 			if (act) {
-				immUniformThemeColor(TH_ACT_MARKER);
+				UI_GetThemeColor3fv(TH_ACT_MARKER, other_col);
 			}
 			else if (track->flag & SELECT) {
-				immUniformThemeColorShade(TH_LOCK_MARKER, 64);
+				UI_GetThemeColorShade3fv(TH_LOCK_MARKER, 64, other_col);
 			}
 			else {
-				immUniformThemeColor(TH_LOCK_MARKER);
+				UI_GetThemeColor3fv(TH_LOCK_MARKER, other_col);
 			}
+			curr_col = other_col;
 		}
 		else {
-			immUniformColor3fv((track->flag & SELECT) ? scol : col);
+			curr_col = (track->flag & SELECT) ? scol : col;
 		}
+		immUniformColor3fv(curr_col);
 
 		add_v2_v2v2(pos, marker->pos, track->offset);
 		ED_clip_point_undistorted_pos(sc, pos, pos);
@@ -671,40 +686,54 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
 			glPointSize(tiny ? 1.0f : 2.0f);
 
 			immBegin(PRIM_POINTS, 1);
-			immVertex2f(position, pos[0], pos[1]);
+			immVertex2f(shdr_pos, pos[0], pos[1]);
 			immEnd();
 		}
 		else {
 			immBegin(PRIM_LINES, 8);
 
-			immVertex2f(position, pos[0] + px[0] * 3, pos[1]);
-			immVertex2f(position, 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(position, pos[0] - px[0] * 3, pos[1]);
-			immVertex2f(position, 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(position, pos[0], pos[1] - px[1] * 3);
-			immVertex2f(position, pos[0], pos[1] - px[1] * 7);
+			immVertex2f(shdr_pos, pos[0], pos[1] - px[1] * 3);
+			immVertex2f(shdr_pos, pos[0], pos[1] - px[1] * 7);
 
-			immVertex2f(position, pos[0], pos[1] + px[1] * 3);
-			immVertex2f(position, pos[0], pos[1] + px[1] * 7);
+			immVertex2f(shdr_pos, pos[0], pos[1] + px[1] * 3);
+			immVertex2f(shdr_pos, pos[0], pos[1] + px[1] * 7);
 
 			immEnd();
 
-			immUniformColor3f(0.0f, 0.0f, 0.0f);
-			setlinestyle(3);
+			immUnbindProgram();
+
+			is_dashed_shader = true;
+			VertexFormat *format = immVertexFormat();
+			shdr_dashed_pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+			shdr_dashed_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+			immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+			float viewport_size[4];
+			glGetFloatv(GL_VIEWPORT, viewport_size);
+			immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
+
+			immUniform4f("color1", 1.0f, 1.0f, 1.0f, 0.0f);
+			immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f);
+			immUniform1f("dash_width", 6.0f);
+			immUniform1f("dash_width_on", 3.0f);
 
 			glEnable(GL_COLOR_LOGIC_OP);
-			glLogicOp(GL_NOR);
+			glLogicOp(GL_XOR);
 
 			immBegin(PRIM_LINES, 2);
-			immVertex2fv(position, pos);
-			immVertex2fv(position, marker_pos);
+			immAttrib2fv(shdr_dashed_origin, pos);
+			immVertex2fv(shdr_dashed_pos, pos);
+			immVertex2fv(shdr_dashed_pos, marker_pos);
 			immEnd();
 
 			glDisable(GL_COLOR_LOGIC_OP);
-
-			setlinestyle(0);
 		}
 	}
 
@@ -712,58 +741,123 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
 	gpuPushMatrix();
 	gpuTranslate2fv(marker_pos);
 
-	if (tiny) {
-		setlinestyle(3);
-	}
-
 	if (track->flag & TRACK_LOCKED) {
 		if (act) {
-			immUniformThemeColor(TH_ACT_MARKER);
+			UI_GetThemeColor3fv(TH_ACT_MARKER, other_col);
 		}
 		else if (track->pat_flag & SELECT) {
-			immUniformThemeColorShade(TH_LOCK_MARKER, 64);
+			UI_GetThemeColorShade3fv(TH_LOCK_MARKER, 64, other_col);
 		}
 		else {
-			immUniformThemeColor(TH_LOCK_MARKER);
+			UI_GetThemeColor3fv(TH_LOCK_MARKER, other_col);
 		}
+		curr_col = other_col;
 	}
 	else if (marker->flag & MARKER_DISABLED) {
 		if (act) {
-			immUniformThemeColor(TH_ACT_MARKER);
+			UI_GetThemeColor3fv(TH_ACT_MARKER, other_col);
 		}
 		else if (track->pat_flag & SELECT) {
-			immUniformThemeColorShade(TH_DIS_MARKER, 128);
+			UI_GetThemeColorShade3fv(TH_DIS_MARKER, 128, other_col);
 		}
 		else {
-			immUniformThemeColor(TH_DIS_MARKER);
+			UI_GetThemeColor3fv(TH_DIS_MARKER, other_col);
 		}
+		curr_col = other_col;
 	}
 	else {
-		immUniformColor3fv((track->pat_flag & SELECT) ? scol : col);
+		curr_col = (track->pat_flag & SELECT) ? scol : col;
 	}
 
-	if ((track->pat_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_PATTERN)) {
-		immBegin(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();
+	if (tiny) {
+		if (!is_dashed_shader) {
+			immUnbindProgram();
+
+			is_dashed_shader = true;
+			VertexFormat *format = immVertexFormat();
+			shdr_dashed_pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+			shdr_dashed_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+			immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+		}
+
+		glEnable(GL_BLEND);
+		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+		float viewport_size[4];
+		glGetFloatv(GL_VIEWPORT, viewport_size);
+		immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
+
+		immUniform4f("color1", curr_col[0], curr_col[1], curr_col[2], 1.0f);
+		immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f);
+		immUniform1f("dash_width", 6.0f);
+		immUniform1f("dash_width_on", 3.0f);
+
+		if ((track->pat_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_PATTERN)) {
+			immBegin(PRIM_LINES, 8);
+			immAttrib2fv(shdr_dashed_origin, marker->pattern_corners[0]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[0]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[1]);
+
+			immAttrib2fv(shdr_dashed_origin, marker->pattern_corners[1]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[1]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[2]);
+
+			immAttrib2fv(shdr_dashed_origin, marker->pattern_corners[3]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[2]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[3]);
+
+			immAttrib2fv(shdr_dashed_origin, marker->pattern_corners[0]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[3]);
+			immVertex2fv(shdr_dashed_pos, marker->pattern_corners[0]);
+			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_line_box_dashed(shdr_dashed_pos, shdr_dashed_origin, marker->search_min[0], marker->search_min[1],
+			                                           marker->search_max[0], marker->search_max[1]);
+		}
+
+		glDisable(GL_BLEND);
 	}
 
-	/* search */
-	show_search = (TRACK_VIEW_SELECTED(sc, track) &&
-	               ((marker->flag & MARKER_DISABLED) == 0 || (sc->flag & SC_SHOW_MARKER_PATTERN) == 0)) != 0;
+	if (is_dashed_shader) {
+		immUnbindProgram();
 
-	if ((track->search_flag & SELECT) == sel && (sc->flag & SC_SHOW_MARKER_SEARCH) && show_se

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list