[Bf-blender-cvs] [9941bc3] blender2.8: OpenGL: draw empties with new imm mode

Mike Erwin noreply at git.blender.org
Wed Oct 19 10:02:03 CEST 2016


Commit: 9941bc3041c6712d6e2ccca3ac5559c55d82bfc1
Author: Mike Erwin
Date:   Wed Oct 19 04:01:15 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB9941bc3041c6712d6e2ccca3ac5559c55d82bfc1

OpenGL: draw empties with new imm mode

Part of T49043

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

M	source/blender/editors/space_view3d/drawarmature.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h

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

diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index 1d9a515..b37a674 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -2161,11 +2161,9 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
 							bone_matrix_translate_y(bmat, pchan->bone->length);
 							glMultMatrixf(bmat);
 							
-							glColor3ubv(col);
-
 							float viewmat_pchan[4][4];
 							mul_m4_m4m4(viewmat_pchan, rv3d->viewmatob, bmat);
-							drawaxes(viewmat_pchan, pchan->bone->length * 0.25f, OB_ARROWS);
+							drawaxes(viewmat_pchan, pchan->bone->length * 0.25f, OB_ARROWS, col);
 							
 							glPopMatrix();
 						}
@@ -2370,11 +2368,9 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, const short dt)
 							bone_matrix_translate_y(bmat, eBone->length);
 							glMultMatrixf(bmat);
 
-							glColor3ubv(col);
-
 							float viewmat_ebone[4][4];
 							mul_m4_m4m4(viewmat_ebone, rv3d->viewmatob, bmat);
