[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