[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21480] branches/soc-2009-imbusy/source/ blender: textured mode works a bit better, buffer pool is cleaned up on exit

Lukas Steiblys imbusy at imbusy.org
Fri Jul 10 13:22:12 CEST 2009


Revision: 21480
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21480
Author:   imbusy
Date:     2009-07-10 13:22:11 +0200 (Fri, 10 Jul 2009)

Log Message:
-----------
textured mode works a bit better, buffer pool is cleaned up on exit

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/customdata.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawmesh.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
    branches/soc-2009-imbusy/source/blender/makesdna/DNA_customdata_types.h
    branches/soc-2009-imbusy/source/blender/windowmanager/intern/wm_init_exit.c

Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-10 10:48:25 UTC (rev 21479)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-10 11:22:11 UTC (rev 21480)
@@ -427,11 +427,12 @@
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
 	MVert *mv = cddm->mvert;
-	MFace *mf = cddm->mface;
+	MFace *mf = DM_get_face_data_layer(dm, CD_MFACE);
 	MCol *mcol = dm->getFaceDataArray(dm, CD_MCOL);
+	MCol *realcol = dm->getFaceDataArray(dm, CD_TEXTURE_MCOL);
 	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 i, j, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
 	int startFace = 0, lastFlag = 0xdeadbeef;
 
 	if( GPU_buffer_legacy(dm) ) {
@@ -510,67 +511,82 @@
 			if(nors) nors += 3;
 		}
 	} else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
+		MCol *col = realcol;
+		if(!col)
+			col = mcol;
+
 		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");
+		if( col != 0 ) {
+			/*if( realcol && dm->drawObject->colType == CD_TEXTURE_MCOL )  {
+				col = 0;
+			} else if( mcol && dm->drawObject->colType == CD_MCOL ) {
+				col = 0;
+			}
+			
+			if( col != 0 ) {*/
+				unsigned char *colors = MEM_mallocN(dm->getNumFaces(dm)*4*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;
+					for( j=0; j < 4; j++ ) {
+						colors[i*12+j*3] = col[i*4+j].r;
+						colors[i*12+j*3+1] = col[i*4+j].g;
+						colors[i*12+j*3+2] = col[i*4+j].b;
+					}
 				}
 				GPU_color3_upload(dm,colors);
 				MEM_freeN(colors);
-				dm->drawObject->colType = CD_MCOL;
-			}
+				if(realcol)
+					dm->drawObject->colType = CD_TEXTURE_MCOL;
+				else if(mcol)
+					dm->drawObject->colType = CD_MCOL;
+			//}
 			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;
 
-				if(drawParams) {
-					flag = drawParams(tf? &tf[actualFace]: NULL, mcol? &mcol[actualFace*4]: NULL, mf[actualFace].mat_nr);
+		glShadeModel( GL_SMOOTH );
+		for(i = 0; i < dm->drawObject->nelements/3; i++) {
+			int actualFace = dm->drawObject->faceRemap[i];
+			int flag = 1;
+			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(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);
 					}
-					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;
-				}
+				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();
 		glShadeModel( GL_FLAT );
 	}
@@ -591,8 +607,10 @@
 	int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
 
 
-	mc = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+	mc = DM_get_face_data_layer(dm, CD_ID_MCOL);
 	if(!mc)
+		mc = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+	if(!mc)
 		mc = DM_get_face_data_layer(dm, CD_MCOL);
 
 	if( GPU_buffer_legacy(dm) ) {

Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/customdata.c	2009-07-10 10:48:25 UTC (rev 21479)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/customdata.c	2009-07-10 11:22:11 UTC (rev 21480)
@@ -726,6 +726,10 @@
 	 layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL},
 	{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
 	 layerSwap_mcol, layerDefault_mcol},
+	 {sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol,
+	 layerSwap_mcol, layerDefault_mcol},
+	 {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
+	 layerSwap_mcol, layerDefault_mcol},
 };
 
 const char *LAYERTYPENAMES[CD_NUMTYPES] = {

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawmesh.c	2009-07-10 10:48:25 UTC (rev 21479)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawmesh.c	2009-07-10 11:22:11 UTC (rev 21480)
@@ -397,8 +397,7 @@
 	glPopMatrix();
 }
 
-
-static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
+static int draw_tface__set_draw_legacy(MTFace *tface, MCol *mcol, int matnr)
 {
 	if (tface && (tface->mode&TF_INVISIBLE)) return 0;
 
@@ -420,7 +419,85 @@
 		return 1; /* Set color from mcol */
 	}
 }
