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.
This commit is contained in:
Dalai Felinto 2017-05-04 15:46:09 +02:00
parent 6ea45da05c
commit a3d8ef059c
Notes: blender-bot 2023-02-14 07:00:21 +01:00
Referenced by issue #51391, Fix Cycles render stats on render preview
7 changed files with 73 additions and 5 deletions

View File

@ -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)

View File

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

View File

@ -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");

View File

@ -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 ************************** */

View File

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

View File

@ -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,

View File

@ -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;