[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37081] branches/bmesh/blender/source/ blender: =bmesh= committing not-quite-functional edge split modifier code before replacing it with a bmesh version , taking too much time to debug right now.

Joseph Eagar joeedh at gmail.com
Wed Jun 1 21:30:19 CEST 2011


Revision: 37081
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37081
Author:   joeedh
Date:     2011-06-01 19:30:19 +0000 (Wed, 01 Jun 2011)
Log Message:
-----------
=bmesh= committing not-quite-functional edge split modifier code before replacing it with a bmesh version, taking too much time to debug right now.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -867,7 +867,7 @@
 	MVert *mv = cddm->mvert;
 	MFace *mf = cddm->mface;
 	MCol *mc;
-	float *nors= dm->getTessFaceDataArray(dm, CD_NORMAL);
+	float *nors= DM_get_tessface_data_layer(dm, CD_NORMAL);
 	int i, orig, *index = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
 
 	mc = DM_get_tessface_data_layer(dm, CD_ID_MCOL);
@@ -944,6 +944,8 @@
 				}
 
 				glEnd();
+			} else {
+				printf("eek!\n");
 			}
 			
 			if (nors) nors += 3;
@@ -2189,7 +2191,9 @@
 
 	cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
 	cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
-
+	
+	cdDM_recalcTesselation(cddm);
+	
 	return dm;
 }
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -2296,9 +2296,9 @@
 			for (j=0; j<mp->totloop; j++, ml++) {
 				v = BLI_addfillvert(mvert[ml->v].co);
 				if (polyorigIndex && use_poly_origindex)
-					v->tmp.l = polyorigIndex[i];
+					v->hash = polyorigIndex[i];
 				else
-					v->tmp.l = i;
+					v->hash = i;
 	
 				v->keyindex = mp->loopstart + j;
 	
@@ -2323,11 +2323,11 @@
 				mf[k].v3 = f->v3->keyindex;
 				
 				/*put poly index in mf->v4*/
-				mf[k].v4 = f->v1->tmp.l;
+				mf[k].v4 = f->v1->hash;
 				
 				mf[k].mat_nr = mp->mat_nr;
 				mf[k].flag = mp->flag;
-				origIndex[k] = use_face_origindex ? k : f->v1->tmp.l;
+				origIndex[k] = use_face_origindex ? k : f->v1->hash;
 	
 				k++;
 			}

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -2624,7 +2624,7 @@
 	int index, totvert, totedge, totface;
 	int i;
 	int vertNum, edgeNum, faceNum;
-	int *vertOrigIndex, *faceOrigIndex, *polyOrigIndex; /* *edgeOrigIndex - as yet, unused  */
+	int *vertOrigIndex, *faceOrigIndex, *polyOrigIndex, *base_polyOrigIndex; /* *edgeOrigIndex - as yet, unused  */
 	short *edgeFlags;
 	char *faceFlags;
 	int *loopidx = NULL, *vertidx = NULL;
@@ -2777,6 +2777,8 @@
 	mface = dm->getTessFaceArray(dm);
 
 	mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+	base_polyOrigIndex = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+	
 	/*CDDM hack*/
 	edgeFlags = ccgdm->edgeFlags = MEM_callocN(sizeof(short)*totedge, "faceFlags");
 	faceFlags = ccgdm->faceFlags = MEM_callocN(sizeof(char)*2*totface, "faceFlags");
@@ -2803,7 +2805,9 @@
 		int g2_wid = gridCuts+2;
 		float *w2;
 		int s, x, y;
-
+		
+		origIndex = base_polyOrigIndex ? base_polyOrigIndex[origIndex] : origIndex;
+		
 		w = get_ss_weights(&wtable, gridCuts, numVerts);
 
 		ccgdm->faceMap[index].startVert = vertNum;

Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -305,8 +305,6 @@
 	Mesh *me = ob->data;
 
 	BMO_CallOpf(bm, "bmesh_to_mesh mesh=%p object=%p", me, ob);
