[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50823] trunk/blender/source/blender/ editors: fix for crashes caused by mixups when adding objects when incompatible object types were already in editmode .

Campbell Barton ideasman42 at gmail.com
Sun Sep 23 09:18:50 CEST 2012


Revision: 50823
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50823
Author:   campbellbarton
Date:     2012-09-23 07:18:50 +0000 (Sun, 23 Sep 2012)
Log Message:
-----------
fix for crashes caused by mixups when adding objects when incompatible object types were already in editmode.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/include/ED_curve.h
    trunk/blender/source/blender/editors/include/ED_mball.h
    trunk/blender/source/blender/editors/mesh/editmesh_add.c
    trunk/blender/source/blender/editors/metaball/mball_edit.c
    trunk/blender/source/blender/editors/object/object_add.c

Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c	2012-09-23 06:38:09 UTC (rev 50822)
+++ trunk/blender/source/blender/editors/curve/editcurve.c	2012-09-23 07:18:50 UTC (rev 50823)
@@ -6191,10 +6191,9 @@
 }
 
 
-Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
+Nurb *add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4], int type, int newob)
 {
 	static int xzproj = 0;   /* this function calls itself... */
-	Object *obedit = CTX_data_edit_object(C);
 	ListBase *editnurb = object_editcurve_get(obedit);
 	View3D *v3d = CTX_wm_view3d(C);
 	RegionView3D *rv3d = ED_view3d_context_rv3d(C);
@@ -6431,7 +6430,7 @@
 			break;
 		case CU_PRIM_TUBE: /* Cylinder */
 			if (cutype == CU_NURBS) {
-				nu = add_nurbs_primitive(C, mat, CU_NURBS | CU_PRIM_CIRCLE, 0); /* circle */
+				nu = add_nurbs_primitive(C, obedit, mat, CU_NURBS | CU_PRIM_CIRCLE, 0); /* circle */
 				nu->resolu = cu->resolu;
 				nu->flag = CU_SMOOTH;
 				BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
@@ -6510,7 +6509,7 @@
 				float tmp_vec[3] = {0.f, 0.f, 1.f};
 
 				xzproj = 1;
-				nu = add_nurbs_primitive(C, mat, CU_NURBS | CU_PRIM_CIRCLE, 0); /* circle */
+				nu = add_nurbs_primitive(C, obedit, mat, CU_NURBS | CU_PRIM_CIRCLE, 0); /* circle */
 				xzproj = 0;
 				nu->resolu = cu->resolu;
 				nu->resolv = cu->resolv;
@@ -6607,7 +6606,7 @@
 	
 	ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
 
-	nu = add_nurbs_primitive(C, mat, type, newob);
+	nu = add_nurbs_primitive(C, obedit, mat, type, newob);
 	editnurb = object_editcurve_get(obedit);
 	BLI_addtail(editnurb, nu);
 

Modified: trunk/blender/source/blender/editors/include/ED_curve.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_curve.h	2012-09-23 06:38:09 UTC (rev 50822)
+++ trunk/blender/source/blender/editors/include/ED_curve.h	2012-09-23 07:18:50 UTC (rev 50823)
@@ -67,7 +67,7 @@
 
 int     mouse_nurb(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
 
-struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob);
+struct Nurb *add_nurbs_primitive(struct bContext *C, struct Object *obedit, float mat[4][4], int type, int newob);
 
 int     isNurbsel(struct Nurb *nu);
 void    ED_nurb_set_spline_type(struct Nurb *nu, int type);

Modified: trunk/blender/source/blender/editors/include/ED_mball.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mball.h	2012-09-23 06:38:09 UTC (rev 50822)
+++ trunk/blender/source/blender/editors/include/ED_mball.h	2012-09-23 07:18:50 UTC (rev 50823)
@@ -38,7 +38,7 @@
 void ED_operatortypes_metaball(void);
 void ED_keymap_metaball(struct wmKeyConfig *keyconf);
 
-struct MetaElem *add_metaball_primitive(struct bContext *C, float mat[4][4], int type, int newname);
+struct MetaElem *add_metaball_primitive(struct bContext *C, struct Object *obedit, float mat[4][4], int type, int newname);
 
 int mouse_mball(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_add.c	2012-09-23 06:38:09 UTC (rev 50822)
+++ trunk/blender/source/blender/editors/mesh/editmesh_add.c	2012-09-23 07:18:50 UTC (rev 50823)
@@ -55,9 +55,9 @@
 
 /* ********* add primitive operators ************* */
 
-static void make_prim_init(bContext *C, const char *idname,
-                           float *dia, float mat[][4],
-                           int *state, const float loc[3], const float rot[3], const unsigned int layer)
+static Object *make_prim_init(bContext *C, const char *idname,
+                              float *dia, float mat[][4],
+                              int *state, const float loc[3], const float rot[3], const unsigned int layer)
 {
 	Object *obedit = CTX_data_edit_object(C);
 
@@ -74,11 +74,12 @@
 	}
 
 	*dia = ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
+
+	return obedit;
 }
 
-static void make_prim_finish(bContext *C, int *state, int enter_editmode)
+static void make_prim_finish(bContext *C, Object *obedit, int *state, int enter_editmode)
 {
-	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 
 	/* Primitive has all verts selected, use vert select flush
@@ -104,9 +105,7 @@
 	unsigned int layer;
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Plane", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Plane", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout",
@@ -115,7 +114,7 @@
 		return OPERATOR_CANCELLED;
 	}
 
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 
 	return OPERATOR_FINISHED;
 }
@@ -148,9 +147,7 @@
 	unsigned int layer;
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Cube", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Cube", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout", "create_cube mat=%m4 size=%f", mat, dia * 2.0f)) {
@@ -158,7 +155,7 @@
 	}
 	
 	/* BMESH_TODO make plane side this: M_SQRT2 - plane (diameter of 1.41 makes it unit size) */
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 
 	return OPERATOR_FINISHED;
 }
@@ -200,9 +197,7 @@
 	cap_tri = (cap_end == 2);
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Circle", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Circle", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout",
@@ -213,7 +208,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 	
 	return OPERATOR_FINISHED;
 }
@@ -257,9 +252,7 @@
 	cap_tri = (cap_end == 2);
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Cylinder", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Cylinder", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(
@@ -274,7 +267,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 	
 	return OPERATOR_FINISHED;
 }
@@ -320,9 +313,7 @@
 	cap_tri = (cap_end == 2);
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Cone", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Cone", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(
@@ -334,7 +325,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 
 	return OPERATOR_FINISHED;
 }
@@ -379,9 +370,7 @@
 	unsigned int layer;
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Grid", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Grid", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout",
@@ -393,7 +382,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 	return OPERATOR_FINISHED;
 }
 
