[Bf-blender-cvs] [05117d7] blender2.8: OpenGL: draw cameras with new immediate mode

Mike Erwin noreply at git.blender.org
Wed Oct 19 02:30:08 CEST 2016


Commit: 05117d71a35d69a978a5e26da185b3617333d98c
Author: Mike Erwin
Date:   Tue Oct 18 20:27:24 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB05117d71a35d69a978a5e26da185b3617333d98c

OpenGL: draw cameras with new immediate mode

Mostly the same as before. Except:
- avoid drawing same lines multiple times
- helper functions take "bool filled" argument instead of GLenum
- drawcamera_volume draws its own near & far planes

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

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 02702af..b41d4b2 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1557,36 +1557,38 @@ void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base,
 	glPopMatrix();
 }
 
-static void draw_limit_line(float sta, float end, const short dflag, const unsigned char col[3])
+static void draw_limit_line(float sta, float end, const short dflag, const unsigned char col[3], unsigned pos)
 {
-	glBegin(GL_LINES);
-	glVertex3f(0.0, 0.0, -sta);
-	glVertex3f(0.0, 0.0, -end);
-	glEnd();
+	immBegin(GL_LINES, 2);
+	immVertex3f(pos, 0.0, 0.0, -sta);
+	immVertex3f(pos, 0.0, 0.0, -end);
+	immEnd();
 
 	if (!(dflag & DRAW_PICKING)) {
 		glPointSize(3.0);
-		glBegin(GL_POINTS);
+		/* would like smooth round points here, but that means binding another shader...
+		 * if it's really desired, pull these points into their own function to be called after */
+		immBegin(GL_POINTS, 2);
 		if ((dflag & DRAW_CONSTCOLOR) == 0) {
-			glColor3ubv(col);
+			immUniformColor3ubv(col);
 		}
-		glVertex3f(0.0, 0.0, -sta);
-		glVertex3f(0.0, 0.0, -end);
-		glEnd();
+		immVertex3f(pos, 0.0, 0.0, -sta);
+		immVertex3f(pos, 0.0, 0.0, -end);
+		immEnd();
 	}
 }
 
 
 /* yafray: draw camera focus point (cross, similar to aqsis code in tuhopuu) */
 /* qdn: now also enabled for Blender to set focus point for defocus composite node */
-static void draw_focus_cross(float dist, float size)
+static void draw_focus_cross(float dist, float size, unsigned pos)
 {
-	glBegin(GL_LINES);
-	glVertex3f(-size, 0.0f, -dist);
-	glVertex3f(size, 0.0f, -dist);
-	glVertex3f(0.0f, -size, -dist);
-	glVertex3f(0.0f, size, -dist);
-	glEnd();
+	immBegin(GL_LINES, 4);
+	immVertex3f(pos, -size, 0.0f, -dist);
+	immVertex3f(pos, size, 0.0f, -dist);
+	immVertex3f(pos, 0.0f, -size, -dist);
+	immVertex3f(pos, 0.0f, size, -dist);
+	immEnd();
 }
 
 #ifdef VIEW3D_CAMERA_BORDER_HACK
@@ -1809,59 +1811,68 @@ static void draw_viewport_reconstruction(
 		GPU_select_load_id(base->selcol);
 }
 
-static void drawcamera_volume(float near_plane[4][3], float far_plane[4][3], const GLenum mode)
-{
-	glBegin(mode);
-	glVertex3fv(near_plane[0]);
-	glVertex3fv(far_plane[0]);
-	glVertex3fv(far_plane[1]);
-	glVertex3fv(near_plane[1]);
-	glEnd();
-
-	glBegin(mode);
-	glVertex3fv(near_plane[1]);
-	glVertex3fv(far_plane[1]);
-	glVertex3fv(far_plane[2]);
-	glVertex3fv(near_plane[2]);
-	glEnd();
-
-	glBegin(mode);
-	glVertex3fv(near_plane[2]);
-	glVertex3fv(near_plane[1]);
-	glVertex3fv(far_plane[1]);
-	glVertex3fv(far_plane[2]);
-	glEnd();
-
-	glBegin(mode);
-	glVertex3fv(far_plane[0]);
-	glVertex3fv(near_plane[0]);
-	glVertex3fv(near_plane[3]);
-	glVertex3fv(far_plane[3]);
-	glEnd();
-}
-
 /* camera frame */
-static void drawcamera_frame(float vec[4][3], const GLenum mode)
+static void drawcamera_frame(float vec[4][3], bool filled, unsigned pos)
 {
-	glBegin(mode);
-	glVertex3fv(vec[0]);
-	glVertex3fv(vec[1]);
-	glVertex3fv(vec[2]);
-	glVertex3fv(vec[3]);
-	glEnd();
+	immBegin(filled ? GL_QUADS : GL_LINE_LOOP, 4);
+	immVertex3fv(pos, vec[0]);
+	immVertex3fv(pos, vec[1]);
+	immVertex3fv(pos, vec[2]);
+	immVertex3fv(pos, vec[3]);
+	immEnd();
 }
 
 /* center point to camera frame */
