[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25243] trunk/blender/source/blender: VBO:

Brecht Van Lommel brecht at blender.org
Wed Dec 9 15:37:28 CET 2009


Revision: 25243
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25243
Author:   blendix
Date:     2009-12-09 15:37:26 +0100 (Wed, 09 Dec 2009)

Log Message:
-----------
VBO:
* Fix #19785: curves not drawing with VBO enabled
* Fix #19553: duplicate Window crashes with VBO's

The convention in Blender was to have GL_VERTEX_ARRAY and GL_NORMAL_ARRAY
enabled by default, and other arrays disabled. The VBO drawing code did
not take this into account. I've made these now disabled by default, since
that makes the code clearer in other places too.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c
    trunk/blender/source/blender/gpu/intern/gpu_draw.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2009-12-09 14:29:55 UTC (rev 25242)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2009-12-09 14:37:26 UTC (rev 25243)
@@ -3010,7 +3010,7 @@
 
 	if(dlbase==NULL) return 1;
 	
-	glDisableClientState(GL_NORMAL_ARRAY);
+	glEnableClientState(GL_VERTEX_ARRAY);
 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
 
 	for(dl= dlbase->first; dl; dl= dl->next) {
@@ -3087,7 +3087,7 @@
 		}
 	}
 	
-	glEnableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_VERTEX_ARRAY);
 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
 	
 	return 0;
@@ -3106,6 +3106,7 @@
 	glGetFloatv(GL_CURRENT_COLOR, curcol);
 
 	glEnable(GL_LIGHTING);
+	glEnableClientState(GL_VERTEX_ARRAY);
 	
 	if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW);
 	else glFrontFace(GL_CCW);
@@ -3164,10 +3165,12 @@
 				
 				if(dl->rt & CU_SMOOTH) glShadeModel(GL_SMOOTH);
 				else glShadeModel(GL_FLAT);
-				
+
+				glEnableClientState(GL_NORMAL_ARRAY);
 				glVertexPointer(3, GL_FLOAT, 0, dl->verts);
 				glNormalPointer(GL_FLOAT, 0, dl->nors);
 				glDrawElements(GL_QUADS, 4*dl->totindex, GL_UNSIGNED_INT, dl->index);
+				glDisableClientState(GL_NORMAL_ARRAY);
 			}			
 			break;
 
@@ -3177,32 +3180,35 @@
 			glVertexPointer(3, GL_FLOAT, 0, dl->verts);
 			
 			/* voor polys only one normal needed */
-			if(index3_nors_incr==0) {
-				glDisableClientState(GL_NORMAL_ARRAY);
-				glNormal3fv(ndata);
+			if(index3_nors_incr) {
+				glEnableClientState(GL_NORMAL_ARRAY);
+				glNormalPointer(GL_FLOAT, 0, dl->nors);
 			}
 			else
-				glNormalPointer(GL_FLOAT, 0, dl->nors);
+				glNormal3fv(ndata);
 			
 			glDrawElements(GL_TRIANGLES, 3*dl->parts, GL_UNSIGNED_INT, dl->index);
 			
-			if(index3_nors_incr==0)
-				glEnableClientState(GL_NORMAL_ARRAY);
+			if(index3_nors_incr)
+				glDisableClientState(GL_NORMAL_ARRAY);
 
 			break;
 
 		case DL_INDEX4:
 			GPU_enable_material(dl->col+1, (glsl)? &gattribs: NULL);
 			
+			glEnableClientState(GL_NORMAL_ARRAY);
 			glVertexPointer(3, GL_FLOAT, 0, dl->verts);
 			glNormalPointer(GL_FLOAT, 0, dl->nors);
 			glDrawElements(GL_QUADS, 4*dl->parts, GL_UNSIGNED_INT, dl->index);
+			glDisableClientState(GL_NORMAL_ARRAY);
 
 			break;
 		}
 		dl= dl->next;
 	}
 
+	glDisableClientState(GL_VERTEX_ARRAY);
 	glShadeModel(GL_FLAT);
 	glDisable(GL_LIGHTING);
 	glFrontFace(GL_CCW);
