[Bf-blender-cvs] [47bba7e] blender2.8: OpenGL: draw nurbs control verts with new imm mode

Mike Erwin noreply at git.blender.org
Thu Sep 29 21:24:46 CEST 2016


Commit: 47bba7e15f4b7a105655b81affea9f2d48a3a767
Author: Mike Erwin
Date:   Thu Sep 29 15:20:24 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB47bba7e15f4b7a105655b81affea9f2d48a3a767

OpenGL: draw nurbs control verts with new imm mode

patch P397 by @lichtwert + minor const by @merwin

Notes from drawvertsN function:
this used to be called twice (once for selected/active, once for unselected -- guess: to avoid state switches[color]?)
this used to be called in a loop, too (subcurves), moved the loop here to avoid multiple init stuff

Part of T49043

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

M	source/blender/editors/space_view3d/drawobject.c

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

diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index a5aeae9..af11136 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -5003,66 +5003,94 @@ static void drawhandlesN_active(Nurb *nu)
 	glColor3ub(0, 0, 0);
 }
 
-static void drawvertsN(Nurb *nu, const char sel, const bool hide_handles, const void *vert)
+static void drawvertsN(const Nurb *nurb, const bool hide_handles, const void *vert)
 {
-	if (nu->hide) return;
+	const Nurb *nu;
 
-	const int color = sel ? TH_VERTEX_SELECT : TH_VERTEX;
+	// just quick guesstimate of how many verts to draw
+	int count = 0;
+	for (nu = nurb; nu; nu = nu->next) {
+		if (!nu->hide) {
+			if (nu->type == CU_BEZIER) {
+				count += nu->pntsu * 3;
+			}
+			else {
+				count += nu->pntsu * nu->pntsv;
+			}
+		}
+	}
+	if (count == 0) return;
 
-	UI_ThemeColor(color);
+	VertexFormat *format = immVertexFormat();
+	unsigned pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+	unsigned color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 3, NORMALIZE_INT_TO_FLOAT);
+	immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR);
+
+	unsigned char vert_color[3];
+	unsigned char vert_color_select[3];
+	unsigned char vert_color_active[3];
+	UI_GetThemeColor3ubv(TH_VERTEX, vert_color);
+	UI_GetThemeColor3ubv(TH_VERTEX_SELECT, vert_color_select);
+	UI_GetThemeColor3ubv(TH_ACTIVE_VERT, vert_color_active);
 
 	glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
+
+	immBeginAtMost(GL_POINTS, count);
 	
-	glBegin(GL_POINTS);
-	
-	if (nu->type == CU_BEZIER) {
+	for (nu = nurb; nu; nu = nu->next) {
 
-		BezTriple *bezt = nu->bezt;
-		int a = nu->pntsu;
-		while (a--) {
-			if (bezt->hide == 0) {
-				if (sel == 1 && bezt == vert) {
-					UI_ThemeColor(TH_ACTIVE_VERT);
+		if (nu->hide) continue;
 
-					if (bezt->f2 & SELECT) glVertex3fv(bezt->vec[1]);
-					if (!hide_handles) {
-						if (bezt->f1 & SELECT) glVertex3fv(bezt->vec[0]);
-						if (bezt->f3 & SELECT) glVertex3fv(bezt->vec[2]);
-					}
+		if (nu->type == CU_BEZIER) {
 
-					UI_ThemeColor(color);
-				}
-				else if (hide_handles) {
-					if ((bezt->f2 & SELECT) == sel) glVertex3fv(bezt->vec[1]);
-				}
-				else {
-					if ((bezt->f1 & SELECT) == sel) glVertex3fv(bezt->vec[0]);
-					if ((bezt->f2 & SELECT) == sel) glVertex3fv(bezt->vec[1]);
-					if ((bezt->f3 & SELECT) == sel) glVertex3fv(bezt->vec[2]);
+			const BezTriple *bezt = nu->bezt;
+			int a = nu->pntsu;
+			while (a--) {
+				if (bezt->hide == 0) {
+					if (bezt == vert) {
+						immAttrib3ubv(color, bezt->f2 & SELECT ? vert_color_active : vert_color);
+						immVertex3fv(pos, bezt->vec[1]);
+						if (!hide_handles) {
+							immAttrib3ubv(color, bezt->f1 & SELECT ? vert_color_active : vert_color);
+							immVertex3fv(pos, bezt->vec[0]);
+							immAttrib3ubv(color, bezt->f3 & SELECT ? vert_color_active : vert_color);
+							immVertex3fv(pos, bezt->vec[2]);
+						}
+					}
+					else {
+						immAttrib3ubv(color, bezt->f2 & SELECT ? vert_color_select : vert_color);
+						immVertex3fv(pos, bezt->vec[1]);
+						if (!hide_handles) {
+							immAttrib3ubv(color, bezt->f1 & SELECT ? vert_color_select : vert_color);
+							immVertex3fv(pos, bezt->vec[0]);
+							immAttrib3ubv(color, bezt->f3 & SELECT ? vert_color_select : vert_color);
+							immVertex3fv(pos, bezt->vec[2]);
+						}
+					}
 				}
+				bezt++;
 			}
-			bezt++;
 		}
-	}
-	else {
-		BPoint *bp = nu->bp;
-		int a = nu->pntsu * nu->pntsv;
-		while (a--) {
-			if (bp->hide == 0) {
-				if (bp == vert) {
-					UI_ThemeColor(TH_ACTIVE_VERT);
-					glVertex3fv(bp->vec);
-					UI_ThemeColor(color);
-				}
-				else {
-					if ((bp->f1 & SELECT) == sel) glVertex3fv(bp->vec);
+		else {
+			const BPoint *bp = nu->bp;
+			int a = nu->pntsu * nu->pntsv;
+			while (a--) {
+				if (bp->hide == 0) {
+					if (bp == vert) {
+						immAttrib3ubv(color, vert_color_active);
+					}
+					else {
+						immAttrib3ubv(color, bp->f1 & SELECT ? vert_color_select : vert_color);
+					}
+					immVertex3fv(pos, bp->vec);
 				}
+				bp++;
 			}
-			bp++;
 		}
 	}
-	
-	glEnd();
+
+	immEnd();
+	immUnbindProgram();
 }
 
 static void editnurb_draw_active_poly(Nurb *nu)
@@ -5280,7 +5308,6 @@ static void draw_editnurb(
 	for (nu = nurb; nu; nu = nu->next) {
 		if (nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES) == 0)
 			drawhandlesN(nu, 1, hide_handles);
-		drawvertsN(nu, 0, hide_handles, NULL);
 	}
 	
 	if (v3d->zbuf) glDepthFunc(GL_LEQUAL);
@@ -5331,11 +5358,9 @@ static void draw_editnurb(
 	}
 
 	if (v3d->zbuf) glDepthFunc(GL_ALWAYS);
-	
-	for (nu = nurb; nu; nu = nu->next) {
-		drawvertsN(nu, 1, hide_handles, vert);
-	}
-	
+
+	drawvertsN(nu, hide_handles, vert);
+
 	if (v3d->zbuf) glDepthFunc(GL_LEQUAL);
 }




More information about the Bf-blender-cvs mailing list