diff options
Diffstat (limited to 'source/blender/editors/util/ed_util.c')
-rw-r--r-- | source/blender/editors/util/ed_util.c | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index b34605f6af3..a5a26cf4d57 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -35,12 +35,14 @@ #include "MEM_guardedalloc.h" +#include "DNA_armature_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_packedFile_types.h" +#include "DNA_workspace_types.h" #include "BLI_utildefines.h" #include "BLI_string.h" @@ -70,6 +72,10 @@ #include "ED_space_api.h" #include "ED_util.h" +#include "DEG_depsgraph.h" + +#include "GPU_immediate.h" + #include "UI_interface.h" #include "UI_resources.h" @@ -84,10 +90,7 @@ void ED_editors_init(bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); - Main *bmain = CTX_data_main(C); Scene *sce = CTX_data_scene(C); - Object *ob, *obact = (sce && sce->basact) ? sce->basact->object : NULL; - ID *data; /* This is called during initialization, so we don't want to store any reports */ ReportList *reports = CTX_wm_reports(C); @@ -95,21 +98,6 @@ void ED_editors_init(bContext *C) SWAP(int, reports->flag, reports_flag_prev); - /* toggle on modes for objects that were saved with these enabled. for - * e.g. linked objects we have to ensure that they are actually the - * active object in this scene. */ - for (ob = bmain->object.first; ob; ob = ob->id.next) { - int mode = ob->mode; - - if (!ELEM(mode, OB_MODE_OBJECT, OB_MODE_POSE)) { - ob->mode = OB_MODE_OBJECT; - data = ob->data; - - if (ob == obact && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) - ED_object_toggle_modes(C, mode); - } - } - /* image editor paint mode */ if (sce) { ED_space_image_paint_update(wm, sce); @@ -122,7 +110,6 @@ void ED_editors_init(bContext *C) void ED_editors_exit(bContext *C) { Main *bmain = CTX_data_main(C); - Scene *sce; if (!bmain) return; @@ -130,23 +117,20 @@ void ED_editors_exit(bContext *C) /* frees all editmode undos */ undo_editmode_clear(); ED_undo_paint_free(); - - for (sce = bmain->scene.first; sce; sce = sce->id.next) { - if (sce->obedit) { - Object *ob = sce->obedit; - - if (ob) { - if (ob->type == OB_MESH) { - Mesh *me = ob->data; - if (me->edit_btmesh) { - EDBM_mesh_free(me->edit_btmesh); - MEM_freeN(me->edit_btmesh); - me->edit_btmesh = NULL; - } - } - else if (ob->type == OB_ARMATURE) { - ED_armature_edit_free(ob->data); - } + + for (Object *ob = bmain->object.first; ob; ob = ob->id.next) { + if (ob->type == OB_MESH) { + Mesh *me = ob->data; + if (me->edit_btmesh) { + EDBM_mesh_free(me->edit_btmesh); + MEM_freeN(me->edit_btmesh); + me->edit_btmesh = NULL; + } + } + else if (ob->type == OB_ARMATURE) { + bArmature *arm = ob->data; + if (arm->edbo) { + ED_armature_edit_free(ob->data); } } } @@ -164,11 +148,16 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render) Object *ob; Main *bmain = CTX_data_main(C); + eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first); + if ((object_mode & (OB_MODE_SCULPT | OB_MODE_EDIT)) == 0) { + return has_edited; + } + /* loop through all data to find edit mode or object mode, because during * exiting we might not have a context for edit object and multiple sculpt * objects can exist at the same time */ for (ob = bmain->object.first; ob; ob = ob->id.next) { - if (ob->mode & OB_MODE_SCULPT) { + if (object_mode & OB_MODE_SCULPT) { /* Don't allow flushing while in the middle of a stroke (frees data in use). * Auto-save prevents this from happening but scripts may cause a flush on saving: T53986. */ if ((ob->sculpt && ob->sculpt->cache) == 0) { @@ -187,7 +176,7 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render) } } } - else if (ob->mode & OB_MODE_EDIT) { + else if (object_mode & OB_MODE_EDIT) { /* get editmode results */ has_edited = true; ED_object_editmode_load(ob); @@ -317,16 +306,28 @@ void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *ar, void *arg_info { wmWindow *win = CTX_wm_window(C); const float *mval_src = (float *)arg_info; - const int mval_dst[2] = {win->eventstate->x - ar->winrct.xmin, - win->eventstate->y - ar->winrct.ymin}; - - UI_ThemeColor(TH_VIEW_OVERLAY); - setlinestyle(3); - glBegin(GL_LINES); - glVertex2iv(mval_dst); - glVertex2fv(mval_src); - glEnd(); - setlinestyle(0); + const float mval_dst[2] = {win->eventstate->x - ar->winrct.xmin, + win->eventstate->y - ar->winrct.ymin}; + + const uint shdr_pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); + + float viewport_size[4]; + glGetFloatv(GL_VIEWPORT, viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); + + immUniform1i("num_colors", 0); /* "simple" mode */ + immUniformThemeColor(TH_VIEW_OVERLAY); + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_factor", 0.5f); + + immBegin(GWN_PRIM_LINES, 2); + immVertex2fv(shdr_pos, mval_src); + immVertex2fv(shdr_pos, mval_dst); + immEnd(); + + immUnbindProgram(); } /** |