[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55286] trunk/blender/source/blender: converting a mesh to a curve was unnecessarily using tessface's.

Campbell Barton ideasman42 at gmail.com
Thu Mar 14 19:35:22 CET 2013


Revision: 55286
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55286
Author:   campbellbarton
Date:     2013-03-14 18:35:21 +0000 (Thu, 14 Mar 2013)
Log Message:
-----------
converting a mesh to a curve was unnecessarily using tessface's.
use mpolys instead and simplify checks for wire edges.

Also rename BKE_mesh_from_curve() --> BKE_mesh_to_curve() since this function converts a mesh into a curve.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/editors/object/object_add.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-03-14 16:53:38 UTC (rev 55285)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-03-14 18:35:21 UTC (rev 55286)
@@ -169,7 +169,7 @@
                                      struct MLoopUV **alluv, int *_totloop, int *_totpoly);
 void BKE_mesh_from_nurbs_displist(struct Object *ob, struct ListBase *dispbase, int use_orco_uv);
 void BKE_mesh_from_nurbs(struct Object *ob);
-void BKE_mesh_from_curve(struct Scene *scene, struct Object *ob);
+void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob);
 void BKE_mesh_delete_material_index(struct Mesh *me, short index);
 void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth);
 void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh);

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-03-14 16:53:38 UTC (rev 55285)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-03-14 18:35:21 UTC (rev 55286)
@@ -1586,60 +1586,50 @@
 	BLI_addtail(lb, vl);
 }
 
-void BKE_mesh_from_curve(Scene *scene, Object *ob)
+void BKE_mesh_to_curve(Scene *scene, Object *ob)
 {
 	/* make new mesh data from the original copy */
 	DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_MESH);
 
 	MVert *mverts = dm->getVertArray(dm);
 	MEdge *med, *medge = dm->getEdgeArray(dm);
-	MFace *mf,  *mface = dm->getTessFaceArray(dm);
+	MPoly *mp,  *mpoly = dm->getPolyArray(dm);
+	MLoop       *mloop = dm->getLoopArray(dm);
 
 	int totedge = dm->getNumEdges(dm);
-	int totface = dm->getNumTessFaces(dm);
+	int totpoly = dm->getNumPolys(dm);
 	int totedges = 0;
-	int i, needsFree = 0;
+	int i;
+	bool needsFree = false;
 
 	/* only to detect edge polylines */
-	EdgeHash *eh = BLI_edgehash_new();
-	EdgeHash *eh_edge = BLI_edgehash_new();
+	int *edge_users;
 
-
 	ListBase edges = {NULL, NULL};
 
-	/* create edges from all faces (so as to find edges not in any faces) */
-	mf = mface;
-	for (i = 0; i < totface; i++, mf++) {
-		if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
-			BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
-		if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
-			BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
-
-		if (mf->v4) {
-			if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
-				BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
-			if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
-				BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
+	/* get boundary edges */
+	edge_users = MEM_callocN(sizeof(int) * totedge, __func__);
+	for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
+		MLoop *ml = &mloop[mp->loopstart];
+		int j;
+		for (j = 0; j < mp->totloop; j++, ml++) {
+			edge_users[ml->e]++;
 		}
-		else {
-			if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
-				BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
-		}
 	}
 
+	/* create edges from all faces (so as to find edges not in any faces) */
 	med = medge;
 	for (i = 0; i < totedge; i++, med++) {
-		if (!BLI_edgehash_haskey(eh, med->v1, med->v2)) {
+		if (edge_users[i] == 0) {
 			EdgeLink *edl = MEM_callocN(sizeof(EdgeLink), "EdgeLink");
 
-			BLI_edgehash_insert(eh_edge, med->v1, med->v2, NULL);
+			// BLI_edgehash_insert(eh_edge, med->v1, med->v2, NULL);
 			edl->edge = med;
 
 			BLI_addtail(&edges, edl);   totedges++;
 		}
 	}
-	BLI_edgehash_free(eh_edge, NULL);
-	BLI_edgehash_free(eh, NULL);
+	MEM_freeN(edge_users);
 
 	if (edges.first) {
 		Curve *cu = BKE_curve_add(G.main, ob->id.name + 2, OB_CURVE);
@@ -1741,7 +1731,7 @@
 		ob->type = OB_CURVE;
 
 		/* curve objects can't contain DM in usual cases, we could free memory */
-		needsFree = 1;
+		needsFree = true;
 	}
 
 	dm->needsFree = needsFree;

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2013-03-14 16:53:38 UTC (rev 55285)
+++ trunk/blender/source/blender/editors/object/object_add.c	2013-03-14 18:35:21 UTC (rev 55286)
@@ -1487,7 +1487,7 @@
 				newob = ob;
 			}
 
-			BKE_mesh_from_curve(scene, newob);
+			BKE_mesh_to_curve(scene, newob);
 
 			if (newob->type == OB_CURVE)
 				BKE_object_free_modifiers(newob);   /* after derivedmesh calls! */




More information about the Bf-blender-cvs mailing list