[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60158] trunk/blender/source/blender: fix [#36291] Applying subsurf to mesh or setting subdivisions to zero crashes Blender
Campbell Barton
ideasman42 at gmail.com
Mon Sep 16 08:00:25 CEST 2013
Revision: 60158
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60158
Author: campbellbarton
Date: 2013-09-16 06:00:25 +0000 (Mon, 16 Sep 2013)
Log Message:
-----------
fix [#36291] Applying subsurf to mesh or setting subdivisions to zero crashes Blender
issue was mesh somehow had a mismatch of UV/texpoly layers. we may want to allow this in the future but for now sync on load just in case.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_mesh.h
trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
trunk/blender/source/blender/blenloader/intern/readfile.c
Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h 2013-09-16 04:19:48 UTC (rev 60157)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h 2013-09-16 06:00:25 UTC (rev 60158)
@@ -354,6 +354,7 @@
/* *** mesh_validate.c *** */
int BKE_mesh_validate(struct Mesh *me, const int do_verbose);
+void BKE_mesh_cd_validate(struct Mesh *me);
bool BKE_mesh_validate_arrays(
struct Mesh *me,
Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c 2013-09-16 04:19:48 UTC (rev 60157)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c 2013-09-16 06:00:25 UTC (rev 60158)
@@ -922,6 +922,7 @@
{
bool is_valid = true;
bool is_change_v, is_change_e, is_change_l, is_change_p;
+ int tot_texpoly, tot_uvloop;
CustomDataMask mask = check_meshmask ? CD_MASK_MESH : 0;
is_valid &= mesh_validate_customdata(vdata, mask, do_verbose, do_fixes, &is_change_v);
@@ -929,6 +930,13 @@
is_valid &= mesh_validate_customdata(ldata, mask, do_verbose, do_fixes, &is_change_l);
is_valid &= mesh_validate_customdata(pdata, mask, do_verbose, do_fixes, &is_change_p);
+ tot_texpoly = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+ tot_uvloop = CustomData_number_of_layers(ldata, CD_MLOOPUV);
+ if (tot_texpoly != tot_uvloop) {
+ PRINT_ERR("\tCustomDataLayer mismatch, tot_texpoly(%d), tot_uvloop(%d)\n",
+ tot_texpoly, tot_uvloop);
+ }
+
*r_change = (is_change_v || is_change_e || is_change_l || is_change_p);
return is_valid;
@@ -973,6 +981,37 @@
return false;
}
}
+
+/**
+ * Duplicate of BM_mesh_cd_validate() for Mesh data.
+ */
+void BKE_mesh_cd_validate(Mesh *me)
+{
+ int totlayer_mtex = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
+ int totlayer_uv = CustomData_number_of_layers(&me->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(&me->ldata, CD_MLOOPUV);
+ do {
+ const char *from_name = me->ldata.layers[uv_index_first + totlayer_mtex].name;
+ CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, from_name);
+ CustomData_set_layer_unique_name(&me->pdata, totlayer_mtex);
+ } while (totlayer_uv != ++totlayer_mtex);
+ }
+ else if (totlayer_uv < totlayer_mtex) {
+ const int mtex_index_first = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY);
+ do {
+ const char *from_name = me->pdata.layers[mtex_index_first + totlayer_uv].name;
+ CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, from_name);
+ CustomData_set_layer_unique_name(&me->ldata, totlayer_uv);
+ } while (totlayer_mtex != ++totlayer_uv);
+ }
+
+ BLI_assert(totlayer_mtex == totlayer_uv);
+}
/** \} */
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2013-09-16 04:19:48 UTC (rev 60157)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2013-09-16 06:00:25 UTC (rev 60158)
@@ -4149,6 +4149,12 @@
direct_link_customdata(fd, &mesh->ldata, mesh->totloop);
direct_link_customdata(fd, &mesh->pdata, mesh->totpoly);
+ if (mesh->mloopuv || mesh->mtpoly) {
+ /* for now we have to ensure texpoly and mloopuv layers are aligned
+ * in the future we may allow non-aligned layers */
+ BKE_mesh_cd_validate(mesh);
+ }
+
mesh->bb = NULL;
mesh->edit_btmesh = NULL;
More information about the Bf-blender-cvs
mailing list