-							drawaxes(viewmat_ebone, eBone->length * 0.25f, OB_ARROWS);
+							drawaxes(viewmat_ebone, eBone->length * 0.25f, OB_ARROWS, col);
 							
 							glPopMatrix();
 						}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 5dfbfc4..1400ae1 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -210,10 +210,11 @@ typedef struct drawBMSelect_userData {
 
 static void draw_bounding_volume(Object *ob, char type);
 
-static void drawcube_size(float size);
-static void drawcircle_size(float size);
-static void draw_empty_sphere(float size);
-static void draw_empty_cone(float size);
+static void drawcube_size(float size, unsigned pos);
+static void drawcircle_size(float size, unsigned pos);
+static void draw_empty_sphere(float size, unsigned pos);
+static void draw_empty_cone(float size, unsigned pos);
+
 static void draw_box(const float vec[8][3], bool solid);
 
 static void ob_wire_color_blend_theme_id(const unsigned char ob_wire_col[4], const int theme_id, float fac)
@@ -414,7 +415,7 @@ static const float cosval[CIRCLE_RESOL] = {
  * \param viewmat_local_unit is typically the 'rv3d->viewmatob'
  * copied into a 3x3 matrix and normalized.
  */
-static void draw_xyz_wire(const float viewmat_local_unit[3][3], const float c[3], float size, int axis)
+static void draw_xyz_wire(const float viewmat_local_unit[3][3], const float c[3], float size, int axis, unsigned pos)
 {
 	int line_type;
 	float buffer[4][3];
@@ -501,18 +502,25 @@ static void draw_xyz_wire(const float viewmat_local_unit[3][3], const float c[3]
 			return;
 	}
 
+	immBegin(line_type, n);
 	for (int i = 0; i < n; i++) {
 		mul_transposed_m3_v3((float (*)[3])viewmat_local_unit, buffer[i]);
 		add_v3_v3(buffer[i], c);
+		immVertex3fv(pos, buffer[i]);
 	}
+	immEnd();
 
+	/* TODO: recode this function for clarity once we're not in a hurry to modernize GL usage */
+
+#if 0
 	glEnableClientState(GL_VERTEX_ARRAY);
 	glVertexPointer(3, GL_FLOAT, 0, buffer);
 	glDrawArrays(line_type, 0, n);
 	glDisableClientState(GL_VERTEX_ARRAY);
+#endif
 }
 
-void drawaxes(const float viewmat_local[4][4], float size, char drawtype)
+void drawaxes(const float viewmat_local[4][4], float size, char drawtype, const unsigned char color[4])
 {
 	int axis;
 	float v1[3] = {0.0, 0.0, 0.0};
@@ -521,34 +529,40 @@ void drawaxes(const float viewmat_local[4][4], float size, char drawtype)
 
 	glLineWidth(1);
 
-	switch (drawtype) {
+	unsigned pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
+	if (color) {
+		immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+		immUniformColor4ubv(color);
+	}
+	else {
+		immBindBuiltinProgram(GPU_SHADER_3D_DEPTH_ONLY);
+	}
 
+	switch (drawtype) {
 		case OB_PLAINAXES:
+			immBegin(GL_LINES, 6);
 			for (axis = 0; axis < 3; axis++) {
-				glBegin(GL_LINES);
-
 				v1[axis] = size;
 				v2[axis] = -size;
-				glVertex3fv(v1);
-				glVertex3fv(v2);
+				immVertex3fv(pos, v1);
+				immVertex3fv(pos, v2);
 
 				/* reset v1 & v2 to zero */
 				v1[axis] = v2[axis] = 0.0f;
-
-				glEnd();
 			}
+			immEnd();
 			break;
-		case OB_SINGLE_ARROW:
 
-			glBegin(GL_LINES);
+		case OB_SINGLE_ARROW:
+			immBegin(GL_LINES, 2);
 			/* in positive z direction only */
 			v1[2] = size;
-			glVertex3fv(v1);
-			glVertex3fv(v2);
-			glEnd();
+			immVertex3fv(pos, v1);
+			immVertex3fv(pos, v2);
+			immEnd();
 
 			/* square pyramid */
-			glBegin(GL_TRIANGLES);
+			immBegin(GL_TRIANGLES, 12);
 
 			v2[0] = size * 0.035f; v2[1] = size * 0.035f;
 			v3[0] = size * -0.035f; v3[1] = size * 0.035f;
@@ -564,28 +578,27 @@ void drawaxes(const float viewmat_local[4][4], float size, char drawtype)
 					v3[0] = -v3[0];
 				}
 
-				glVertex3fv(v1);
-				glVertex3fv(v2);
-				glVertex3fv(v3);
-
+				immVertex3fv(pos, v1);
+				immVertex3fv(pos, v2);
+				immVertex3fv(pos, v3);
 			}
-			glEnd();
-
+			immEnd();
 			break;
+
 		case OB_CUBE:
-			drawcube_size(size);
+			drawcube_size(size, pos);
 			break;
 
 		case OB_CIRCLE:
-			drawcircle_size(size);
+			drawcircle_size(size, pos);
 			break;
 
 		case OB_EMPTY_SPHERE:
-			draw_empty_sphere(size);
+			draw_empty_sphere(size, pos);
 			break;
 
 		case OB_EMPTY_CONE:
-			draw_empty_cone(size);
+			draw_empty_cone(size, pos);
 			break;
 
 		case OB_ARROWS:
@@ -599,34 +612,34 @@ void drawaxes(const float viewmat_local[4][4], float size, char drawtype)
 			for (axis = 0; axis < 3; axis++) {
 				const int arrow_axis = (axis == 0) ? 1 : 0;
 
-				glBegin(GL_LINES);
+				immBegin(GL_LINES, 6);
 
 				v2[axis] = size;
-				glVertex3fv(v1);
-				glVertex3fv(v2);
-				
+				immVertex3fv(pos, v1);
+				immVertex3fv(pos, v2);
+
 				v1[axis] = size * 0.85f;
 				v1[arrow_axis] = -size * 0.08f;
-				glVertex3fv(v1);
-				glVertex3fv(v2);
-				
+				immVertex3fv(pos, v1);
+				immVertex3fv(pos, v2);
+
 				v1[arrow_axis] = size * 0.08f;
-				glVertex3fv(v1);
-				glVertex3fv(v2);
+				immVertex3fv(pos, v1);
+				immVertex3fv(pos, v2);
 
-				glEnd();
-				
-				v2[axis] += size * 0.125f;
+				immEnd();
 
-				draw_xyz_wire(viewmat_local_unit, v2, size, axis);
+				v2[axis] += size * 0.125f;
 
+				draw_xyz_wire(viewmat_local_unit, v2, size, axis, pos);
 
 				/* reset v1 & v2 to zero */
 				v1[arrow_axis] = v1[axis] = v2[axis] = 0.0f;
 			}
-			break;
 		}
 	}
+
+	immUnbindProgram();
 }
 
 
