Draw Manager: use engine drawing for depth drawing
This commit is contained in:
parent
f59d3a7b0c
commit
7631f4bf6d
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue