Draw Manager: split DRW_draw_view into 2 functions

Needed for offscreen render
This commit is contained in:
Campbell Barton 2017-05-03 00:45:10 +10:00
parent 47239b4041
commit 2b0f02057f
Notes: blender-bot 2023-02-14 06:45:14 +01:00
Referenced by commit 24168f72c3, Fix for edit modes (sculpt, weight paint) menus not showing in header
4 changed files with 52 additions and 18 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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,

View File

@ -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;