[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57755] trunk/blender/source/blender: fix [#35507] BMesh module: Crash on to_mesh() if faces.layers. tex is used but no loops.layers.uv

Campbell Barton ideasman42 at gmail.com
Wed Jun 26 06:17:41 CEST 2013


Revision: 57755
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57755
Author:   campbellbarton
Date:     2013-06-26 04:17:41 +0000 (Wed, 26 Jun 2013)
Log Message:
-----------
fix [#35507] BMesh module: Crash on to_mesh() if faces.layers.tex is used but no loops.layers.uv

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h
    trunk/blender/source/blender/python/bmesh/bmesh_py_api.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-06-26 04:17:02 UTC (rev 57754)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-06-26 04:17:41 UTC (rev 57755)
@@ -98,6 +98,42 @@
 #include "bmesh.h"
 #include "intern/bmesh_private.h" /* for element checking */
 
+/**
+ * Currently this is only used for Python scripts
+ * which may fail to keep matching UV/TexFace layers.
+ *
+ * \note This should only perform any changes in exceptional cases,
+ * if we need this to be faster we could inline #BM_data_layer_add and only
+ * call #update_data_blocks once at the end.
+ */
+void BM_mesh_cd_validate(BMesh *bm)
+{
+	int totlayer_mtex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
+	int totlayer_uv = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
+
+	if (LIKELY(totlayer_mtex == totlayer_uv)) {
+		/* pass */
+	}
+	else if (totlayer_mtex < totlayer_uv) {
+		const int uv_index_first = CustomData_get_layer_index(&bm->ldata, CD_MLOOPUV);
+		do {
+			const char *from_name =  bm->ldata.layers[uv_index_first + totlayer_mtex].name;
+			BM_data_layer_add_named(bm, &bm->pdata, CD_MTEXPOLY, from_name);
+			CustomData_set_layer_unique_name(&bm->pdata, totlayer_mtex);
+		} while (totlayer_uv != ++totlayer_mtex);
+	}
+	else if (totlayer_uv < totlayer_mtex) {
+		const int mtex_index_first = CustomData_get_layer_index(&bm->pdata, CD_MTEXPOLY);
+		do {
+			const char *from_name = bm->pdata.layers[mtex_index_first + totlayer_uv].name;
+			BM_data_layer_add_named(bm, &bm->ldata, CD_MLOOPUV, from_name);
+			CustomData_set_layer_unique_name(&bm->ldata, totlayer_uv);
+		} while (totlayer_mtex != ++totlayer_uv);
+	}
+
+	BLI_assert(totlayer_mtex == totlayer_uv);
+}
+
 void BM_mesh_cd_flag_ensure(BMesh *bm, Mesh *mesh, const char cd_flag)
 {
 	const char cd_flag_all = BM_mesh_cd_flag_from_bmesh(bm) | cd_flag;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h	2013-06-26 04:17:02 UTC (rev 57754)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.h	2013-06-26 04:17:41 UTC (rev 57755)
@@ -34,6 +34,7 @@
 
 struct Mesh;
 
+void BM_mesh_cd_validate(BMesh *bm);
 void BM_mesh_cd_flag_ensure(BMesh *bm, struct Mesh *mesh, const char cd_flag);
 void BM_mesh_cd_flag_apply(BMesh *bm, const char cd_flag);
 char BM_mesh_cd_flag_from_bmesh(BMesh *bm);

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_api.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_api.c	2013-06-26 04:17:02 UTC (rev 57754)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_api.c	2013-06-26 04:17:41 UTC (rev 57755)
@@ -138,6 +138,12 @@
 
 	{
 		extern void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_destructive);
+		BMEditMesh *em = me->edit_btmesh;
+		BMesh *bm = em->bm;
+
+		/* python won't ensure matching uv/mtex */
+		BM_mesh_cd_validate(bm);
+
 		EDBM_update_generic(me->edit_btmesh, do_tessface, is_destructive);
 	}
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2013-06-26 04:17:02 UTC (rev 57754)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2013-06-26 04:17:41 UTC (rev 57755)
@@ -907,6 +907,9 @@
 
 	bm = self->bm;
 
+	/* python won't ensure matching uv/mtex */
+	BM_mesh_cd_validate(bm);
+
 	BM_mesh_bm_to_me(bm, me, false);
 
 	/* we could have the user do this but if they forget blender can easy crash




More information about the Bf-blender-cvs mailing list