[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57208] trunk/blender/source/blender: fix [#35555] Collada: export destroys mesh in some cases

Campbell Barton ideasman42 at gmail.com
Mon Jun 3 01:20:50 CEST 2013


Revision: 57208
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57208
Author:   campbellbarton
Date:     2013-06-02 23:20:49 +0000 (Sun, 02 Jun 2013)
Log Message:
-----------
fix [#35555] Collada: export destroys mesh in some cases

add arguments to calculate normals when converting to bmesh:
  BM_mesh_bm_from_me, DM_to_bmesh

This gives some speedup to undo (which didnt need to re-calculate vertex normals), and array modifier which doesnt need to calculate face normals at all

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h
    trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c
    trunk/blender/source/blender/collada/collada_utils.cpp
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
    trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-06-02 23:20:49 UTC (rev 57208)
@@ -474,11 +474,11 @@
 void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob, CustomDataMask mask);
 
 struct BMEditMesh *DM_to_editbmesh(struct DerivedMesh *dm,
-                                   struct BMEditMesh *existing, int do_tessellate);
+                                   struct BMEditMesh *existing, const bool do_tessellate);
 
 /* conversion to bmesh only */
-void          DM_to_bmesh_ex(struct DerivedMesh *dm, struct BMesh *bm);
-struct BMesh *DM_to_bmesh(struct DerivedMesh *dm);
+void          DM_to_bmesh_ex(struct DerivedMesh *dm, struct BMesh *bm, const bool calc_face_normal);
+struct BMesh *DM_to_bmesh(struct DerivedMesh *dm, const bool calc_face_normal);
 
 
 /** Utility function to convert a DerivedMesh to a shape key block */

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -539,7 +539,7 @@
 
 	bm = BM_mesh_create(&bm_mesh_allocsize_default);
 
-	BM_mesh_bm_from_me(bm, me, true, ob->shapenr);
+	BM_mesh_bm_from_me(bm, me, false, true, ob->shapenr);
 
 	return bm;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -61,7 +61,7 @@
  *
  * \note The mesh may already have geometry. see 'is_init'
  */
-void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm)
+void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm, const bool calc_face_normal)
 {
 	MVert *mv, *mvert;
 	MEdge *me, *medge;
@@ -182,12 +182,14 @@
 
 		CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, i, &f->head.data, true);
 
-		if (face_normals) {
-			copy_v3_v3(f->no, face_normals[i]);
+		if (calc_face_normal) {
+			if (face_normals) {
+				copy_v3_v3(f->no, face_normals[i]);
+			}
+			else {
+				BM_face_normal_update(f);
+			}
 		}
-		else {
-			BM_face_normal_update(f);
-		}
 
 		if (UNLIKELY(has_orig_hflag & BM_FACE)) {
 			int *orig_index = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_ORIGINDEX);
@@ -202,7 +204,7 @@
 
 /* converts a cddm to a BMEditMesh.  if existing is non-NULL, the
  * new geometry will be put in there.*/
-BMEditMesh *DM_to_editbmesh(DerivedMesh *dm, BMEditMesh *existing, int do_tessellate)
+BMEditMesh *DM_to_editbmesh(DerivedMesh *dm, BMEditMesh *existing, const bool do_tessellate)
 {
 	BMEditMesh *em = existing;
 	BMesh *bm;
@@ -214,7 +216,7 @@
 		bm = BM_mesh_create(&bm_mesh_allocsize_default);
 	}
 
-	DM_to_bmesh_ex(dm, bm);
+	DM_to_bmesh_ex(dm, bm, do_tessellate);
 
 	if (!em) {
 		em = BKE_editmesh_create(bm, do_tessellate);
@@ -228,13 +230,13 @@
 	return em;
 }
 
-BMesh *DM_to_bmesh(DerivedMesh *dm)
+BMesh *DM_to_bmesh(DerivedMesh *dm, const bool calc_face_normal)
 {
 	BMesh *bm;
 
 	bm = BM_mesh_create(&bm_mesh_allocsize_default);
 
-	DM_to_bmesh_ex(dm, bm);
+	DM_to_bmesh_ex(dm, bm, calc_face_normal);
 
 	return bm;
 }

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -185,7 +185,8 @@
  *
  * \warning This function doesn't calculate face normals.
  */
-void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
+void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
+                        const bool calc_face_normal, const bool set_key, int act_key_nr)
 {
 	MVert *mvert;
 	MEdge *medge;
@@ -397,6 +398,10 @@
 
 		/* Copy Custom Data */
 		CustomData_to_bmesh_block(&me->pdata, &bm->pdata, i, &f->head.data, true);
+
+		if (calc_face_normal) {
+			BM_face_normal_update(f);
+		}
 	}
 
 	bm->elem_index_dirty &= ~BM_FACE; /* added in order, clear dirty flag */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h	2013-06-02 23:20:49 UTC (rev 57208)
@@ -38,7 +38,8 @@
 void BM_mesh_cd_flag_apply(BMesh *bm, const char cd_flag);
 char BM_mesh_cd_flag_from_bmesh(BMesh *bm);
 
