Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / util / ed_util.c
index b22ab9d..a829f8c 100644 (file)
@@ -35,6 +35,7 @@
 
 #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 "BKE_global.h"
 #include "BKE_main.h"
 #include "BKE_multires.h"
+#include "BKE_object.h"
 #include "BKE_packedFile.h"
 #include "BKE_paint.h"
 #include "BKE_screen.h"
+#include "BKE_workspace.h"
+#include "BKE_layer.h"
 #include "BKE_undo_system.h"
 
 #include "ED_armature.h"
@@ -71,6 +75,8 @@
 #include "ED_space_api.h"
 #include "ED_util.h"
 
+#include "GPU_immediate.h"
+
 #include "UI_interface.h"
 #include "UI_resources.h"
 
 
 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;
+       wmWindowManager *wm = CTX_wm_manager(C);
 
        if (wm->undo_stack == NULL) {
                wm->undo_stack = BKE_undosys_stack_create();
@@ -103,21 +106,31 @@ void ED_editors_init(bContext *C)
        /* 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;
+       Object *obact = CTX_data_active_object(C);
+       if (obact != NULL) {
+               for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+                       int mode = ob->mode;
 
-                       if (ob == obact && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data)))
-                               ED_object_mode_toggle(C, mode);
+                       if (mode == OB_MODE_OBJECT) {
+                               /* pass */
+                       }
+                       else if (!BKE_object_has_mode_data(ob, mode)) {
+                               /* For multi-edit mode we may already have mode data. */
+                               ID *data = ob->data;
+                               ob->mode = OB_MODE_OBJECT;
+                               if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) {
+                                       ED_object_mode_toggle(C, mode);
+                               }
+                       }
                }
        }
 
        /* image editor paint mode */
-       if (sce) {
-               ED_space_image_paint_update(bmain, wm, sce);
+       {
+               Scene *sce = CTX_data_scene(C);
+               if (sce) {
+                       ED_space_image_paint_update(bmain, wm, sce);
+               }
        }
 
        SWAP(int, reports->flag, reports_flag_prev);
@@ -127,7 +140,6 @@ void ED_editors_init(bContext *C)
 void ED_editors_exit(bContext *C)
 {
        Main *bmain = CTX_data_main(C);
-       Scene *sce;
 
        if (!bmain)
                return;
@@ -142,22 +154,19 @@ void ED_editors_exit(bContext *C)
                }
        }
 
-       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);
                        }
                }
        }
@@ -329,16 +338,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();
 }
 
 /**