[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36599] branches/bmesh/blender/source/ blender: =bmesh= glsl drawing in editmode works again, also fixed some minor customdata bugs

Joseph Eagar joeedh at gmail.com
Tue May 10 19:01:27 CEST 2011


Revision: 36599
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36599
Author:   joeedh
Date:     2011-05-10 17:01:26 +0000 (Tue, 10 May 2011)
Log Message:
-----------
=bmesh= glsl drawing in editmode works again, also fixed some minor customdata bugs

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2011-05-10 16:30:03 UTC (rev 36598)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2011-05-10 17:01:26 UTC (rev 36599)
@@ -229,6 +229,8 @@
  */
 void *CustomData_bmesh_get_layer_n(const struct CustomData *data, void *block, int n);
 
+int CustomData_set_layer_name(const struct CustomData *data, int type, int n, const char *name);
+
 /* gets a pointer to the active or first layer of type
  * returns NULL if there is no layer of type
  */

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-05-10 16:30:03 UTC (rev 36598)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-05-10 17:01:26 UTC (rev 36599)
@@ -1069,7 +1069,7 @@
 	LinkNode *datamasks, *curr;
 	CustomDataMask mask, nextmask;
 	float (*deformedVerts)[3] = NULL;
-	DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm;
+	DerivedMesh *dm=NULL, *orcodm, *clothorcodm, *finaldm;
 	int numVerts = me->totvert;
 	int required_mode;
 	int isPrevDeform= FALSE;
@@ -2178,7 +2178,25 @@
 				attribs->tface[a].array = tfdata->layers[layer].data;
 				attribs->tface[a].emOffset = tfdata->layers[layer].offset;
 				attribs->tface[a].glIndex = gattribs->layer[b].glindex;
-			}
+			} /*else {
+				int player;
+				CustomData *pdata = dm->getFaceDataLayout(dm);
+				
+				if(gattribs->layer[b].name[0])
+					player = CustomData_get_named_layer_index(pdata, CD_MTEXPOLY,
+						gattribs->layer[b].name);
+				else
+					player = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
+				
+				if (player != -1) {
+					a = attribs->tottface++;
+	
+					attribs->tface[a].array = NULL;
+					attribs->tface[a].emOffset = pdata->layers[layer].offset;
+					attribs->tface[a].glIndex = gattribs->layer[b].glindex;
+					
+				}
+			}*/
 		}
 		else if(gattribs->layer[b].type == CD_MCOL) {
 			/* vertex colors */

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2011-05-10 16:30:03 UTC (rev 36598)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2011-05-10 17:01:26 UTC (rev 36599)
@@ -1827,6 +1827,19 @@
 	return data->layers[layer_index].data;
 }
 
+
+int CustomData_set_layer_name(const CustomData *data, int type, int n, const char *name)
+{
+	/* get the layer index of the first layer of type */
+	int layer_index = CustomData_get_layer_index_n(data, type, n);
+
+	if(layer_index < 0) return 0;
+
+	strcpy(data->layers[layer_index].name, name);
+	
+	return 1;
+}
+
 void *CustomData_set_layer(const CustomData *data, int type, void *ptr)
 {
 	/* get the layer index of the first layer of type */
@@ -2165,13 +2178,13 @@
 	int i;
 	for(i=0; i < pdata->totlayer; i++){
 		if(pdata->layers[i].type == CD_MTEXPOLY)
-			CustomData_add_layer(fdata, CD_MTFACE, CD_CALLOC, &(pdata->layers[i].name), total);
+			CustomData_add_layer_named(fdata, CD_MTFACE, CD_CALLOC, NULL, total, pdata->layers[i].name);
 	}
 	for(i=0; i < ldata->totlayer; i++){
 		if(ldata->layers[i].type == CD_MLOOPCOL)
-			CustomData_add_layer(fdata, CD_MCOL, CD_CALLOC, &(ldata->layers[i].name), total);
+			CustomData_add_layer_named(fdata, CD_MCOL, CD_CALLOC, NULL, total, ldata->layers[i].name);
 		if (ldata->layers[i].type == CD_WEIGHT_MLOOPCOL)
-			CustomData_add_layer(fdata, CD_WEIGHT_MCOL, CD_CALLOC, &(ldata->layers[i].name), total);
+			CustomData_add_layer_named(fdata, CD_WEIGHT_MCOL, CD_CALLOC, NULL, total, ldata->layers[i].name);
 	}
 }
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-05-10 16:30:03 UTC (rev 36598)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-05-10 17:01:26 UTC (rev 36599)
@@ -336,9 +336,6 @@
 	/*private variables, for number of verts/edges/faces
 	  within the above hash/table members*/
 	int tv, te, tf;
