[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40144] branches/bmesh/blender/source/ blender: revert own commit r40051, mesh and object pointers are needed for undo, this commit caused bug [ #28625] Separate crash bug.

Campbell Barton ideasman42 at gmail.com
Mon Sep 12 04:23:32 CEST 2011


Revision: 40144
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40144
Author:   campbellbarton
Date:     2011-09-12 02:23:30 +0000 (Mon, 12 Sep 2011)
Log Message:
-----------
revert own commit r40051, mesh and object pointers are needed for undo, this commit caused bug [#28625] Separate crash bug.

also added a safety check for the crash, even though reverting fixes.
bmesh_to_mesh_exec() could set me->mface array to NULL but leave me->totface when notellelation=1, which is likely to give trouble elsewhere.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40051

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_inline.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-09-12 02:23:30 UTC (rev 40144)
@@ -61,7 +61,7 @@
 extern "C" {
 #endif
 
-struct BMesh *BKE_mesh_to_bmesh(struct Object *ob);
+struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob);
 
 /*
   this function recreates a tesselation.

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -569,14 +569,14 @@
 	return men;
 }
 
-BMesh *BKE_mesh_to_bmesh(Object *ob)
+BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob)
 {
 	BMesh *bm;
 	int allocsize[4] = {512,512,2048,512};
 
 	bm = BM_Make_Mesh(ob, allocsize);
 
-	BMO_CallOpf(bm, "mesh_to_bmesh set_shapekey=%i", 1);
+	BMO_CallOpf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%i", me, ob, 1);
 
 	return bm;
 }

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-09-12 02:23:30 UTC (rev 40144)
@@ -143,7 +143,7 @@
 struct BMFace *BM_Make_Ngon ( struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge **edges, int len, int nodouble );
 
 /*stuff for dealing with header flags*/
-BM_INLINE int BM_TestHFlag(const void *element, const int flag);
+BM_INLINE int BM_TestHFlag(void *element, const int flag);
 
 /*stuff for dealing with header flags*/
 BM_INLINE void BM_SetHFlag(void *element, const int flag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_inline.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_inline.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_inline.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -3,9 +3,10 @@
 
 #include "bmesh.h"
 
-BM_INLINE int BM_TestHFlag(const void *element, const int flag)
+BM_INLINE int BM_TestHFlag(void *element, const int flag)
 {
-	return ((BMHeader *)element)->flag & flag;
+	BMHeader *e = element;
+	return e->flag & flag;
 }
 
 BM_INLINE void BM_SetHFlag(void *element, const int flag)

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -497,6 +497,7 @@
 static BMOpDefine def_object_load_bmesh = {
 	"object_load_bmesh",
 	{{BMOP_OPSLOT_PNT, "scene"},
+	{BMOP_OPSLOT_PNT, "object"},
 	{0, /*null-terminating sentinel*/}},
 	object_load_bmesh_exec,
 	0,
@@ -510,7 +511,9 @@
 */
 static BMOpDefine def_bmesh_to_mesh = {
 	"bmesh_to_mesh",
-    {{BMOP_OPSLOT_INT, "notesselation"}, //don't calculate mfaces
+	{{BMOP_OPSLOT_PNT, "mesh"}, //pointer to a mesh structure to fill in
+	 {BMOP_OPSLOT_PNT, "object"}, //pointer to an object structure
+	 {BMOP_OPSLOT_INT, "notesselation"}, //don't calculate mfaces
 	 {0, /*null-terminating sentinel*/}},
 	bmesh_to_mesh_exec,
 	0,
@@ -524,7 +527,9 @@
 */
 static BMOpDefine def_mesh_to_bmesh = {
 	"mesh_to_bmesh",
-    {{BMOP_OPSLOT_INT, "set_shapekey"}, //load active shapekey coordinates into verts
+	{{BMOP_OPSLOT_PNT, "mesh"}, //pointer to a Mesh structure
+	 {BMOP_OPSLOT_PNT, "object"}, //pointer to an Object structure
+	 {BMOP_OPSLOT_INT, "set_shapekey"}, //load active shapekey coordinates into verts
 	 {0, /*null-terminating sentinel*/}},
 	mesh_to_bmesh_exec,
 	0

Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -44,8 +44,8 @@
 */
 
 void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
-	Object *ob = bm->ob;
-	Mesh *me = ob->data;
+	Object *ob = BMO_Get_Pnt(op, "object");
+	Mesh *me = BMO_Get_Pnt(op, "mesh");
 	MVert *mvert;
 	BLI_array_declare(verts);
 	MEdge *medge;
@@ -347,9 +347,12 @@
 	}
 }
 
-void object_load_bmesh_exec(BMesh *bm, BMOperator *UNUSED(op))
-{
-	BMO_CallOpf(bm, "bmesh_to_mesh");
+void object_load_bmesh_exec(BMesh *bm, BMOperator *op) {
+	Object *ob = BMO_Get_Pnt(op, "object");
+	/* Scene *scene = BMO_Get_Pnt(op, "scene"); */
+	Mesh *me = ob->data;
+
+	BMO_CallOpf(bm, "bmesh_to_mesh mesh=%p object=%p", me, ob);
 }
 
 
@@ -393,8 +396,8 @@
 }
 
 void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) {
-	Object *ob = bm->ob;
-	Mesh *me = ob->data;
+	Mesh *me = BMO_Get_Pnt(op, "mesh");
+	/* Object *ob = BMO_Get_Pnt(op, "object"); */
 	MLoop *mloop;
 	KeyBlock *block;
 	MPoly *mpoly;
@@ -405,8 +408,7 @@
 	BMEdge *e;
 	BMLoop *l;
 	BMFace *f;
-	BMIter iter, liter;
-	float *facenors = NULL;
+	BMIter iter, liter; float *facenors = NULL;
 	int i, j, *keyi, ototvert, totloop, totface, numTex, numCol;
 	int dotess = !BMO_Get_Int(op, "notesselation");
 
@@ -456,6 +458,10 @@
 	me->totedge= bm->totedge;
 	me->totloop= totloop;
 	me->totpoly= bm->totface;
+	/* will be overwritten with a valid value if 'dotess' is set, otherwise we
+	 * end up with 'me->totface' and me->mface == NULL which can crash [#28625]
+	 */
+	me->totface= 0;
 
 	CustomData_copy(&bm->vdata, &me->vdata, CD_MASK_MESH, CD_CALLOC, me->totvert);
 	CustomData_copy(&bm->edata, &me->edata, CD_MASK_MESH, CD_CALLOC, me->totedge);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -3571,7 +3571,7 @@
 	EDBM_CallOpf(em, wmop, "del geom=%hvef context=%i", BM_SELECT, DEL_VERTS);
 	
 	BM_Compute_Normals(bmnew);
-	BMO_CallOpf(bmnew, "bmesh_to_mesh");
+	BMO_CallOpf(bmnew, "bmesh_to_mesh mesh=%p object=%p", basenew->object->data, basenew->object);
 		
 	BM_Free_Mesh(bmnew);
 	((Mesh*)basenew->object->data)->edit_btmesh = NULL;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-12 01:43:20 UTC (rev 40143)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-12 02:23:30 UTC (rev 40144)
@@ -270,9 +270,9 @@
 		printf("yeek!! bmesh conversion issue! may lose lots of geometry!\n");
 		
 		/*BMESH_TODO need to write smarter code here*/
-		bm = BKE_mesh_to_bmesh(ob);
+		bm = BKE_mesh_to_bmesh(me, ob);
 	} else {
-		bm = BKE_mesh_to_bmesh(ob);
+		bm = BKE_mesh_to_bmesh(me, ob);
 	}
 
 	me->edit_btmesh = BMEdit_Create(bm);
@@ -286,7 +286,7 @@
 	Mesh *me = ob->data;
 	BMesh *bm = me->edit_btmesh->bm;
 
-	BMO_CallOpf(bm, "object_load_bmesh scene=%p", scene);
+	BMO_CallOpf(bm, "object_load_bmesh scene=%p object=%p", scene, ob);
 }
 
 void EDBM_FreeEditBMesh(BMEditMesh *tm)
@@ -580,7 +580,7 @@
 	  BMEdit_RecalcTesselation throughout the code.*/
 	BMEdit_RecalcTesselation(em);
 
-	BMO_CallOpf(em->bm, "bmesh_to_mesh notesselation=%i", 1);
+	BMO_CallOpf(em->bm, "bmesh_to_mesh mesh=%p notesselation=%i", me, 1);
 	me->selectmode = em->selectmode;
 
 	return me;
@@ -600,7 +600,7 @@
 	BMEdit_Free(em);
 
 	bm = BM_Make_Mesh(ob, allocsize);
-	BMO_CallOpf(bm, "mesh_to_bmesh set_shapekey=%i", 0);
+	BMO_CallOpf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%i", me, ob, 0);
 
 	em2 = BMEdit_Create(bm);
 	*em = *em2;




More information about the Bf-blender-cvs mailing list