[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40112] trunk/blender/source/blender/ editors/space_view3d/view3d_draw.c: use vertex arrays for 3d view grid floor, reduce calls to glColor3ubv.

Campbell Barton ideasman42 at gmail.com
Sun Sep 11 07:50:44 CEST 2011


Revision: 40112
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40112
Author:   campbellbarton
Date:     2011-09-11 05:50:44 +0000 (Sun, 11 Sep 2011)
Log Message:
-----------
use vertex arrays for 3d view grid floor, reduce calls to glColor3ubv. clanup some unrelated odd formatting in draw_rotation_guide.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2011-09-11 05:10:27 UTC (rev 40111)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2011-09-11 05:50:44 UTC (rev 40112)
@@ -428,7 +428,7 @@
 
 static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
 {
-	float vert[3]= {0.0f, 0.0f, 0.0f}, grid, grid_scale;
+	float grid, grid_scale;
 	unsigned char col_grid[3];
 	const int gridlines= v3d->gridlines/2;
 
@@ -459,9 +459,11 @@
 
 	/* draw the Y axis and/or grid lines */
 	if(v3d->gridflag & V3D_SHOW_FLOOR) {
-		int a;
+		float vert[4][3]= {{0.0f}};
 		unsigned char col_bg[3];
 		unsigned char col_grid_emphasise[3], col_grid_light[3];
+		int a;
+		int prev_emphasise= -1;
 
 		UI_GetThemeColor3ubv(TH_BACK, col_bg);
 
@@ -470,34 +472,43 @@
 		UI_GetColorPtrShade3ubv(col_grid, col_grid_emphasise,
 		                        (((col_grid[0]+col_grid[1]+col_grid[2])+30) > (col_bg[0]+col_bg[1]+col_bg[2])) ? 20 : -10);
 
+		/* set fixed axis */
+		vert[0][0]= vert[2][1]= grid;
+		vert[1][0]= vert[3][1]= -grid;
+
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glVertexPointer(3, GL_FLOAT, 0, vert);
+
 		for(a= -gridlines;a<=gridlines;a++) {
-			glColor3ubv((a % 10) ? col_grid_light : col_grid_emphasise);
+			const float line= a * grid_scale;
+			const int is_emphasise= (a % 10) == 0;
 
-			glBegin(GL_LINES);
-			/* Y axis */
-			vert[0]= a * grid_scale;
-			vert[1]= grid;
-			glVertex3fv(vert);
-			vert[1]= -grid;
-			glVertex3fv(vert);
+			if(is_emphasise != prev_emphasise) {
+				glColor3ubv(is_emphasise ? col_grid_emphasise : col_grid_light);
+			}
+			prev_emphasise= is_emphasise;
 
-			/* X axis */
-			SWAP(float, vert[0], vert[1]);
-			glVertex3fv(vert);
-			vert[0]= grid;
-			glVertex3fv(vert);
+			/* set variable axis */
+			vert[0][1]= vert[1][1]=
+			vert[2][0]= vert[3][0]= line;
 
-			glEnd();
+			glDrawArrays(GL_LINES, 0, 4);
 		}
+
+		glDisableClientState(GL_VERTEX_ARRAY);
+
+		GPU_print_error("sdsd");
 	}
 	
 	/* draw the Z axis line */	
 	/* check for the 'show Z axis' preference */
 	if (v3d->gridflag & (V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_Z)) {
-		unsigned char tcol[3];
 		int axis;
 		for(axis= 0; axis < 3; axis++)
 		if (v3d->gridflag & (V3D_SHOW_X << axis)) {
+			float vert[3];
+			unsigned char tcol[3];
+
 			UI_make_axis_color(col_grid, tcol, 'X' + axis);
 			glColor3ubv(tcol);
 
@@ -652,60 +663,63 @@
 		float scaled_axis[3];
 		const float scale = rv3d->dist;
 		mul_v3_v3fl(scaled_axis, rv3d->rot_axis, scale);
-	
+
+
 		glBegin(GL_LINE_STRIP);
-			color[3] = 0.f; // more transparent toward the ends
-			glColor4fv(color);
-			add_v3_v3v3(end, o, scaled_axis);
-			glVertex3fv(end);
-	
-			// color[3] = 0.2f + fabsf(rv3d->rot_angle); // modulate opacity with angle
-			// ^^ neat idea, but angle is frame-rate dependent, so it's usually close to 0.2
+		color[3] = 0.f; // more transparent toward the ends
+		glColor4fv(color);
+		add_v3_v3v3(end, o, scaled_axis);
+		glVertex3fv(end);
 
-			color[3] = 0.5f; // more opaque toward the center
-			glColor4fv(color);
-			glVertex3fv(o);
-	
-			color[3] = 0.f;
-			glColor4fv(color);
-			sub_v3_v3v3(end, o, scaled_axis);
-			glVertex3fv(end);
+		// color[3] = 0.2f + fabsf(rv3d->rot_angle); // modulate opacity with angle
+		// ^^ neat idea, but angle is frame-rate dependent, so it's usually close to 0.2
+
+		color[3] = 0.5f; // more opaque toward the center
+		glColor4fv(color);
+		glVertex3fv(o);
+
+		color[3] = 0.f;
+		glColor4fv(color);
+		sub_v3_v3v3(end, o, scaled_axis);
+		glVertex3fv(end);
 		glEnd();
 		
 		// -- draw ring around rotation center --
 		{
-		#define ROT_AXIS_DETAIL 13
-		const float s = 0.05f * scale;
-		const float step = 2.f * (float)(M_PI / ROT_AXIS_DETAIL);
-		float angle;
-		int i;
+#define		ROT_AXIS_DETAIL 13
 
-		float q[4]; // rotate ring so it's perpendicular to axis
-		const int upright = fabsf(rv3d->rot_axis[2]) >= 0.95f;
-		if (!upright)
-			{
-			const float up[3] = {0.f, 0.f, 1.f};
-			float vis_angle, vis_axis[3];
+			const float s = 0.05f * scale;
+			const float step = 2.f * (float)(M_PI / ROT_AXIS_DETAIL);
+			float angle;
+			int i;
 
-			cross_v3_v3v3(vis_axis, up, rv3d->rot_axis);
-			vis_angle = acosf(dot_v3v3(up, rv3d->rot_axis));
-			axis_angle_to_quat(q, vis_axis, vis_angle);
+			float q[4]; // rotate ring so it's perpendicular to axis
+			const int upright = fabsf(rv3d->rot_axis[2]) >= 0.95f;
+			if (!upright) {
+				const float up[3] = {0.f, 0.f, 1.f};
+				float vis_angle, vis_axis[3];
+
+				cross_v3_v3v3(vis_axis, up, rv3d->rot_axis);
+				vis_angle = acosf(dot_v3v3(up, rv3d->rot_axis));
+				axis_angle_to_quat(q, vis_axis, vis_angle);
 			}
 
-		color[3] = 0.25f; // somewhat faint
-		glColor4fv(color);
-		glBegin(GL_LINE_LOOP);
-		for (i = 0, angle = 0.f; i < ROT_AXIS_DETAIL; ++i, angle += step)
-			{
-			float p[3] = { s * cosf(angle), s * sinf(angle), 0.f };
+			color[3] = 0.25f; // somewhat faint
+			glColor4fv(color);
+			glBegin(GL_LINE_LOOP);
+			for (i = 0, angle = 0.f; i < ROT_AXIS_DETAIL; ++i, angle += step) {
+				float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f};
 
-			if (!upright)
-				mul_qt_v3(q, p);
+				if (!upright) {
+					mul_qt_v3(q, p);
+				}
 
-			add_v3_v3(p, o);
-			glVertex3fv(p);
+				add_v3_v3(p, o);
+				glVertex3fv(p);
 			}
-		glEnd();
+			glEnd();
+
+#undef		ROT_AXIS_DETAIL
 		}
 
 		color[3] = 1.f; // solid dot




More information about the Bf-blender-cvs mailing list