@@ -436,16 +425,14 @@
 	if (!view_aligned)
 		rot[0] += (float)M_PI / 2.0f;
 	
-	make_prim_init(C, "Monkey", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Monkey", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout", "create_monkey mat=%m4", mat)) {
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 	return OPERATOR_FINISHED;
 }
 
@@ -477,9 +464,7 @@
 	unsigned int layer;
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Sphere", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Sphere", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(em, op, "vertout",
@@ -490,7 +475,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 
 	return OPERATOR_FINISHED;	
 }
@@ -531,9 +516,7 @@
 	unsigned int layer;
 	
 	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
-	make_prim_init(C, "Icosphere", &dia, mat, &state, loc, rot, layer);
-
-	obedit = CTX_data_edit_object(C);
+	obedit = make_prim_init(C, "Icosphere", &dia, mat, &state, loc, rot, layer);
 	em = BMEdit_FromObject(obedit);
 
 	if (!EDBM_op_call_and_selectf(
@@ -545,7 +528,7 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	make_prim_finish(C, &state, enter_editmode);
+	make_prim_finish(C, obedit, &state, enter_editmode);
 
 	return OPERATOR_FINISHED;	
 }

Modified: trunk/blender/source/blender/editors/metaball/mball_edit.c
===================================================================
--- trunk/blender/source/blender/editors/metaball/mball_edit.c	2012-09-23 06:38:09 UTC (rev 50822)
+++ trunk/blender/source/blender/editors/metaball/mball_edit.c	2012-09-23 07:18:50 UTC (rev 50823)
@@ -98,9 +98,8 @@
 }
 
 /* Add metaelem primitive to metaball object (which is in edit mode) */
-MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int UNUSED(newname))

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list