Revision: 41908
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41908
Author: campbellbarton
Date: 2011-11-16 12:38:40 +0000 (Wed, 16 Nov 2011)
Log Message:
-----------
prepare for flagging the bmesh has having invalid index values, so we can skip
looping over all elements if its already valid.
- went over every BM_SetIndex call and added comments about its use, if its
setting dirty values or correct ones.
- replace loops over all elements _just_ to set index values, with a new
function, BM_ElemIndex_Ensure(...), this will eventually only initialize values
when they are dirty.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
branches/bmesh/blender/source/blender/bmesh/operators/createops.c
branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c
branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
branches/bmesh/blender/source/blender/bmesh/operators/mirror.c
branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
branches/bmesh/blender/source/blender/bmesh/operators/utils.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
branches/bmesh/blender/source/blender/editors/mesh/meshtools.c
branches/bmesh/blender/source/blender/editors/object/object_vgroup.c
branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
branches/bmesh/blender/source/blender/editors/util/crazyspace.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c
Modified:
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
2011-11-16 12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
2011-11-16 12:38:40 UTC (rev 41908)
@@ -1997,11 +1997,6 @@
/*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 @@
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 @@
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 @@
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);
Modified:
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
2011-11-16 12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
2011-11-16 12:38:40 UTC (rev 41908)
@@ -402,10 +402,7 @@
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 @@
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 @@
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 @@
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,16 +607,9 @@
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);
+ BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT | BM_FACE);
- 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);
-
for (i=0; i<bmdm->tc->tottri; i++) {
BMLoop **l = bmdm->tc->looptris[i];
int drawSmooth;
@@ -694,9 +674,7 @@
}
}
} 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 @@
/* 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 @@
}
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 @@
/* 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 @@
}
\
}
- 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 @@
/* 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 @@
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 @@
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,22 +1426,11 @@
/* 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++);
- }
+ BM_ElemIndex_Ensure(bm, BM_VERT | BM_EDGE);
- i = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
- BM_SetIndex(e, i++);
- }
-
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
loop_r->v = BM_GetIndex(l->v);
@@ -1714,12 +1662,10 @@
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++) {
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-11-16 12:27:24 UTC
(rev 41907)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-11-16 12:38:40 UTC
(rev 41908)
@@ -154,6 +154,31 @@
/*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);
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h 2011-11-16
12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_class.h 2011-11-16
12:38:40 UTC (rev 41908)
@@ -123,6 +123,12 @@
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
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs