diff options
27 files changed, 256 insertions, 269 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 3a132aa326d..218375f3a6d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1997,11 +1997,6 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis /*add tesselation mface layers*/ CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, em->tottri); - /* set vert index */ - eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) - BM_SetIndex(eve, i); - index = dm->getVertDataArray(dm, CD_ORIGINDEX); eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); @@ -2010,7 +2005,7 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis copy_v3_v3(mv->co, eve->co); - BM_SetIndex(eve, i); + BM_SetIndex(eve, i); /* set_inline */ normal_float_to_short_v3(mv->no, eve->no); @@ -2023,13 +2018,14 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i); } + bm->elem_index_dirty &= ~BM_VERT; index = dm->getEdgeDataArray(dm, CD_ORIGINDEX); eed = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL); for (i=0; eed; eed=BMIter_Step(&iter), i++, index++) { MEdge *med = &medge[i]; - BM_SetIndex(eed, i); + BM_SetIndex(eed, i); /* set_inline */ med->v1 = BM_GetIndex(eed->v1); med->v2 = BM_GetIndex(eed->v2); @@ -2044,11 +2040,9 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i); if (add_orig) *index = i; } + bm->elem_index_dirty &= ~BM_EDGE; - efa = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL); - for (i=0; efa; i++, efa=BMIter_Step(&iter)) { - BM_SetIndex(efa, i); - } + BM_ElemIndex_Ensure(em->bm, BM_FACE); polyindex = dm->getTessFaceDataArray(dm, CD_POLYINDEX); index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX); diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index d0db7c82ce6..3d6a03aaf19 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -402,10 +402,7 @@ static void bmDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData, BMVert *eve; BMIter viter; - eve = BMIter_New(&viter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&viter), i++) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT); eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL); for(i=0; eed; i++,eed=BMIter_Step(&iter)) @@ -428,13 +425,8 @@ static void bmDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us int i; if (bmdm->vertexCos) { - BMVert *eve; - BMIter viter; - eve = BMIter_New(&viter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&viter), i++) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT); glBegin(GL_LINES); eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL); @@ -472,11 +464,8 @@ static void bmDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(vo int i; if (bmdm->vertexCos) { - BMVert *eve; - eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) - BM_SetIndex(eve, i); + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT); glBegin(GL_LINES); eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL); @@ -581,9 +570,7 @@ static void bmDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use int i; if (bmdm->vertexCos) { - eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) - BM_SetIndex(eve, i); + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT); } efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL); @@ -620,15 +607,8 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, float (*vertexCos)[3]= bmdm->vertexCos; float (*vertexNos)[3]= bmdm->vertexNos; float (*faceNos)[3]= bmdm->faceNos; - BMVert *eve; - eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) - BM_SetIndex(eve, i); - - efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL); - for (i=0; efa; efa=BMIter_Step(&iter), i++) - BM_SetIndex(efa, i); + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT | BM_FACE); for (i=0; i<bmdm->tc->tottri; i++) { BMLoop **l = bmdm->tc->looptris[i]; @@ -694,9 +674,7 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, } } } else { - efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL); - for (i=0; efa; efa=BMIter_Step(&iter), i++) - BM_SetIndex(efa, i); + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_FACE); for (i=0; i<bmdm->tc->tottri; i++) { BMLoop **l = bmdm->tc->looptris[i]; @@ -809,16 +787,12 @@ static void bmDM_drawFacesTex_common(DerivedMesh *dm, /* always use smooth shading even for flat faces, else vertex colors wont interpolate */ glShadeModel(GL_SMOOTH); - - i = 0; - BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) - BM_SetIndex(efa, i++); + + BM_ElemIndex_Ensure(bm, BM_FACE); if (vertexCos) { - i = 0; - BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(eve, i++); - + BM_ElemIndex_Ensure(bm, BM_VERT); + glBegin(GL_TRIANGLES); for (i=0; i<em->tottri; i++) { BMLoop **ls = em->looptris[i]; @@ -891,10 +865,8 @@ static void bmDM_drawFacesTex_common(DerivedMesh *dm, } glEnd(); } else { - i = 0; - BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(eve, i++); - + BM_ElemIndex_Ensure(bm, BM_VERT); + for (i=0; i<em->tottri; i++) { BMLoop **ls = em->looptris[i]; MTexPoly *tp= CustomData_bmesh_get(&bm->pdata, ls[0]->f->head.data, CD_MTEXPOLY); @@ -1022,9 +994,7 @@ static void bmDM_drawMappedFacesGLSL(DerivedMesh *dm, /* 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) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(bm, BM_VERT | BM_FACE); #define PASSATTRIB(loop, eve, vert) { \ if(attribs.totorco) { \ @@ -1047,9 +1017,6 @@ static void bmDM_drawMappedFacesGLSL(DerivedMesh *dm, } \ } - BM_ITER_INDEX(efa, &iter, bm, BM_FACES_OF_MESH, NULL, i) { - BM_SetIndex(efa, i); - } for (i=0, ltri=em->looptris[0]; i<em->tottri; i++, ltri += 3) { int drawSmooth; @@ -1150,9 +1117,7 @@ static void bmDM_drawMappedFacesMat(DerivedMesh *dm, /* 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) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(bm, BM_VERT); #define PASSATTRIB(loop, eve, vert) { \ if(attribs.totorco) { \ @@ -1405,12 +1370,9 @@ static void bmDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r) BMIter iter; BMVert *ev; int has_bweight = CustomData_has_layer(&bm->edata, CD_BWEIGHT); - int i, has_crease = CustomData_has_layer(&bm->edata, CD_CREASE); + int has_crease = CustomData_has_layer(&bm->edata, CD_CREASE); - /* store vertex indices in tmp union */ - ev = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (i=0; ev; ev=BMIter_Step(&iter), i++) - BM_SetIndex(ev, i); + BM_ElemIndex_Ensure(bm, BM_VERT); ee = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL); for( ; ee; ee=BMIter_Step(&iter), edge_r++) { @@ -1439,10 +1401,7 @@ static void bmDM_copyFaceArray(DerivedMesh *dm, MFace *face_r) BMLoop **l; int i; - /* store vertexes indices in tmp union */ - i = 0; - BM_ITER(ev, &iter, bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(ev, i++); + BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT); for (i=0; i<bmdm->tc->tottri; i++, face_r++) { l = bmdm->tc->looptris[i]; @@ -1467,21 +1426,10 @@ static void bmDM_copyLoopArray(DerivedMesh *dm, MLoop *loop_r) /* EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; */ /* UNUSED */ BMesh *bm = ((EditDerivedBMesh *)dm)->tc->bm; BMIter iter, liter; - BMVert *v; BMFace *f; BMLoop *l; - BMEdge *e; - int i; - i = 0; - BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, i++); - } - - i = 0; - BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { - BM_SetIndex(e, i++); - } + BM_ElemIndex_Ensure(bm, BM_VERT | BM_EDGE); BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) { @@ -1714,12 +1662,10 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em, Object *UNUSED(ob), BMIter iter; int totface = bmdm->tc->tottri; int i; - - eve=BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) - BM_SetIndex(eve, i); - bmdm->vertexNos = MEM_callocN(sizeof(*bmdm->vertexNos)*i, "bmdm_vno"); + BM_ElemIndex_Ensure(bm, BM_VERT); + + bmdm->vertexNos = MEM_callocN(sizeof(*bmdm->vertexNos) * bm->totvert, "bmdm_vno"); bmdm->faceNos = MEM_mallocN(sizeof(*bmdm->faceNos)*totface, "bmdm_vno"); for (i=0; i<bmdm->tc->tottri; i++) { diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 7936df87c61..6e0c3cef4d6 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -154,6 +154,31 @@ BM_INLINE void BM_ClearHFlag(void *element, const char hflag); /*stuff for dealing BM_ToggleHFlag header flags*/ BM_INLINE void BM_ToggleHFlag(void *element, const char hflag); BM_INLINE void BM_MergeHFlag(void *element_a, void *element_b); + +/* notes on BM_SetIndex(...) usage, + * Set index is sometimes abused as temp storage, other times we cant be + * sure if the index values are valid because certain operations have modified + * the mesh structure. + * + * To set the elements to valid indicies 'BM_ElemIndex_Ensure' should be used + * rather then adding inline loops, however there are cases where we still + * set the index directly + * + * In an attempt to manage this, here are 3 tags Im adding to uses of + * 'BM_SetIndex' + * + * - 'set_inline' -- since the data is already being looped over set to a + * valid value inline. + * + * - 'set_dirty!' -- intentionally sets the index to an invalid value, + * flagging 'bm->elem_index_dirty' so we dont use it. + * + * - 'set_ok' -- this is valid use since the part of the code is low level. + * + * - 'set_loop' -- currently loop index values are not used used much so + * assume each case they are dirty. + * - campbell */ + BM_INLINE void BM_SetIndex(void *element, const int index); BM_INLINE int BM_GetIndex(const void *element); diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index 2ad25ba216a..faece6069b2 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -123,6 +123,12 @@ typedef struct BMFlagLayer { typedef struct BMesh { int totvert, totedge, totloop, totface; int totvertsel, totedgesel, totfacesel; + + /* flag index arrays as being dirty so we can check if they are clean and + * avoid looping over the entire vert/edge/face array in those cases. + * valid flags are - BM_VERT | BM_EDGE | BM_FACE. + * BM_LOOP isnt handled so far. */ + char elem_index_dirty; /*element pools*/ struct BLI_mempool *vpool, *epool, *lpool, *fpool; diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 98e60c29e2b..839e616deb8 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -525,9 +525,12 @@ BMesh *BM_Copy_Mesh(BMesh *bmold) v2 = BM_Make_Vert(bm, v->co, NULL); /* copy between meshes so cant use 'example' argument */ BM_Copy_Attributes(bmold, bm, v, v2); vtable[i] = v2; - BM_SetIndex(v, i); - BM_SetIndex(v2, i); + BM_SetIndex(v, i); /* set_inline */ + BM_SetIndex(v2, i); /* set_inline */ } + bmold->elem_index_dirty &= ~BM_VERT; + bm->elem_index_dirty &= ~BM_VERT; + /* safety check */ BLI_assert(i == bmold->totvert); @@ -538,14 +541,19 @@ BMesh *BM_Copy_Mesh(BMesh *bmold) BM_Copy_Attributes(bmold, bm, e, e2); etable[i] = e2; - BM_SetIndex(e, i); - BM_SetIndex(e2, i); + BM_SetIndex(e, i); /* set_inline */ + BM_SetIndex(e2, i); /* set_inline */ } + bmold->elem_index_dirty &= ~BM_EDGE; + bm->elem_index_dirty &= ~BM_EDGE; + /* safety check */ BLI_assert(i == bmold->totedge); f = BMIter_New(&iter, bmold, BM_FACES_OF_MESH, NULL); for (i=0; f; f=BMIter_Step(&iter), i++) { + BM_SetIndex(f, i); /* set_inline */ + BLI_array_empty(loops); BLI_array_empty(edges); l = BMIter_New(&liter, bmold, BM_LOOPS_OF_FACE, f); @@ -568,7 +576,6 @@ BMesh *BM_Copy_Mesh(BMesh *bmold) if (!f2) continue; - BM_SetIndex(f, i); ftable[i] = f2; BM_Copy_Attributes(bmold, bm, f, f2); @@ -581,6 +588,9 @@ BMesh *BM_Copy_Mesh(BMesh *bmold) if (f == bmold->act_face) bm->act_face = f2; } + bmold->elem_index_dirty &= ~BM_FACE; + bm->elem_index_dirty &= ~BM_FACE; + /* safety check */ BLI_assert(i == bmold->totface); diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index 8821faf9106..d77f274ebf9 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -270,15 +270,16 @@ void BM_Compute_Normals(BMesh *bm) index = 0; edgevec = MEM_callocN(sizeof(float) * 3 * bm->totedge, "BM normal computation array"); BM_ITER(e, &edges, bm, BM_EDGES_OF_MESH, NULL) { + BM_SetIndex(e, index); /* set_inline */ if (!e->l) { /* the edge vector will not be needed when the edge has no radial */ continue; } - BM_SetIndex(e, index); sub_v3_v3v3(edgevec[index], e->v2->co, e->v1->co); normalize_v3(edgevec[index]); index++; } + bm->elem_index_dirty &= ~BM_EDGE; /*add weighted face normals to vertices*/ BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) { @@ -486,31 +487,88 @@ void BM_ElemIndex_Ensure(BMesh *bm, const char hflag) { BMIter iter; BMHeader *ele; - int index; - /* TODO, mark arrays as dirty, only calculate if needed! */ + /* TODO, mark arrays as dirty, only calculate if needed!, + * uncomment bm->elem_index_dirty checks */ - if (hflag & BM_VERT) { - index= 0; + if ((hflag & BM_VERT) /* && (bm->elem_index_dirty & BM_VERT) */) { + int index= 0; BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(ele, index); + BM_SetIndex(ele, index); /* set_ok */ index++; } + bm->elem_index_dirty &= ~BM_VERT; } - if (hflag & BM_EDGE) { - index= 0; + if ((hflag & BM_EDGE) /* && (bm->elem_index_dirty & BM_EDGE) */) { + int index= 0; BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) { - BM_SetIndex(ele, index); + BM_SetIndex(ele, index); /* set_ok */ index++; } + bm->elem_index_dirty &= ~BM_EDGE; } - if (hflag & BM_FACE) { - index= 0; + if ((hflag & BM_FACE) /* && (bm->elem_index_dirty & BM_FACES) */) { + int index= 0; BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) { - BM_SetIndex(ele, index); + BM_SetIndex(ele, index); /* set_ok */ index++; } + bm->elem_index_dirty &= ~BM_FACE; } } + + +/* array checking/setting macros */ +/* currently vert/edge/loop/face index data is being abused, but we should + * eventually be able to rely on it being valid. To this end are macro's + * that validate them (so blender doesnt crash), but also print errors so we can + * fix the offending parts of the code, this way after some months we can + * confine this code for debug mode. + * + * + */ + +void BM_ElemIndex_Validate(BMesh *bm, const char *location, const char *func, const char *msg_a, const char *msg_b) +{ + BMIter iter; + BMHeader *ele; + int types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH}; + const char *type_names[3]= {"vert", "edge", "face"}; + int i; + int is_any_error= 0; + + for (i=0; i<3; i++) { + int index= 0; + int is_error= 0; + int err_val= 0; + int err_idx= 0; + + BM_ITER(ele, &iter, bm, types[i], NULL) { + if (BM_GetIndex(ele) != index) { + err_val= BM_GetIndex(ele); + err_idx= index; + is_error= 1; + } + + BM_SetIndex(ele, index); /* set_ok */ + index++; + } + + if (is_error) { + is_any_error= 1; + fprintf(stderr, + "Invalid Index: at %s, %s, %s[%d] invalid index %d, '%s', '%s'\n", + location, func, type_names[i], err_idx, err_val, msg_a, msg_b); + } + } + +#ifdef DEBUG + if (is_any_error == 0) { + fprintf(stderr, + "Valid Index Success: at %s, %s, '%s', '%s'\n", + location, func, msg_a, msg_b); + } +#endif +} diff --git a/source/blender/bmesh/intern/bmesh_newcore.c b/source/blender/bmesh/intern/bmesh_newcore.c index f15b5a4a2fa..63db5807d0f 100644 --- a/source/blender/bmesh/intern/bmesh_newcore.c +++ b/source/blender/bmesh/intern/bmesh_newcore.c @@ -23,7 +23,7 @@ BMVert *BM_Make_Vert(BMesh *bm, float co[3], const struct BMVert *example) { BMVert *v = BLI_mempool_calloc(bm->vpool); - BM_SetIndex(v, bm->totvert); + BM_SetIndex(v, bm->totvert); /* set_ok */ bm->totvert += 1; @@ -79,7 +79,7 @@ BMEdge *BM_Make_Edge(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *example, i e = BLI_mempool_calloc(bm->epool); - BM_SetIndex(e, bm->totedge); + BM_SetIndex(e, bm->totedge); /* set_ok */ bm->totedge += 1; @@ -228,7 +228,7 @@ BMFace *BM_Make_Face(BMesh *bm, BMVert **verts, BMEdge **edges, int len, int nod f = BLI_mempool_calloc(bm->fpool); - BM_SetIndex(f, bm->totface); + BM_SetIndex(f, bm->totface); /* set_ok */ bm->totface += 1; @@ -1587,7 +1587,7 @@ static int bmesh_cutvert(BMesh *bm, BMVert *v, BMVert ***vout, int *len) the edges & faces and assign an index to each connected set */ while ((e = BLI_array_pop(stack))) { BLI_ghash_insert(visithash, e, SET_INT_IN_POINTER(maxindex)); - BM_SetIndex(e, maxindex); + BM_SetIndex(e, maxindex); /* set_dirty! */ /* BMESH_TODO, check the indexs are is invalid after this function runs */ BM_ITER(l, &liter, bm, BM_LOOPS_OF_EDGE, e) { nl = (l->v == v) ? l->prev : l->next; @@ -1599,6 +1599,7 @@ static int bmesh_cutvert(BMesh *bm, BMVert *v, BMVert ***vout, int *len) maxindex++; } + em->bm->elem_index_dirty |= BM_EDGE; /* Make enough verts to split v for each group */ verts = MEM_callocN(sizeof(BMVert *) * maxindex, "bmesh_cutvert"); diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 30336777e7d..d77b59bc7db 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -753,11 +753,13 @@ void BM_Triangulate_Face(BMesh *bm, BMFace *f, float (*projectverts)[3], l = bm_firstfaceloop(f); do{ copy_v3_v3(projectverts[i], l->v->co); - BM_SetIndex(l->v, i); + BM_SetIndex(l->v, i); /* set dirty! */ i++; l = l->next; }while(l != bm_firstfaceloop(f)); - + + bm->elem_index_dirty |= BM_VERT; /* see above */ + ///bmesh_update_face_normal(bm, f, projectverts); compute_poly_normal(f->no, projectverts, f->len); @@ -854,7 +856,7 @@ void BM_LegalSplits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len) i = 0; l = BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, f); for (; l; l=BMIter_Step(&iter)) { - BM_SetIndex(l, i); + BM_SetIndex(l, i); /* set_loop */ copy_v3_v3(projverts[i], l->v->co); i++; } diff --git a/source/blender/bmesh/operators/createops.c b/source/blender/bmesh/operators/createops.c index 97cb6297813..c2ce5c64343 100644 --- a/source/blender/bmesh/operators/createops.c +++ b/source/blender/bmesh/operators/createops.c @@ -544,7 +544,7 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata) continue; //cv = BM_Make_Vert(bm, cent, v); - //BM_SetIndex(cv, -1); + //BM_SetIndex(cv, -1); /* set_dirty! */ i = 0; e = vdata[BM_GetIndex(v)].e; lastv = NULL; @@ -565,7 +565,7 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata) add_v3_v3(co, vdata[BM_GetIndex(v)].offco); v2 = BM_Make_Vert(bm, co, NULL); - BM_SetIndex(v2, -1); + BM_SetIndex(v2, -1); /* set_dirty! */ //BM_Make_Edge(bm, cv, v2, NULL, 0); BM_Select(bm, v2, 1); @@ -850,11 +850,7 @@ void bmesh_edgenet_fill_exec(BMesh *bm, BMOperator *op) BMO_Flag_Buffer(bm, op, "edges", EDGE_MARK, BM_EDGE); BMO_Flag_Buffer(bm, op, "excludefaces", FACE_IGNORE, BM_FACE); - i = 0; - BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, i); - i++; - } + BM_ElemIndex_Ensure(bm, BM_VERT); BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { BMO_SetFlag(bm, f, ELE_ORIG); @@ -862,14 +858,15 @@ void bmesh_edgenet_fill_exec(BMesh *bm, BMOperator *op) i = 0; BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { - BM_SetIndex(e, i); + BM_SetIndex(e, i); /* set_inline */ if (!BMO_TestFlag(bm, e, EDGE_MARK)) { edata[i].tag = 2; } - i += 1; + i++; } + bm->elem_index_dirty &= ~BM_EDGE; init_rotsys(bm, edata, vdata); diff --git a/source/blender/bmesh/operators/edgesplitop.c b/source/blender/bmesh/operators/edgesplitop.c index 95c27298445..3767e267eeb 100644 --- a/source/blender/bmesh/operators/edgesplitop.c +++ b/source/blender/bmesh/operators/edgesplitop.c @@ -102,7 +102,7 @@ static BMFace *remake_face(BMesh *bm, EdgeTag *etags, BMFace *f, BMVert **verts, if (l->e != l2->e) { /*set up data for figuring out the two sides of the splits*/ - BM_SetIndex(l2->e, BM_GetIndex(l->e)); + BM_SetIndex(l2->e, BM_GetIndex(l->e)); /* set_dirty! */ /* BMESH_TODO, double check this is being set dirty - campbell */ et = etags + BM_GetIndex(l->e); if (!et->newe1) { @@ -128,6 +128,7 @@ static BMFace *remake_face(BMesh *bm, EdgeTag *etags, BMFace *f, BMVert **verts, BMO_SetFlag(bm, l->e, EDGE_MARK); BMO_SetFlag(bm, l2->e, EDGE_MARK); } + bm->elem_index_dirty |= BM_EDGE; /* double check this, see above */ return f2; } @@ -247,12 +248,8 @@ void bmesh_edgesplitop_exec(BMesh *bm, BMOperator *op) } etags = MEM_callocN(sizeof(EdgeTag)*bm->totedge, "EdgeTag"); - - i = 0; - BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { - BM_SetIndex(e, i); - i++; - } + + BM_ElemIndex_Ensure(bm, BM_EDGE); #ifdef ETV # undef ETV diff --git a/source/blender/bmesh/operators/extrudeops.c b/source/blender/bmesh/operators/extrudeops.c index c31c34a8b3e..e1fac927093 100644 --- a/source/blender/bmesh/operators/extrudeops.c +++ b/source/blender/bmesh/operators/extrudeops.c @@ -355,11 +355,7 @@ static void calc_solidify_normals(BMesh *bm) BM_SetHFlag(v, BM_TMP_TAG); } - /* todo - replace with func! */ - i= 0; - BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) { - BM_SetIndex(e, i++); - } + BM_ElemIndex_Ensure(bm, BM_EDGE); BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) { if (!BMO_TestFlag(bm, f, FACE_MARK)) { @@ -509,11 +505,7 @@ static void solidify_add_thickness(BMesh *bm, float dist) float *angles = NULL; BLI_array_staticdeclare(angles, 16); - /* BMESH_TODO, remove this when we are sure the array will be valid */ - i = 0; - BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, i++); - } + BM_ElemIndex_Ensure(bm, BM_VERT); BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { if(!BMO_TestFlag(bm, f, FACE_MARK)) { diff --git a/source/blender/bmesh/operators/mesh_conv.c b/source/blender/bmesh/operators/mesh_conv.c index bc5106dcaba..54fd083d389 100644 --- a/source/blender/bmesh/operators/mesh_conv.c +++ b/source/blender/bmesh/operators/mesh_conv.c @@ -131,7 +131,6 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) normal_short_to_float_v3(v->no, mvert->no); vt[i] = v; - BM_SetIndex(v, i); /*transfer flags*/ v->head.hflag = MEFlags_To_BMFlags(mvert->flag, BM_VERT); @@ -242,7 +241,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) j = 0; BM_ITER_INDEX(l, &iter, bm, BM_LOOPS_OF_FACE, f, j) { /* Save index of correspsonding MLoop */ - BM_SetIndex(l, mpoly->loopstart+j); + BM_SetIndex(l, mpoly->loopstart+j); /* set_loop */ } /*Copy Custom Data*/ @@ -261,7 +260,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) { int li = BM_GetIndex(l); CustomData_to_bmesh_block(&me->ldata, &bm->ldata, li, &l->head.data); - BM_SetIndex(l, 0); + BM_SetIndex(l, 0); /* set_loop */ } } } @@ -503,7 +502,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) mvert->flag = BMFlags_To_MEFlags(v); - BM_SetIndex(v, i); + BM_SetIndex(v, i); /* set_inline */ /*copy over customdata*/ CustomData_from_bmesh_block(&bm->vdata, &me->vdata, v->head.data, i); @@ -513,6 +512,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) BM_CHECK_ELEMENT(bm, v); } + bm->elem_index_dirty &= ~BM_VERT; i = 0; BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { @@ -526,7 +526,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) medge->flag = BMFlags_To_MEFlags(e); - BM_SetIndex(e, i); + BM_SetIndex(e, i); /* set_inline */ /*copy over customdata*/ CustomData_from_bmesh_block(&bm->edata, &me->edata, e->head.data, i); @@ -535,6 +535,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) medge++; BM_CHECK_ELEMENT(bm, e); } + bm->elem_index_dirty &= ~BM_EDGE; /*new scanfill tesselation code*/ if (dotess) { @@ -549,7 +550,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) eve = BLI_addfillvert(l->v->co); eve->tmp.p = l; - BM_SetIndex(l, i); + BM_SetIndex(l, i); /* set_loop */ if (lasteve) { BLI_addfilledge(lasteve, eve); diff --git a/source/blender/bmesh/operators/mirror.c b/source/blender/bmesh/operators/mirror.c index af0ab354ea2..c1866e0cdbc 100644 --- a/source/blender/bmesh/operators/mirror.c +++ b/source/blender/bmesh/operators/mirror.c @@ -73,11 +73,12 @@ void bmesh_mirror_exec(BMesh *bm, BMOperator *op) BLI_array_growone(vmap); vmap[i] = v; - BM_SetIndex(v2, i); + BM_SetIndex(v2, i); /* set_dirty! */ /*BMESH_TODO, double check this is being made dirty, 99% sure it is - campbell */ v2 = BMIter_Step(&iter); - i += 1; + i++; } + bm->elem_index_dirty |= BM_VERT; /*feed old data to transform bmop*/ scale[axis] = -1.0f; diff --git a/source/blender/bmesh/operators/removedoubles.c b/source/blender/bmesh/operators/removedoubles.c index 6b6dbc5e821..25b223e023b 100644 --- a/source/blender/bmesh/operators/removedoubles.c +++ b/source/blender/bmesh/operators/removedoubles.c @@ -125,14 +125,15 @@ void bmesh_weldverts_exec(BMesh *bm, BMOperator *op) /* BMESH_TODO, stop abusing face index here */ BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { - BM_SetIndex(f, 0); + BM_SetIndex(f, 0); /* set_dirty! */ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) { if (BMO_TestFlag(bm, l->v, ELE_DEL)) BMO_SetFlag(bm, f, FACE_MARK|ELE_DEL); if (BMO_TestFlag(bm, l->e, EDGE_COL)) - BM_SetIndex(f, BM_GetIndex(f)+1); + BM_SetIndex(f, BM_GetIndex(f)+1); /* set_dirty! */ } } + bm->elem_index_dirty |= BM_FACE; BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { if (!BMO_TestFlag(bm, f, FACE_MARK)) diff --git a/source/blender/bmesh/operators/utils.c b/source/blender/bmesh/operators/utils.c index c92df89b76a..9cc3571adf3 100644 --- a/source/blender/bmesh/operators/utils.c +++ b/source/blender/bmesh/operators/utils.c @@ -1232,9 +1232,10 @@ void bmesh_vertexshortestpath_exec(BMesh *bm, BMOperator *op) vert_list[i].v = v; vert_list[i].parent = NULL; vert_list[i].weight = FLT_MAX; - BM_SetIndex(v, i); + BM_SetIndex(v, i); /* set_inline */ i++; } + bm->elem_index_dirty &= ~BM_VERT; /* ** we now have everything we need, start Dijkstra path finding algorithm diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c index 8b42d90617a..cab263bfcbd 100644 --- a/source/blender/editors/mesh/bmesh_select.c +++ b/source/blender/editors/mesh/bmesh_select.c @@ -1217,21 +1217,19 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B BLI_smallhash_init(&visithash); - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - /* we need the vert */ - BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, totvert); - totvert++; - } + /* note, would pass BM_EDGE except we are looping over all edges anyway */ + BM_ElemIndex_Ensure(em->bm, BM_VERT /* | BM_EDGE */ ); BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) { e->head.flags[0].f = 0; if (BM_TestHFlag(e, BM_HIDDEN)) { BLI_smallhash_insert(&visithash, (uintptr_t)e, NULL); } - BM_SetIndex(e, totedge); + + BM_SetIndex(e, totedge); /* set_inline */ totedge++; } + em->bm->elem_index_dirty &= ~BM_EDGE; /* alloc */ nedges = MEM_callocN(sizeof(*nedges)*totvert+1, "SeamPathNEdges"); diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c index 6f77cfb06bb..074e8638658 100644 --- a/source/blender/editors/mesh/bmeshutils.c +++ b/source/blender/editors/mesh/bmeshutils.c @@ -630,14 +630,9 @@ UvVertMap *EDBM_make_uv_vert_map(BMEditMesh *em, int selected, int do_face_idx_a if (do_face_idx_array) EDBM_init_index_arrays(em, 0, 0, 1); - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - /* we need the vert */ - totverts=0; - BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(ev, totverts); - totverts++; - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); + totverts= em->bm->totvert; totuv = 0; /* generate UvMapVert array */ @@ -827,15 +822,7 @@ void EDBM_CacheMirrorVerts(BMEditMesh *em, const short use_select) em->bm->vdata.layers[li].flag |= CD_FLAG_TEMPORARY; - /* BMESH_TODO, we should STOP overwriting the vertex index data with bad - * indicies, once createTransEditVerts() stops doing this, this loop can be - * removed - campbell */ - i= 0; - BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, i++); - } - /* END BMESH_TODO */ - + BM_ElemIndex_Ensure(em->bm, BM_VERT); BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { BMVert *mirr; diff --git a/source/blender/editors/mesh/editbmesh_bvh.c b/source/blender/editors/mesh/editbmesh_bvh.c index eb8b525aea0..7649550ba62 100644 --- a/source/blender/editors/mesh/editbmesh_bvh.c +++ b/source/blender/editors/mesh/editbmesh_bvh.c @@ -157,9 +157,11 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit) tree->cos = MEM_callocN(sizeof(float)*3*em->bm->totvert, "bmbvh cos"); BM_ITER_INDEX(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL, i) { - BM_SetIndex(v, i); + BM_SetIndex(v, i); /* set_inline */ copy_v3_v3(tree->cos[i], v->co); } + em->bm->elem_index_dirty &= ~BM_VERT; + cage = editbmesh_get_derived_cage_and_final(scene, obedit, em, &final, CD_MASK_DERIVEDMESH); cagecos = MEM_callocN(sizeof(float)*3*em->bm->totvert, "bmbvh cagecos"); diff --git a/source/blender/editors/mesh/knifetool.c b/source/blender/editors/mesh/knifetool.c index 511c41ff9ee..79dac3ae396 100755 --- a/source/blender/editors/mesh/knifetool.c +++ b/source/blender/editors/mesh/knifetool.c @@ -1366,10 +1366,13 @@ static void remerge_faces(knifetool_opdata *kcd) f2 = BM_Join_Faces(bm, faces, BLI_array_count(faces)); if (f2) { BMO_SetFlag(bm, f2, FACE_NEW); - BM_SetIndex(f2, idx); + BM_SetIndex(f2, idx); /* set_dirty! */ /* BMESH_TODO, check if this is valid or not */ } } } + /* BMESH_TODO, check if the code above validates the indicies */ + /* bm->elem_index_dirty &= ~BM_FACE; */ + bm->elem_index_dirty |= BM_FACE; BLI_array_free(stack); BLI_array_free(faces); @@ -1399,10 +1402,11 @@ static void knifenet_fill_faces(knifetool_opdata *kcd) /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ i = 0; BM_ITER(f, &bmiter, bm, BM_FACES_OF_MESH, NULL) { - BM_SetIndex(f, i); + BM_SetIndex(f, i); /* set_inline */ faces[i] = f; i++; } + bm->elem_index_dirty &= ~BM_FACE; BM_ITER(e, &bmiter, bm, BM_EDGES_OF_MESH, NULL) { BMO_SetFlag(bm, e, BOUNDARY); @@ -1568,10 +1572,10 @@ static void knifenet_fill_faces(knifetool_opdata *kcd) } while (l != bm_firstfaceloop(f2)); BMO_ClearFlag(bm, f2, DEL); - BM_SetIndex(f2, i); - + BM_SetIndex(f2, i); /* set_dirty! */ /* note, not 100% sure this is dirty? need to check */ + BM_Face_UpdateNormal(bm, f2); - if (dot_v3v3(f->no, f2->no) < 0.0) { + if (dot_v3v3(f->no, f2->no) < 0.0f) { BM_flip_normal(bm, f2); } } @@ -1579,13 +1583,14 @@ static void knifenet_fill_faces(knifetool_opdata *kcd) BLI_end_edgefill(); BLI_smallhash_release(hash); } + bm->elem_index_dirty |= BM_FACE; /* interpolate customdata */ BM_ITER(f, &bmiter, bm, BM_FACES_OF_MESH, NULL) { BMLoop *l1; BMFace *f2; BMIter liter1; - + if (!BMO_TestFlag(bm, f, FACE_NEW)) continue; @@ -1600,7 +1605,7 @@ static void knifenet_fill_faces(knifetool_opdata *kcd) BM_loop_interp_from_face(bm, l1, f2, 1, 1); } } - + /*merge triangles back into faces*/ remerge_faces(kcd); @@ -1718,9 +1723,6 @@ static int knifetool_init(bContext *C, wmOperator *op, int UNUSED(do_cut)) Object *obedit = CTX_data_edit_object(C); DerivedMesh *cage, *final; SmallHash shash; - BMIter iter; - BMVert *v; - int i; void *data[3]; /* alloc new customdata */ @@ -1734,10 +1736,8 @@ static int knifetool_init(bContext *C, wmOperator *op, int UNUSED(do_cut)) em_setup_viewcontext(C, &kcd->vc); kcd->em= ((Mesh *)kcd->ob->data)->edit_btmesh; - - BM_ITER_INDEX(v, &iter, kcd->em->bm, BM_VERTS_OF_MESH, NULL, i) { - BM_SetIndex(v, i); - } + + BM_ElemIndex_Ensure(kcd->em->bm, BM_VERT); cage = editbmesh_get_derived_cage_and_final(scene, obedit, kcd->em, &final, CD_MASK_DERIVEDMESH); kcd->cagecos = MEM_callocN(sizeof(float)*3*kcd->em->bm->totvert, "knife cagecos"); diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index da730605648..c74a994b9b6 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -964,13 +964,9 @@ long mesh_mirrtopo_table(Object *ob, char mode) } if(em) { - BMVert *eve; + BM_ElemIndex_Ensure(em->bm, BM_VERT); - totvert= 0; - BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(eve, totvert); - totvert++; - } + totvert= em->bm->totvert; } else { totvert = me->totvert; diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 8e18e8693fe..d00c4b7907f 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -1389,12 +1389,9 @@ static void vgroup_blend(Object *ob) def_nr= ob->actdef-1; - i= 0; - BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(eve, i); - i++; - } - dvert_tot= i; + BM_ElemIndex_Ensure(em->bm, BM_VERT); + + dvert_tot= em->bm->totvert; vg_weights= MEM_callocN(sizeof(float)*dvert_tot, "vgroup_blend_f"); vg_users= MEM_callocN(sizeof(int)*dvert_tot, "vgroup_blend_i"); diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index ce0ca005790..efa7837087a 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -234,26 +234,31 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) void *userdata[2] = {em, NULL}; /*int proptrans= 0; */ /*UNUSED*/ + /* abuses vertex index all over, set, just set dirty here, + * perhaps this could use its own array instead? - campbell */ + // transform now requires awareness for select mode, so we tag the f1 flags in verts tottrans= 0; if(em->selectmode & SCE_SELECT_VERTEX) { BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) { if(!BM_TestHFlag(eve, BM_HIDDEN) && BM_TestHFlag(eve, BM_SELECT)) { - BM_SetIndex(eve, 1); + BM_SetIndex(eve, 1); /* set_dirty! */ tottrans++; } - else BM_SetIndex(eve, 0); + else BM_SetIndex(eve, 0); /* set_dirty! */ } } else if(em->selectmode & SCE_SELECT_EDGE) { BMEdge *eed; BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(eve, 0); + BM_SetIndex(eve, 0); /* set_dirty! */ BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) { - if(!BM_TestHFlag(eed, BM_HIDDEN) && BM_TestHFlag(eed, BM_SELECT)) - BM_SetIndex(eed->v1, 1), BM_SetIndex(eed->v2, 1); + if(!BM_TestHFlag(eed, BM_HIDDEN) && BM_TestHFlag(eed, BM_SELECT)) { + BM_SetIndex(eed->v1, 1); /* set_dirty! */ + BM_SetIndex(eed->v2, 1); /* set_dirty! */ + } } BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) @@ -263,7 +268,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) BMFace *efa; BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(eve, 0); + BM_SetIndex(eve, 0); /* set_dirty! */ BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) { if(!BM_TestHFlag(efa, BM_HIDDEN) && BM_TestHFlag(efa, BM_SELECT)) { @@ -271,7 +276,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) BMLoop *l; BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) { - BM_SetIndex(l->v, 1); + BM_SetIndex(l->v, 1); /* set_dirty! */ } } } @@ -279,6 +284,8 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) if(BM_GetIndex(eve)) tottrans++; } + /* for any of the 3 loops above which all dirty the indicies */ + bm->elem_index_dirty |= BM_VERT; /* and now make transverts */ if(tottrans) { @@ -287,7 +294,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) a = 0; BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) { if(BM_GetIndex(eve)) { - BM_SetIndex(eve, a); + BM_SetIndex(eve, a); /* set_dirty! */ copy_v3_v3(tv->oldloc, eve->co); tv->loc= eve->co; if(eve->no[0] != 0.0f || eve->no[1] != 0.0f ||eve->no[2] != 0.0f) @@ -295,9 +302,10 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) tv->flag= BM_GetIndex(eve) & SELECT; tv++; a++; - } else BM_SetIndex(eve, -1); + } else BM_SetIndex(eve, -1); /* set_dirty! */ } - + /* set dirty already, above */ + userdata[1] = transvmain; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index cdf6fe58893..3362d9d38d2 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1840,13 +1840,10 @@ static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], f BMIter viter; int i, start; - i = 0; - BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, i); - dists[i] = FLT_MAX; - i++; - } - + fill_vn(dists, em->bm->totvert, FLT_MAX); + + BM_ElemIndex_Ensure(em->bm, BM_VERT); + BLI_smallhash_init(visit); BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) { diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c index 8c5d7d6990b..26db6ff32ac 100644 --- a/source/blender/editors/util/crazyspace.c +++ b/source/blender/editors/util/crazyspace.c @@ -146,13 +146,8 @@ void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mapped int *vert_table = MEM_callocN(sizeof(int)*em->bm->totvert, "vert_table"); int index = 0; - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(v, index); - index++; - } - - index = 0; + BM_ElemIndex_Ensure(em->bm, BM_VERT); + BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if (!BM_TestHFlag(v, BM_SELECT) || BM_TestHFlag(v, BM_HIDDEN)) continue; @@ -179,17 +174,16 @@ void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mapped } } - /* BMESH_TODO, don't overwrite invalid index info! */ - index = 0; BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if (vert_table[index] != 0) - BM_SetIndex(v, vert_table[index]-1); + BM_SetIndex(v, vert_table[index]-1); /* set_dirty! */ else - BM_SetIndex(v, -1); + BM_SetIndex(v, -1); /* set_dirty! */ index++; } + em->bm->elem_index_dirty |= BM_VERT; MEM_freeN(vert_table); #if 0 diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 5f58c710c53..5b2f545179e 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -665,11 +665,7 @@ static void find_nearest_uv_edge(Scene *scene, Image *ima, BMEditMesh *em, float mindist= 1e10f; memset(hit, 0, sizeof(*hit)); - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); @@ -811,10 +807,7 @@ static void find_nearest_uv_vert(Scene *scene, Image *ima, BMEditMesh *em, mindist= 1e10f; memset(hit, 0, sizeof(*hit)); - eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter), i++) { - BM_SetIndex(eve, i); - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); @@ -981,7 +974,6 @@ static int uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit, float limit[2], int extend) { - BMVert *eve; BMFace *efa; BMIter iter, liter; BMLoop *l; @@ -994,12 +986,7 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit EDBM_init_index_arrays(em, 0, 0, 1); vmap= EDBM_make_uv_vert_map(em, 0, 0, limit); - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - count = 0; - BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(eve, count); - count++; - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); count = 0; BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { @@ -1009,11 +996,11 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit BMO_ClearFlag(em->bm, efa, EFA_F1_FLAG); - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - BM_SetIndex(efa, count); + BM_SetIndex(efa, count); /* set_inline */ count++; } + em->bm->elem_index_dirty &= ~BM_FACE; /* set flags for first face and verts */ nverts= hit->efa->len; @@ -1652,17 +1639,10 @@ static int stitch_exec(bContext *C, wmOperator *op) } else { UVVertAverage *uv_average, *uvav; - int count; - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - // index and count verts - count=0; - BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(eve, count); - count++; - } - - uv_average= MEM_callocN(sizeof(UVVertAverage)*count, "Stitch"); + BM_ElemIndex_Ensure(em->bm, BM_VERT); + + uv_average= MEM_callocN(sizeof(UVVertAverage)*em->bm->totvert, "Stitch"); // gather uv averages per vert BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { @@ -2052,14 +2032,8 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) /* (de)select sticky uv nodes */ if(sticky != SI_STICKY_DISABLE) { - BMVert *ev; - /* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */ - a = 0; - BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(ev, a); - a++; - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); /* deselect */ if(select==0) { @@ -2885,7 +2859,8 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe /* set all verts to -1 : an unused index*/ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) - BM_SetIndex(eve, -1); + BM_SetIndex(eve, -1); /* set_dirty! */ + em->bm->elem_index_dirty |= BM_VERT; /* index every vert that has a selected UV using it, but only once so as to * get unique indices and to count how much to malloc */ @@ -2901,11 +2876,12 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe change = 1; BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { if (uvedit_uv_selected(em, scene, l) && BM_GetIndex(l->v) == -1) { - BM_SetIndex(l->v, count); + BM_SetIndex(l->v, count); /* set_dirty! */ count++; } } } + em->bm->elem_index_dirty |= BM_VERT; /* set above but include for completeness since they are made dirty again */ coords = MEM_callocN(sizeof(float)*count*2, "snap to adjacent coords"); usercount = MEM_callocN(sizeof(short)*count, "snap to adjacent counts"); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 977eaf23ba6..6038ebf4029 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -207,11 +207,7 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em, } /* we need the vert indices */ - a = 0; - BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - BM_SetIndex(ev, a); - a++; - } + BM_ElemIndex_Ensure(em->bm, BM_VERT); BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { EditVert *v, *lastv, *firstv; diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 01dc978bc25..dedd97ec55e 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -432,14 +432,18 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, i = 0; BMO_ITER(h, &oiter, em->bm, &op, "geom", BM_ALL) { - BM_SetIndex(h, i); + BM_SetIndex(h, i); /* set_dirty */ i++; } BMO_ITER(h, &oiter, em->bm, &op, "newout", BM_ALL) { - BM_SetIndex(h, i); + BM_SetIndex(h, i); /* set_dirty */ i++; } + /* above loops over all, so set all to dirty, if this is somehow + * setting valid values, this line can be remvoed - campbell */ + em->bm->elem_index_dirty |= BM_VERT | BM_EDGE | BM_FACE; + BMO_Exec_Op(em->bm, &findop); |