+static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
+{
+	if (tface && (tface->mode&TF_INVISIBLE)) return 0;
 
+	if (tface && set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, matnr, TF_TWOSIDE)) {
+		return 2; /* Don't set color */
+	} else if (tface && tface->mode&TF_OBCOL) {
+		return 2; /* Don't set color */
+	} else if (!mcol) {
+		return 2; /* Don't set color */
+	} else {
+		return 1; /* Set color from mcol */
+	}
+}
+static void add_tface_color_layer(DerivedMesh *dm)
+{
+	MTFace *tface = DM_get_face_data_layer(dm, CD_MTFACE);
+	MFace *mface = DM_get_face_data_layer(dm, CD_MFACE);
+	MCol *mcol = dm->getFaceDataArray(dm, CD_MCOL);
+	MCol *finalCol;
+	int i,j;
+	finalCol = MEM_mallocN(sizeof(MCol)*4*dm->getNumFaces(dm),"add_tface_color_layer");
+	for(i=0;i<dm->getNumFaces(dm);i++) {
+		if (tface && (tface->mode&TF_INVISIBLE)) {
+			if( mcol )
+				memcpy(&finalCol[i*4],&mcol[i*4],sizeof(MCol)*4);
+			else
+				for(j=0;j<4;j++) {
+					finalCol[i*4+j].b = 255;
+					finalCol[i*4+j].g = 255;
+					finalCol[i*4+j].r = 255;
+				}
+		}
+		else if (tface && mface && set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, mface[i].mat_nr, TF_TWOSIDE)) {
+			for(j=0;j<4;j++) {
+				finalCol[i*4+j].b = 255;
+				finalCol[i*4+j].g = 0;
+				finalCol[i*4+j].r = 255;
+			}
+		} else if (tface && tface->mode&TF_OBCOL) {
+			for(j=0;j<4;j++) {
+				finalCol[i*4+j].r = Gtexdraw.obcol[0];
+				finalCol[i*4+j].g = Gtexdraw.obcol[1];
+				finalCol[i*4+j].b = Gtexdraw.obcol[2];
+			}
+		} else if (!mcol) {
+			if (tface) {
+				for(j=0;j<4;j++) {
+					finalCol[i*4+j].b = 255;
+					finalCol[i*4+j].g = 255;
+					finalCol[i*4+j].r = 255;
+				}
+			}
+			else {
+				Material *ma= give_current_material(Gtexdraw.ob, mface[i].mat_nr+1);
+				if(ma) 
+					for(j=0;j<4;j++) {
+						finalCol[i*4+j].b = ma->b;
+						finalCol[i*4+j].g = ma->g;
+						finalCol[i*4+j].r = ma->r;
+					}
+				else
+					for(j=0;j<4;j++) {
+						finalCol[i*4+j].b = 255;
+						finalCol[i*4+j].g = 255;
+						finalCol[i*4+j].r = 255;
+					}
+			}
+		} else {
+			for(j=0;j<4;j++) {
+				finalCol[i*4+j].b = mcol[i*4+j].r;
+				finalCol[i*4+j].g = mcol[i*4+j].g;
+				finalCol[i*4+j].r = mcol[i*4+j].b;
+			}
+		}
+	}
+	CustomData_add_layer( &dm->faceData, CD_TEXTURE_MCOL, CD_ASSIGN, finalCol, dm->numFaceData );
+}
+
 static int draw_tface_mapped__set_draw(void *userData, int index)
 {
 	Mesh *me = (Mesh*)userData;
@@ -568,7 +645,13 @@
 			dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
 	}
 	else {
-		dm->drawFacesTex(dm, draw_tface__set_draw);
+		if( GPU_buffer_legacy(dm) )
+			dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
+		else {
+			if( !CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL) )
+				add_tface_color_layer(dm);
+			dm->drawFacesTex(dm, draw_tface__set_draw);
+		}
 	}
 
 	/* draw game engine text hack */

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-07-10 10:48:25 UTC (rev 21479)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-07-10 11:22:11 UTC (rev 21480)
@@ -5642,12 +5642,11 @@
 			}
 		}
 
-		CustomData_free_layers( &dm->faceData, CD_WEIGHT_MCOL, dm->getNumFaces(dm) );
-		CustomData_add_layer( &dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, colors, dm->numFaceData );
+		CustomData_add_layer( &dm->faceData, CD_ID_MCOL, CD_ASSIGN, colors, dm->numFaceData );
 		GPU_buffer_free(dm->drawObject->colors,0);
 		dm->drawObject->colors = 0;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list