-static void drawcamera_framelines(float vec[4][3], float origin[3])
+static void drawcamera_framelines(float vec[4][3], float origin[3], unsigned pos)
+{
+	immBegin(GL_LINES, 8);
+	immVertex3fv(pos, origin);
+	immVertex3fv(pos, vec[0]);
+	immVertex3fv(pos, origin);
+	immVertex3fv(pos, vec[1]);
+	immVertex3fv(pos, origin);
+	immVertex3fv(pos, vec[2]);
+	immVertex3fv(pos, origin);
+	immVertex3fv(pos, vec[3]);
+	immEnd();
+}
+
+static void drawcamera_volume(float near_plane[4][3], float far_plane[4][3], bool filled, unsigned pos)
 {
-	glBegin(GL_LINE_STRIP);
-	glVertex3fv(vec[1]);
-	glVertex3fv(origin);
-	glVertex3fv(vec[0]);
-	glVertex3fv(vec[3]);
-	glVertex3fv(origin);
-	glVertex3fv(vec[2]);
-	glEnd();
+	drawcamera_frame(near_plane, filled, pos);
+	drawcamera_frame(far_plane, filled, pos);
+
+	if (filled) {
+		immBegin(GL_QUADS, 16); /* TODO(merwin): use GL_TRIANGLE_STRIP here */
+		immVertex3fv(pos, near_plane[0]);
+		immVertex3fv(pos, far_plane[0]);
+		immVertex3fv(pos, far_plane[1]);
+		immVertex3fv(pos, near_plane[1]);
+
+		immVertex3fv(pos, near_plane[1]);
+		immVertex3fv(pos, far_plane[1]);
+		immVertex3fv(pos, far_plane[2]);
+		immVertex3fv(pos, near_plane[2]);
+
+		immVertex3fv(pos, near_plane[2]);
+		immVertex3fv(pos, near_plane[1]);
+		immVertex3fv(pos, far_plane[1]);
+		immVertex3fv(pos, far_plane[2]);
+
+		immVertex3fv(pos, far_plane[0]);
+		immVertex3fv(pos, near_plane[0]);
+		immVertex3fv(pos, near_plane[3]);
+		immVertex3fv(pos, far_plane[3]);
+		immEnd();
+	}
+	else {
+		immBegin(GL_LINES, 8);
+		for (int i = 0; i < 4; ++i) {
+			immVertex3fv(pos, near_plane[i]);
+			immVertex3fv(pos, far_plane[i]);
+		}
+		immEnd();
+	}
 }
 
 static bool drawcamera_is_stereo3d(Scene *scene, View3D *v3d, Object *ob)
