[Bf-blender-cvs] [7631f4bf6dc] blender2.8: Draw Manager: use engine drawing for depth drawing

Campbell Barton noreply at git.blender.org
Wed Apr 26 17:39:14 CEST 2017


Commit: 7631f4bf6dc848c9df28dda60d0aff9bdf26b53e
Author: Campbell Barton
Date:   Thu Apr 27 01:43:05 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB7631f4bf6dc848c9df28dda60d0aff9bdf26b53e

Draw Manager: use engine drawing for depth drawing

===================================================================

M	source/blender/draw/DRW_engine.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/editors/space_view3d/view3d_draw.c

===================================================================

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();




More information about the Bf-blender-cvs mailing list