From 2b0f02057f457acec1ed9444ee7d833ab26d0d33 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 3 May 2017 00:45:10 +1000 Subject: Draw Manager: split DRW_draw_view into 2 functions Needed for offscreen render --- source/blender/blenkernel/BKE_context.h | 1 + source/blender/blenkernel/intern/context.c | 14 +++++--- source/blender/draw/DRW_engine.h | 4 +++ source/blender/draw/intern/draw_manager.c | 51 ++++++++++++++++++++++-------- 4 files changed, 52 insertions(+), 18 deletions(-) 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; -- cgit v1.2.3