@@ -1873,7 +1884,7 @@ static bool drawcamera_is_stereo3d(Scene *scene, View3D *v3d, Object *ob)
 
 static void drawcamera_stereo3d(
         Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, const Camera *cam,
-        float vec[4][3], float drawsize, const float scale[3])
+        float vec[4][3], float drawsize, const float scale[3], unsigned pos)
 {
 	float obmat[4][4];
 	float vec_lr[2][4][3];
@@ -1889,6 +1900,8 @@ static void drawcamera_stereo3d(
 
 	zero_v3(tvec);
 
+	/* caller bound GPU_SHADER_3D_UNIFORM_COLOR, passed in pos attribute ID */
+
 	glPushMatrix();
 
 	for (int i = 0; i < 2; i++) {
@@ -1914,10 +1927,10 @@ static void drawcamera_stereo3d(
 
 		if (is_stereo3d_cameras) {
 			/* camera frame */
-			drawcamera_frame(vec_lr[i], GL_LINE_LOOP);
+			drawcamera_frame(vec_lr[i], false, pos);
 
 			/* center point to camera frame */
-			drawcamera_framelines(vec_lr[i], tvec);
+			drawcamera_framelines(vec_lr[i], tvec, pos);
 		}
 
 		/* connecting line */
@@ -1931,21 +1944,20 @@ static void drawcamera_stereo3d(
 		}
 	}
 
-
 	/* the remaining drawing takes place in the view space */
 	glLoadMatrixf(rv3d->viewmat);
 
 	if (is_stereo3d_cameras) {
 		/* draw connecting lines */
-		glPushAttrib(GL_ENABLE_BIT);
-
+		glPushAttrib(GL_ENABLE_BIT); /* TODO(merwin): new state tracking! */
 		glLineStipple(2, 0xAAAA);
 		glEnable(GL_LINE_STIPPLE);
 
-		glBegin(GL_LINES);
-		glVertex3fv(origin[0]);
-		glVertex3fv(origin[1]);
-		glEnd();
+		immBegin(GL_LINES, 2);
+		immVertex3fv(pos, origin[0]);
+		immVertex3fv(pos, origin[1]);
+		immEnd();
+
 		glPopAttrib();
 	}
 
@@ -1971,18 +1983,18 @@ static void drawcamera_stereo3d(
 			add_v3_v3(local_plane[i], axis_center);
 		}
 
-		glColor3f(0.0f, 0.0f, 0.0f);
+		immUniformColor3f(0.0f, 0.0f, 0.0f);
 
 		/* camera frame */
-		drawcamera_frame(local_plane, GL_LINE_LOOP);
+		drawcamera_frame(local_plane, false, pos);
 
 		if (v3d->stereo3d_convergence_alpha > 0.0f) {
 			glEnable(GL_BLEND);
 			glDepthMask(0);  /* disable write in zbuffer, needed for nice transp */
 
-			glColor4f(0.0f, 0.0f, 0.0f, v3d->stereo3d_convergence_alpha);
+			immUniformColor4f(0.0f, 0.0f, 0.0f, v3d->stereo3d_convergence_alpha);
 
-			drawcamera_frame(local_plane, GL_QUADS);
+			drawcamera_frame(local_plane, true, pos);
 
 			glDisable(GL_BLEND);
 			glDepthMask(1);  /* restore write in zbuffer */
@@ -2010,24 +2022,20 @@ static void drawcamera_stereo3d(
 			}
 
 			/* camera frame */
-			glColor3f(0.0f, 0.0f, 0.0f);
+			immUniformColor3f(0.0f, 0.0f, 0.0f);
 
-			drawcamera_frame(near_plane, GL_LINE_LOOP);
-			drawcamera_frame(far_plane, GL_LINE_LOOP);
-			drawcamera_volume(near_plane, far_plane, GL_LINE_LOOP);
+			drawcamera_volume(near_plane, far_plane, false, pos);
 
 			if (v3d->stereo3d_volume_alpha > 0.0f) {
 				glEnable(GL_BLEND);
 				glDepthMask(0);  /* disable write in zbuffer, needed for nice transp */
 
 				if (i == 0)
-					glColor4f(0.0f, 1.0f, 1.0f, v3d->stereo3d_volume_alpha);
+					immUniformColor4f(0.0f, 1.0f, 1.0f, v3d->stereo3d_volume_alpha);
 				else
-					glColor4f(1.0f, 0.0f, 0.0f, v3d->stereo3d_volume_alpha);
+					immUniformColor4f(1.0f, 0.0f, 0.0f, v3d->stereo3d_volume_alpha);
 
-				drawcamera_frame(near_plane, GL_QUADS);
-				drawcamera_frame(far_plane, GL_QUADS);
-				drawcamera_volume(near_plane, far_plane, GL_QUADS);
+				drawcamera_volume(near_plane, far_plane, true, pos);
 
 				glDisable(GL_BLEND);
 				glDepthMask(1);  /* restore write in zbuffer */
@@ -2103,6 +2111,11 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base
 	BKE_camera_view_frame_ex(scene, cam, cam->drawsize, is_view, scale,
 	                         asp, shift, &drawsize, vec);
 
+	unsigned pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
+	immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+	if (ob_wire_col) {
+		immUniformColor3ubv(ob_wire_col);
+	}
 	glDisable(GL_CULL_FACE);
 	glLineWidth(1);
 
@@ -2118,22 +2131,24 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base
 			BKE_camera_multiview_model_matrix(&scene->r, ob, is_left ? STEREO_LEFT_NAME : STEREO_RIGHT_NAME, obmat);
 			glMultMatrixf(obmat);
 
-			drawcamera_frame(vec, GL_LINE_LOOP);
+			drawcamera_frame(vec, false, pos);
 			glPopMatrix();
 		}
 		else {
-			drawcamera_frame(vec, GL_LINE_LOOP);
+			drawcamera_frame(vec, false, pos);
 		}
 	}
 
-	if (is_view)
+	if (is_view) {
+		immUnbindProgram();
 		return;
+	}
 
 	zero_v3(tvec);
 
 	/* center point to camera frame */
 	if (!is_stereo3d_cameras)
-		drawcamera_framelines(vec, tvec);
+		drawcamera_framelines(vec, tvec, pos);
 
 	/* arrow on top */
 	tvec[2] = vec[1][2]; /* copy the depth */
@@ -2142,22 +2157,22 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base
 	 * for active cameras. We actually draw both outline+filled
 	 * for active cameras so the wire can be seen side-on */
 	for (int i = 0; i < 2; i++) {
-		if (i == 0) glBegin(GL_LINE_LOOP);
-		else if (i == 1 && is_active) glBegin(GL_TRIANGLES);
+		if (i == 0) immBegin(GL_LINE_LOOP, 3);
+		else if (i == 1 && is_active) immBegin(GL_TRIANGLES, 3);
 		else break;
 
 		tvec

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list