Fix T45729: Cycles Bake break when building a special mesh
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 25 Aug 2015 08:29:40 +0000 (10:29 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 25 Aug 2015 08:30:46 +0000 (10:30 +0200)
The issue was caused by CD_SHAPEKEY_INDEX layer being added to edge data,
now we make sure all the layers are nicely re-allocated.

source/blender/blenkernel/BKE_customdata.h
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/mesh.c

index 1c7fb79856a9c4ce2555f1ad8b4f54ceeee09722..6fb27cf75777dbf0828aeb14ee9f91f986c86f96 100644 (file)
@@ -131,6 +131,14 @@ void CustomData_update_typemap(struct CustomData *data);
 bool CustomData_merge(const struct CustomData *source, struct CustomData *dest,
                       CustomDataMask mask, int alloctype, int totelem);
 
+/* Reallocate custom data to a new element count.
+ * Only affects on data layers which are owned by the CustomData itself,
+ * referenced data is kept unchanged,
+ *
+ * NOTE: Take care of referenced layers by yourself!
+ */
+void CustomData_realloc(struct CustomData *data, int totelem);
+
 /* bmesh version of CustomData_merge; merges the layouts of source and dest,
  * then goes through the mesh and makes sure all the customdata blocks are
  * consistent with the new layout.*/
index 2e377195d672ed260006c31b45c59d806c9fa454..3cf8730e3af9ae89ca12c33e7da2d910474772af 100644 (file)
@@ -1504,6 +1504,23 @@ bool CustomData_merge(const struct CustomData *source, struct CustomData *dest,
        return changed;
 }
 
+/* NOTE: Take care of referenced layers by yourself! */
+void CustomData_realloc(CustomData *data, int totelem)
+{
+       int i;
+       for (i = 0; i < data->totlayer; ++i) {
+               CustomDataLayer *layer = &data->layers[i];
+               const LayerTypeInfo *typeInfo;
+               int size;
+               if (layer->flag & CD_FLAG_NOFREE) {
+                       continue;
+               }
+               typeInfo = layerType_getInfo(layer->type);
+               size = totelem * typeInfo->size;
+               layer->data = MEM_reallocN(layer->data, size);
+       }
+}
+
 void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
                      CustomDataMask mask, int alloctype, int totelem)
 {
index 3d6481349c509a2e8568538b439a6c4c9c0c56e7..f85e54a8362d0e8983535ade78c5233862a3131e 100644 (file)
@@ -2237,7 +2237,7 @@ void BKE_mesh_split_faces(Mesh *mesh)
                BKE_mesh_calc_normals_split(mesh);
        }
        lnors = CustomData_get_layer(&mesh->ldata, CD_NORMAL);
-       /* Count. */
+       /* Count number of vertices to be split. */
        for (poly = 0; poly < num_polys; poly++) {
                MPoly *mp = &mpoly[poly];
                int loop;
@@ -2255,19 +2255,16 @@ void BKE_mesh_split_faces(Mesh *mesh)
                /* No new vertices are to be added, can do early exit. */
                return;
        }
-       /* Actual split. */
+       /* Reallocate all vert and edge related data. */
        mesh->totvert += num_new_verts;
        mesh->totedge += 2 * num_new_verts;
-       mvert = mesh->mvert = MEM_reallocN(mesh->mvert,
-                                          sizeof(MVert) * mesh->totvert);
-       medge = mesh->medge = MEM_reallocN(mesh->medge,
-                                          sizeof(MEdge) * mesh->totedge);
-       if (mesh->dvert != NULL) {
-               mesh->dvert = MEM_reallocN(mesh->dvert, sizeof(MDeformVert) * mesh->totvert);
-               CustomData_set_layer(&mesh->vdata, CD_MDEFORMVERT, mesh->dvert);
-       }
-       CustomData_set_layer(&mesh->vdata, CD_MVERT, mesh->mvert);
-       CustomData_set_layer(&mesh->edata, CD_MEDGE, mesh->medge);
+       CustomData_realloc(&mesh->vdata, mesh->totvert);
+       CustomData_realloc(&mesh->edata, mesh->totedge);
+       /* Update pointers to a newly allocated memory. */
+       BKE_mesh_update_customdata_pointers(mesh, false);
+       mvert = mesh->mvert;
+       medge = mesh->medge;
+       /* Perform actual vertex split. */
        num_new_verts = 0;
        for (poly = 0; poly < num_polys; poly++) {
                MPoly *mp = &mpoly[poly];