-
-	/*customdata layout of the tesselated faces*/
-	CustomData tessface_layout;
 } EditDerivedBMesh;
 
 static void bmdm_recalc_lookups(EditDerivedBMesh *bmdm)
@@ -962,7 +959,7 @@
                int (*setMaterial)(int, void *attribs),
                int (*setDrawOptions)(void *userData, int index), void *userData)
 {
-#if 1
+#if 0
 	(void)dm;
 	(void)setMaterial;
 	(void)setDrawOptions;
@@ -971,13 +968,16 @@
 
 	EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
 	BMesh *bm= bmdm->tc->bm;
+	BMEditMesh *em = bmdm->tc;
 	float (*vertexCos)[3]= bmdm->vertexCos;
 	float (*vertexNos)[3]= bmdm->vertexNos;
 	BMVert *eve;
 	BMFace *efa;
+	BMIter iter;
+	BMLoop **ltri;
 	DMVertexAttribs attribs;
 	GPUVertexAttribs gattribs;
-	MTFace *tf;
+	MTexPoly *tp;
 	int transp, new_transp, orig_transp, tfoffset;
 	int i, b, matnr, new_matnr, dodraw, layer;
 
@@ -986,42 +986,47 @@
 
 	transp = GPU_get_material_blend_mode();
 	orig_transp = transp;
-	layer = CustomData_get_layer_index(&bm->pdata, CD_MTFACE);
-	tfoffset = (layer == -1)? -1: bm->pdata.layers[layer].offset;
 
 	memset(&attribs, 0, sizeof(attribs));
 
 	/* always use smooth shading even for flat faces, else vertex colors wont interpolate */
 	glShadeModel(GL_SMOOTH);
+	BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+		 BMINDEX_SET(eve, i);
+	}
 
-	for (i=0,eve=bm->verts.first; eve; eve= eve->next)
-		BMINDEX_SET(eve, i++);
-
-#define PASSATTRIB(efa, eve, vert) {											\
+#define PASSATTRIB(loop, eve, vert) {											\
 	if(attribs.totorco) {														\
-		float *orco = attribs.orco.array[BMINDEX_GET(eve)];							\
+		float *orco = attribs.orco.array[BMINDEX_GET(eve)];						\
 		glVertexAttrib3fvARB(attribs.orco.glIndex, orco);						\
 	}																			\
 	for(b = 0; b < attribs.tottface; b++) {										\
-		MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].bmOffset);	\
-		glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]);			\
+		MLoopUV *_luv = CustomData_bmesh_get_n(&bm->ldata, loop->head.data, CD_MLOOPUV, b);\
+		glVertexAttrib2fvARB(attribs.tface[b].glIndex, _luv->uv);				\
 	}																			\
 	for(b = 0; b < attribs.totmcol; b++) {										\
-		MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].bmOffset);		\
-		GLubyte col[4];															\
-		col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a;				\
-		glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col);					\
+		MLoopCol *_cp = CustomData_bmesh_get_n(&bm->ldata, loop->head.data, CD_MLOOPCOL, b);\
+		GLubyte _col[4];														\
+		_col[0]= _cp->b; _col[1]= _cp->g; _col[2]= _cp->r; _col[3]= _cp->a;		\
+		glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, _col);					\
 	}																			\
 	if(attribs.tottang) {														\
 		float *tang = attribs.tang.array[i*4 + vert];							\
 		glVertexAttrib3fvARB(attribs.tang.glIndex, tang);						\
 	}																			\
