[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