[Bf-blender-cvs] [8d983627107] blender2.8: OpenGL immediate mode: graph_draw.c

Luca Rood noreply at git.blender.org
Thu Mar 9 05:09:50 CET 2017


Commit: 8d98362710798fe9e40e6a24c32306e4d4edfef0
Author: Luca Rood
Date:   Wed Mar 8 02:30:51 2017 -0300
Branches: blender2.8
https://developer.blender.org/rB8d98362710798fe9e40e6a24c32306e4d4edfef0

OpenGL immediate mode: graph_draw.c

This also fixes a little bug, which caused `draw_fcurve_samples` to
never be called, and thus sampled curve range boundaries were not drawn.

Part of T49043

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

M	source/blender/editors/space_graph/graph_draw.c

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

diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 99a38862354..c8f692e45ce 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -46,12 +46,11 @@
 #include "BKE_curve.h"
 #include "BKE_fcurve.h"
 
-
-#include "BIF_gl.h"
 #include "BIF_glutil.h"
 
 #include "GPU_draw.h"
 #include "GPU_immediate.h"
+#include "GPU_matrix.h"
 
 #include "ED_anim_api.h"
 
@@ -85,38 +84,46 @@ static void draw_fcurve_modifier_controls_envelope(FModifier *fcm, View2D *v2d)
 	FCM_EnvelopeData *fed;
 	const float fac = 0.05f * BLI_rctf_size_x(&v2d->cur);
 	int i;
-	
+
+	unsigned int pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
+	immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+
 	/* draw two black lines showing the standard reference levels */
-	glColor3f(0.0f, 0.0f, 0.0f);
+	immUniformColor3f(0.0f, 0.0f, 0.0f);
 	glLineWidth(1);
 	setlinestyle(5);
 	
-	glBegin(GL_LINES);
-	glVertex2f(v2d->cur.xmin, env->midval + env->min);
-	glVertex2f(v2d->cur.xmax, env->midval + env->min);
+	immBegin(PRIM_LINES, 4);
+	immVertex2f(pos, v2d->cur.xmin, env->midval + env->min);
+	immVertex2f(pos, v2d->cur.xmax, env->midval + env->min);
 		
-	glVertex2f(v2d->cur.xmin, env->midval + env->max);
-	glVertex2f(v2d->cur.xmax, env->midval + env->max);
-	glEnd();
+	immVertex2f(pos, v2d->cur.xmin, env->midval + env->max);
+	immVertex2f(pos, v2d->cur.xmax, env->midval + env->max);
+	immEnd();
+
 	setlinestyle(0);
-	
+
 	/* set size of vertices (non-adjustable for now) */
 	glPointSize(2.0f);
 	
 	/* for now, point color is fixed, and is white */
-	glColor3f(1.0f, 1.0f, 1.0f);
+	immUniformColor3f(1.0f, 1.0f, 1.0f);
 	
