Draw Manager: use engine drawing for depth drawing

This commit is contained in:
Campbell Barton 2017-04-27 01:43:05 +10:00
parent f59d3a7b0c
commit 7631f4bf6d
4 changed files with 90 additions and 4 deletions

View File

@ -66,6 +66,8 @@ void DRW_draw_select_loop(
struct ViewContext *vc, struct Depsgraph *graph,
struct Scene *scene, struct SceneLayer *sl, struct View3D *v3d, struct ARegion *ar,
bool use_obedit_skip, bool use_nearest, const struct rcti *rect);
void DRW_draw_depth_loop(
struct Scene *scene, struct ARegion *ar, struct View3D *v3d);
void DRW_object_engine_data_free(struct Object *ob);

View File

@ -1555,7 +1555,7 @@ bool DRW_viewport_is_persp_get(void)
*/
bool DRW_viewport_is_fbo(void)
{
return (G.f & G_PICKSEL) == 0;
return (DST.default_framebuffer != NULL);
}
/**
@ -2149,6 +2149,82 @@ void DRW_draw_select_loop(
#endif /* USE_GPU_SELECT */
}
/**
* object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing).
*/
void DRW_draw_depth_loop(
Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d = ar->regiondata;
/* backup (_never_ use rv3d->viewport) */
void *backup_viewport = rv3d->viewport;
rv3d->viewport = NULL;
struct GPUViewport *viewport = GPU_viewport_create();
GPU_viewport_size_set(viewport, (const int[2]){ar->winx, ar->winy});
bool cache_is_dirty;
DST.viewport = viewport;
v3d->zbuf = true;
/* Get list of enabled engines */
{
DRW_engines_enable_select();
DRW_engines_enable_from_object_mode();
}
/* Setup viewport */
cache_is_dirty = true;
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
DST.draw_ctx = (DRWContextState){
ar, rv3d, v3d, scene, BKE_scene_layer_context_active(scene), (bContext *)NULL,
};
DRW_viewport_var_init();
/* Update ubos */
DRW_globals_update();
/* Init engines */
DRW_engines_init();
/* TODO : tag to refresh by the deps graph */
/* ideally only refresh when objects are added/removed */
/* or render properties / materials change */
if (cache_is_dirty) {
DRW_engines_cache_init();
DEG_OBJECT_ITER(scene->depsgraph, ob)
{
DRW_engines_cache_populate(ob);
}
DEG_OBJECT_ITER_END
DRW_engines_cache_finish();
}
/* Start Drawing */
DRW_draw_callbacks_pre_scene();
DRW_engines_draw_scene();
DRW_draw_callbacks_post_scene();
DRW_state_reset();
DRW_engines_disable();
/* avoid accidental reuse */
memset(&DST, 0x0, sizeof(DST));
/* Cleanup for selection state */
GPU_viewport_free(viewport);
MEM_freeN(viewport);
/* restore */
rv3d->viewport = backup_viewport;
}
/* ****************************************** OTHER ***************************************** */
void DRW_context_state_init(const bContext *C, DRWContextState *r_draw_ctx)

View File

@ -1271,7 +1271,7 @@ static void OBJECT_draw_scene(void *vedata)
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
float clearcol[4] = {0.0f, 0.0f, 0.0f, 0.0f};
if (!DRW_viewport_is_select()) {
if (DRW_viewport_is_fbo()) {
/* Render filled polygon on a separate framebuffer */
DRW_framebuffer_bind(fbl->outlines);
DRW_framebuffer_clear(true, true, false, clearcol, 1.0f);

View File

@ -818,8 +818,16 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover
v3d->zbuf = true;
glEnable(GL_DEPTH_TEST);
/* temp, calls into view3d_draw_legacy.c */
ED_view3d_draw_depth_loop(scene, ar, v3d);
#ifdef WITH_OPENGL_LEGACY
if (IS_VIEWPORT_LEGACY(vc->v3d)) {
/* temp, calls into view3d_draw_legacy.c */
ED_view3d_draw_depth_loop(scene, ar, v3d);
}
else
#endif /* WITH_OPENGL_LEGACY */
{
DRW_draw_depth_loop(scene, ar, v3d);
}
if (rv3d->rflag & RV3D_CLIPPING) {
ED_view3d_clipping_disable();