-void BM_mesh_bm_from_me(BMesh *bm, struct Mesh *me, bool set_key, int act_key_nr);
+void BM_mesh_bm_from_me(BMesh *bm, struct Mesh *me,
+                        const bool calc_face_normal, const bool set_key, int act_key_nr);
 void BM_mesh_bm_to_me(BMesh *bm, struct Mesh *me, bool do_tessface);
 
 #endif /* __BMESH_MESH_CONV_H__ */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -45,7 +45,7 @@
 	Mesh *me     = BMO_slot_ptr_get(op->slots_in,  "mesh");
 	bool set_key = BMO_slot_bool_get(op->slots_in, "use_shapekey");
 
-	BM_mesh_bm_from_me(bm, me, set_key, ob->shapenr);
+	BM_mesh_bm_from_me(bm, me, false, set_key, ob->shapenr);
 
 	if (me->key && ob->shapenr > me->key->totkey) {
 		ob->shapenr = me->key->totkey - 1;

Modified: trunk/blender/source/blender/collada/collada_utils.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada_utils.cpp	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/collada/collada_utils.cpp	2013-06-02 23:20:49 UTC (rev 57208)
@@ -383,12 +383,13 @@
 
 }
 
-void bc_triangulate_mesh(Mesh *me) {
+void bc_triangulate_mesh(Mesh *me)
+{
 	bool use_beauty = false;
 	bool tag_only   = false;
 	 
 	BMesh *bm = BM_mesh_create(&bm_mesh_allocsize_default);
-	BM_mesh_bm_from_me(bm, me, FALSE, 0);
+	BM_mesh_bm_from_me(bm, me, true, false, 0);
 	BM_mesh_triangulate(bm, use_beauty, tag_only, NULL, NULL);
 	BM_mesh_bm_to_me(bm, me, FALSE);
 	BM_mesh_free(bm);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -2598,7 +2598,7 @@
 
 					bm_old = BM_mesh_create(&bm_mesh_allocsize_default);
 
-					BM_mesh_bm_from_me(bm_old, me, false, 0);
+					BM_mesh_bm_from_me(bm_old, me, false, false, 0);
 
 					if      (type == 1) retval_iter = mesh_separate_material(bmain, scene, base_iter, bm_old);
 					else if (type == 2) retval_iter = mesh_separate_loose(bmain, scene, base_iter, bm_old);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -655,11 +655,8 @@
 
 	bm = BM_mesh_create(&allocsize);
 
-	BM_mesh_bm_from_me(bm, &um->me, false, ob->shapenr);
+	BM_mesh_bm_from_me(bm, &um->me, true, false, ob->shapenr);
 
-	/* face normals need recalculation since we are not calling through an operator */
-	BM_mesh_normals_update(bm);
-
 	em_tmp = BKE_editmesh_create(bm, true);
 	*em = *em_tmp;
 	

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -4570,8 +4570,7 @@
 	/* Create triangles-only BMesh */
 	ss->bm = BM_mesh_create(&bm_mesh_allocsize_default);
 
-	BM_mesh_bm_from_me(ss->bm, me, TRUE, ob->shapenr);
-	BM_mesh_normals_update(ss->bm);
+	BM_mesh_bm_from_me(ss->bm, me, true, true, ob->shapenr);
 	sculpt_dynamic_topology_triangulate(ss->bm);
 	BM_data_layer_add(ss->bm, &ss->bm->vdata, CD_PAINT_MASK);
 	BM_mesh_normals_update(ss->bm);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_array.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_array.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/modifiers/intern/MOD_array.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -228,7 +228,7 @@
 	/* Add the DerivedMesh's elements to the BMesh. The pre-existing
 	 * elements were already tagged, so the new elements can be
 	 * identified by not having the BM_ELEM_TAG flag set. */
-	DM_to_bmesh_ex(dm, bm);
+	DM_to_bmesh_ex(dm, bm, false);
 
 	if (amd->flags & MOD_ARR_MERGE) {
 		/* if merging is enabled, find doubles */
@@ -330,7 +330,7 @@
                                           int UNUSED(initFlags))
 {
 	DerivedMesh *result;
-	BMesh *bm = DM_to_bmesh(dm);
+	BMesh *bm = DM_to_bmesh(dm, false);
 	BMOperator first_dupe_op, dupe_op, old_dupe_op, weld_op;
 	BMVert **first_geom = NULL;
 	int i, j;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2013-06-02 22:54:00 UTC (rev 57207)
+++ trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2013-06-02 23:20:49 UTC (rev 57208)
@@ -113,7 +113,7 @@
 	const bool vertex_only = (bmd->flags & BME_BEVEL_VERT) != 0;
 	const bool do_clamp = !(bmd->flags & BME_BEVEL_OVERLAP_OK);
 
-	bm = DM_to_bmesh(dm);
+	bm = DM_to_bmesh(dm, true);
 
 	if (vertex_only) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list