-	glBegin(GL_POINTS);
+	immBeginAtMost(PRIM_POINTS, env->totvert * 2);
+
 	for (i = 0, fed = env->data; i < env->totvert; i++, fed++) {
 		/* only draw if visible
 		 *	- min/max here are fixed, not relative
 		 */
 		if (IN_RANGE(fed->time, (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) {
-			glVertex2f(fed->time, fed->min);
-			glVertex2f(fed->time, fed->max);
+			immVertex2f(pos, fed->time, fed->min);
+			immVertex2f(pos, fed->time, fed->max);
 		}
 	}
-	glEnd();
+
+	immEnd();
+
+	immUnbindProgram();
 }
 
 /* *************************** */
@@ -302,13 +309,10 @@ static bool draw_fcurve_handles_check(SpaceIpo *sipo, FCurve *fcu)
 static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
 {
 	int sel, b;
-	
-	/* a single call to GL_LINES here around these calls should be sufficient to still
-	 * get separate line segments, but which aren't wrapped with GL_LINE_STRIP every time we
-	 * want a single line
-	 */
-	glBegin(GL_LINES);
-	
+
+	unsigned int pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
+	immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+
 	/* slightly hacky, but we want to draw unselected points before selected ones 
 	 * so that selected points are clearly visible
 	 */
@@ -335,18 +339,24 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
 				if ((!prevbezt && (bezt->ipo == BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo == BEZT_IPO_BEZ))) {
 					UI_GetThemeColor3ubv(basecol + bezt->h1, col);
 					col[3] = fcurve_display_alpha(fcu) * 255;
-					glColor4ubv((GLubyte *)col);
-					
-					glVertex2fv(fp); glVertex2fv(fp + 3);
+					immUniformColor4ubv(col);
+
+					immBegin(PRIM_LINES, 2);
+					immVertex2fv(pos, fp);
+					immVertex2fv(pos, fp + 3);
+					immEnd();
 				}
 				
 				/* only draw second handle if this segment is bezier */
 				if (bezt->ipo == BEZT_IPO_BEZ) {
 					UI_GetThemeColor3ubv(basecol + bezt->h2, col);
 					col[3] = fcurve_display_alpha(fcu) * 255;
-					glColor4ubv((GLubyte *)col);
-					
-					glVertex2fv(fp + 3); glVertex2fv(fp + 6);
+					immUniformColor4ubv(col);
+
+					immBegin(PRIM_LINES, 2);
+					immVertex2fv(pos, fp + 3);
+					immVertex2fv(pos, fp + 6);
+					immEnd();
 				}
 			}
 			else {
@@ -357,9 +367,12 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
 					fp = bezt->vec[0];
 					UI_GetThemeColor3ubv(basecol + bezt->h1, col);
 					col[3] = fcurve_display_alpha(fcu) * 255;
-					glColor4ubv((GLubyte *)col);
-					
-					glVertex2fv(fp); glVertex2fv(fp + 3);
+					immUniformColor4ubv(col);
+
+					immBegin(PRIM_LINES, 2);
+					immVertex2fv(pos, fp);
+					immVertex2fv(pos, fp + 3);
+					immEnd();
 				}
 				
 				/* only draw second handle if this segment is bezier, and selection is ok */
@@ -369,15 +382,18 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
 					fp = bezt->vec[1];
 					UI_GetThemeColor3ubv(basecol + bezt->h2, col);
 					col[3] = fcurve_display_alpha(fcu) * 255;
-					glColor4ubv((GLubyte *)col);
-					
-					glVertex2fv(fp); glVertex2fv(fp + 3);
+					immUniformColor4ubv(col);
+
+					immBegin(PRIM_LINES, 2);
+					immVertex2fv(pos, fp);
+					immVertex2fv(pos, fp + 3);
+					immEnd();
 				}
 			}
 		}
 	}
-	
-	glEnd();  /* GL_LINES */
+
+	immUnbindProgram();
 }
 
 /* Samples ---------------- */
@@ -386,25 +402,26 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
  * NOTE: the caller MUST HAVE GL_LINE_SMOOTH & GL_BLEND ENABLED, otherwise, the controls don't 
  * have a consistent appearance (due to off-pixel alignments)...
  */
-static void draw_fcurve_sample_control(float x, float y, float xscale, float yscale, float hsize)
+static void draw_fcurve_sample_control(float x, float y, float xscale, float yscale, float hsize, unsigned int pos)
 {
-	
 	/* adjust view transform before starting */
 	glTranslatef(x, y, 0.0f);
 	glScalef(1.0f / xscale * hsize, 1.0f / yscale * hsize, 1.0f);
+	gpuMatrixUpdate_legacy();
 
 	/* draw X shape */
-	glBegin(GL_LINES);
-	glVertex2f(-0.7f, -0.7f);
-	glVertex2f(+0.7f, +0.7f);
+	immBegin(GL_LINES, 4);
+	immVertex2f(pos, -0.7f, -0.7f);
+	immVertex2f(pos, +0.7f, +0.7f);
 
-	glVertex2f(-0.7f, +0.7f);
-	glVertex2f(+0.7f, -0.7f);
-	glEnd();  /* GL_LINES */
+	immVertex2f(pos, -0.7f, +0.7f);
+	immVertex2f(pos, +0.7f, -0.7f);
+	immEnd();
 
 	/* restore view transform */
 	glScalef(xscale / hsize, yscale / hsize, 1.0);
 	glTranslatef(-x, -y, 0.0f);
+	gpuMatrixUpdate_legacy();
 }
 
 /* helper func - draw keyframe vertices only for an F-Curve */