@@ -3216,7 +3222,7 @@
 	if(lb==NULL) return;
 
 	glShadeModel(GL_SMOOTH);
-	glDisableClientState(GL_NORMAL_ARRAY);
+	glEnableClientState(GL_VERTEX_ARRAY);
 	glEnableClientState(GL_COLOR_ARRAY);
 	
 	dl= lb->first;
@@ -3255,7 +3261,7 @@
 	}
 	
 	glShadeModel(GL_FLAT);
-	glEnableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_VERTEX_ARRAY);
 	glDisableClientState(GL_COLOR_ARRAY);
 }
 
@@ -3996,14 +4002,12 @@
 /* 6. */
 
 	glGetIntegerv(GL_POLYGON_MODE, polygonmode);
-	glDisableClientState(GL_NORMAL_ARRAY);
+	glEnableClientState(GL_VERTEX_ARRAY);
 
 	if(draw_as==PART_DRAW_PATH){
 		ParticleCacheKey **cache, *path;
 		float *cd2=0,*cdata2=0;
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-
 		/* setup gl flags */
 		if(ob_dt > OB_WIRE) {
 			glEnableClientState(GL_NORMAL_ARRAY);
@@ -4131,7 +4135,6 @@
 		glDisableClientState(GL_COLOR_ARRAY);
 		cpack(0xC0C0C0);
 		
-		glEnableClientState(GL_VERTEX_ARRAY);
 		glVertexPointer(3, GL_FLOAT, 0, pdd->vedata);
 		
 		glDrawArrays(GL_LINES, 0, 2*totve);
@@ -4144,7 +4147,8 @@
 	
 	glDisable(GL_LIGHTING);
 	glDisableClientState(GL_COLOR_ARRAY);
-	glEnableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_NORMAL_ARRAY);
 
 	if(states)
 		MEM_freeN(states);
@@ -4209,7 +4213,6 @@
 	}
 
 	glEnableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_NORMAL_ARRAY);
 	glEnableClientState(GL_COLOR_ARRAY);
 
 	glEnable(GL_COLOR_MATERIAL);
@@ -4319,7 +4322,8 @@
 	glDisable(GL_LIGHTING);
 	glDisable(GL_COLOR_MATERIAL);
 	glDisableClientState(GL_COLOR_ARRAY);
-	glEnableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_VERTEX_ARRAY);
 	glEnable(GL_DEPTH_TEST);
 	glLineWidth(1.0f);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2009-12-09 14:29:55 UTC (rev 25242)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2009-12-09 14:37:26 UTC (rev 25243)
@@ -388,15 +388,9 @@
 
 	DEBUG_VBO("GPU_buffer_setup\n");
 
-	if( globalPool == 0 ) {
+	if( globalPool == 0 )
 		globalPool = GPU_buffer_pool_new();
 
-		/* somehow GL_NORMAL_ARRAY is enabled on startup and causes edge drawing code to crash */
-		glDisableClientState( GL_VERTEX_ARRAY );
-		glDisableClientState( GL_NORMAL_ARRAY );
-		glDisableClientState( GL_TEXTURE_COORD_ARRAY );
-		glDisableClientState( GL_COLOR_ARRAY );
-	}
 	buffer = GPU_buffer_alloc(size,globalPool);
 	if( buffer == 0 ) {
 		dm->drawObject->legacy = 1;

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2009-12-09 14:29:55 UTC (rev 25242)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2009-12-09 14:37:26 UTC (rev 25243)
@@ -1276,9 +1276,11 @@
 	glDisable(GL_TEXTURE_1D);
 	glDisable(GL_TEXTURE_2D);
 
-	/* default on, disable/enable should be local per function */
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glEnableClientState(GL_NORMAL_ARRAY);
+	/* default disabled, enable should be local per function */
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_COLOR_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 	
 	glPixelTransferi(GL_MAP_COLOR, GL_FALSE);
 	glPixelTransferi(GL_RED_SCALE, 1);





More information about the Bf-blender-cvs mailing list