Draw Manager: split DRW_draw_view into 2 functions
Needed for offscreen render
This commit is contained in:
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
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue