[Bf-blender-cvs] [a3d8ef059cf] blender2.8: Draw Manager: Implement render info for external engines

Dalai Felinto noreply at git.blender.org
Thu May 4 17:00:15 CEST 2017


Commit: a3d8ef059cf831ec032977079a837214e7c92122
Author: Dalai Felinto
Date:   Thu May 4 15:46:09 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBa3d8ef059cf831ec032977079a837214e7c92122

Draw Manager: Implement render info for external engines

This can be used by any engine actually. For example to give feedback
regarding probe caching in Eevee, ....

Unline master, we try to conciliate both the original viewport info
(FPS, view name) and the render info.

Note: I had to split the function in two because the camera alpha
passepartout is handled inside the view3d_draw_region_info function.

Review: Campbell Barton and Clement Foucault.

Thanks to Sergey Sharybin and Pablo Vazquez for some of the design
discussions.

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

M	source/blender/draw/engines/external/external_engine.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/gpu/GPU_viewport.h

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

diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index 7b6b4e51147..6a530cccb6e 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -80,6 +80,7 @@ typedef struct EXTERNAL_Data {
 	EXTERNAL_TextureList *txl;
 	EXTERNAL_PassList *psl;
 	EXTERNAL_StorageList *stl;
+	char info[GPU_INFO_SIZE];
 } EXTERNAL_Data;
 
 /* *********** STATIC *********** */
@@ -138,7 +139,7 @@ static void EXTERNAL_cache_finish(void *UNUSED(vedata))
 {
 }
 
-static void external_draw_scene(void *UNUSED(vedata))
+static void external_draw_scene(void *vedata)
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	Scene *scene = draw_ctx->scene;
@@ -173,6 +174,15 @@ static void external_draw_scene(void *UNUSED(vedata))
 	type->render_to_view(rv3d->render_engine, draw_ctx->evil_C);
 
 	gpuPopProjectionMatrix();
+
+	/* Set render info. */
+	EXTERNAL_Data *data = vedata;
+	if (rv3d->render_engine->text) {
+		BLI_strncpy(data->info, rv3d->render_engine->text, sizeof(data->info));
+	}
+	else {
+		data->info[0] = '\0';
+	}
 }
 
 static void EXTERNAL_draw_scene(void *vedata)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 394f5d8d670..0b694da6c94 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -327,6 +327,9 @@ void DRW_draw_text_cache_queue(struct DRWTextStore *dt);
 void DRW_draw_callbacks_pre_scene(void);
 void DRW_draw_callbacks_post_scene(void);
 
+int DRW_draw_region_engine_info_offset(void);
+void DRW_draw_region_engine_info(void);
+
 void DRW_state_reset_ex(DRWState state);
 void DRW_state_reset(void);
 
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index c64e5b6403b..5b4111ada2c 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -41,6 +41,7 @@
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
+#include "DNA_camera_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_screen_types.h"
 
@@ -64,6 +65,7 @@
 
 #include "RE_engine.h"
 
+#include "UI_interface.h"
 #include "UI_resources.h"
 
 #include "draw_manager_text.h"
@@ -2019,6 +2021,45 @@ static void DRW_engines_draw_text(void)
 	}
 }
 
+/**
+ * Returns the offset required for the drawing of engines info.
+ */
+int DRW_draw_region_engine_info_offset()
+{
+	int offset = 0;
+	for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+		DrawEngineType *engine = link->data;
+		ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+
+		if (data->info[0] != '\0') {
+			offset += UI_UNIT_Y;
+		}
+	}
+	return offset;
+}
+
+/**
+ * Actual drawing;
+ */
+void DRW_draw_region_engine_info()
+{
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	ARegion *ar = draw_ctx->ar;
+	float fill_color[4] = {0.0f, 0.0f, 0.0f, 0.25f};
+
+	UI_GetThemeColor3fv(TH_HIGH_GRAD, fill_color);
+	mul_v3_fl(fill_color, fill_color[3]);
+
+	for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+		DrawEngineType *engine = link->data;
+		ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+
+		if (data->info[0] != '\0') {
+			ED_region_info_draw(ar, data->info, fill_color, true);
+		}
+	}
+}
+
 static void use_drw_engine(DrawEngineType *engine)
 {
 	LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data");
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index c6a0d6ed5b1..b4d0a9309dd 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -61,9 +61,17 @@ void DRW_draw_region_info(void)
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	ARegion *ar = draw_ctx->ar;
+	int offset;
 
 	DRW_draw_cursor();
-	view3d_draw_region_info(draw_ctx->evil_C, ar);
+
+	offset = DRW_draw_region_engine_info_offset();
+
+	view3d_draw_region_info(draw_ctx->evil_C, ar, offset);
+
+	if (offset > 0) {
+		DRW_draw_region_engine_info();
+	}
 }
 
 /* ************************* Grid ************************** */
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index ceb8f69acaf..b54681dfde4 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2311,7 +2311,7 @@ static void view3d_draw_manipulators(const bContext *C, const ARegion *ar)
 /**
 * Information drawn on top of the solid plates and composed data
 */
-void view3d_draw_region_info(const bContext *C, ARegion *ar)
+void view3d_draw_region_info(const bContext *C, ARegion *ar, const int offset)
 {
 	RegionView3D *rv3d = ar->regiondata;
 	View3D *v3d = CTX_wm_view3d(C);
@@ -2325,6 +2325,9 @@ void view3d_draw_region_info(const bContext *C, ARegion *ar)
 	rcti rect;
 	ED_region_visible_rect(ar, &rect);
 
+	/* Leave room for previously drawn info. */
+	rect.ymax -= offset;
+
 	view3d_draw_border(C, ar);
 	view3d_draw_grease_pencil(C);
 
@@ -2400,7 +2403,7 @@ static void view3d_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data
 
 	glDisable(GL_DEPTH_TEST);
 
-	view3d_draw_region_info(C, ar);
+	view3d_draw_region_info(C, ar, 0);
 
 #if VIEW3D_DRAW_DEBUG
 	view3d_draw_debug(C, ar, draw_data);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 8c306176eff..27d03f81109 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -209,7 +209,7 @@ void draw_sim_debug_data(Scene *scene, View3D *v3d, ARegion *ar);
 
 /* view3d_draw.c */
 void view3d_main_region_draw(const struct bContext *C, struct ARegion *ar);
-void view3d_draw_region_info(const struct bContext *C, struct ARegion *ar);
+void view3d_draw_region_info(const struct bContext *C, struct ARegion *ar, const int offset);
 
 void ED_view3d_draw_depth(
         struct Depsgraph *graph,
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index 2585fcae24c..e5acc024ff4 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -39,6 +39,8 @@
 #include "GPU_framebuffer.h"
 #include "GPU_texture.h"
 
+#define GPU_INFO_SIZE 512 /* IMA_MAX_RENDER_TEXT */
+
 typedef struct GPUViewport GPUViewport;
 
 /* All FramebufferLists are just the same pointers with different names */
@@ -65,6 +67,7 @@ typedef struct ViewportEngineData {
 	TextureList *txl;
 	PassList *psl;
 	StorageList *stl;
+	char info[GPU_INFO_SIZE];
 
 	/* we may want to put this elsewhere */
 	struct DRWTextStore *text_draw_cache;




More information about the Bf-blender-cvs mailing list