[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44679] trunk/blender/source/blender/ blenkernel/intern/mesh.c: Fix for fracture object crash

Sergey Sharybin sergey.vfx at gmail.com
Tue Mar 6 17:22:42 CET 2012


Revision: 44679
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44679
Author:   nazgul
Date:     2012-03-06 16:22:41 +0000 (Tue, 06 Mar 2012)
Log Message:
-----------
Fix for fracture object crash

Issue was caused by incorrect resetting of tesselated fave data in copy_mesh:
- CustomData_free will free data from original mesh because layers in new mesh
  are pointing to the same memory just after copy. So it's needed only to
  set some pointers to NULL.
- It was incorrect filling fdata with zeroes because of incorrect structure size used.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-06 16:17:55 UTC (rev 44678)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-06 16:22:41 UTC (rev 44679)
@@ -452,6 +452,19 @@
 	MEM_freeN (dvert);
 }
 
+static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata)
+{
+	if (free_customdata)
+		CustomData_free(&mesh->fdata, mesh->totface);
+
+	mesh->mface = NULL;
+	mesh->mtface = NULL;
+	mesh->mcol = NULL;
+	mesh->totface = 0;
+
+	memset(&mesh->fdata, 0, sizeof(mesh->fdata));
+}
+
 Mesh *add_mesh(const char *name)
 {
 	Mesh *me;
@@ -492,7 +505,7 @@
 		CustomData_copy(&me->fdata, &men->fdata, CD_MASK_MESH, CD_DUPLICATE, men->totface);
 	}
 	else {
-		BKE_mesh_tessface_clear(men);
+		mesh_tessface_clear_intern(men, FALSE);
 	}
 
 	mesh_update_customdata_pointers(men, do_tessface);
@@ -2971,12 +2984,5 @@
 
 void BKE_mesh_tessface_clear(Mesh *mesh)
 {
-	CustomData_free(&mesh->fdata, mesh->totface);
-
-	mesh->mface = NULL;
-	mesh->mtface = NULL;
-	mesh->mcol = NULL;
-	mesh->totface = 0;
-
-	memset(&mesh->fdata, 0, sizeof(&mesh->fdata));
+	mesh_tessface_clear_intern(mesh, TRUE);
 }




More information about the Bf-blender-cvs mailing list