[Bf-blender-cvs] [1b4b4df] blender2.8: OpenGL/GPencil: draw stroke-in-progress with new imm mode

Mike Erwin noreply at git.blender.org
Fri Oct 7 02:57:06 CEST 2016


Commit: 1b4b4dfd0cbc766b026296b7a0460fae6a18d117
Author: Mike Erwin
Date:   Thu Oct 6 20:51:05 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB1b4b4dfd0cbc766b026296b7a0460fae6a18d117

OpenGL/GPencil: draw stroke-in-progress with new imm mode

We should revisit this later and use geometry shader to draw one continuous tapered stroke.

Part of T49043

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

M	source/blender/editors/gpencil/drawgpencil.c

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

diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index a7e30cc7..9d6920f 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -157,16 +157,24 @@ static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short
 	if (dflag & (GP_DRAWDATA_ONLY3D | GP_DRAWDATA_ONLYV2D))
 		return;
 
+	if (sflag & GP_STROKE_ERASER) {
+		/* don't draw stroke at all! */
+		return;
+	}
+
+	VertexFormat *format = immVertexFormat();
+	unsigned pos = add_attrib(format, "pos", GL_INT, 2, CONVERT_INT_TO_FLOAT);
+	unsigned color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 4, NORMALIZE_INT_TO_FLOAT);
+
+	const tGPspoint *pt = points;
+
 	if (totpoints == 1) {
 		/* if drawing a single point, draw it larger */
 		glPointSize((float)(thickness + 2) * points->pressure);
-		glBegin(GL_POINTS);
-
-		gp_set_color_and_tpoint(points, ink);
-		glEnd();
-	}
-	else if (sflag & GP_STROKE_ERASER) {
-		/* don't draw stroke at all! */
+		immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
+		immBegin(GL_POINTS, 1);
+		gp_set_tpoint_varying_color(pt, ink, color);
+		immVertex2iv(pos, &pt->x);
 	}
 	else {
 		float oldpressure = points[0].pressure;
@@ -175,36 +183,39 @@ static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short
 		if (G.debug & G_DEBUG) setlinestyle(2);
 
 		glLineWidth(max_ff(oldpressure * thickness, 1.0));
-		glBegin(GL_LINE_STRIP);
+		immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
+		immBeginAtMost(GL_LINE_STRIP, totpoints);
+
+		/* TODO: implement this with a geometry shader to draw one continuous tapered stroke */
 
-		const tGPspoint *pt = points;
 		for (int i = 0; i < totpoints; i++, pt++) {
 			/* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
 			 * and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
 			 */
 			if (fabsf(pt->pressure - oldpressure) > 0.2f) {
-				glEnd();
+				immEnd();
 				glLineWidth(max_ff(pt->pressure * thickness, 1.0f));
-				glBegin(GL_LINE_STRIP);
+				immBeginAtMost(GL_LINE_STRIP, totpoints - i + 1);
 
 				/* need to roll-back one point to ensure that there are no gaps in the stroke */
 				if (i != 0) { 
-					gp_set_color_and_tpoint((pt - 1), ink);
+					gp_set_tpoint_varying_color(pt - 1, ink, color);
+					immVertex2iv(pos, &(pt - 1)->x);
 				}
 
-				/* now the point we want... */
-				gp_set_color_and_tpoint(pt, ink);
-
-				oldpressure = pt->pressure;
-			}
-			else {
-				gp_set_color_and_tpoint(pt, ink);
+				oldpressure = pt->pressure; /* reset our threshold */
 			}
+
+			/* now the point we want */
+			gp_set_tpoint_varying_color(pt, ink, color);
+			immVertex2iv(pos, &pt->x);
 		}
-		glEnd();
 
 		if (G.debug & G_DEBUG) setlinestyle(0);
 	}
+
+	immEnd();
+	immUnbindProgram();
 }
 
 /* --------- 2D Stroke Drawing Helpers --------- */




More information about the Bf-blender-cvs mailing list