Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-04-26 18:43:05 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-04-26 18:43:05 +0300
commit7631f4bf6dc848c9df28dda60d0aff9bdf26b53e (patch)
treedf748c27f45951bc9a8846cdab85611fa77b5973 /source
parentf59d3a7b0cab84ec0646ec1aa341400ba99cb4d3 (diff)
Draw Manager: use engine drawing for depth drawing
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/DRW_engine.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c78
-rw-r--r--source/blender/draw/modes/object_mode.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c12
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();