[Bf-blender-cvs] [9d40c3d] blender2.8: OpenGL: draw gpencil fill with new imm mode

Mike Erwin noreply at git.blender.org
Fri Oct 7 09:17:59 CEST 2016


Commit: 9d40c3dc32b6a293ba21fe10efafc19f78fd562a
Author: Mike Erwin
Date:   Fri Oct 7 03:04:34 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB9d40c3dc32b6a293ba21fe10efafc19f78fd562a

OpenGL: draw gpencil fill with new imm mode

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 1320949..0f286bc 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -442,41 +442,55 @@ static void gp_triangulate_stroke_fill(bGPDstroke *gps)
 /* draw fills for shapes */
 static void gp_draw_stroke_fill(
         bGPdata *gpd, bGPDstroke *gps,
-        int offsx, int offsy, int winx, int winy, const float diff_mat[4][4])
+        int offsx, int offsy, int winx, int winy, const float diff_mat[4][4], const float color[4])
 {
-	bGPDpalettecolor *palcolor;
 	float fpt[3];
 
 	BLI_assert(gps->totpoints >= 3);
 
-	palcolor = ED_gpencil_stroke_getcolor(gpd, gps);
+	bGPDpalettecolor *palcolor = ED_gpencil_stroke_getcolor(gpd, gps);
 
 	/* Triangulation fill if high quality flag is enabled */
 	if (palcolor->flag & PC_COLOR_HQ_FILL) {
-		bGPDtriangle *stroke_triangle = gps->triangles;
-		bGPDspoint *pt;
-
 		/* Calculate triangles cache for filling area (must be done only after changes) */
 		if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) {
 			gp_triangulate_stroke_fill(gps);
 		}
-		/* Draw all triangles for filling the polygon (cache must be calculated before) */
 		BLI_assert(gps->tot_triangles >= 1);
-		glBegin(GL_TRIANGLES);
+
+		unsigned pos;
+		if (gps->flag & GP_STROKE_3DSPACE) {
+			pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
+			immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+		}
+		else {
+			pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
+			immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+		}
+
+		immUniformColor4fv(color);
+
+		/* Draw all triangles for filling the polygon (cache must be calculated before) */
+		immBegin(GL_TRIANGLES, gps->tot_triangles * 3);
+		/* TODO: use batch instead of immediate mode, to share vertices */
+
+		bGPDtriangle *stroke_triangle = gps->triangles;
+		bGPDspoint *pt;
+
 		for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
 			if (gps->flag & GP_STROKE_3DSPACE) {
 				/* vertex 1 */
 				pt = &gps->points[stroke_triangle->v1];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
-				glVertex3fv(fpt);
+				immVertex3fv(pos, fpt);
 				/* vertex 2 */
 				pt = &gps->points[stroke_triangle->v2];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
-				glVertex3fv(fpt);
+				immVertex3fv(pos, fpt);
 				/* vertex 3 */
 				pt = &gps->points[stroke_triangle->v3];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
-				glVertex3fv(fpt);
+				immVertex3fv(pos, fpt);
 			}
 			else {
 				float co[2];
@@ -484,20 +498,22 @@ static void gp_draw_stroke_fill(
 				pt = &gps->points[stroke_triangle->v1];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
 				gp_calc_2d_stroke_fxy(fpt, gps->flag, offsx, offsy, winx, winy, co);
-				glVertex2fv(co);
+				immVertex2fv(pos, co);
 				/* vertex 2 */
 				pt = &gps->points[stroke_triangle->v2];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
 				gp_calc_2d_stroke_fxy(fpt, gps->flag, offsx, offsy, winx, winy, co);
-				glVertex2fv(co);
+				immVertex2fv(pos, co);
 				/* vertex 3 */
 				pt = &gps->points[stroke_triangle->v3];
 				mul_v3_m4v3(fpt, diff_mat, &pt->x);
 				gp_calc_2d_stroke_fxy(fpt, gps->flag, offsx, offsy, winx, winy, co);
-				glVertex2fv(co);
+				immVertex2fv(pos, co);
 			}
 		}
-		glEnd();
+
+		immEnd();
+		immUnbindProgram();
 	}
 
 #if 0 /* convert to modern GL only if needed */
@@ -934,19 +950,20 @@ static void gp_draw_strokes(
 				interp_v3_v3v3(tfill, palcolor->fill, tintcolor, tintcolor[3]);
 				tfill[3] = palcolor->fill[3] * opacity;
 				if (tfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) {
+					const float *color;
 					if (!onion) {
-						glColor4fv(tfill);
+						color = tfill;
 					}
 					else {
 						if (custonion) {
-							glColor4fv(tintcolor);
+							color = tintcolor;
 						}
 						else {
 							ARRAY_SET_ITEMS(tfill, UNPACK3(palcolor->fill), tintcolor[3]);
-							glColor4fv(tfill);
+							color = tfill;
 						}
 					}
-					gp_draw_stroke_fill(gpd, gps, offsx, offsy, winx, winy, diff_mat);
+					gp_draw_stroke_fill(gpd, gps, offsx, offsy, winx, winy, diff_mat, color);
 				}
 			}
 
@@ -999,20 +1016,21 @@ static void gp_draw_strokes(
 				interp_v3_v3v3(tfill, palcolor->fill, tintcolor, tintcolor[3]);
 				tfill[3] = palcolor->fill[3] * opacity;
 				if (tfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) {
+					const float *color;
 					if (!onion) {
-						glColor4fv(tfill);
+						color = tfill;
 					}
 					else {
 						if (custonion) {
-							glColor4fv(tintcolor);
+							color = tintcolor;
 						}
 						else {
 							ARRAY_SET_ITEMS(tfill, palcolor->fill[0], palcolor->fill[1], palcolor->fill[2],
 							                tintcolor[3]);
-							glColor4fv(tfill);
+							color = tfill;
 						}
 					}
-					gp_draw_stroke_fill(gpd, gps, offsx, offsy, winx, winy, diff_mat);
+					gp_draw_stroke_fill(gpd, gps, offsx, offsy, winx, winy, diff_mat, color);
 				}
 			}




More information about the Bf-blender-cvs mailing list