[Bf-blender-cvs] [e4c2a3c] master: Various fixes/improvements regarding BMesh's elem_index_dirty and BM_LOOP handling.

Bastien Montagne noreply at git.blender.org
Tue Apr 15 16:25:06 CEST 2014


Commit: e4c2a3c31cf262fcf5d3577552e66b1c5e63218f
Author: Bastien Montagne
Date:   Tue Apr 15 16:18:27 2014 +0200
https://developer.blender.org/rBe4c2a3c31cf262fcf5d3577552e66b1c5e63218f

Various fixes/improvements regarding BMesh's elem_index_dirty and BM_LOOP handling.

Most notably, BM_LOOP and BM_FACE index recompute should now be fully decoupled.

===================================================================

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/modifiers_bmesh.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/operators/bmo_removedoubles.c
M	source/blender/bmesh/tools/bmesh_decimate_collapse.c

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 176ef50..b1bf1b4 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -2162,6 +2162,8 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, const bool use_mdisps,
 			mloop->e = BM_elem_index_get(l_iter->e);
 			CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j);
 
+			BM_elem_index_set(l_iter, j); /* set_inline */
+
 			j++;
 			mloop++;
 		} while ((l_iter = l_iter->next) != l_first);
@@ -2170,7 +2172,7 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, const bool use_mdisps,
 
 		if (add_orig) *index++ = i;
 	}
-	bm->elem_index_dirty &= ~BM_FACE;
+	bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
 
 	dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
 
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index 13368be..3cb6077 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -176,7 +176,8 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm, const bool calc_face_normal)
 		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
 		do {
 			/* Save index of correspsonding MLoop */
-			CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, j++, &l_iter->head.data, true);
+			CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, j, &l_iter->head.data, true);
+			BM_elem_index_set(l_iter, j++); /* set_inline */
 		} while ((l_iter = l_iter->next) != l_first);
 
 		CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, i, &f->head.data, true);
@@ -195,7 +196,7 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm, const bool calc_face_normal)
 			*orig_index = ORIGINDEX_NONE;
 		}
 	}
-	if (is_init) bm->elem_index_dirty &= ~BM_FACE;
+	if (is_init) bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
 
 	MEM_freeN(vtable);
 	MEM_freeN(etable);
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index ee7dc81..e723353 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -451,10 +451,12 @@ static void bm_mesh_edges_sharp_tag(BMesh *bm, const float (*vnos)[3], const flo
 
 	{
 		char hflag = BM_LOOP;
-		if (vnos)
+		if (vnos) {
 			hflag |= BM_VERT;
-		if (fnos)
+		}
+		if (fnos) {
 			hflag |= BM_FACE;
+		}
 		BM_mesh_elem_index_ensure(bm, hflag);
 	}
 
@@ -508,10 +510,12 @@ static void bm_mesh_loops_calc_normals(BMesh *bm, const float (*vcos)[3], const
 
 	{
 		char hflag = BM_LOOP;
-		if (vcos)
+		if (vcos) {
 			hflag |= BM_VERT;
-		if (fnos)
+		}
+		if (fnos) {
 			hflag |= BM_FACE;
+		}
 		BM_mesh_elem_index_ensure(bm, hflag);
 	}
 
@@ -822,27 +826,31 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag)
 					BMIter iter;
 					BMElem *ele;
 
-					const bool hflag_loop = (hflag & BM_LOOP) && (bm->elem_index_dirty & BM_LOOP);
+					const bool update_face = (hflag & BM_FACE) && (bm->elem_index_dirty & BM_FACE);
+					const bool update_loop = (hflag & BM_LOOP) && (bm->elem_index_dirty & BM_LOOP);
 
 					int index;
-					int index_loop_start = 0;
+					int index_loop = 0;
+
 					BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, index) {
-						BM_elem_index_set(ele, index); /* set_ok */
+						if (update_face) {
+							BM_elem_index_set(ele, index); /* set_ok */
+						}
 
-						if (hflag_loop) {
-							BMIter liter;
-							BMElem *lele;
+						if (update_loop) {
+							BMLoop *l_iter, *l_first;
 
-							int index_diff;
-							BM_ITER_ELEM_INDEX (lele, &liter, ele, BM_LOOPS_OF_FACE, index_diff) {
-								BM_elem_index_set(lele, index_loop_start + index_diff); /* set_ok */
-							}
-							index_loop_start += index_diff;
+							l_iter = l_first = BM_FACE_FIRST_LOOP((BMFace *)ele);
+							do {
+								BM_elem_index_set(l_iter, index_loop++); /* set_ok */
+							} while ((l_iter = l_iter->next) != l_first);
 						}
 					}
+
 					BLI_assert(index == bm->totface);
-					if (hflag & BM_LOOP)
-						BLI_assert(index_loop_start == bm->totloop);
+					if (update_loop) {
+						BLI_assert(index_loop == bm->totloop);
+					}
 				}
 				else {
 					// printf("%s: skipping face/loop index calc!\n", __func__);
diff --git a/source/blender/bmesh/operators/bmo_removedoubles.c b/source/blender/bmesh/operators/bmo_removedoubles.c
index cef7c70..216d341 100644
--- a/source/blender/bmesh/operators/bmo_removedoubles.c
+++ b/source/blender/bmesh/operators/bmo_removedoubles.c
@@ -219,7 +219,7 @@ void bmo_weld_verts_exec(BMesh *bm, BMOperator *op)
 			}
 		}
 	}
-	bm->elem_index_dirty |= BM_FACE;
+	bm->elem_index_dirty |= BM_FACE | BM_LOOP;
 
 	/* faces get "modified" by creating new faces here, then at the
 	 * end the old faces are deleted */
diff --git a/source/blender/bmesh/tools/bmesh_decimate_collapse.c b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
index ef628a1..1e9d8e9 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_collapse.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
@@ -1006,7 +1006,7 @@ void BM_mesh_decimate_collapse(BMesh *bm, const float factor, float *vweights, c
 	bm_decim_build_edge_cost(bm, vquadrics, vweights, eheap, eheap_table);
 
 	face_tot_target = bm->totface * factor;
-	bm->elem_index_dirty |= BM_FACE | BM_LOOP | BM_EDGE | BM_VERT;
+	bm->elem_index_dirty |= BM_ALL;
 
 
 #ifdef USE_CUSTOMDATA




More information about the Bf-blender-cvs mailing list