[Bf-blender-cvs] [8dbd961a3e] blender2.8: OpenGL immediate mode: interface_draw.c

Clément Foucault noreply at git.blender.org
Mon Feb 6 14:07:44 CET 2017


Commit: 8dbd961a3ecb56f9ecef8d028914d981d65ef75b
Author: Clément Foucault
Date:   Mon Feb 6 14:06:13 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB8dbd961a3ecb56f9ecef8d028914d981d65ef75b

OpenGL immediate mode: interface_draw.c

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_draw.c
M	source/blender/editors/screen/area.c
M	source/blender/editors/space_nla/nla_draw.c
M	source/blender/editors/space_sequencer/sequencer_draw.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index d48cfbee41..5e27dc12a1 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -316,8 +316,8 @@ void UI_draw_box_shadow(unsigned char alpha, float minx, float miny, float maxx,
 void UI_draw_roundbox_gl_mode_3ubAlpha(int mode, float minx, float miny, float maxx, float maxy, float rad, unsigned char col[3], unsigned char alpha);
 void UI_draw_roundbox_gl_mode_3fvAlpha(int mode, float minx, float miny, float maxx, float maxy, float rad, float col[3], float alpha);
 void UI_draw_roundbox_gl_mode(int mode, float minx, float miny, float maxx, float maxy, float rad, float col[4]);
-void UI_draw_roundbox_shade_x(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
-void UI_draw_roundbox_shade_y(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight);
+void UI_draw_roundbox_shade_x(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown, float col[4]);
+void UI_draw_roundbox_shade_y(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeleft, float shaderight, float col[4]);
 void UI_draw_text_underline(int pos_x, int pos_y, int len, int height);
 
 void UI_draw_safe_areas(
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index f17c61b8aa..bfd90142e9 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -174,227 +174,251 @@ void UI_draw_roundbox_gl_mode(int mode, float minx, float miny, float maxx, floa
 	immUnbindProgram();
 }
 
-static void round_box_shade_col(const float col1[3], float const col2[3], const float fac)
+static void round_box_shade_col(unsigned attrib, const float col1[3], float const col2[3], const float fac)
 {
-	float col[3] = {
+	float col[4] = {
 		fac * col1[0] + (1.0f - fac) * col2[0],
 		fac * col1[1] + (1.0f - fac) * col2[1],
-		fac * col1[2] + (1.0f - fac) * col2[2]
+		fac * col1[2] + (1.0f - fac) * col2[2],
+		1.0f
 	};
-	glColor3fv(col);
+	immAttrib4fv(attrib, col);
 }
 
 /* linear horizontal shade within button or in outline */
 /* view2d scrollers use it */
 void UI_draw_roundbox_shade_x(
         int mode, float minx, float miny, float maxx, float maxy,
-        float rad, float shadetop, float shadedown)
+        float rad, float shadetop, float shadedown, float col[4])
 {
 	float vec[7][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},
 	                   {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
 	const float div = maxy - miny;
 	const float idiv = 1.0f / div;
-	float coltop[3], coldown[3], color[4];
+	float coltop[3], coldown[3];
+	int vert_count = 0;
 	int a;
-	
+
+	VertexFormat *format = immVertexFormat();
+	unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+	unsigned color = add_attrib(format, "color", GL_FLOAT, 4, KEEP_FLOAT);
+
+	immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
+
 	/* mult */
 	for (a = 0; a < 7; a++) {
 		mul_v2_fl(vec[a], rad);
 	}
-	/* get current color, needs to be outside of glBegin/End */
-	glGetFloatv(GL_CURRENT_COLOR, color);
 
 	/* 'shade' defines strength of shading */
-	coltop[0]  = min_ff(1.0f, color[0] + shadetop);
-	coltop[1]  = min_ff(1.0f, color[1] + shadetop);
-	coltop[2]  = min_ff(1.0f, color[2] + shadetop);
-	coldown[0] = max_ff(0.0f, color[0] + shadedown);
-	coldown[1] = max_ff(0.0f, color[1] + shadedown);
-	coldown[2] = max_ff(0.0f, color[2] + shadedown);
+	coltop[0]  = min_ff(1.0f, col[0] + shadetop);
+	coltop[1]  = min_ff(1.0f, col[1] + shadetop);
+	coltop[2]  = min_ff(1.0f, col[2] + shadetop);
+	coldown[0] = max_ff(0.0f, col[0] + shadedown);
+	coldown[1] = max_ff(0.0f, col[1] + shadedown);
+	coldown[2] = max_ff(0.0f, col[2] + shadedown);
+
+	vert_count += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_TOP_RIGHT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_TOP_LEFT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 9 : 1;
 
-	glBegin(mode);
+	immBegin(mode, vert_count);
 
 	/* start with corner right-bottom */
 	if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
 		
-		round_box_shade_col(coltop, coldown, 0.0);
-		glVertex2f(maxx - rad, miny);
+		round_box_shade_col(color, coltop, coldown, 0.0);
+		immVertex2f(pos, maxx - rad, miny);
 		
 		for (a = 0; a < 7; a++) {
-			round_box_shade_col(coltop, coldown, vec[a][1] * idiv);
-			glVertex2f(maxx - rad + vec[a][0], miny + vec[a][1]);
+			round_box_shade_col(color, coltop, coldown, vec[a][1] * idiv);
+			immVertex2f(pos, maxx - rad + vec[a][0], miny + vec[a][1]);
 		}
 		
-		round_box_shade_col(coltop, coldown, rad * idiv);
-		glVertex2f(maxx, miny + rad);
+		round_box_shade_col(color, coltop, coldown, rad * idiv);
+		immVertex2f(pos, maxx, miny + rad);
 	}
 	else {
-		round_box_shade_col(coltop, coldown, 0.0);
-		glVertex2f(maxx, miny);
+		round_box_shade_col(color, coltop, coldown, 0.0);
+		immVertex2f(pos, maxx, miny);
 	}
 	
 	/* corner right-top */
 	if (roundboxtype & UI_CNR_TOP_RIGHT) {
 		
-		round_box_shade_col(coltop, coldown, (div - rad) * idiv);
-		glVertex2f(maxx, maxy - rad);
+		round_box_shade_col(color, coltop, coldown, (div - rad) * idiv);
+		immVertex2f(pos, maxx, maxy - rad);
 		
 		for (a = 0; a < 7; a++) {
-			round_box_shade_col(coltop, coldown, (div - rad + vec[a][1]) * idiv);
-			glVertex2f(maxx - vec[a][1], maxy - rad + vec[a][0]);
+			round_box_shade_col(color, coltop, coldown, (div - rad + vec[a][1]) * idiv);
+			immVertex2f(pos, maxx - vec[a][1], maxy - rad + vec[a][0]);
 		}
-		round_box_shade_col(coltop, coldown, 1.0);
-		glVertex2f(maxx - rad, maxy);
+		round_box_shade_col(color, coltop, coldown, 1.0);
+		immVertex2f(pos, maxx - rad, maxy);
 	}
 	else {
-		round_box_shade_col(coltop, coldown, 1.0);
-		glVertex2f(maxx, maxy);
+		round_box_shade_col(color, coltop, coldown, 1.0);
+		immVertex2f(pos, maxx, maxy);
 	}
 	
 	/* corner left-top */
 	if (roundboxtype & UI_CNR_TOP_LEFT) {
 		
-		round_box_shade_col(coltop, coldown, 1.0);
-		glVertex2f(minx + rad, maxy);
+		round_box_shade_col(color, coltop, coldown, 1.0);
+		immVertex2f(pos, minx + rad, maxy);
 		
 		for (a = 0; a < 7; a++) {
-			round_box_shade_col(coltop, coldown, (div - vec[a][1]) * idiv);
-			glVertex2f(minx + rad - vec[a][0], maxy - vec[a][1]);
+			round_box_shade_col(color, coltop, coldown, (div - vec[a][1]) * idiv);
+			immVertex2f(pos, minx + rad - vec[a][0], maxy - vec[a][1]);
 		}
 		
-		round_box_shade_col(coltop, coldown, (div - rad) * idiv);
-		glVertex2f(minx, maxy - rad);
+		round_box_shade_col(color, coltop, coldown, (div - rad) * idiv);
+		immVertex2f(pos, minx, maxy - rad);
 	}
 	else {
-		round_box_shade_col(coltop, coldown, 1.0);
-		glVertex2f(minx, maxy);
+		round_box_shade_col(color, coltop, coldown, 1.0);
+		immVertex2f(pos, minx, maxy);
 	}
 	
 	/* corner left-bottom */
 	if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
 		
-		round_box_shade_col(coltop, coldown, rad * idiv);
-		glVertex2f(minx, miny + rad);
+		round_box_shade_col(color, coltop, coldown, rad * idiv);
+		immVertex2f(pos, minx, miny + rad);
 		
 		for (a = 0; a < 7; a++) {
-			round_box_shade_col(coltop, coldown, (rad - vec[a][1]) * idiv);
-			glVertex2f(minx + vec[a][1], miny + rad - vec[a][0]);
+			round_box_shade_col(color, coltop, coldown, (rad - vec[a][1]) * idiv);
+			immVertex2f(pos, minx + vec[a][1], miny + rad - vec[a][0]);
 		}
 		
-		round_box_shade_col(coltop, coldown, 0.0);
-		glVertex2f(minx + rad, miny);
+		round_box_shade_col(color, coltop, coldown, 0.0);
+		immVertex2f(pos, minx + rad, miny);
 	}
 	else {
-		round_box_shade_col(coltop, coldown, 0.0);
-		glVertex2f(minx, miny);
+		round_box_shade_col(color, coltop, coldown, 0.0);
+		immVertex2f(pos, minx, miny);
 	}
-	
-	glEnd();
+
+	immEnd();
+	immUnbindProgram();
 }
 
 /* linear vertical shade within button or in outline */
 /* view2d scrollers use it */
 void UI_draw_roundbox_shade_y(
         int mode, float minx, float miny, float maxx, float maxy,
-        float rad, float shadeLeft, float shadeRight)
+        float rad, float shadeleft, float shaderight, float col[4])
 {
 	float vec[7][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},
 	                   {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
 	const float div = maxx - minx;
 	const float idiv = 1.0f / div;
-	float colLeft[3], colRight[3], color[4];
+	float colLeft[3], colRight[3];
+	int vert_count = 0;
 	int a;
 	
 	/* mult */
 	for (a = 0; a < 7; a++) {
 		mul_v2_fl(vec[a], rad);
 	}
-	/* get current color, needs to be outside of glBegin/End */
-	glGetFloatv(GL_CURRENT_COLOR, color);
+
+	VertexFormat *format = immVertexFormat();
+	unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+	unsigned color = add_attrib(format, "color", GL_FLOAT, 4, KEEP_FLOAT);
+
+	immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
 
 	/* 'shade' defines strength of shading */
-	colLeft[0]  = min_ff(1.0f, color[0] + shadeLeft);
-	colLeft[1]  = min_ff(1.0f, color[1] + shadeLeft);
-	colLeft[2]  = min_ff(1.0f, color[2] + shadeLeft);
-	colRight[0] = max_ff(0.0f, color[0] + shadeRight);
-	colRight[1] = max_ff(0.0f, color[1] + shadeRight);
-	colRight[2] = max_ff(0.0f, color[2] + shadeRight);
+	colLeft[0]  = min_ff(1.0f, col[0] + shadeleft);
+	colLeft[1]  = min_ff(1.0f, col[1] + shadeleft);
+	colLeft[2]  = min_ff(1.0f, col[2] + shadeleft);
+	colRight[0] = max_ff(0.0f, col[0] + shaderight);
+	colRight[1] = max_ff(0.0f, col[1] + shaderight);
+	colRight[2] = max_ff(0.0f, col[2] + shaderight);
+
+
+	vert_count += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_TOP_RIGHT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_TOP_LEFT) ? 9 : 1;
+	vert_count += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 9 : 1;
 
-	glBegin(mode);
+	immBegin(mode, vert_count);
 
 	/* start with corner right-bottom */
 	if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
-		round_box_shade_col(colLeft, colRight, 0.0);
-		glVertex2f(maxx - rad, miny);
+		round_box_shade_col(color, col

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list