[Bf-blender-cvs] [c6d7562] master: Fix T45729: Cycles Bake break when building a special mesh

Sergey Sharybin noreply at git.blender.org
Tue Aug 25 10:35:17 CEST 2015


Commit: c6d75628968818aa38b881d0bcaca7c07fc6492a
Author: Sergey Sharybin
Date:   Tue Aug 25 10:29:40 2015 +0200
Branches: master
https://developer.blender.org/rBc6d75628968818aa38b881d0bcaca7c07fc6492a

Fix T45729: Cycles Bake break when building a special mesh

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.

===================================================================

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

===================================================================

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 1c7fb79..6fb27cf 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -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.*/
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 2e37719..3cf8730 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -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)
 {
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3d64813..f85e54a 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -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];




More information about the Bf-blender-cvs mailing list