[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59358] trunk/blender/source/blender/bmesh /operators/bmo_dupe.c: mesh duplication was doing a loop & hash lookup for every loop corner, when there is no need since the faces are aligned.

Campbell Barton ideasman42 at gmail.com
Wed Aug 21 13:27:18 CEST 2013


Revision: 59358
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59358
Author:   campbellbarton
Date:     2013-08-21 11:27:18 +0000 (Wed, 21 Aug 2013)
Log Message:
-----------
mesh duplication was doing a loop & hash lookup for every loop corner, when there is no need since the faces are aligned.
was also initializing and stepping an iterator for no reason.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_dupe.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dupe.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dupe.c	2013-08-21 11:09:50 UTC (rev 59357)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dupe.c	2013-08-21 11:27:18 UTC (rev 59358)
@@ -128,52 +128,45 @@
  */
 static BMFace *copy_face(BMOperator *op,
                          BMOpSlot *slot_facemap_out,
-                         BMesh *source_mesh,
-                         BMFace *source_face, BMesh *target_mesh,
+                         BMesh *bm_dst, BMesh *bm_src,
+                         BMFace *source_face,
                          GHash *vhash, GHash *ehash)
 {
 	/* BMVert *target_vert1, *target_vert2; */ /* UNUSED */
 	BMVert **vtar = BLI_array_alloca(vtar, source_face->len);
 	BMEdge **edar = BLI_array_alloca(edar, source_face->len);
-	BMLoop *source_loop, *target_loop;
-	BMFace *target_face = NULL;
-	BMIter iter, iter2;
+	BMLoop *l_iter_src, *l_iter_dst, *l_first_src;
+	BMFace *f_dst = NULL;
 	int i;
-	
-	/* lookup the first and second vert */
-#if 0 /* UNUSED */
-	target_vert1 = BLI_ghash_lookup(vhash, BM_iter_new(&iter, source_mesh, BM_VERTS_OF_FACE, source_face));
-	target_vert2 = BLI_ghash_lookup(vhash, BM_iter_step(&iter));
-#else
-	BM_iter_new(&iter, source_mesh, BM_VERTS_OF_FACE, source_face);
-	BM_iter_step(&iter);
-#endif
 
+	l_first_src = BM_FACE_FIRST_LOOP(source_face);
+
 	/* lookup edge */
-	BM_ITER_ELEM_INDEX (source_loop, &iter, source_face, BM_LOOPS_OF_FACE, i) {
-		vtar[i] = BLI_ghash_lookup(vhash, source_loop->v);
-		edar[i] = BLI_ghash_lookup(ehash, source_loop->e);
-	}
+	l_iter_src = l_first_src;
+	i = 0;
+	do {
+		vtar[i] = BLI_ghash_lookup(vhash, l_iter_src->v);
+		edar[i] = BLI_ghash_lookup(ehash, l_iter_src->e);
+		i++;
+	} while ((l_iter_src = l_iter_src->next) != l_first_src);
 
 	/* create new face */
-	target_face = BM_face_create(target_mesh, vtar, edar, source_face->len, source_face, BM_CREATE_NOP);
-	BMO_slot_map_elem_insert(op, slot_facemap_out, source_face, target_face);
-	BMO_slot_map_elem_insert(op, slot_facemap_out, target_face, source_face);
+	f_dst = BM_face_create(bm_dst, vtar, edar, source_face->len, source_face, BM_CREATE_NOP);
+	BMO_slot_map_elem_insert(op, slot_facemap_out, source_face, f_dst);
+	BMO_slot_map_elem_insert(op, slot_facemap_out, f_dst, source_face);
 
 	/* mark the face for output */
-	BMO_elem_flag_enable(target_mesh, target_face, DUPE_NEW);
+	BMO_elem_flag_enable(bm_dst, f_dst, DUPE_NEW);
 	
 	/* copy per-loop custom data */
-	BM_ITER_ELEM (source_loop, &iter, source_face, BM_LOOPS_OF_FACE) {
-		BM_ITER_ELEM (target_loop, &iter2, target_face, BM_LOOPS_OF_FACE) {
-			if (BLI_ghash_lookup(vhash, source_loop->v) == target_loop->v) {
-				BM_elem_attrs_copy(source_mesh, target_mesh, source_loop, target_loop);
-				break;
-			}
-		}
-	}
+	l_iter_src = l_first_src;
+	l_iter_dst = BM_FACE_FIRST_LOOP(f_dst);
+	do {
+		BM_elem_attrs_copy(bm_src, bm_dst, l_iter_src, l_iter_dst);
+	} while ((l_iter_dst = l_iter_dst->next),
+	         (l_iter_src = l_iter_src->next) != l_first_src);
 
-	return target_face;
+	return f_dst;
 }
 
 /**
@@ -272,7 +265,7 @@
 				}
 			}
 
-			copy_face(op, slot_face_map_out, bm_src, f, bm_dst, vhash, ehash);
+			copy_face(op, slot_face_map_out, bm_dst, bm_src, f, vhash, ehash);
 			BMO_elem_flag_enable(bm_src, f, DUPE_DONE);
 		}
 	}




More information about the Bf-blender-cvs mailing list