diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-04-26 18:43:05 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-04-26 18:43:05 +0300 |
commit | 7631f4bf6dc848c9df28dda60d0aff9bdf26b53e (patch) | |
tree | df748c27f45951bc9a8846cdab85611fa77b5973 /source | |
parent | f59d3a7b0cab84ec0646ec1aa341400ba99cb4d3 (diff) |
Draw Manager: use engine drawing for depth drawing
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/DRW_engine.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 78 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 12 |
4 files changed, 90 insertions, 4 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 8d1188cb3b7..e26a66ac7df 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -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); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 7cba39d8bff..0ee69e92375 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -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) diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 2bb0ec06383..7ef188d70a3 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -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); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 4f90c2b5017..5f2e12fd938 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -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(); |