[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21383] branches/soc-2009-imbusy/source/ blender/blenkernel/intern/cdderivedmesh.c: Finally tracked down the crashing bug when running out of video memory.

Lukas Steiblys imbusy at imbusy.org
Mon Jul 6 14:19:07 CEST 2009


Revision: 21383
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21383
Author:   imbusy
Date:     2009-07-06 14:19:06 +0200 (Mon, 06 Jul 2009)

Log Message:
-----------
Finally tracked down the crashing bug when running out of video memory. Solid Object mode should be at least as stable as the original

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c

Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-06 11:23:22 UTC (rev 21382)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-06 12:19:06 UTC (rev 21383)
@@ -322,10 +322,12 @@
 	else {	/* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
 		GPU_vertex_setup( dm );
 		GPU_normal_setup( dm );
-		glShadeModel(GL_SMOOTH);
-		for( a = 0; a < dm->drawObject->nmaterials; a++ ) {
-			setMaterial(dm->drawObject->materials[a].mat_nr+1, NULL);
-			glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start, dm->drawObject->materials[a].end);
+		if( !GPU_buffer_legacy(dm) ) {
+			glShadeModel(GL_SMOOTH);
+			for( a = 0; a < dm->drawObject->nmaterials; a++ ) {
+				setMaterial(dm->drawObject->materials[a].mat_nr+1, NULL);
+				glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start, dm->drawObject->materials[a].end);
+			}
 		}
 		GPU_buffer_unbind( );
 	}
@@ -399,15 +401,17 @@
 		GPU_color4_upload(dm,cp1);
 		GPU_vertex_setup(dm);
 		GPU_color_setup(dm);
-		glShadeModel(GL_SMOOTH);
-		glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
+		if( !GPU_buffer_legacy(dm) ) {
+			glShadeModel(GL_SMOOTH);
+			glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
 
-		if( useTwoSided ) {
-			GPU_color4_upload(dm,cp2);
-			GPU_color_setup(dm);
-			glCullFace(GL_FRONT);
-			glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
-			glCullFace(GL_BACK);
+			if( useTwoSided ) {
+				GPU_color4_upload(dm,cp2);
+				GPU_color_setup(dm);
+				glCullFace(GL_FRONT);
+				glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
+				glCullFace(GL_BACK);
+			}
 		}
 		GPU_buffer_unbind();
 	}
@@ -523,47 +527,48 @@
 			}
 			GPU_color_setup( dm );
 		}
+		if( !GPU_buffer_legacy(dm) ) {
+			glShadeModel( GL_SMOOTH );
+			for(i = 0; i < dm->drawObject->nelements/3; i++) {
+				int actualFace = dm->drawObject->faceRemap[i];
+				int flag;
+				unsigned char *cp = NULL;
 
-		glShadeModel( GL_SMOOTH );
-		for(i = 0; i < dm->drawObject->nelements/3; i++) {
-			int actualFace = dm->drawObject->faceRemap[i];
-			int flag;
-			unsigned char *cp = NULL;
-
-			if(drawParams) {
-				flag = drawParams(tf? &tf[actualFace]: NULL, mcol? &mcol[actualFace*4]: NULL, mf[actualFace].mat_nr);
-			}
-			else {
-				if(index) {
-					orig = index[actualFace];
-					if(drawParamsMapped)
-						flag = drawParamsMapped(userData, orig);
+				if(drawParams) {
+					flag = drawParams(tf? &tf[actualFace]: NULL, mcol? &mcol[actualFace*4]: NULL, mf[actualFace].mat_nr);
 				}
-				else
-					if(drawParamsMapped)
-						flag = drawParamsMapped(userData, actualFace);
-			}
-			if( flag != lastFlag ) {
-				if( startFace < i ) {
-					if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
-						if (lastFlag==1 && mcol)
-							GPU_color_switch(1);
-						else
-							GPU_color_switch(0);
-						glDrawArrays(GL_TRIANGLES,startFace*3,(i-startFace)*3);
+				else {
+					if(index) {
+						orig = index[actualFace];
+						if(drawParamsMapped)
+							flag = drawParamsMapped(userData, orig);
 					}
+					else
+						if(drawParamsMapped)
+							flag = drawParamsMapped(userData, actualFace);
 				}
-				lastFlag = flag;
-				startFace = i;
+				if( flag != lastFlag ) {
+					if( startFace < i ) {
+						if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
+							if (lastFlag==1 && mcol)
+								GPU_color_switch(1);
+							else
+								GPU_color_switch(0);
+							glDrawArrays(GL_TRIANGLES,startFace*3,(i-startFace)*3);
+						}
+					}
+					lastFlag = flag;
+					startFace = i;
+				}
 			}
-		}
-		if( startFace < dm->drawObject->nelements/3 ) {
-			if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
-				if (lastFlag==1 && mcol)
-					GPU_color_switch(1);
-				else
-					GPU_color_switch(0);
-				glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3);
+			if( startFace < dm->drawObject->nelements/3 ) {
+				if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
+					if (lastFlag==1 && mcol)
+						GPU_color_switch(1);
+					else
+						GPU_color_switch(0);
+					glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3);
+				}
 			}
 		}
 		GPU_buffer_unbind();
@@ -667,35 +672,37 @@
 		int prevstart = 0;
 		GPU_vertex_setup(dm);
 		GPU_normal_setup(dm);
-		if( useColors && mc )
-			GPU_color_setup(dm);
-		glShadeModel(GL_SMOOTH);
-		for( i = 0; i < dm->drawObject->nelements/3; i++ ) {
-			int actualFace = dm->drawObject->faceRemap[i];
-			int drawSmooth = (mf[actualFace].flag & ME_SMOOTH);
-			if(index) {
-				orig = index[actualFace];
+		if( !GPU_buffer_legacy(dm) ) {
+			if( useColors && mc )
+				GPU_color_setup(dm);
+			glShadeModel(GL_SMOOTH);
+			for( i = 0; i < dm->drawObject->nelements/3; i++ ) {
+				int actualFace = dm->drawObject->faceRemap[i];
+				int drawSmooth = (mf[actualFace].flag & ME_SMOOTH);
+				if(index) {
+					orig = index[actualFace];
+				}
+				else
+					orig = i;
+				if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
+					state = 1;
+				}
+				else {
+					state = 0;
+				}
+				if( prevstate != state && prevstate == 1 ) {
+					if( i-prevstart > 0 ) {
+						glDrawArrays(GL_TRIANGLES,prevstart*3,(i-prevstart)*3);
+					}
+					prevstart = i;
+				}
+				prevstate = state;
 			}
-			else
-				orig = i;
-			if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
-				state = 1;
+			if(state==1) {
+				glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3);
 			}
-			else {
-				state = 0;
-			}
-			if( prevstate != state && prevstate == 1 ) {
-				if( i-prevstart > 0 ) {
-					glDrawArrays(GL_TRIANGLES,prevstart*3,(i-prevstart)*3);
-				}
-				prevstart = i;
-			}
-			prevstate = state;
+			glShadeModel(GL_FLAT);
 		}
-		if(state==1) {
-			glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3);
-		}
-		glShadeModel(GL_FLAT);
 		GPU_buffer_unbind();
 	}
 }





More information about the Bf-blender-cvs mailing list