-}
+	}
+	
+	BM_ITER_INDEX(efa, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
+		BMINDEX_SET(efa, i);
+	}
+	
+	for (i=0, ltri=em->looptris[0]; i<em->tottri; i++, ltri += 3) {
+		int drawSmooth;
 
-	for (i=0,efa= bm->faces.first; efa; i++,efa= efa->next) {
-		int drawSmooth= (efa->flag & ME_SMOOTH);
-
-		if(setDrawOptions && !setDrawOptions(userData, i))
+		efa = ltri[0]->f;
+		drawSmooth= BM_TestHFlag(efa, BM_SMOOTH);
+		
+		if(setDrawOptions && !setDrawOptions(userData, BMINDEX_GET(efa)))
 			continue;
 
 		new_matnr = efa->mat_nr + 1;
@@ -1031,9 +1036,9 @@
 				DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
 		}
 
-		if(tfoffset != -1) {
-			tf = (MTFace*)((char*)efa->data)+tfoffset;
-			new_transp = tf->transp;
+		if(attribs.tottface) {
+			tp = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
+			new_transp = tp->transp;
 
 			if(new_transp != transp) {
 				if(new_transp == GPU_BLEND_SOLID && orig_transp != GPU_BLEND_SOLID)
@@ -1045,70 +1050,52 @@
 		}
 
 		if(dodraw) {
-			glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+			glBegin(GL_TRIANGLES);
 			if (!drawSmooth) {
 				if(vertexCos) glNormal3fv(bmdm->faceNos[i]);
-				else glNormal3fv(efa->n);
+				else glNormal3fv(efa->no);
 
-				PASSATTRIB(efa, efa->v1, 0);
-				if(vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
-				else glVertex3fv(efa->v1->co);
+				PASSATTRIB(ltri[0], ltri[0]->v, 0);
+				if(vertexCos) glVertex3fv(vertexCos[BMINDEX_GET(ltri[0]->v)]);
+				else glVertex3fv(ltri[0]->v->co);
 
-				PASSATTRIB(efa, efa->v2, 1);
-				if(vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
-				else glVertex3fv(efa->v2->co);
+				PASSATTRIB(ltri[1], ltri[1]->v, 1);
+				if(vertexCos) glVertex3fv(vertexCos[BMINDEX_GET(ltri[1]->v)]);
+				else glVertex3fv(ltri[1]->v->co);
 
-				PASSATTRIB(efa, efa->v3, 2);
-				if(vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
-				else glVertex3fv(efa->v3->co);
-
-				if(efa->v4) {
-					PASSATTRIB(efa, efa->v4, 3);
-					if(vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
-					else glVertex3fv(efa->v4->co);
-				}
+				PASSATTRIB(ltri[2], ltri[2]->v, 2);
+				if(vertexCos) glVertex3fv(vertexCos[BMINDEX_GET(ltri[2]->v)]);
+				else glVertex3fv(ltri[2]->v->co);
 			} else {
-				PASSATTRIB(efa, efa->v1, 0);
+				PASSATTRIB(ltri[0], ltri[0]->v, 0);
 				if(vertexCos) {
-					glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
-					glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+					glNormal3fv(vertexNos[BMINDEX_GET(ltri[0]->v)]);
+					glVertex3fv(vertexCos[BMINDEX_GET(ltri[0]->v)]);
 				}
 				else {
-					glNormal3fv(efa->v1->no);
-					glVertex3fv(efa->v1->co);
+					glNormal3fv(ltri[0]->v->no);
+					glVertex3fv(ltri[0]->v->co);
 				}
 
-				PASSATTRIB(efa, efa->v2, 1);
+				PASSATTRIB(ltri[1], ltri[1]->v, 1);
 				if(vertexCos) {
-					glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
-					glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+					glNormal3fv(vertexNos[BMINDEX_GET(ltri[1]->v)]);
+					glVertex3fv(vertexCos[BMINDEX_GET(ltri[1]->v)]);
 				}
 				else {
-					glNormal3fv(efa->v2->no);
-					glVertex3fv(efa->v2->co);
+					glNormal3fv(ltri[1]->v->no);
+					glVertex3fv(ltri[1]->v->co);
 				}
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list