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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to