[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