[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21083] branches/soc-2009-imbusy/source/ blender: textured mode seems to work, but could be improved

Lukas Steiblys imbusy at imbusy.org
Mon Jun 22 21:35:52 CEST 2009


Revision: 21083
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21083
Author:   imbusy
Date:     2009-06-22 21:35:52 +0200 (Mon, 22 Jun 2009)

Log Message:
-----------
textured mode seems to work, but could be improved

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
    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-06-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-22 19:35:52 UTC (rev 21083)
@@ -318,8 +318,70 @@
 	float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
 	MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
 	int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+	int startFace = 0, lastFlag = 0xdeadbeef;
+	GPU_vertex_setup( dm );
+	GPU_normal_setup( dm );
+	GPU_uv_setup( dm );
+	if( mcol != 0 ) {
+		if( dm->drawObject->colType != CD_MCOL ) {
+			unsigned char *colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), "cdDM_drawFacesTex_common");
+			for( i=0; i < dm->getNumFaces(dm); i++ ) {
+				colors[i*3] = mcol[i].r;
+				colors[i*3+1] = mcol[i].g;
+				colors[i*3+2] = mcol[i].b;
+			}
+			GPU_color3_upload(dm,colors);
+			MEM_freeN(colors);
+			dm->drawObject->colType = CD_MCOL;
+		}
+		GPU_color_setup( dm );
+	}
 
-	for(i = 0; i < dm->numFaceData; i++, mf++) {
+	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);
+			}
+			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);
+				}
+			}
+			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/3)-startFace)*3);
+		}
+	}
+	GPU_buffer_unbind();
+	glShadeModel( GL_FLAT );
+	/*for(i = 0; i < dm->numFaceData; i++, mf++) {
 		MVert *mvert;
 		int flag;
 		unsigned char *cp = NULL;
@@ -339,7 +401,7 @@
 				else	{ if(nors) nors += 3; continue; }
 		}
 		
-		if(flag != 0) { /* if the flag is 0 it means the face is hidden or invisible */
+		if(flag != 0) {
 			if (flag==1 && mcol)
 				cp= (unsigned char*) &mcol[i*4];
 
@@ -348,7 +410,6 @@
 					glNormal3fv(nors);
 				}
 				else {
-					/* TODO make this better (cache facenormals as layer?) */
 					float nor[3];
 					if(mf->v4) {
 						CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
@@ -392,7 +453,7 @@
 		}
 		
 		if(nors) nors += 3;
-	}
+	}*/
 }
 
 static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-22 19:35:52 UTC (rev 21083)
@@ -67,6 +67,8 @@
 	GPUBuffer *normals;
 	GPUBuffer *uv;
 	GPUBuffer *colors;
+	int	*faceRemap;		/* at what index was the face originally in DerivedMesh */
+	int colType;
 
 	GPUBufferMaterial *materials;
 
@@ -89,10 +91,12 @@
 void GPU_uv_setup( struct DerivedMesh *dm );
 void GPU_color_setup( struct DerivedMesh *dm );
 
-/* upload three unsigned chars, representing RGB colors, for each vertex */
+/* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
 void GPU_color3_upload( struct DerivedMesh *dm, char *data );
-/* upload four unsigned chars, representing RGBA colors, for each vertex */
+/* upload four unsigned chars, representing RGBA colors, for each vertex. Resets dm->drawObject->colType to -1 */
 void GPU_color4_upload( struct DerivedMesh *dm, char *data );
+/* switch color rendering on=1/off=0 */
+void GPU_color_switch( int mode );
 
 /* called after drawing */
 void 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-06-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-06-22 19:35:52 UTC (rev 21083)
@@ -195,6 +195,10 @@
 
 	if( buffer == 0 )
 		return;
+	if( pool == 0 )
+		pool = globalPool;
+	if( pool == 0 )
+		globalPool = GPU_buffer_pool_new();
 
 	while( pool->start < 0 )
 		pool->start += MAX_FREE_GPU_BUFFERS;
@@ -216,6 +220,8 @@
 	MVert *mvert;
 	MFace *mface;
 	int numverts[256];	/* material number is an 8-bit char so there's at most 256 materials */
+	int redir[256];		/* material number is an 8-bit char so there's at most 256 materials */
+	int *index;
 	int i;
 	int curmat, curverts;
 
@@ -242,18 +248,36 @@
 		}
 	}
 	object->materials = MEM_mallocN(sizeof(GPUBufferMaterial)*object->nmaterials,"GPU_drawobject_new_materials");
