diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-09-23 11:18:50 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-09-23 11:18:50 +0400 |
commit | c574419049f2ff7dfc558304ea9097dcf2a282c3 (patch) | |
tree | 94b11e5d742535d58f010a46fc75f2c1d512974f /source/blender/editors/mesh/editmesh_add.c | |
parent | 7d1a36f8f4e928d8e2a3828d4def38251cdf9914 (diff) |
fix for crashes caused by mixups when adding objects when incompatible object types were already in editmode.
Diffstat (limited to 'source/blender/editors/mesh/editmesh_add.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_add.c | 65 |
1 files changed, 24 insertions, 41 deletions
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 8b032bb1a3d..fdaddec5246 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -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 @@ static void make_prim_init(bContext *C, const char *idname, } *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 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) } /* 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 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) 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 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - make_prim_finish(C, &state, enter_editmode); + make_prim_finish(C, obedit, &state, enter_editmode); return OPERATOR_FINISHED; } |