[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37082] branches/bmesh/blender/source/ blender: =bmesh= edge split modifier uses bmesh code for now, slower but works.

Joseph Eagar joeedh at gmail.com
Wed Jun 1 21:47:22 CEST 2011


Revision: 37082
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37082
Author:   joeedh
Date:     2011-06-01 19:47:21 +0000 (Wed, 01 Jun 2011)
Log Message:
-----------
=bmesh= edge split modifier uses bmesh code for now, slower but works.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-06-01 19:30:19 UTC (rev 37081)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-06-01 19:47:21 UTC (rev 37082)
@@ -200,18 +200,18 @@
 	tm->looptris = (BMLoop *(*)[3])looptris;
 }
 
-void BMEdit_RecalcTesselation(BMEditMesh *tm)
+void BMEdit_RecalcTesselation(BMEditMesh *em)
 {
-	BMEdit_RecalcTesselation_intern(tm);
+	BMEdit_RecalcTesselation_intern(em);
 
-	if (tm->derivedFinal && tm->derivedFinal == tm->derivedCage) {
-		if (tm->derivedFinal->recalcTesselation) 
-			tm->derivedFinal->recalcTesselation(tm->derivedFinal);
-	} else if (tm->derivedFinal) {
-		if (tm->derivedCage->recalcTesselation) 
-			tm->derivedCage->recalcTesselation(tm->derivedCage);
-		if (tm->derivedFinal->recalcTesselation) 
-			tm->derivedFinal->recalcTesselation(tm->derivedFinal);
+	if (em->derivedFinal && em->derivedFinal == em->derivedCage) {
+		if (em->derivedFinal->recalcTesselation) 
+			em->derivedFinal->recalcTesselation(em->derivedFinal);
+	} else if (em->derivedFinal) {
+		if (em->derivedCage->recalcTesselation) 
+			em->derivedCage->recalcTesselation(em->derivedCage);
+		if (em->derivedFinal->recalcTesselation) 
+			em->derivedFinal->recalcTesselation(em->derivedFinal);
 	}
 }
 

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:30:19 UTC (rev 37081)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2011-06-01 19:47:21 UTC (rev 37082)
@@ -52,521 +52,65 @@
  * or edge angle (can be used to achieve autosmoothing)
 */
 
-/*new cddm-based edge split code*/
-typedef struct VertUser {
-	int ov, v, done;
-	ListBase users;
-} VertUser;
+#define EDGE_MARK	1
 
-typedef struct EdgeNode {
-	struct EdgeNode *next, *prev;
-	struct EdgeData *edge;
-} EdgeNode;
-
-typedef struct EdgeData {
-	EdgeNode v1node, v2node;
-	VertUser *v1user, *v2user;
-	float fno[3]; /*used to calculate face angles*/
-	int has_fno;
-	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;
-
-BM_INLINE EdgeData *edge_get_next(EdgeData *e, int ov) {
-	if (ov == e->v1)
-		return e->v1node.next ? e->v1node.next->edge : NULL;
-	else return e->v2node.next ? e->v2node.next->edge : NULL;
-}
-
-BM_INLINE EdgeNode *edge_get_node(EdgeData *e, int ov)
+DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *ob)
 {
-	if (ov == e->v1)
-		return &e->v1node;
-	else return &e->v2node;
-		return NULL;
-}
-
-BM_INLINE VertUser *edge_get_vuser(MemBase *UNUSED(b), EdgeData *edge, int ov)
-{
-	if (ov == edge->v1)
-		return edge->v1user;
-	else if (ov == edge->v2)
-		return edge->v2user;
-	else {
-		printf("yeek!!\n");
-		return NULL;
-	}
-}
-
-BM_INLINE void edge_set_vuser(MemBase *b, EdgeData *e, int ov, VertUser *vu)
-
-{
-	VertUser *olduser = edge_get_vuser(b, e, ov);
-
-	if (vu == olduser)
-		return;
-
-	if (olduser)
-		BLI_remlink(&olduser->users, ov==e->v1 ? &e->v1node : &e->v2node);
-	BLI_addtail(&vu->users, ov==e->v1 ? &e->v1node : &e->v2node);
-
-	if (ov == e->v1)
-		e->v1user = vu;
-	else e->v2user = vu;
-}
-
-BM_INLINE VertUser *new_vuser(MemBase *base)
-{
-	VertUser *vusr = BLI_mempool_calloc(base->vertuserpool);
-
-	return vusr;
-}
-
-BM_INLINE MemBase *new_membase(void)
-{
-	MemBase *b = MEM_callocN(sizeof(MemBase), "MemBase for edgesplit in modifier.c");
-	b->vertuserpool = BLI_mempool_create(sizeof(VertUser), 1, 2048, 1, 0);
-
-	return b;
-}
-
-BM_INLINE void free_membase(MemBase *b)
-{
-	BLI_mempool_destroy(b->vertuserpool);
-	MEM_freeN(b);
-}
-
-BM_INLINE EdgeData *edge_get_first(VertUser *vu)
-{
-	return vu->users.first ? ((EdgeNode*)vu->users.first)->edge : NULL;
-}
-
-DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
-{
-	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;
-	MVert *mvert;
-	BLI_array_declare(mvert);
-	EdgeData *etags, *e, *enext;
-	BLI_array_declare(etags);
-	VertUser *vu, *vu2;
-	MemBase *membase;
-	CustomData edata, vdata;
-	int *origv = NULL, *orige = NULL;
-	BLI_array_declare(origv);
-	BLI_array_declare(orige);
-	EdgeHash *eh, *pairh;
+	BMesh *bm;
+	BMEditMesh *em;
+	DerivedMesh *cddm, *bmdm;
+	BMIter iter, liter;
+	BMFace *f;
+	BMLoop *l;
+	BMEdge *e;
+	int allocsize[] = {512, 512, 2048, 512};
 	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->dupVertArray(cddm);
-	BLI_array_set_length(mvert, cddm->numVertData);
-	medge = cddm->dupEdgeArray(cddm);
-	BLI_array_set_length(medge, cddm->numEdgeData);
+	if (!CDDM_Check(dm)) {
+		cddm = CDDM_copy(dm, 0);
+	} else cddm = dm;
 	
-	mloop = CDDM_get_loops(cddm);
-	mpoly = CDDM_get_polys(cddm);
-
-	for (i=0; i<cddm->numEdgeData; i++) {
-		etags[i].v1 = medge[i].v1;
-		etags[i].v2 = medge[i].v2;
-
-		etags[i].tag = (medge[i].flag & ME_SHARP) != 0;
-
-		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);
-	}
+	em = CDDM_To_BMesh(ob, dm, NULL);
+	bm = em->bm;
 	
-	for (i=0; i<cddm->numVertData; i++) {
-		BLI_array_append(origv, i);
-	}
-
-	if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
-		mp = mpoly;
-		for (i=0; i<cddm->numPolyData; i++, mp++) {
-			mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, no);
-
-			ml = mloop + mp->loopstart;
-			for (j=0; j<mp->totloop; j++, ml++) {
-				if (!etags[ml->e].has_fno) {
-					VECCOPY(etags[ml->e].fno, no);
-					etags[ml->e].has_fno = 1;
-				} else if (!etags[ml->e].tag) {
-					edge_angle_cos = INPR(etags[ml->e].fno, no);
-					if (edge_angle_cos < threshold) {
-						etags[ml->e].tag = 1;
-					}
-				}
-			}
-		}
-	}
+	BMO_push(bm, NULL);
 	