+	index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup_index");
 
 	curmat = curverts = 0;
 	for( i = 0; i < 256; i++ ) {
 		if( numverts[i] > 0 ) {
 			object->materials[curmat].mat_nr = i-127;
 			object->materials[curmat].start = curverts;
+			index[curmat] = curverts/3;
 			object->materials[curmat].end = curverts+numverts[i];
 			curverts += numverts[i];
 			curmat++;
 		}
 	}
+	object->faceRemap = MEM_mallocN(sizeof(int)*object->nelements/3,"GPU_drawobject_new_faceRemap");
+	for( i = 0; i < object->nmaterials; i++ ) {
+		redir[object->materials[i].mat_nr+127] = i;	/* material number -> material index */
+	}
 
+	for( i=0; i < dm->getNumFaces(dm); i++ ) {
+		object->faceRemap[index[redir[mface[i].mat_nr+127]]] = i; 
+		if( mface[i].v4 ) {
+			object->faceRemap[index[redir[mface[i].mat_nr+127]]+1] = i;
+			index[redir[mface[i].mat_nr+127]]+=2;
+		}
+		else
+		{
+			index[redir[mface[i].mat_nr+127]]++;
+		}
+	}
+	MEM_freeN(index);
 	return object;
 }
 
@@ -265,7 +289,7 @@
 	DEBUG_VBO("GPU_drawobject_free\n");
 
 	MEM_freeN(object->materials);
-
+	MEM_freeN(object->faceRemap);
 	GPU_buffer_free( object->vertices, globalPool );
 	GPU_buffer_free( object->normals, globalPool );
 	GPU_buffer_free( object->uv, globalPool );
@@ -462,8 +486,10 @@
 GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
 {
 	DEBUG_VBO("GPU_buffer_uv\n");
-
-	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+	if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
+		return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+	else
+		return 0;
 }
 
 void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
@@ -477,6 +503,7 @@
 
 	DEBUG_VBO("GPU_buffer_copy_color3\n");
 
+	dm->drawObject->colType = -1;
 	mcol = user;
 	varray = (unsigned char *)varray_;
 
@@ -513,6 +540,7 @@
 
 	DEBUG_VBO("GPU_buffer_copy_color4\n");
 
+	dm->drawObject->colType = -1;
 	mcol = (unsigned char *)user;
 	varray = (unsigned char *)varray_;
 
@@ -547,8 +575,9 @@
 	DEBUG_VBO("GPU_buffer_color\n");
 
 	mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
-	if(!mcol)
+	if(!mcol) {
 		mcol = DM_get_face_data_layer(dm, CD_MCOL);
+	}
 
 	colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), "GPU_buffer_color");
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
@@ -556,7 +585,14 @@
 		colors[i*3+1] = mcol[i].g;
 		colors[i*3+2] = mcol[i].b;
 	}
+
 	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;
 }
@@ -608,16 +644,19 @@
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->uv == 0 )
 		dm->drawObject->uv = GPU_buffer_uv( dm );
-	glEnableClientState( GL_TEXTURE_COORD_ARRAY );
-	if( useVBOs ) {
-		glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
-		glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+	if( dm->drawObject->uv != 0 ) {
+		glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+		if( useVBOs ) {
+			glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
+			glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+		}
+		else {
+			glTexCoordPointer( 2, GL_FLOAT, 0, dm->drawObject->uv->pointer );
+		}
+
+		GLStates |= GPU_BUFFER_TEXCOORD_STATE;
 	}
-	else {
-		glTexCoordPointer( 2, GL_FLOAT, 0, dm->drawObject->uv->pointer );
-	}
-
-	GLStates |= GPU_BUFFER_TEXCOORD_STATE;
 }
 
 void GPU_color_setup( DerivedMesh *dm )
@@ -626,7 +665,7 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->colors == 0 )
-		dm->drawObject->colors = GPU_buffer_uv( dm );
+		dm->drawObject->colors = GPU_buffer_color( dm );
 	glEnableClientState( GL_COLOR_ARRAY );
 	if( useVBOs ) {
 		glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
@@ -670,4 +709,18 @@
 		dm->drawObject = GPU_drawobject_new(dm);
 	GPU_buffer_free(dm->drawObject->colors,globalPool);
 	dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color4 );
+}
+
+void GPU_color_switch( int mode )
+{
+	if( mode ) {
+		if( !GLStates & GPU_BUFFER_COLOR_STATE )
+			glEnableClientState( GL_COLOR_ARRAY );
+		GLStates |= GPU_BUFFER_COLOR_STATE;
+	}
+	else {
+		if( GLStates & GPU_BUFFER_COLOR_STATE )
+			glDisableClientState( GL_COLOR_ARRAY );
+		GLStates &= (!GPU_BUFFER_COLOR_STATE);
+	}
 }
\ No newline at end of file





More information about the Bf-blender-cvs mailing list