Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/mesh/editmesh_add.c
| Show All 34 Lines | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BLT_translation.h" | #include "BLT_translation.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_library.h" | #include "BKE_library.h" | ||||
| #include "BKE_editmesh.h" | #include "BKE_editmesh.h" | ||||
| #include "BKE_workspace.h" | |||||
| #include "RNA_define.h" | #include "RNA_define.h" | ||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "ED_mesh.h" | #include "ED_mesh.h" | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_object.h" | #include "ED_object.h" | ||||
| #include "ED_uvedit.h" | #include "ED_uvedit.h" | ||||
| #include "mesh_intern.h" /* own include */ | #include "mesh_intern.h" /* own include */ | ||||
| #define MESH_ADD_VERTS_MAXI 10000000 | #define MESH_ADD_VERTS_MAXI 10000000 | ||||
| /* ********* add primitive operators ************* */ | /* ********* add primitive operators ************* */ | ||||
| typedef struct MakePrimitiveData { | typedef struct MakePrimitiveData { | ||||
| eObjectMode initial_workspace_mode; | |||||
| float mat[4][4]; | float mat[4][4]; | ||||
| bool was_editmode; | bool was_editmode; | ||||
| } MakePrimitiveData; | } MakePrimitiveData; | ||||
| static Object *make_prim_init(bContext *C, const char *idname, | static Object *make_prim_init(bContext *C, const char *idname, | ||||
| const float loc[3], const float rot[3], const unsigned int layer, | const float loc[3], const float rot[3], const unsigned int layer, | ||||
| MakePrimitiveData *r_creation_data) | MakePrimitiveData *r_creation_data) | ||||
| { | { | ||||
| Object *obedit = CTX_data_edit_object(C); | Object *obedit = CTX_data_edit_object(C); | ||||
| r_creation_data->was_editmode = false; | r_creation_data->was_editmode = false; | ||||
| if (obedit == NULL || obedit->type != OB_MESH) { | if (obedit == NULL || obedit->type != OB_MESH) { | ||||
| const WorkSpace *workspace = CTX_wm_workspace(C); | |||||
| /* may have to reset this later */ | |||||
| r_creation_data->initial_workspace_mode = workspace->preferred_mode; | |||||
| obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false, layer); | obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false, layer); | ||||
| /* create editmode */ | /* create editmode */ | ||||
| ED_object_editmode_enter(C, EM_DO_UNDO | EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ | ED_object_editmode_enter(C, EM_DO_UNDO | EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ | ||||
| r_creation_data->was_editmode = true; | r_creation_data->was_editmode = true; | ||||
| } | } | ||||
| ED_object_new_primitive_matrix(C, obedit, loc, rot, r_creation_data->mat); | ED_object_new_primitive_matrix(C, obedit, loc, rot, r_creation_data->mat); | ||||
| Show All 11 Lines | static void make_prim_finish(bContext *C, Object *obedit, const MakePrimitiveData *creation_data, int enter_editmode) | ||||
| EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX); | EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX); | ||||
| /* only recalc editmode tessface if we are staying in editmode */ | /* only recalc editmode tessface if we are staying in editmode */ | ||||
| EDBM_update_generic(em, !exit_editmode, true); | EDBM_update_generic(em, !exit_editmode, true); | ||||
| /* userdef */ | /* userdef */ | ||||
| if (exit_editmode) { | if (exit_editmode) { | ||||
| ED_object_editmode_exit(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */ | ED_object_editmode_exit(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */ | ||||
| if (creation_data->initial_workspace_mode != OB_MODE_OBJECT) { | |||||
| WorkSpace *workspace = CTX_wm_workspace(C); | |||||
| /* restore workspace mode */ | |||||
| workspace->preferred_mode = creation_data->initial_workspace_mode; | |||||
| } | |||||
| } | } | ||||
| WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); | WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); | ||||
| } | } | ||||
| static int add_primitive_plane_exec(bContext *C, wmOperator *op) | static int add_primitive_plane_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| MakePrimitiveData creation_data; | MakePrimitiveData creation_data; | ||||
| Object *obedit; | Object *obedit; | ||||
| ▲ Show 20 Lines • Show All 515 Lines • Show Last 20 Lines | |||||