-	mp = mpoly;
-	for (i=0; i<cddm->numPolyData; i++, mp++) {
-		ml = mloop + mp->loopstart;
-		for (j=0; j<mp->totloop; j++, ml++) {
-			/*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;
-
-			if (!edge_get_vuser(membase, etags+prevl->e, ml->v)) {
-				vu = new_vuser(membase);
-				vu->ov = vu->v = ml->v;
-				edge_set_vuser(membase, etags+prevl->e, ml->v, vu);
-			}
-
-			if (!edge_get_vuser(membase, etags+ml->e, ml->v)) {
-				vu = new_vuser(membase);
-				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;
-
-			j = lp->ml1;
-			k = lp->mp1;
-			ml = mloop + lp->ml1;
-			mp = mp2 = mpoly + lp->mp1;
-
-			/*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;
+	if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
+		BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+			BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, l) {
+				float edge_angle_cos;
 				
-				prevl = mloop + j;
-				e2 = etags + prevl->e;
+				if (l->radial_next == l)
+					continue;
 				
-				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;
-	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)
-				continue;
-			
-			prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop;
-
-			if (!etags[prevl->e].tag) {
-				vu = edge_get_vuser(membase, etags+prevl->e, ml->v);
-				if (!vu) {
-					vu = new_vuser(membase);
-					vu->ov = vu->v = ml->v;
-					edge_set_vuser(membase, etags+prevl->e, ml->v, vu);
+				edge_angle_cos = INPR(f->no, l->radial_next->f->no);
+				if (edge_angle_cos < threshold) {
+					BMO_SetFlag(bm, l->e, EDGE_MARK);
 				}
-
-				edge_set_vuser(membase, etags+ml->e, ml->v, vu);
-			} else {
-				vu = new_vuser(membase);
-				vu->ov = vu->v = ml->v;
-				edge_set_vuser(membase, etags+ml->e, ml->v, vu);
 			}
 		}
 	}
 	
-	mp = mpoly;
-	for (i=0; i<cddm->numPolyData; i++, mp++) {
-		ml = mloop + mp->loopstart;
-		for (j=0; j<mp->totloop; j++, ml++) {
-			prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop;
-			
-			/*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);
-				
-				if (!vu) {
-					edge_set_vuser(membase, etags+prevl->e, ml->v, vu2);
-				} else if (!vu2) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list