@@ -417,10 +434,6 @@ static void draw_fcurve_samples(SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
 	hsize = UI_GetThemeValuef(TH_VERTEX_SIZE);
 	UI_view2d_scale_get(&ar->v2d, &xscale, &yscale);
 	
-	/* set vertex color */
-	if (fcu->flag & (FCURVE_ACTIVE | FCURVE_SELECTED)) UI_ThemeColor(TH_TEXT_HI);
-	else UI_ThemeColor(TH_TEXT);
-	
 	/* get verts */
 	first = fcu->fpt;
 	last = (first) ? (first + (fcu->totvert - 1)) : (NULL);
@@ -430,10 +443,17 @@ static void draw_fcurve_samples(SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
 		/* anti-aliased lines for more consistent appearance */
 		if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glEnable(GL_LINE_SMOOTH);
 		glEnable(GL_BLEND);
-		
-		draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize);
-		draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize);
-		
+
+		unsigned int pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
+		immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+
+		immUniformThemeColor((fcu->flag & FCURVE_SELECTED) ? TH_TEXT_HI : TH_TEXT);
+
+		draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize, pos);
+		draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize, pos);
+
+		immUnbindProgram();
+
 		glDisable(GL_BLEND);
 		if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glDisable(GL_LINE_SMOOTH);
 	}
@@ -442,7 +462,7 @@ static void draw_fcurve_samples(SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
 /* Curve ---------------- */
 
 /* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
-static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
+static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid, unsigned int pos)
 {
 	SpaceIpo *sipo = (SpaceIpo *)ac->sl;
 	ChannelDriver *driver;
@@ -512,37 +532,51 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	 *	- apply the unit correction factor to the calculated values so that 
 	 *	  the displayed values appear correctly in the viewport
 	 */
-	glBegin(GL_LINE_STRIP);
-	
+
 	n = (etime - stime) / samplefreq + 0.5f;
-	for (i = 0; i <= n; i++) {
-		float ctime = stime + i * samplefreq;
-		glVertex2f(ctime, (evaluate_fcurve(fcu, ctime) + offset) * unitFac);
+
+	if (n > 0) {
+		immBegin(PRIM_LINE_STRIP, (n + 1));
+
+		for (i = 0; i <= n; i++) {
+			float ctime = stime + i * samplefreq;
+			immVertex2f(pos, ctime, (evaluate_fcurve(fcu, ctime) + offset) * unitFac);
+		}
+
+		immEnd();
 	}
-	
-	glEnd();
-	
+
 	/* restore driver */
 	fcu->driver = driver;
 }
 
 /* helper func - draw a samples-based F-Curve */
-static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d)
+static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, unsigned int pos)
 {
 	FPoint *prevfpt = fcu->fpt;
 	FPoint *fpt = prevfpt + 1;
 	float fac, v[2];
-	int b = fcu->totvert - 1;
+	int b = fcu->totvert;
 	float unit_scale, offset;
 	short mapping_flag = ANIM_get_normalization_flags(ac);
+	int count = fcu->totvert;
+
+	if (prevfpt->vec[0] > v2d->cur.xmin) {
+		count++;
+	}
+
+	if ((prevfpt + b - 1)->vec[0] < v2d->cur.xmax) {
+		count++;
+	}
 
 	/* apply unit mapping */
 	glPushMatrix();
 	unit_scale = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
 	glScalef(1.0f, unit_scale, 1.0f);
 	glTranslatef(0.0f, offset, 0.0f);
+	gpuMatrixUpdate_legacy();
 
-	glBegin(GL_LINE_STRIP);
+	immBegin(PRIM_LINE_STRIP, count);
 	
 	/* extrapolate to left? - left-side of view comes before first keyframe? */
 	if (prevfpt->vec[0] > v2d->cur.xmin) {
@@ -560,26 +594,19 @@ static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, Vie
 			v[1] = prevfpt->vec[1] - fac * (prevfpt->vec[1] - fpt->vec[1]);
 		}
 		
-		glVertex2fv(v);
+		immVertex2fv(pos, v);
 	}
 	
-	/* if only one sample, add it now

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list