-
-	/*BMESH_TODO eventually we'll have to handle shapekeys here*/
 }
 
 void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) {

Modified: branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -1840,8 +1840,8 @@
 {
 	BMFace *efa = EDBM_get_face_for_index(((void **)userData)[0], index);
 	int sel = *(((int **)userData)[1]);
-
-	if (!BM_TestHFlag(efa, BM_HIDDEN) && BM_TestHFlag(efa, BM_SELECT)==sel) {
+	
+	if (efa && !BM_TestHFlag(efa, BM_HIDDEN) && BM_TestHFlag(efa, BM_SELECT)==sel) {
 		bglVertex3fv(cent);
 	}
 }
@@ -6551,7 +6551,9 @@
 
 static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
 {
-	if (!BM_TestHFlag(EDBM_get_face_for_index(((void**)userData)[0], index), BM_HIDDEN)) {
+	BMFace *efa = EDBM_get_face_for_index(((void**)userData)[0], index);
+	
+	if (efa && !BM_TestHFlag(efa, BM_HIDDEN)) {
 		if (((void**)userData)[1]) {
 			WM_set_framebuffer_index_color(index+1);
 		}

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2011-06-01 19:21:36 UTC (rev 37080)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2011-06-01 19:30:19 UTC (rev 37081)
@@ -37,6 +37,7 @@
 #include "BLI_edgehash.h"
 #include "BLI_math.h"
 #include "BLI_array.h"
+#include "BLI_smallhash.h"
 
 #include "BKE_cdderivedmesh.h"
 #include "BKE_modifier.h"
@@ -70,8 +71,14 @@
 	int tag;
 	int v1, v2;
 	int used;
+	int idx;
+	int ml1, ml2, mp1, mp2;
 } EdgeData;
 
+typedef struct LoopPair {
+	int ml1, ml2, mp1, mp2;
+} LoopPair;
+
 typedef struct MemBase {
 	BLI_mempool *vertuserpool;
 } MemBase;
@@ -147,8 +154,9 @@
 
 DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
 {
-	DerivedMesh *cddm = CDDM_copy(dm, 0);
-	MEdge *medge;
+	DerivedMesh *cddm = CDDM_copy(dm, 0), *cddm2;
+	MEdge *medge = NULL;
+	BLI_array_declare(stack);
 	BLI_array_declare(medge);
 	MLoop *mloop, *ml, *prevl;
 	MPoly *mpoly, *mp;
@@ -159,24 +167,33 @@
 	VertUser *vu, *vu2;
 	MemBase *membase;
 	CustomData edata, vdata;
-	int i, j, curv, cure;
+	int *origv = NULL, *orige = NULL;
+	BLI_array_declare(origv);
+	BLI_array_declare(orige);
+	EdgeHash *eh, *pairh;
 	float threshold = cos((emd->split_angle + 0.00001) * M_PI / 180.0);
 	float no[3], edge_angle_cos;
+	LoopPair *pairs = NULL, *lp;
+	BLI_array_declare(pairs);
+	int i, j, curv, cure;
 
 	if (!cddm->numVertData || !cddm->numEdgeData)
 		return cddm;
-
+	
+	eh = BLI_edgehash_new();
+	pairh = BLI_edgehash_new();
 	membase = new_membase();
 
 	etags = MEM_callocN(sizeof(EdgeData)*cddm->numEdgeData, "edgedata tag thingies");
 	BLI_array_set_length(etags, cddm->numEdgeData);
 
-	mvert = cddm->getVertArray(cddm);
+	mvert = cddm->dupVertArray(cddm);
 	BLI_array_set_length(mvert, cddm->numVertData);
-	medge = cddm->getEdgeArray(cddm);
+	medge = cddm->dupEdgeArray(cddm);
 	BLI_array_set_length(medge, cddm->numEdgeData);
-	mloop = CustomData_get_layer(&cddm->loopData, CD_MLOOP);
-	mpoly = CustomData_get_layer(&cddm->polyData, CD_MPOLY);
+	
+	mloop = CDDM_get_loops(cddm);
+	mpoly = CDDM_get_polys(cddm);
 
 	for (i=0; i<cddm->numEdgeData; i++) {
 		etags[i].v1 = medge[i].v1;
@@ -186,7 +203,15 @@
 
 		etags[i].v1node.edge = etags+i;
 		etags[i].v2node.edge = etags+i;
+		etags[i].idx = i;
+		
+		BLI_edgehash_insert(eh, medge[i].v1, medge[i].v2, SET_INT_IN_POINTER(i));
+		BLI_array_append(orige, i);
 	}
+	
+	for (i=0; i<cddm->numVertData; i++) {
+		BLI_array_append(origv, i);
+	}
 
 	if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
 		mp = mpoly;
@@ -207,12 +232,22 @@
 			}
 		}
 	}
-
+	
 	mp = mpoly;
 	for (i=0; i<cddm->numPolyData; i++, mp++) {
 		ml = mloop + mp->loopstart;
 		for (j=0; j<mp->totloop; j++, ml++) {
-			if (etags[ml->e].tag)
+			/*create loop pairs*/
+			e = etags + ml->e;
+			if (!e->mp1) {
+				e->mp1 = i+1;
+				e->ml1 = mp->loopstart+j+1;
+			} else if (!e->mp2) {
+				e->mp2 = i+1;
+				e->ml2 = mp->loopstart+j+1;
+			}
+			
+			if (e->tag)
 				continue;
 
 			prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop;
@@ -228,34 +263,79 @@
 				vu->ov = vu->v = ml->v;
 				edge_set_vuser(membase, etags+ml->e, ml->v, vu);
 			}
+		}
+	}
+	
+	/*build list of loop pairs*/
+	for (i=0; i<cddm->numEdgeData; i++) {
+		e = etags + i;
+		if (e->tag && e->mp2) {
+			BLI_array_growone(pairs);
+			lp = pairs + BLI_array_count(pairs)-1;
+			lp->mp1 = e->mp1-1; lp->ml1 = e->ml1-1;
+			lp->mp2 = e->mp2-1; lp->ml2 = e->ml2-1;
+		}
+	}
+	
+	/*find contiguous face regions*/
+	while (1) {
+		int ok = 1;
+		
+		lp = pairs;
+		for (i=0; i<BLI_array_count(pairs); i++, lp++) {
+			MLoop *ml2;
+			MPoly *mp2;
+			EdgeData *e2;
+			int k, lastj;
 
-			/*continue if previous edge is tagged*/
-			if (etags[prevl->e].tag)
-				continue;
+			j = lp->ml1;
+			k = lp->mp1;
+			ml = mloop + lp->ml1;
+			mp = mp2 = mpoly + lp->mp1;
 
-			/*merge together adjacent split vert users*/
-			if (edge_get_vuser(membase, etags+prevl->e, ml->v)
-				!= edge_get_vuser(membase, etags+ml->e, ml->v))
-			{
-				vu = edge_get_vuser(membase, etags+prevl->e, ml->v);
-				vu2 = edge_get_vuser(membase, etags+ml->e, ml->v);
-
-				/*remove from vu2's users list and add to vu's*/
-				for (e=edge_get_first(vu2); e; e=enext) {
-					enext = edge_get_next(e, ml->v);
-					edge_set_vuser(membase, e, ml->v, vu);
-				}
+			/*walk edges around ml->v*/
+			do {
+				lastj = j;
+				if (mloop[j].v == ml->v)
+					j = mp2->loopstart + (j-mp2->loopstart-1 + mp2->totloop)%mp2->totloop;
+				else
+					j = mp2->loopstart + (j-mp2->loopstart+1)%mp2->totloop;
+				
+				prevl = mloop + j;
+				e2 = etags + prevl->e;
+				
+				if (!e2->tag && e2->mp1 && e2->mp2) {
+					j = e2->ml1-1 == j ? e2->ml2-1 : e2->ml1-1;
+					k = e2->mp1-1 == k ? e2->mp2-1 : e2->mp1-1;
+				} else
+					break;
+				
+				mp2 = mpoly + k;
+			} while (!etags[j].tag && (mloop+j) != ml && j != lastj);
+			
+			ml2 = mloop + j;
+			e = etags + ml->e;
+			e2 = etags + ml2->e;
+			if (e2->tag && e != e2 && (e->mp1-1==lp->mp1) != (e2->mp1-1 == k)) {
+				SWAP(int, e->ml1, e->ml2);
+				SWAP(int, e->mp1, e->mp2);
+				SWAP(int, lp->ml1, lp->ml2);
+				SWAP(int, lp->mp1, lp->mp2);
+				ok = 0;
 			}
 		}
+		
+		if (ok)
+			break;
 	}
-
+	
 	mp = mpoly;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list