Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Wed, 23 Aug 2017 15:07:09 +0000 (01:07 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 23 Aug 2017 15:07:09 +0000 (01:07 +1000)
1  2 
source/blender/editors/space_view3d/view3d_edit.c
source/blender/windowmanager/intern/wm_files.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index fd29658061efbd0b038b082a9f89637548b03437,f560754a7a951cf89a1bd4f0947f315e4cca0739..4dda0f515227de3c8b22d0fa5f1f97f8ac3ef25a
  #include "BKE_scene.h"
  #include "BKE_screen.h"
  #include "BKE_action.h"
 -#include "BKE_depsgraph.h" /* for ED_view3d_camera_lock_sync */
  
 +#include "DEG_depsgraph.h"
  
  #include "BIF_gl.h"
 -#include "BIF_glutil.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
@@@ -78,8 -79,6 +78,8 @@@
  #include "ED_gpencil.h"
  #include "ED_view3d.h"
  
 +#include "DEG_depsgraph_query.h"
 +
  #include "UI_resources.h"
  
  #include "PIL_time.h" /* smoothview */
@@@ -164,7 -163,7 +164,7 @@@ bool ED_view3d_camera_lock_sync(View3D 
  
                        ob_update = v3d->camera;
                        while (ob_update) {
 -                              DAG_id_tag_update(&ob_update->id, OB_RECALC_OB);
 +                              DEG_id_tag_update(&ob_update->id, OB_RECALC_OB);
                                WM_main_add_notifier(NC_OBJECT | ND_TRANSFORM, ob_update);
                                ob_update = ob_update->parent;
                        }
                        ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
                        BKE_object_tfm_protected_restore(v3d->camera, &obtfm, v3d->camera->protectflag | protect_scale_all);
  
 -                      DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
 +                      DEG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
                        WM_main_add_notifier(NC_OBJECT | ND_TRANSFORM, v3d->camera);
                }
  
@@@ -622,8 -621,7 +622,8 @@@ static bool view3d_orbit_calc_center(bC
        bool is_set = false;
  
        Scene *scene = CTX_data_scene(C);
 -      Object *ob_act = OBACT;
 +      SceneLayer *sl = CTX_data_scene_layer(C);
 +      Object *ob_act = OBACT_NEW(sl);
  
        if (ob_act && (ob_act->mode & OB_MODE_ALL_PAINT) &&
            /* with weight-paint + pose-mode, fall through to using calculateTransformCenter */
        }
        else if (ob_act == NULL || ob_act->mode == OB_MODE_OBJECT) {
                /* object mode use boundbox centers */
 -              View3D *v3d = CTX_wm_view3d(C);
                Base *base;
                unsigned int tot = 0;
                float select_center[3];
  
                zero_v3(select_center);
 -              for (base = FIRSTBASE; base; base = base->next) {
 -                      if (TESTBASE(v3d, base)) {
 +              for (base = FIRSTBASE_NEW(sl); base; base = base->next) {
 +                      if (TESTBASE_NEW(base)) {
                                /* use the boundbox if we can */
                                Object *ob = base->object;
  
@@@ -737,18 -736,14 +737,18 @@@ static void viewops_data_create_ex
  
        /* we need the depth info before changing any viewport options */
        if (orbit_mode & VIEWOPS_ORBIT_DEPTH) {
 +              EvaluationContext eval_ctx;
 +              struct Depsgraph *graph = CTX_data_depsgraph(C);
                float fallback_depth_pt[3];
  
 +              CTX_data_eval_ctx(C, &eval_ctx);
 +
                view3d_operator_needs_opengl(C); /* needed for zbuf drawing */
  
                negate_v3_v3(fallback_depth_pt, rv3d->ofs);
  
                vod->use_dyn_ofs = ED_view3d_autodist(
 -                      vod->scene, vod->ar, vod->v3d,
 +                      &eval_ctx, graph, vod->ar, vod->v3d,
                        event->mval, vod->dyn_ofs, true, fallback_depth_pt);
        }
        else {
@@@ -867,9 -862,8 +867,9 @@@ static void viewops_data_create(bContex
  static void viewops_data_free(bContext *C, wmOperator *op)
  {
        ARegion *ar;
 +#if 0
        Paint *p = BKE_paint_get_active_from_context(C);
 -
 +#endif
        if (op->customdata) {
                ViewOpsData *vod = op->customdata;
                ar = vod->ar;
                ar = CTX_wm_region(C);
        }
  
 +#if 0
        if (p && (p->flags & PAINT_FAST_NAVIGATE))
 +#endif
                ED_region_tag_redraw(ar);
  }
  /** \} */
@@@ -1681,7 -1673,7 +1681,7 @@@ static int ndof_orbit_invoke(bContext *
                viewops_data_alloc(C, op);
                viewops_data_create_ex(
                        C, op, event,
-                       viewops_orbit_mode_ex((U.uiflag & USER_ORBIT_SELECTION) != 0, false), false);
+                       false, viewops_orbit_mode_ex((U.uiflag & USER_ORBIT_SELECTION) != 0, false));
                vod = op->customdata;
  
                ED_view3d_smooth_view_force_finish(C, vod->v3d, vod->ar);
@@@ -1750,7 -1742,7 +1750,7 @@@ static int ndof_orbit_zoom_invoke(bCont
                viewops_data_alloc(C, op);
                viewops_data_create_ex(
                        C, op, event,
-                       viewops_orbit_mode_ex((U.uiflag & USER_ORBIT_SELECTION) != 0, false), false);
+                       false, viewops_orbit_mode_ex((U.uiflag & USER_ORBIT_SELECTION) != 0, false));
  
                vod = op->customdata;
  
@@@ -2984,7 -2976,6 +2984,7 @@@ static int view3d_all_exec(bContext *C
        ARegion *ar = CTX_wm_region(C);
        View3D *v3d = CTX_wm_view3d(C);
        Scene *scene = CTX_data_scene(C);
 +      SceneLayer *sl = CTX_data_scene_layer(C);
        Base *base;
        float *curs;
        const bool use_all_regions = RNA_boolean_get(op->ptr, "use_all_regions");
                INIT_MINMAX(min, max);
        }
  
 -      for (base = scene->base.first; base; base = base->next) {
 -              if (BASE_VISIBLE(v3d, base)) {
 +      for (base = sl->object_bases.first; base; base = base->next) {
 +              if (BASE_VISIBLE_NEW(base)) {
                        changed = true;
  
                        if (skip_camera && base->object == v3d->camera) {
@@@ -3069,12 -3060,9 +3069,12 @@@ static int viewselected_exec(bContext *
        ARegion *ar = CTX_wm_region(C);
        View3D *v3d = CTX_wm_view3d(C);
        Scene *scene = CTX_data_scene(C);
 +      SceneLayer *sl = CTX_data_scene_layer(C);
        bGPdata *gpd = CTX_data_gpencil_data(C);
        const bool is_gp_edit = ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE));
 -      Object *ob = OBACT;
 +      const bool is_face_map = ((is_gp_edit == false) && ar->manipulator_map &&
 +                                WM_manipulatormap_is_any_selected(ar->manipulator_map));
 +      Object *ob = OBACT_NEW(sl);
        Object *obedit = CTX_data_edit_object(C);
        float min[3], max[3];
        bool ok = false, ok_dist = true;
        const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
  
        INIT_MINMAX(min, max);
 -
 -      if (is_gp_edit) {
 +      if (is_gp_edit || is_face_map) {
                ob = NULL;
        }
  
                /* hard-coded exception, we look for the one selected armature */
                /* this is weak code this way, we should make a generic active/selection callback interface once... */
                Base *base;
 -              for (base = scene->base.first; base; base = base->next) {
 -                      if (TESTBASELIB(v3d, base)) {
 +              for (base = sl->object_bases.first; base; base = base->next) {
 +                      if (TESTBASELIB_NEW(base)) {
                                if (base->object->type == OB_ARMATURE)
                                        if (base->object->mode & OB_MODE_POSE)
                                                break;
                }
                CTX_DATA_END;
        }
 +      else if (is_face_map) {
 +              ok = WM_manipulatormap_minmax(ar->manipulator_map, true, true, min, max);
 +      }
        else if (obedit) {
                ok = ED_view3d_minmax_verts(obedit, min, max);    /* only selected */
        }
                ok = paintface_minmax(ob, min, max);
        }
        else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
 -              ok = PE_minmax(scene, min, max);
 +              ok = PE_minmax(scene, sl, min, max);
        }
        else if (ob &&
                 (ob->mode & (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)))
        }
        else {
                Base *base;
 -              for (base = FIRSTBASE; base; base = base->next) {
 -                      if (TESTBASE(v3d, base)) {
 +              for (base = FIRSTBASE_NEW(sl); base; base = base->next) {
 +                      if (TESTBASE_NEW(base)) {
  
                                if (skip_camera && base->object == v3d->camera) {
                                        continue;
@@@ -3320,21 -3306,18 +3320,21 @@@ static int viewcenter_pick_invoke(bCont
  {
        View3D *v3d = CTX_wm_view3d(C);
        RegionView3D *rv3d = CTX_wm_region_view3d(C);
 -      Scene *scene = CTX_data_scene(C);
        ARegion *ar = CTX_wm_region(C);
  
        if (rv3d) {
 +              EvaluationContext eval_ctx;
 +              struct Depsgraph *graph = CTX_data_depsgraph(C);
                float new_ofs[3];
                const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
  
 +              CTX_data_eval_ctx(C, &eval_ctx);
 +
                ED_view3d_smooth_view_force_finish(C, v3d, ar);
  
                view3d_operator_needs_opengl(C);
  
 -              if (ED_view3d_autodist(scene, ar, v3d, event->mval, new_ofs, false, NULL)) {
 +              if (ED_view3d_autodist(&eval_ctx, graph, ar, v3d, event->mval, new_ofs, false, NULL)) {
                        /* pass */
                }
                else {
@@@ -3589,10 -3572,10 +3589,10 @@@ void VIEW3D_OT_clear_render_border(wmOp
  
  static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
  {
 +      EvaluationContext eval_ctx;
        ARegion *ar = CTX_wm_region(C);
        View3D *v3d = CTX_wm_view3d(C);
        RegionView3D *rv3d = CTX_wm_region_view3d(C);
 -      Scene *scene = CTX_data_scene(C);
        int gesture_mode;
        const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
  
        float new_ofs[3];
  
        /* ZBuffer depth vars */
 -      bglMats mats;
        float depth_close = FLT_MAX;
 -      double cent[2],  p[3];
 +      float p[3];
  
        /* note; otherwise opengl won't work */
        view3d_operator_needs_opengl(C);
  
 +      CTX_data_eval_ctx(C, &eval_ctx);
 +
        /* get border select values using rna */
        WM_operator_properties_border_to_rcti(op, &rect);
  
        ED_view3d_dist_range_get(v3d, dist_range);
  
        /* Get Z Depths, needed for perspective, nice for ortho */
 -      bgl_get_mats(&mats);
 -      ED_view3d_draw_depth(scene, ar, v3d, true);
 +      ED_view3d_draw_depth(&eval_ctx, CTX_data_depsgraph(C), ar, v3d, true);
        
        {
                /* avoid allocating the whole depth buffer */
                MEM_SAFE_FREE(depth_temp.depths);
        }
  
 -      cent[0] = (((double)rect.xmin) + ((double)rect.xmax)) / 2;
 -      cent[1] = (((double)rect.ymin) + ((double)rect.ymax)) / 2;
 +      float centx = (((float)rect.xmin) + ((float)rect.xmax)) / 2;
 +      float centy = (((float)rect.ymin) + ((float)rect.ymax)) / 2;
  
        if (rv3d->is_persp) {
 -              double p_corner[3];
 +              float p_corner[3];
  
                /* no depths to use, we cant do anything! */
                if (depth_close == FLT_MAX) {
                        return OPERATOR_CANCELLED;
                }
                /* convert border to 3d coordinates */
 -              if ((!gluUnProject(cent[0], cent[1], depth_close,
 -                                 mats.modelview, mats.projection, (GLint *)mats.viewport,
 -                                 &p[0], &p[1], &p[2])) ||
 -                  (!gluUnProject((double)rect.xmin, (double)rect.ymin, depth_close,
 -                                 mats.modelview, mats.projection, (GLint *)mats.viewport,
 -                                 &p_corner[0], &p_corner[1], &p_corner[2])))
 +              if ((!ED_view3d_unproject(ar, centx, centy, depth_close, p)) ||
 +                  (!ED_view3d_unproject(ar, rect.xmin, rect.ymin, depth_close, p_corner)))
                {
                        return OPERATOR_CANCELLED;
                }
  
 -              dvec[0] = p[0] - p_corner[0];
 -              dvec[1] = p[1] - p_corner[1];
 -              dvec[2] = p[2] - p_corner[2];
 -
 -              new_ofs[0] = -p[0];
 -              new_ofs[1] = -p[1];
 -              new_ofs[2] = -p[2];
 +              sub_v3_v3v3(dvec, p, p_corner);
 +              negate_v3_v3(new_ofs, p);
  
                new_dist = len_v3(dvec);
  
                new_dist = rv3d->dist;
  
                /* convert the drawn rectangle into 3d space */
 -              if (depth_close != FLT_MAX && gluUnProject(cent[0], cent[1], depth_close,
 -                                                         mats.modelview, mats.projection, (GLint *)mats.viewport,
 -                                                         &p[0], &p[1], &p[2]))
 +              if (depth_close != FLT_MAX && ED_view3d_unproject(ar, centx, centy, depth_close, p))
                {
 -                      new_ofs[0] = -p[0];
 -                      new_ofs[1] = -p[1];
 -                      new_ofs[2] = -p[2];
 +                      negate_v3_v3(new_ofs, p);
                }
                else {
                        float mval_f[2];
@@@ -3911,7 -3907,6 +3911,7 @@@ static int viewnumpad_exec(bContext *C
        ARegion *ar;
        RegionView3D *rv3d;
        Scene *scene = CTX_data_scene(C);
 +      SceneLayer *sl = CTX_data_scene_layer(C);
        static int perspo = RV3D_PERSP;
        int viewnum, nextperspo;
        bool align_active;
                        /* lastview -  */
  
                        if (rv3d->persp != RV3D_CAMOB) {
 -                              Object *ob = OBACT;
 +                              Object *ob = OBACT_NEW(sl);
  
                                if (!rv3d->smooth_timer) {
                                        /* store settings of current view before allowing overwriting with camera view
@@@ -4640,8 -4635,9 +4640,8 @@@ void ED_view3d_clipping_local(RegionVie
  
  static int view3d_clipping_exec(bContext *C, wmOperator *op)
  {
 +      ARegion *ar = CTX_wm_region(C);
        RegionView3D *rv3d = CTX_wm_region_view3d(C);
 -      ViewContext vc;
 -      bglMats mats;
        rcti rect;
  
        WM_operator_properties_border_to_rcti(op, &rect);
        rv3d->rflag |= RV3D_CLIPPING;
        rv3d->clipbb = MEM_callocN(sizeof(BoundBox), "clipbb");
  
 -      /* note; otherwise opengl won't work */
 -      view3d_operator_needs_opengl(C);
 -
 -      view3d_set_viewcontext(C, &vc);
 -      view3d_get_transformation(vc.ar, vc.rv3d, NULL, &mats); /* NULL because we don't want it in object space */
 -      ED_view3d_clipping_calc(rv3d->clipbb, rv3d->clip, &mats, &rect);
 +      /* NULL object because we don't want it in object space */
 +      ED_view3d_clipping_calc(rv3d->clipbb, rv3d->clip, ar, NULL, &rect);
  
        return OPERATOR_FINISHED;
  }
@@@ -4702,6 -4702,7 +4702,6 @@@ void VIEW3D_OT_clip_border(wmOperatorTy
  /* note: cannot use event->mval here (called by object_add() */
  void ED_view3d_cursor3d_position(bContext *C, float fp[3], const int mval[2])
  {
 -      Scene *scene = CTX_data_scene(C);
        ARegion *ar = CTX_wm_region(C);
        View3D *v3d = CTX_wm_view3d(C);
        RegionView3D *rv3d = ar->regiondata;
        }
  
        if (U.uiflag & USER_ZBUF_CURSOR) {  /* maybe this should be accessed some other way */
 +              EvaluationContext eval_ctx;
 +              struct Depsgraph *graph = CTX_data_depsgraph(C);
 +
 +              CTX_data_eval_ctx(C, &eval_ctx);
 +
                view3d_operator_needs_opengl(C);
 -              if (ED_view3d_autodist(scene, ar, v3d, mval, fp, true, NULL))
 +              if (ED_view3d_autodist(&eval_ctx, graph, ar, v3d, mval, fp, true, NULL)) {
                        depth_used = true;
 +              }
        }
  
        if (depth_used == false) {
@@@ -4810,6 -4805,45 +4810,6 @@@ void VIEW3D_OT_cursor3d(wmOperatorType 
  
  /* ***************** manipulator op ******************* */
  
 -
 -static int manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 -{
 -      View3D *v3d = CTX_wm_view3d(C);
 -
 -      if (!(v3d->twflag & V3D_USE_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
 -      if (!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
 -
 -      /* note; otherwise opengl won't work */
 -      view3d_operator_needs_opengl(C);
 -
 -      if (BIF_do_manipulator(C, event, op) == 0)
 -              return OPERATOR_PASS_THROUGH;
 -
 -      return OPERATOR_FINISHED;
 -}
 -
 -void VIEW3D_OT_manipulator(wmOperatorType *ot)
 -{
 -      PropertyRNA *prop;
 -
 -      /* identifiers */
 -      ot->name = "3D Manipulator";
 -      ot->description = "Manipulate selected item by axis";
 -      ot->idname = "VIEW3D_OT_manipulator";
 -
 -      /* api callbacks */
 -      ot->invoke = manipulator_invoke;
 -
 -      ot->poll = ED_operator_view3d_active;
 -
 -      /* properties to pass to transform */
 -      Transform_Properties(ot, P_CONSTRAINT);
 -
 -      prop = RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the "
 -                             "two axes that have not been clicked (translate/scale only)");
 -      RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN);
 -}
 -
  static int enable_manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
  {
        View3D *v3d = CTX_wm_view3d(C);
@@@ -4913,17 -4947,22 +4913,17 @@@ static float view_autodist_depth_margin
   * \param fallback_depth_pt: Use this points depth when no depth can be found.
   */
  bool ED_view3d_autodist(
 -        Scene *scene, ARegion *ar, View3D *v3d,
 +        const EvaluationContext *eval_ctx, struct Depsgraph *graph, ARegion *ar, View3D *v3d,
          const int mval[2], float mouse_worldloc[3],
          const bool alphaoverride, const float fallback_depth_pt[3])
  {
 -      bglMats mats; /* ZBuffer depth vars */
        float depth_close;
 -      double cent[2],  p[3];
        int margin_arr[] = {0, 2, 4};
        int i;
        bool depth_ok = false;
  
        /* Get Z Depths, needed for perspective, nice for ortho */
 -      ED_view3d_draw_depth(scene, ar, v3d, alphaoverride);
 -
 -      /* call after in case settings have been modified since last drawing, see: T47089 */
 -      bgl_get_mats(&mats);
 +      ED_view3d_draw_depth(eval_ctx, graph, ar, v3d, alphaoverride);
  
        /* Attempt with low margin's first */
        i = 0;
        } while ((depth_ok == false) && (i < ARRAY_SIZE(margin_arr)));
  
        if (depth_ok) {
 -              cent[0] = (double)mval[0] + 0.5;
 -              cent[1] = (double)mval[1] + 0.5;
 +              float centx = (float)mval[0] + 0.5f;
 +              float centy = (float)mval[1] + 0.5f;
  
 -              if (gluUnProject(cent[0], cent[1], depth_close,
 -                               mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2]))
 +              if (ED_view3d_unproject(ar, centx, centy, depth_close, mouse_worldloc))
                {
 -                      mouse_worldloc[0] = (float)p[0];
 -                      mouse_worldloc[1] = (float)p[1];
 -                      mouse_worldloc[2] = (float)p[2];
                        return true;
                }
        }
        }
  }
  
 -void ED_view3d_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode)
 +void ED_view3d_autodist_init(
 +        const EvaluationContext *eval_ctx, struct Depsgraph *graph,
 +        ARegion *ar, View3D *v3d, int mode)
  {
        /* Get Z Depths, needed for perspective, nice for ortho */
        switch (mode) {
                case 0:
 -                      ED_view3d_draw_depth(scene, ar, v3d, true);
 +                      ED_view3d_draw_depth(eval_ctx, graph, ar, v3d, true);
                        break;
                case 1:
 -                      ED_view3d_draw_depth_gpencil(scene, ar, v3d);
 +              {
 +                      Scene *scene = DEG_get_evaluated_scene(graph);
 +                      ED_view3d_draw_depth_gpencil(eval_ctx, scene, ar, v3d);
                        break;
 +              }
        }
  }
  
  bool ED_view3d_autodist_simple(ARegion *ar, const int mval[2], float mouse_worldloc[3],
                                 int margin, float *force_depth)
  {
 -      bglMats mats; /* ZBuffer depth vars, could cache? */
        float depth;
 -      double cent[2],  p[3];
  
        /* Get Z Depths, needed for perspective, nice for ortho */
        if (force_depth)
        if (depth == FLT_MAX)
                return false;
  
 -      cent[0] = (double)mval[0] + 0.5;
 -      cent[1] = (double)mval[1] + 0.5;
 -
 -      bgl_get_mats(&mats);
 -
 -      if (!gluUnProject(cent[0], cent[1], depth,
 -                        mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2]))
 -      {
 -              return false;
 -      }
 -
 -      mouse_worldloc[0] = (float)p[0];
 -      mouse_worldloc[1] = (float)p[1];
 -      mouse_worldloc[2] = (float)p[2];
 -      return true;
 +      float centx = (float)mval[0] + 0.5f;
 +      float centy = (float)mval[1] + 0.5f;
 +      return ED_view3d_unproject(ar, centx, centy, depth, mouse_worldloc);
  }
  
  bool ED_view3d_autodist_depth(ARegion *ar, const int mval[2], int margin, float *depth)
@@@ -5168,7 -5220,6 +5168,7 @@@ void ED_view3d_from_object(Object *ob, 
  void ED_view3d_to_object(Object *ob, const float ofs[3], const float quat[4], const float dist)
  {
        float mat[4][4];
 +
        ED_view3d_to_m4(mat, ofs, quat, dist);
        BKE_object_apply_mat4(ob, mat, true, true);
  }
index 784cdcc97dda4a63c3f7181d9769dac74fb55252,637ace9cd823470df7562d569691cec474dcd72b..3de6824c23df669e6e2475b58235c6f4b6d53adf
@@@ -69,7 -69,6 +69,7 @@@
  #include "DNA_scene_types.h"
  #include "DNA_screen_types.h"
  #include "DNA_windowmanager_types.h"
 +#include "DNA_workspace_types.h"
  
  #include "BKE_appdir.h"
  #include "BKE_utildefines.h"
@@@ -78,6 -77,7 +78,6 @@@
  #include "BKE_blendfile.h"
  #include "BKE_blender_undo.h"
  #include "BKE_context.h"
 -#include "BKE_depsgraph.h"
  #include "BKE_global.h"
  #include "BKE_library.h"
  #include "BKE_main.h"
@@@ -86,7 -86,6 +86,7 @@@
  #include "BKE_sound.h"
  #include "BKE_scene.h"
  #include "BKE_screen.h"
 +#include "BKE_workspace.h"
  
  #include "BLO_readfile.h"
  #include "BLO_writefile.h"
  #include "BPY_extern.h"
  #endif
  
 +#include "DEG_depsgraph.h"
 +
  #include "WM_api.h"
  #include "WM_types.h"
  #include "wm.h"
@@@ -162,7 -159,7 +162,7 @@@ static void wm_window_match_init(bConte
                        CTX_wm_window_set(C, win);  /* needed by operator close callbacks */
                        WM_event_remove_handlers(C, &win->handlers);
                        WM_event_remove_handlers(C, &win->modalhandlers);
 -                      ED_screen_exit(C, win, win->screen);
 +                      ED_screen_exit(C, win, WM_window_get_active_screen(win));
                }
        }
        
@@@ -251,23 -248,16 +251,23 @@@ static void wm_window_match_do(bContex
  
                                /* match oldwm to new dbase, only old files */
                                for (wm = oldwmlist->first; wm; wm = wm->id.next) {
 -                                      
                                        for (win = wm->windows.first; win; win = win->next) {
 +                                              WorkSpace *workspace = WM_window_get_active_workspace(win);
 +
                                                /* all windows get active screen from file */
 -                                              if (screen->winid == 0)
 -                                                      win->screen = screen;
 -                                              else 
 -                                                      win->screen = ED_screen_duplicate(win, screen);
 -                                              
 -                                              BLI_strncpy(win->screenname, win->screen->id.name + 2, sizeof(win->screenname));
 -                                              win->screen->winid = win->winid;
 +                                              if (screen->winid == 0) {
 +                                                      WM_window_set_active_screen(win, workspace, screen);
 +                                              }
 +                                              else {
 +                                                      WorkSpaceLayout *layout_old = WM_window_get_active_layout(win);
 +                                                      WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace, layout_old, win);
 +
 +                                                      WM_window_set_active_layout(win, workspace, layout_new);
 +                                              }
 +
 +                                              bScreen *win_screen = WM_window_get_active_screen(win);
 +                                              BLI_strncpy(win->screenname, win_screen->id.name + 2, sizeof(win->screenname));
 +                                              win_screen->winid = win->winid;
                                        }
                                }
                        }
  }
  
  /* in case UserDef was read, we re-initialize all, and do versioning */
 -static void wm_init_userdef(bContext *C, const bool read_userdef_from_memory)
 +static void wm_init_userdef(Main *bmain, const bool read_userdef_from_memory)
  {
 -      Main *bmain = CTX_data_main(C);
 -
        /* versioning is here */
        UI_init_userdef();
        
@@@ -470,7 -462,7 +470,7 @@@ static void wm_file_read_post(bContext 
        CTX_wm_window_set(C, wm->windows.first);
  
        ED_editors_init(C);
 -      DAG_on_visible_update(CTX_data_main(C), true);
 +      DEG_on_visible_update(CTX_data_main(C), true);
  
  #ifdef WITH_PYTHON
        if (is_startup_file) {
@@@ -588,7 -580,7 +588,7 @@@ bool WM_file_read(bContext *C, const ch
  
                if (retval == BKE_BLENDFILE_READ_OK_USERPREFS) {
                        /* in case a userdef is read from regular .blend */
 -                      wm_init_userdef(C, false);
 +                      wm_init_userdef(G.main, false);
                }
                
                if (retval != BKE_BLENDFILE_READ_FAIL) {
@@@ -746,13 -738,13 +746,13 @@@ int wm_homefile_read
  
        if ((app_template != NULL) && (app_template[0] != '\0')) {
                BKE_appdir_app_template_id_search(app_template, app_template_system, sizeof(app_template_system));
-               BLI_path_join(app_template_config, sizeof(app_template_config), cfgdir, app_template, NULL);
  
                /* Insert template name into startup file. */
  
                /* note that the path is being set even when 'use_factory_settings == true'
                 * this is done so we can load a templates factory-settings */
                if (!use_factory_settings) {
+                       BLI_path_join(app_template_config, sizeof(app_template_config), cfgdir, app_template, NULL);
                        BLI_path_join(filepath_startup, sizeof(filepath_startup), app_template_config, BLENDER_STARTUP_FILE, NULL);
                        if (BLI_access(filepath_startup, R_OK) != 0) {
                                filepath_startup[0] = '\0';
        /* prevent buggy files that had G_FILE_RELATIVE_REMAP written out by mistake. Screws up autosaves otherwise
         * can remove this eventually, only in a 2.53 and older, now its not written */
        G.fileflags &= ~G_FILE_RELATIVE_REMAP;
 -      
 -      if (use_userdef) {
 +
 +      if (use_userdef) {      
                /* check userdef before open window, keymaps etc */
 -              wm_init_userdef(C, read_userdef_from_memory);
 +              wm_init_userdef(CTX_data_main(C), read_userdef_from_memory);
        }
        
        /* match the read WM with current WM */
@@@ -1000,7 -992,7 +1000,7 @@@ static void wm_history_file_update(void
  
  
  /* screen can be NULL */
 -static ImBuf *blend_file_thumb(Scene *scene, bScreen *screen, BlendThumbnail **thumb_pt)
 +static ImBuf *blend_file_thumb(const bContext *C, Scene *scene, SceneLayer *sl, bScreen *screen, BlendThumbnail **thumb_pt)
  {
        /* will be scaled down, but gives some nice oversampling */
        ImBuf *ibuf;
        ARegion *ar = NULL;
        View3D *v3d = NULL;
  
 +      EvaluationContext eval_ctx;
 +
 +      CTX_data_eval_ctx(C, &eval_ctx);
 +
        /* In case we are given a valid thumbnail data, just generate image from it. */
        if (*thumb_pt) {
                thumb = *thumb_pt;
        /* gets scaled to BLEN_THUMB_SIZE */
        if (scene->camera) {
                ibuf = ED_view3d_draw_offscreen_imbuf_simple(
 -                      scene, scene->camera,
 +                      &eval_ctx, scene, sl, scene->camera,
                        BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2,
                        IB_rect, OB_SOLID, false, false, false, R_ALPHAPREMUL, 0, false, NULL,
                        NULL, NULL, err_out);
        }
        else {
                ibuf = ED_view3d_draw_offscreen_imbuf(
 -                      scene, v3d, ar,
 +                      &eval_ctx, scene, sl, v3d, ar,
                        BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2,
                        IB_rect, false, R_ALPHAPREMUL, 0, false, NULL,
                        NULL, NULL, err_out);
@@@ -1144,7 -1132,7 +1144,7 @@@ static int wm_file_write(bContext *C, c
        /* Main now can store a .blend thumbnail, usefull for background mode or thumbnail customization. */
        main_thumb = thumb = CTX_data_main(C)->blen_thumb;
        if ((U.flag & USER_SAVE_PREVIEWS) && BLI_thread_is_main()) {
 -              ibuf_thumb = blend_file_thumb(CTX_data_scene(C), CTX_wm_screen(C), &thumb);
 +              ibuf_thumb = blend_file_thumb(C, CTX_data_scene(C), CTX_data_scene_layer(C), CTX_wm_screen(C), &thumb);
        }
  
        /* operator now handles overwrite checks */
@@@ -1399,7 -1387,7 +1399,7 @@@ static int wm_homefile_write_exec(bCont
        BLI_callback_exec(G.main, NULL, BLI_CB_EVT_SAVE_PRE);
  
        /* check current window and close it if temp */
 -      if (win && win->screen->temp)
 +      if (win && WM_window_is_temp_screen(win))
                wm_window_close(C, wm, win);
  
        /* update keymaps in user preferences */
@@@ -1534,42 -1522,6 +1534,42 @@@ void WM_OT_save_userpref(wmOperatorTyp
        ot->exec = wm_userpref_write_exec;
  }
  
 +static int wm_workspace_configuration_file_write_exec(bContext *C, wmOperator *op)
 +{
 +      Main *bmain = CTX_data_main(C);
 +      char filepath[FILE_MAX];
 +
 +      const char *app_template = U.app_template[0] ? U.app_template : NULL;
 +      const char * const cfgdir = BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, app_template);
 +      if (cfgdir == NULL) {
 +              BKE_report(op->reports, RPT_ERROR, "Unable to create workspace configuration file path");
 +              return OPERATOR_CANCELLED;
 +      }
 +
 +      BLI_path_join(filepath, sizeof(filepath), cfgdir, BLENDER_WORKSPACES_FILE, NULL);
 +      printf("trying to save workspace configuration file at %s ", filepath);
 +
 +      if (BKE_blendfile_workspace_config_write(bmain, filepath, op->reports) != 0) {
 +              printf("ok\n");
 +              return OPERATOR_FINISHED;
 +      }
 +      else {
 +              printf("fail\n");
 +      }
 +
 +      return OPERATOR_CANCELLED;
 +}
 +
 +void WM_OT_save_workspace_file(wmOperatorType *ot)
 +{
 +      ot->name = "Save Workspace Configuration";
 +      ot->idname = "WM_OT_save_workspace_file";
 +      ot->description = "Save workspaces of the current file as part of the user configuration";
 +
 +      ot->invoke = WM_operator_confirm;
 +      ot->exec = wm_workspace_configuration_file_write_exec;
 +}
 +
  static int wm_history_file_read_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
  {
        ED_file_read_bookmarks();
index 21b4b0def3955b074bd7068daa8c4482eef466a1,8bc3f709551b52df929ec268f3be4f49503eb2b3..c847524359a9f679f239eeba88b2bb76215bf863
  
  struct ARegion;
  struct ARegionType;
 +struct bFaceMap;
  struct BMEditMesh;
  struct Base;
 +struct BaseLegacy;
  struct bContext;
  struct BoundBox;
  struct Brush;
@@@ -115,7 -113,6 +115,7 @@@ struct bConstraintOb
  struct bConstraintTarget;
  struct bContextDataResult;
  struct bGPDlayer;
 +struct bFaceMap;
  struct bNode;
  struct bNodeType;
  struct bNodeSocket;
@@@ -133,8 -130,6 +133,8 @@@ struct wmOperator
  struct wmOperatorType;
  struct wmWindow;
  struct wmWindowManager;
 +struct wmManipulatorGroupType;
 +struct wmManipulatorMap;
  
  
  /* -------------------------------------------------------------------- */
  #include "../blender/editors/include/ED_keyframes_edit.h"
  #include "../blender/editors/include/ED_keyframing.h"
  #include "../blender/editors/include/ED_lattice.h"
 +#include "../blender/editors/include/ED_manipulator_library.h"
  #include "../blender/editors/include/ED_mball.h"
  #include "../blender/editors/include/ED_mesh.h"
  #include "../blender/editors/include/ED_node.h"
  #include "../blender/editors/include/ED_object.h"
  #include "../blender/editors/include/ED_particle.h"
  #include "../blender/editors/include/ED_render.h"
 +#include "../blender/editors/include/ED_scene.h"
  #include "../blender/editors/include/ED_screen.h"
  #include "../blender/editors/include/ED_space_api.h"
  #include "../blender/editors/include/ED_text.h"
  #include "../blender/editors/include/UI_resources.h"
  #include "../blender/editors/include/UI_view2d.h"
  #include "../blender/freestyle/FRS_freestyle.h"
 +#include "../blender/gpu/GPU_immediate.h"
 +#include "../blender/gpu/GPU_matrix.h"
  #include "../blender/python/BPY_extern.h"
 +#include "../blender/python/intern/bpy_manipulator_wrap.h"
  #include "../blender/render/extern/include/RE_engine.h"
  #include "../blender/render/extern/include/RE_pipeline.h"
  #include "../blender/render/extern/include/RE_render_ext.h"
  #include "../blender/render/extern/include/RE_shader_ext.h"
 +#include "../blender/draw/DRW_engine.h"
  #include "../blender/windowmanager/WM_api.h"
 +#include "../blender/windowmanager/WM_types.h"
  
  
  /* -------------------------------------------------------------------- */
  
  /* bpy_operator_wrap.h */
  extern void macro_wrapper(struct wmOperatorType *ot, void *userdata);
 -extern void operator_wrapper(struct wmOperatorType *ot, void *userdata);
 +extern void operator_wrapper(struct wmManipulatorGroupType *wgt, void *userdata);
 +
 +/* bpy_widgetgroup_wrap.h */
 +extern void widgetgroup_wrapper(struct wmOperatorType *ot, void *userdata);
 +
  /* bpy_rna.h */
  extern bool pyrna_id_FromPyObject(struct PyObject *obj, struct ID **id);
  extern const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
@@@ -244,7 -228,7 +244,7 @@@ void EDBM_mesh_load(struct Object *ob) 
  void EDBM_mesh_make(struct ToolSettings *ts, struct Object *ob, const bool use_key_index) RET_NONE
  void EDBM_mesh_normals_update(struct BMEditMesh *em) RET_NONE
  void *g_system;
 -bool EDBM_mtexpoly_check(struct BMEditMesh *em) RET_ZERO
 +bool EDBM_uv_check(struct BMEditMesh *em) RET_ZERO
  
  float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, const char *name, const char *viewname) RET_NULL
  float RE_filter_value(int type, float x) RET_ZERO
@@@ -276,7 -260,7 +276,7 @@@ bool ED_texture_context_check_linestyle
  void FRS_free_view_map_cache(void) RET_NONE
  
  /* texture.c */
 -int   multitex_ext(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, short thread, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO
 +int   multitex_ext(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, const short thread, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO
  int multitex_ext_safe(struct Tex *tex, float texvec[3], struct TexResult *texres, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO
  int multitex_nodes(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, const short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex, struct ImagePool *pool) RET_ZERO
  
@@@ -327,12 -311,6 +327,12 @@@ struct MenuType *WM_menutype_find(cons
  void WM_operator_stack_clear(struct wmWindowManager *wm) RET_NONE
  void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot) RET_NONE
  bool WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op) RET_ZERO;
 +void WM_windows_scene_data_sync(const struct ListBase *win_lb, struct Scene *scene) RET_NONE
 +struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager *wm, const struct bScreen *screen) RET_NULL
 +struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) RET_NULL
 +struct Scene *WM_window_get_active_scene(const struct wmWindow *win) RET_NULL
 +void WM_window_change_active_scene(struct Main *bmain, struct bContext *C, struct wmWindow *win, struct Scene *scene_new) RET_NONE
 +bool WM_window_is_temp_screen(const struct wmWindow *win) RET_ZERO
  
  void WM_autosave_init(wmWindowManager *wm) RET_NONE
  void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner) RET_NONE
@@@ -362,39 -340,6 +362,39 @@@ void WM_jobs_callbacks(struct wmJob *jo
  void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *job) RET_NONE
  void WM_report(ReportType type, const char *message) RET_NONE
  
 +void BPY_RNA_manipulatorgroup_wrapper(struct wmManipulatorGroupType *wgt, void *userdata) RET_NONE
 +void BPY_RNA_manipulator_wrapper(struct wmManipulatorType *wgt, void *userdata) RET_NONE
 +
 +PointerRNA *WM_manipulator_set_operator(struct wmManipulator *mpr, struct wmOperatorType *ot, struct IDProperty *properties) RET_NULL
 +const struct wmManipulatorPropertyType *WM_manipulatortype_target_property_find(const struct wmManipulatorType *wt, const char *idname) RET_NULL
 +const struct wmManipulatorType *WM_manipulatortype_find(const char *idname, bool quiet) RET_NULL
 +struct wmManipulator *WM_manipulator_new_ptr(const struct wmManipulatorType *wt, struct wmManipulatorGroup *mgroup, struct PointerRNA *properties) RET_NULL
 +struct wmManipulatorGroupType *WM_manipulatorgrouptype_append_ptr(void (*mnpfunc)(struct wmManipulatorGroupType *, void *), void *userdata) RET_NULL
 +struct wmManipulatorGroupType *WM_manipulatorgrouptype_find(const char *idname, bool quiet) RET_NULL
 +void WM_manipulator_unlink(ListBase *manipulatorlist, struct wmManipulatorMap *mmap, struct wmManipulator *mpr, struct bContext *C) RET_NONE
 +void WM_manipulator_group_type_add_ptr(struct wmManipulatorGroupType *wgt) RET_NONE
 +void WM_manipulator_group_type_add_ptr_ex(struct wmManipulatorGroupType *wgt, struct wmManipulatorMapType *mmap_type) RET_NONE
 +void WM_manipulator_group_type_remove_ptr(struct Main *bmain, struct wmManipulatorGroupType *wgt) RET_NONE
 +void WM_manipulator_name_set(struct wmManipulatorGroup *mgroup, struct wmManipulator *mpr, const char *name) RET_NONE
 +bool WM_manipulator_select_set(struct wmManipulatorMap *mmap, struct wmManipulator *mpr, bool select) RET_ZERO
 +void WM_manipulator_target_property_def_rna_ptr(struct wmManipulator *mpr, const struct wmManipulatorPropertyType *mpr_prop_type, struct PointerRNA *ptr, struct PropertyRNA *prop, int index) RET_NONE
 +void WM_manipulatorgrouptype_free_ptr(struct wmManipulatorGroupType *wt) RET_NONE
 +void WM_manipulatormaptype_group_unlink(struct bContext *C, struct Main *bmain, struct wmManipulatorMapType *mmap_type, const struct wmManipulatorGroupType *wgt) RET_NONE
 +void WM_manipulatortype_append_ptr(void (*mnpfunc)(struct wmManipulatorType *, void *), void *userdata) RET_NONE
 +void WM_manipulatortype_remove_ptr(struct bContext *C, struct Main *bmain, struct wmManipulatorType *wt) RET_NONE
 +
 +void ED_manipulator_draw_preset_box(const struct wmManipulator *mpr, float mat[4][4], int select_id) RET_NONE
 +void ED_manipulator_draw_preset_arrow(const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id) RET_NONE
 +void ED_manipulator_draw_preset_circle(const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id) RET_NONE
 +void ED_manipulator_draw_preset_facemap(const struct bContext *C, const struct wmManipulator *mpr, struct Scene *scene, struct Object *ob, const int facemap, int select_id) RET_NONE
 +
 +struct wmManipulatorMapType *WM_manipulatormaptype_find(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL
 +struct wmManipulatorMapType *WM_manipulatormaptype_ensure(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL
 +struct wmManipulatorMap *WM_manipulatormap_new_from_type(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL
 +void WM_manipulatormaptype_group_init_runtime(
 +        const struct Main *bmain, struct wmManipulatorMapType *mmap_type, struct wmManipulatorGroupType *wgt) RET_NONE
 +const struct ListBase *WM_manipulatormap_group_list(struct wmManipulatorMap *mmap) RET_NULL
 +
  #ifdef WITH_INPUT_NDOF
      void WM_ndof_deadzone_set(float deadzone) RET_NONE
  #endif
@@@ -420,10 -365,8 +420,10 @@@ void ED_armature_edit_bone_remove(struc
  void object_test_constraints(struct Object *owner) RET_NONE
  void ED_armature_ebone_to_mat4(struct EditBone *ebone, float mat[4][4]) RET_NONE
  void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]) RET_NONE
 -void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr) RET_NONE
 +void ED_object_parent(struct Object *ob, struct Object *par, const int type, const char *substr) RET_NONE
  void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con) RET_NONE
 +void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int facenum) RET_NONE
 +void ED_object_facemap_face_remove(struct Object *ob, struct bFaceMap *fmap, int facenum) RET_NONE
  void ED_node_composit_default(const struct bContext *C, struct Scene *scene) RET_NONE
  void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type) RET_ZERO /* XXX this one looks weird */
  void *ED_region_draw_cb_customdata(void *handle) RET_ZERO /* XXX This one looks wrong also */
@@@ -450,6 -393,7 +450,6 @@@ void ED_space_image_scopes_update(cons
  
  void ED_uvedit_get_aspect(struct Scene *scene, struct Object *ob, struct BMesh *em, float *aspx, float *aspy) RET_NONE
  
 -void ED_screen_set_scene(struct bContext *C, struct bScreen *screen, struct Scene *scene) RET_NONE
  struct MovieClip *ED_space_clip_get_clip(struct SpaceClip *sc) RET_NULL
  void ED_space_clip_set_clip(struct bContext *C, struct bScreen *screen, struct SpaceClip *sc, struct MovieClip *clip) RET_NONE
  void ED_space_clip_set_mask(struct bContext *C, struct SpaceClip *sc, struct Mask *mask) RET_NONE
@@@ -470,8 -414,8 +470,8 @@@ void ED_fsmenu_entry_set_path(struct FS
  char *ED_fsmenu_entry_get_name(struct FSMenuEntry *fsentry) RET_NULL
  void ED_fsmenu_entry_set_name(struct FSMenuEntry *fsentry, const char *name) RET_NONE
  
 -struct PTCacheEdit *PE_get_current(struct Scene *scene, struct Object *ob) RET_NULL
 -void PE_current_changed(struct Scene *scene, struct Object *ob) RET_NONE
 +struct PTCacheEdit *PE_get_current(struct Scene *scene, struct SceneLayer *sl, struct Object *ob) RET_NULL
 +void PE_current_changed(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob) RET_NONE
  
  /* rna keymap */
  struct wmKeyMap *WM_keymap_active(struct wmWindowManager *wm, struct wmKeyMap *keymap) RET_NULL
@@@ -510,7 -454,7 +510,7 @@@ bool ANIM_remove_driver(struct ReportLi
  void ED_space_image_release_buffer(struct SpaceImage *sima, struct ImBuf *ibuf, void *lock) RET_NONE
  struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **r_lock) RET_NULL
  void ED_space_image_get_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy) RET_NONE
 -const char *ED_info_stats_string(struct Scene *scene) RET_NULL
 +const char *ED_info_stats_string(struct Scene *scene, struct SceneLayer *sl) RET_NULL
  void ED_area_tag_redraw(struct ScrArea *sa) RET_NONE
  void ED_area_tag_refresh(struct ScrArea *sa) RET_NONE
  void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type, const bool skip_ar_exit) RET_NONE
@@@ -538,16 -482,13 +538,16 @@@ void ED_view3d_from_m4(float mat[4][4]
  struct BGpic *ED_view3D_background_image_new(struct View3D *v3d) RET_NULL
  void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic) RET_NONE
  void ED_view3D_background_image_clear(struct View3D *v3d) RET_NONE
 -void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4], const struct rcti *rect) RET_NONE
 +void ED_view3d_update_viewmat(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4], const struct rcti *rect) RET_NONE
  float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit) RET_ZERO
  void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct View3D *v3d, struct ScrArea *sa) RET_NONE
  void ED_node_shader_default(const struct bContext *C, struct ID *id) RET_NONE
  void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh) RET_NONE
  struct bScreen *ED_screen_animation_playing(const struct wmWindowManager *wm) RET_NULL
 -void ED_base_object_select(struct Base *base, short mode) RET_NONE
 +struct Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm) RET_NULL
 +bool ED_scene_render_layer_delete(struct Main *bmain, Scene *scene, SceneLayer *layer, ReportList *reports) RET_ZERO
 +void ED_base_object_select(struct BaseLegacy *base, short mode) RET_NONE
 +void ED_object_base_select(struct Base *base, short mode) RET_NONE
  bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Object *ob, struct ModifierData *md) RET_ZERO
  struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type) RET_ZERO
  void ED_object_modifier_clear(struct Main *bmain, struct Object *ob) RET_NONE
@@@ -568,7 -509,7 +568,7 @@@ void uiLayoutSetAlignment(uiLayout *lay
  void uiLayoutSetScaleX(struct uiLayout *layout, float scale) RET_NONE
  void uiLayoutSetScaleY(struct uiLayout *layout, float scale) RET_NONE
  void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, int show_labels, float icon_scale) RET_NONE
 -void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base) RET_NONE
 +void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *base) RET_NONE
  void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface) RET_NONE
  void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
  void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
@@@ -594,7 -535,7 +594,7 @@@ int ED_mesh_mirror_spatial_table(struc
  
  float ED_rollBoneToVector(EditBone *bone, const float new_up_axis[3], const bool axis_only) RET_ZERO
  void ED_space_image_get_size(struct SpaceImage *sima, int *width, int *height) RET_NONE
 -bool ED_space_image_check_show_maskedit(struct Scene *scene, struct SpaceImage *sima) RET_ZERO
 +bool ED_space_image_check_show_maskedit(struct SceneLayer *sl, struct SpaceImage *sima) RET_ZERO
  
  bool ED_texture_context_check_world(const struct bContext *C) RET_ZERO
  bool ED_texture_context_check_material(const struct bContext *C) RET_ZERO
@@@ -605,9 -546,9 +605,9 @@@ bool ED_texture_context_check_others(co
  bool ED_text_region_location_from_cursor(SpaceText *st, ARegion *ar, const int cursor_co[2], int r_pixel_co[2]) RET_ZERO
  
  SnapObjectContext *ED_transform_snap_object_context_create(
 -        struct Main *bmain, struct Scene *scene, int flag) RET_NULL
 +        struct Main *bmain, struct Scene *scene, struct SceneLayer *sl, int flag) RET_NULL
  SnapObjectContext *ED_transform_snap_object_context_create_view3d(
 -        struct Main *bmain, struct Scene *scene, int flag,
 +        struct Main *bmain, struct Scene *scene, struct SceneLayer *sl, int flag,
          const struct ARegion *ar, const struct View3D *v3d) RET_NULL
  void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx) RET_NONE
  bool ED_transform_snap_object_project_ray_ex(
          /* return args */
          float r_loc[3], float r_no[3], int *r_index,
          struct Object **r_ob, float r_obmat[4][4]) RET_ZERO
 +void BIF_selectTransformOrientationValue(struct View3D *v3d, int orientation) RET_NONE
  
  void ED_lattice_editlatt_make(struct Object *obedit) RET_NONE
  void ED_lattice_editlatt_load(struct Object *obedit) RET_NONE
@@@ -658,14 -598,6 +658,14 @@@ const char *uiLayoutIntrospect(uiLayou
  void UI_reinit_font(void) RET_NONE
  int UI_rnaptr_icon_get(struct bContext *C, struct PointerRNA *ptr, int rnaicon, const bool big) RET_ZERO
  struct bTheme *UI_GetTheme(void) RET_NULL
 +void UI_GetThemeColor3fv(int colorid, float col[4]) RET_NONE
 +void UI_GetThemeColor4fv(int colorid, float col[4]) RET_NONE
 +void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4]) RET_NONE
 +void UI_GetThemeColorShadeAlpha4fv(int colorid, int coloffset, int alphaoffset, float col[4]) RET_NONE
 +void UI_GetThemeColorBlendShade3fv(int colorid1, int colorid2, float fac, int offset, float col[3]) RET_NONE
 +void UI_GetThemeColorBlendShade4fv(int colorid1, int colorid2, float fac, int offset, float col[4]) RET_NONE
 +void UI_GetThemeColorBlend3ubv(int colorid1, int colorid2, float fac, unsigned char col[3]) RET_NONE
 +void UI_GetThemeColorShadeAlpha4ubv(int colorid, int coloffset, int alphaoffset, unsigned char col[4]) RET_NONE
  
  /* rna template */
  void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *proptypename, const char *text) RET_NONE
@@@ -677,17 -609,6 +677,17 @@@ struct uiLayout *uiTemplateConstraint(s
  void uiTemplatePreview(struct uiLayout *layout, struct bContext *C, struct ID *id, int show_buttons, struct ID *parent,
                         struct MTex *slot, const char *preview_id) RET_NONE
  void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int rows, int cols) RET_NONE
 +void uiTemplateSearch(
 +        uiLayout *layout, struct bContext *C,
 +        PointerRNA *ptr, const char *propname,
 +        PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop) RET_NONE
 +void uiTemplateSearchPreview(
 +        uiLayout *layout, struct bContext *C,
 +        PointerRNA *ptr, const char *propname,
 +        PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop,
 +        const int rows, const int cols) RET_NONE
  void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, int levels, int brush, int neg_slope) RET_NONE
  void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand) RET_NONE
  void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname, PointerRNA *used_ptr, const char *used_propname, int active_layer) RET_NONE
@@@ -710,7 -631,6 +710,7 @@@ void uiTemplateNodeView(struct uiLayou
  void uiTemplateTextureUser(struct uiLayout *layout, struct bContext *C) RET_NONE
  void uiTemplateTextureShow(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop) RET_NONE
  void uiTemplateKeymapItemProperties(struct uiLayout *layout, struct PointerRNA *ptr) RET_NONE
 +void uiTemplateOverrideProperty(struct uiLayout *layout, struct PointerRNA *collection_props_ptr, struct PointerRNA *scene_props_ptr, const char *propname, const char *name, const char *text_ctxt, int translate, int icon, const char *custom_template) RET_NONE
  void uiTemplateMovieClip(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, int compact) RET_NONE
  void uiTemplateMovieclipInformation(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr) RET_NONE
  void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
@@@ -744,7 -664,6 +744,7 @@@ void RE_ReleaseResultImage(struct Rende
  int RE_engine_test_break(struct RenderEngine *engine) RET_ZERO
  void RE_engines_init() RET_NONE
  void RE_engines_exit() RET_NONE
 +void RE_engines_register(struct Main *bmain, RenderEngineType *render_type) RET_NONE
  void RE_engine_report(struct RenderEngine *engine, int type, const char *msg) RET_NONE
  ListBase R_engines = {NULL, NULL};
  void RE_engine_free(struct RenderEngine *engine) RET_NONE
@@@ -753,22 -672,14 +753,22 @@@ void RE_engine_update_memory_stats(stru
  struct RenderEngine *RE_engine_create(struct RenderEngineType *type) RET_NULL
  void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe) RET_NONE
  void RE_FreePersistentData(void) RET_NONE
 -void RE_point_density_cache(struct Scene *scene, struct PointDensity *pd, const bool use_render_params) RET_NONE
 -void RE_point_density_minmax(struct Scene *scene, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]) RET_NONE
 -void RE_point_density_sample(struct Scene *scene, struct PointDensity *pd, int resolution, const bool use_render_params, float *values) RET_NONE
 +void RE_point_density_cache(struct Scene *scene, struct SceneLayer *sl, struct PointDensity *pd, const bool use_render_params) RET_NONE
 +void RE_point_density_minmax(struct Scene *scene, struct SceneLayer *sl, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]) RET_NONE
 +void RE_point_density_sample(struct Scene *scene, struct SceneLayer *sl, struct PointDensity *pd, const int resolution, const bool use_render_params, float *values) RET_NONE
  void RE_point_density_free(struct PointDensity *pd) RET_NONE
  void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, float *age, float *lifetime, float co[3], float *size, float vel[3], float angvel[3]) RET_NONE
  void RE_FreeAllPersistentData(void) RET_NONE
  float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta) RET_ZERO
  void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, struct SceneRenderLayer *srl, const char *name, int channels, const char *chanid, int type) RET_NONE
 +struct SceneLayer *RE_engine_get_scene_layer(struct Render *re) RET_NULL
 +
 +/* Draw */
 +void OBJECT_collection_settings_create(struct IDProperty *properties) RET_NONE
 +void EDIT_MESH_collection_settings_create(struct IDProperty *properties) RET_NONE
 +void EDIT_ARMATURE_collection_settings_create(struct IDProperty *properties) RET_NONE
 +void PAINT_WEIGHT_collection_settings_create(struct IDProperty *properties) RET_NONE
 +void PAINT_VERTEX_collection_settings_create(struct IDProperty *properties) RET_NONE
  
  /* python */
  struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet) RET_NULL
@@@ -788,6 -699,7 +788,7 @@@ void WM_operatortype_append_ptr(void (*
  void WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata) RET_NONE
  void WM_operator_bl_idname(char *to, const char *from) RET_NONE
  void WM_operator_py_idname(char *to, const char *from) RET_NONE
+ bool WM_operator_py_idname_ok_or_report(struct ReportList *reports, const char *classname, const char *idname) RET_ZERO
  int WM_operator_ui_popup(struct bContext *C, struct wmOperator *op, int width, int height) RET_ZERO
  void update_autoflags_fcurve(struct FCurve *fcu, struct bContext *C, struct ReportList *reports, struct PointerRNA *ptr) RET_NONE
  short insert_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, char keytype, short flag) RET_ZERO
@@@ -809,10 -721,10 +810,10 @@@ struct uiLayout *uiLayoutRadial(struct 
  int UI_pie_menu_invoke_from_operator_enum(struct bContext *C, const char *title, const char *opname,
                               const char *propname, const struct wmEvent *event) RET_ZERO
  
 -/* RNA COLLADA dependency                                       */
 -/* XXX (gaia) Why do we need this declaration here?             */
 -/*     The collada header is included anyways further up...     */
 -int collada_export(struct Scene *sce,
 +/* RNA COLLADA dependency */
 +int collada_export(const struct EvaluationContext *eval_ctx,
 +                   struct Scene *sce,
 +                   struct SceneLayer *scene_layer,
                     const char *filepath,
                     int apply_modifiers,
                     BC_export_mesh_type export_mesh_type,
                     int deform_bones_only,
  
                     int active_uv_only,
 -                   BC_export_texture_type export_texture_type,
 +                   int include_material_textures,
                     int use_texture_copies,
  
                     int triangulate,
@@@ -845,7 -757,6 +846,7 @@@ void BPY_RNA_operator_wrapper(struct wm
  void BPY_RNA_operator_macro_wrapper(struct wmOperatorType *ot, void *userdata) RET_NONE
  void BPY_text_free_code(struct Text *text) RET_NONE
  void BPY_id_release(struct ID *id) RET_NONE
 +void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr) RET_NONE
  int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result) RET_ZERO
  void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct) RET_NONE
  float BPY_driver_exec(PathResolvedRNA *anim_rna, struct ChannelDriver *driver, const float evaltime) RET_ZERO /* might need this one! */