[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