[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21380] branches/soc-2009-imbusy/source/ blender: fixed a crashing bug when allocating buffers from pool, started work on vertex paint mode, somehow can paint only 4 vertices

Lukas Steiblys imbusy at imbusy.org
Mon Jul 6 12:45:15 CEST 2009


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

Log Message:
-----------
fixed a crashing bug when allocating buffers from pool, started work on vertex paint mode, somehow can paint only 4 vertices

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.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 08:57:37 UTC (rev 21379)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-06 10:45:14 UTC (rev 21380)
@@ -563,7 +563,7 @@
 					GPU_color_switch(1);
 				else
 					GPU_color_switch(0);
-				glDrawArrays(GL_TRIANGLES,startFace*3,((dm->drawObject->nelements/3)-startFace)*3);
+				glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3);
 			}
 		}
 		GPU_buffer_unbind();
@@ -662,13 +662,40 @@
 		}
 	}
 	else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
+		int state = 1;
+		int prevstate = 1;
+		int prevstart = 0;
 		GPU_vertex_setup(dm);
 		GPU_normal_setup(dm);
 		if( useColors && mc )
 			GPU_color_setup(dm);
 		glShadeModel(GL_SMOOTH);
-		glDrawArrays(GL_TRIANGLES,0,dm->drawObject->nelements);
-		glShadeModel(GL_FLOAT);
+		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;
+		}
+		if(state==1) {
+			glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3);
+		}
+		glShadeModel(GL_FLAT);
 		GPU_buffer_unbind();
 	}
 }

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-06 08:57:37 UTC (rev 21379)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-06 10:45:14 UTC (rev 21380)
@@ -145,9 +145,10 @@
 		pool->start += MAX_FREE_GPU_BUFFERS;
 
 	for( i = 0; i < pool->size; i++ ) {
-		cursize = pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]->size;
+		int actuali = (pool->start+i)%MAX_FREE_GPU_BUFFERS;
+		cursize = pool->buffers[actuali]->size;
 		if( cursize == size ) {
-			allocated = pool->buffers[pool->start+i];
+			allocated = pool->buffers[actuali];
 			GPU_buffer_pool_remove(i,pool);
 			DEBUG_VBO("free buffer of exact size found\n");
 			return allocated;
@@ -183,10 +184,10 @@
 		}
 	}
 	else {
-		sprintf(buffer,"free buffer found. Wasted %d bytes\n", pool->buffers[pool->start+bestfit]->size-size);
+		sprintf(buffer,"free buffer found. Wasted %d bytes\n", pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS]->size-size);
 		DEBUG_VBO(buffer);
 
-		allocated = pool->buffers[pool->start+bestfit];
+		allocated = pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS];
 		GPU_buffer_pool_remove(bestfit,pool);
 	}
 	return allocated;
@@ -556,15 +557,31 @@
 		else
 			index[redir[mface[i].mat_nr+127]] += 9;
 
+		varray[start] = mcol[i*12];
+		varray[start+1] = mcol[i*12+1];
+		varray[start+2] = mcol[i*12+2];
+
+		varray[start+3] = mcol[i*12+3];
+		varray[start+4] = mcol[i*12+4];
+		varray[start+5] = mcol[i*12+5];
+
+		varray[start+6] = mcol[i*12+6];
+		varray[start+7] = mcol[i*12+7];
+		varray[start+8] = mcol[i*12+8];
 		/* v1 v2 v3 */
-		VECCOPY(&varray[start],&mcol[i*12]);
-		VECCOPY(&varray[start+3],&mcol[i*12+3]);
-		VECCOPY(&varray[start+6],&mcol[i*12+6]);
 		if( mface[i].v4 ) {
 			/* v3 v4 v1 */
-			VECCOPY(&varray[start+9],&mcol[i*12+6]);
-			VECCOPY(&varray[start+12],&mcol[i*12+9]);
-			VECCOPY(&varray[start+15],&mcol[i*12]);
+			varray[start+9] = mcol[i*12+6];
+			varray[start+10] = mcol[i*12+7];
+			varray[start+11] = mcol[i*12+8];
+
+			varray[start+12] = mcol[i*12+9];
+			varray[start+13] = mcol[i*12+10];
+			varray[start+14] = mcol[i*12+11];
+
+			varray[start+15] = mcol[i*12];
+			varray[start+16] = mcol[i*12+1];
+			varray[start+17] = mcol[i*12+2];
 		}
 	}
 }
@@ -615,24 +632,21 @@
 	DEBUG_VBO("GPU_buffer_color\n");
 
 	mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+	dm->drawObject->colType = CD_WEIGHT_MCOL;
 	if(!mcol) {
 		mcol = DM_get_face_data_layer(dm, CD_MCOL);
+		dm->drawObject->colType = CD_MCOL;
 	}
 
-	colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), "GPU_buffer_color");
-	for( i=0; i < dm->getNumFaces(dm); i++ ) {
-		colors[i*3] = mcol[i].r;
+	colors = MEM_mallocN(dm->getNumFaces(dm)*12*sizeof(unsigned char), "GPU_buffer_color");
+	for( i=0; i < dm->getNumFaces(dm)*4; i++ ) {
+		colors[i*3] = mcol[i].b;
 		colors[i*3+1] = mcol[i].g;
-		colors[i*3+2] = mcol[i].b;
+		colors[i*3+2] = mcol[i].r;
 	}
 
 	result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, colors, GPU_buffer_copy_color3 );
 
-	mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
-	dm->drawObject->colType = CD_WEIGHT_MCOL;
-	if(!mcol) {
-		dm->drawObject->colType = CD_MCOL;
-	}
 	MEM_freeN(colors);
 	return result;
 }





More information about the Bf-blender-cvs mailing list