[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40954] branches/bmesh/blender/source/ blender/bmesh/operators/bmesh_dupeops.c: Make copy_face use BM_Make_Face instead of BM_Make_Ngon (better perf, and better handling of two-sided faces and other corner cases)
Andrew Wiggin
ender79bl at gmail.com
Wed Oct 12 15:04:41 CEST 2011
Revision: 40954
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40954
Author: ender79
Date: 2011-10-12 13:04:41 +0000 (Wed, 12 Oct 2011)
Log Message:
-----------
Make copy_face use BM_Make_Face instead of BM_Make_Ngon (better perf, and better handling of two-sided faces and other corner cases)
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2011-10-12 13:01:06 UTC (rev 40953)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2011-10-12 13:04:41 UTC (rev 40954)
@@ -103,8 +103,8 @@
*
*/
static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
- BMFace *source_face, BMesh *target_mesh,
- BMEdge **edar, GHash *vhash, GHash *ehash)
+ BMFace *source_face, BMesh *target_mesh,
+ BMVert **vtar, BMEdge **edar, GHash *vhash, GHash *ehash)
{
BMVert *target_vert1, *target_vert2;
BMLoop *source_loop, *target_loop;
@@ -119,11 +119,12 @@
/*lookup edges*/
for (i=0,source_loop=BMIter_New(&iter, source_mesh, BM_LOOPS_OF_FACE, source_face);
source_loop; source_loop=BMIter_Step(&iter), i++) {
+ vtar[i] = BLI_ghash_lookup(vhash, source_loop->v);
edar[i] = BLI_ghash_lookup(ehash, source_loop->e);
}
/*create new face*/
- target_face = BM_Make_Ngon(target_mesh, target_vert1, target_vert2, edar, source_face->len, 0);
+ target_face = BM_Make_Face(target_mesh, vtar, edar, source_face->len);
BMO_Insert_MapPointer(source_mesh, op,
"facemap", source_face, target_face);
BMO_Insert_MapPointer(source_mesh, op,
@@ -146,16 +147,16 @@
return target_face;
}
- /*
+
+/*
* COPY MESH
*
* Internal Copy function.
-*/
-
+ */
static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
{
- BMVert *v = NULL, *v2;
+ BMVert *v = NULL, *v2, **vtar = NULL;
BMEdge *e = NULL, **edar = NULL;
BMFace *f = NULL;
@@ -177,6 +178,7 @@
if(f->len > maxlength) maxlength = f->len;
}
edar = MEM_callocN(sizeof(BMEdge*) * maxlength, "BM copy mesh edge pointer array");
+ vtar = MEM_callocN(sizeof(BMVert*) * maxlength, "BM copy mesh vert pointer array");
for(v = BMIter_New(&verts, source, BM_VERTS_OF_MESH, source); v; v = BMIter_Step(&verts)){
if(BMO_TestFlag(source, (BMHeader*)v, DUPE_INPUT) && (!BMO_TestFlag(source, (BMHeader*)v, DUPE_DONE))){
@@ -244,7 +246,7 @@
BMO_SetFlag(source, (BMHeader*)e, DUPE_DONE);
}
}
- copy_face(op, source, f, target, edar, vhash, ehash);
+ copy_face(op, source, f, target, vtar, edar, vhash, ehash);
BMO_SetFlag(source, (BMHeader*)f, DUPE_DONE);
}
}
@@ -254,8 +256,12 @@
BLI_ghash_free(ehash, NULL, NULL);
/*free edge pointer array*/
- if(edar)
+ if (edar) {
MEM_freeN(edar);
+ }
+ if (vtar) {
+ MEM_freeN(vtar);
+ }
}
/*
More information about the Bf-blender-cvs
mailing list