@@ -761,6 +774,19 @@ void drawcircball(int mode, const float cent[3], float rad, const float tmat[4][
 	glDisableClientState(GL_VERTEX_ARRAY);
 }
 
+void imm_drawcircball(const float cent[3], float rad, const float tmat[4][4], unsigned pos)
+{
+	float verts[CIRCLE_RESOL][3];
+
+	circball_array_fill(verts, cent, rad, tmat);
+
+	immBegin(GL_LINE_LOOP, CIRCLE_RESOL);
+	for (int i = 0; i < CIRCLE_RESOL; ++i) {
+		immVertex3fv(pos, verts[i]);
+	}
+	immEnd();
+}
+
 /* circle for object centers, special_color is for library or ob users */
 static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], int selstate, bool special_color)
 {
@@ -978,9 +1004,9 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, bool depth_write, flo
 /* draws a cube given the scaling of the cube, assuming that
  * all required matrices have been set (used for drawing empties)
  */
-static void drawcube_size(float size)
+static void drawcube_size(float size, unsigned pos)
 {
-	const GLfloat pos[8][3] = {
+	const GLfloat verts[8][3] = {
 		{-size, -size, -size},
 		{-size, -size,  size},
 		{-size,  size, -size},
@@ -993,10 +1019,18 @@ static void drawcube_size(float size)
 
 	const GLubyte indices[24] = {0,1,1,3,3,2,2,0,0,4,4,5,5,7,7,6,6,4,1,5,3,7,2,6};
 
+#if 0
 	glEnableClientState(GL_VERTEX_ARRAY);
-	glVertexPointer(3, GL_FLOAT, 0, pos);
+	glVertexPointer(3, GL_FLOAT, 0, verts);
 	glDrawRangeElements(GL_LINES, 0, 7, 24, GL_UNSIGNED_BYTE, indices);
 	glDisableClientState(GL_VERTEX_ARRAY);
+#else
+	immBegin(GL_LINES, 24);
+	for (int i = 0; i < 24; ++i) {
+		immVertex3fv(pos, verts[indices[i]]);
+	}
+	immEnd();
+#endif
 }
 
 static void drawshadbuflimits(Lamp *la, float mat[4][4])
@@ -1685,16 +1719,19 @@ static void draw_viewport_object_reconstruction(
 
 		const int v3d_drawtype = view3d_effective_drawtype(v3d);
 		if (v3d_drawtype == OB_WIRE) {
+			unsigned char color[4];
+			const unsigned char *color_ptr = NULL;
 			if ((dflag & DRAW_CONSTCOLOR) == 0) {
 				if (selected && (track->flag & TRACK_CUSTOMCOLOR) == 0) {
-					glColor3ubv(ob_wire_col);
+					color_ptr = ob_wire_col;
 				}
 				else {
-					glColor3fv(track->color);
+					rgba_float_to_uchar(color, track->color);
+					color_ptr = color;
 				}
 			}
 
-			drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype);
+			drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype, color_ptr);
 		}
 		else if (v3d_drawtype > OB_WIRE) {
 			if (v3d->bundle_drawtype == OB_EMPTY_SPHERE) {
@@ -1720,17 +1757,21 @@ static void draw_viewport_object_reconstruction(
 				draw_bundle_sphere();
 			}
 			else {
+				unsigned char color[4];
+				const unsigned char *color_ptr = NULL;
 				if ((dflag & DRAW_CONSTCOLOR) == 0) {
 					if (selected) {
-						glColor3ubv(ob_wire_col);
+						color_ptr = ob_wire_col;
 					}
 					else {
-						if (track->flag & TRACK_CUSTOMCOLOR) glColor3fv(track->color);
-						else UI_ThemeColor(TH_WIRE);
+						if (track->flag & TRACK_CUSTOMCOLOR) rgba_float_to_uchar(color, track->color);
+						else UI_GetThemeColor4ubv(TH_WIRE, color);
+
+						color_ptr = color;
 					}
 				}
 
-				drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype);
+				drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype, color_ptr);
 			}
 		}
 
@@ -5538,7 +5579,7 @@ static void draw_editfont(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *b
 }
 
 /* draw a sphere for use as an empty drawtype */
-static void draw_empty_sphere(float size)
+static void draw_empty_sphere(float size, unsigned pos)
 {
 #define NSEGMENTS 16
 	/* a single ring of vertices */
@@ -5548,24 +5589,24 @@ static void draw_empty_sphere(float size)
 		p[i][0] = size * cosf(angle);
 		p[i][1] = size * sinf(angle);
 	}
-	
-	glBegin(GL_LINE_LOOP);
+
+	i

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list