Commit: 2b0f02057f457acec1ed9444ee7d833ab26d0d33
Author: Campbell Barton
Date:   Wed May 3 00:45:10 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB2b0f02057f457acec1ed9444ee7d833ab26d0d33

Draw Manager: split DRW_draw_view into 2 functions

Needed for offscreen render

===================================================================

M       source/blender/blenkernel/BKE_context.h
M       source/blender/blenkernel/intern/context.c
M       source/blender/draw/DRW_engine.h
M       source/blender/draw/intern/draw_manager.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_context.h 
b/source/blender/blenkernel/BKE_context.h
index 22368104566..c911d9ec952 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -250,6 +250,7 @@ struct SceneLayer *CTX_data_scene_layer(const bContext *C);
 struct ToolSettings *CTX_data_tool_settings(const bContext *C);
 
 const char *CTX_data_mode_string(const bContext *C);
+int CTX_data_mode_enum_ex(const struct Object *obedit, const struct Object 
*ob);
 int CTX_data_mode_enum(const bContext *C);
 
 void CTX_data_main_set(bContext *C, struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/context.c 
b/source/blender/blenkernel/intern/context.c
index 20a3d4ac7e0..6ca9b1dab04 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -953,10 +953,9 @@ SceneCollection *CTX_data_scene_collection(const bContext 
*C)
        return BKE_collection_master(scene);
 }
 
-int CTX_data_mode_enum(const bContext *C)
+int CTX_data_mode_enum_ex(const Object *obedit, const Object *ob)
 {
-       Object *obedit = CTX_data_edit_object(C);
-
+       // Object *obedit = CTX_data_edit_object(C);
        if (obedit) {
                switch (obedit->type) {
                        case OB_MESH:
@@ -976,8 +975,7 @@ int CTX_data_mode_enum(const bContext *C)
                }
        }
        else {
-               Object *ob = CTX_data_active_object(C);
-
+               // Object *ob = CTX_data_active_object(C);
                if (ob) {
                        if (ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
                        else if (ob->mode & OB_MODE_SCULPT) return 
CTX_MODE_SCULPT;
@@ -991,6 +989,12 @@ int CTX_data_mode_enum(const bContext *C)
        return CTX_MODE_OBJECT;
 }
 
+int CTX_data_mode_enum(const bContext *C)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       Object *obact = obedit ? CTX_data_active_object(C) : NULL;
+       return CTX_data_mode_enum_ex(obedit, obact);
+}
 
 /* would prefer if we can use the enum version below over this one - Campbell 
*/
 /* must be aligned with above enum  */
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 62dae9b3e7b..6b3aee73229 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -63,6 +63,10 @@ void DRW_engine_viewport_data_size_get(
         int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
 
 void DRW_draw_view(const struct bContext *C);
+
+void DRW_draw_render_loop(
+        struct Depsgraph *graph,
+        struct View3D *v3d, struct ARegion *ar);
 void DRW_draw_select_loop(
         struct Depsgraph *graph,
         struct View3D *v3d, struct ARegion *ar,
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index d6c86d82291..f116ecbc8b4 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2003,10 +2003,9 @@ static void DRW_engines_enable_external(void)
        use_drw_engine(DRW_engine_viewport_external_type.draw_engine);
 }
 
-static void DRW_engines_enable(const bContext *C)
+static void DRW_engines_enable(const Scene *scene, SceneLayer *sl)
 {
-       Scene *scene = CTX_data_scene(C);
-       const int mode = CTX_data_mode_enum(C);
+       const int mode = CTX_data_mode_enum_ex(scene->obedit, OBACT_NEW);
        DRW_engines_enable_from_engine(scene);
        DRW_engines_enable_from_object_mode();
        DRW_engines_enable_from_mode(mode);
@@ -2179,20 +2178,40 @@ static void DRW_debug_gpu_stats(void)
  * for each relevant engine / mode engine. */
 void DRW_draw_view(const bContext *C)
 {
-       bool cache_is_dirty;
-       RegionView3D *rv3d = CTX_wm_region_view3d(C);
+       struct Depsgraph *graph = CTX_data_depsgraph(C);
+       ARegion *ar = CTX_wm_region(C);
+//     RegionView3D *rv3d = ar->regiondata;
        View3D *v3d = CTX_wm_view3d(C);
+
+       DST.draw_ctx.evil_C = C;
+
+       DRW_draw_render_loop(graph, v3d, ar);
+}
+
+void DRW_draw_render_loop(
+        struct Depsgraph *graph,
+        View3D *v3d, ARegion *ar)
+{
+       Scene *scene = DAG_get_scene(graph);
+       SceneLayer *sl = DAG_get_scene_layer(graph);
+       RegionView3D *rv3d = ar->regiondata;
+
+       bool cache_is_dirty;
        DST.viewport = rv3d->viewport;
        v3d->zbuf = true;
 
        /* Get list of enabled engines */
-       DRW_engines_enable(C);
+       DRW_engines_enable(scene, sl);
 
        /* Setup viewport */
        cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, 
DRW_engines_get_hash());
 
-       /* Save context for all later needs */
-       DRW_context_state_init(C, &DST.draw_ctx);
+       DST.draw_ctx = (DRWContextState){
+               ar, rv3d, v3d, scene, sl,
+               /* reuse if caller sets */
+               DST.draw_ctx.evil_C,
+       };
+
        DRW_viewport_var_init();
 
        /* Update ubos */
@@ -2207,7 +2226,6 @@ void DRW_draw_view(const bContext *C)
        if (cache_is_dirty) {
                DRW_engines_cache_init();
 
-               Depsgraph *graph = CTX_data_depsgraph(C);
                DEG_OBJECT_ITER(graph, ob);
                {
                        DRW_engines_cache_populate(ob);
@@ -2221,21 +2239,27 @@ void DRW_draw_view(const bContext *C)
        DRW_engines_draw_background();
 
        DRW_draw_callbacks_pre_scene();
-       ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_PRE_VIEW);
+       if (DST.draw_ctx.evil_C) {
+               ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, 
REGION_DRAW_PRE_VIEW);
+       }
 
        DRW_engines_draw_scene();
 
        DRW_draw_callbacks_post_scene();
-       ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
+       if (DST.draw_ctx.evil_C) {
+               ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, 
REGION_DRAW_POST_VIEW);
+       }
 
        DRW_engines_draw_text();
 
        /* needed so manipulator isn't obscured */
        glClear(GL_DEPTH_BUFFER_BIT);
 
-       DRW_draw_manipulator();
+       if (DST.draw_ctx.evil_C) {
+               DRW_draw_manipulator();
 
-       DRW_draw_region_info();
+               DRW_draw_region_info();
+       }
 
        if (G.debug_value > 20) {
                DRW_debug_cpu_stats();
@@ -2508,6 +2532,7 @@ void DRW_context_state_init(const bContext *C, 
DRWContextState *r_draw_ctx)
        r_draw_ctx->evil_C = C;
 }
 
+
 const DRWContextState *DRW_context_state_get(void)
 {
        return &DST.draw_ctx;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to