From 1be598ba680657682b42005c709704425d306049 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 31 Aug 2021 14:12:14 +0200 Subject: Cleanup: DRW color management seperated in multiple functions. --- source/blender/draw/intern/DRW_render.h | 8 + .../blender/draw/intern/draw_color_management.cc | 192 ++++++++++++++------- source/blender/draw/intern/draw_color_management.h | 3 +- source/blender/draw/intern/draw_manager.c | 4 +- 4 files changed, 138 insertions(+), 69 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 0aa3fd3b2f7..6639a100af9 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -63,6 +63,10 @@ #include "DEG_depsgraph.h" +#ifdef __cplusplus +extern "C" { +#endif + struct GPUBatch; struct GPUMaterial; struct GPUShader; @@ -774,3 +778,7 @@ typedef struct DRWContextState { } DRWContextState; const DRWContextState *DRW_context_state_get(void); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/draw/intern/draw_color_management.cc b/source/blender/draw/intern/draw_color_management.cc index 42843d38b00..0e39f9ffc81 100644 --- a/source/blender/draw/intern/draw_color_management.cc +++ b/source/blender/draw/intern/draw_color_management.cc @@ -39,87 +39,149 @@ #include "draw_color_management.h" -/* -------------------------------------------------------------------- */ -/** \name Color Management - * \{ */ +namespace blender::draw::color_management { -void DRW_viewport_colormanagement_set(GPUViewport *viewport, DRWContextState *draw_ctx) -{ - const Scene *scene = draw_ctx->scene; - const View3D *v3d = draw_ctx->v3d; +enum class eDRWColorManagementType { + Off = 0, + OnlyViewTransform, + UseRenderSettings, +}; - const ColorManagedDisplaySettings *display_settings = &scene->display_settings; - ColorManagedViewSettings view_settings; - float dither = 0.0f; +static float dither_get(eDRWColorManagementType color_management_type, const Scene *scene) +{ + if (ELEM(color_management_type, + eDRWColorManagementType::OnlyViewTransform, + eDRWColorManagementType::UseRenderSettings)) { + return scene->r.dither_intensity; + } + return 0.0f; +} - bool use_render_settings = false; - bool use_view_transform = false; +static eDRWColorManagementType drw_color_management_type_for_v3d(const Scene *scene, + const View3D *v3d) +{ - if (v3d) { - bool use_workbench = BKE_scene_uses_blender_workbench(scene); - - bool use_scene_lights = (!v3d || - ((v3d->shading.type == OB_MATERIAL) && - (v3d->shading.flag & V3D_SHADING_SCENE_LIGHTS)) || - ((v3d->shading.type == OB_RENDER) && - (v3d->shading.flag & V3D_SHADING_SCENE_LIGHTS_RENDER))); - bool use_scene_world = (!v3d || - ((v3d->shading.type == OB_MATERIAL) && - (v3d->shading.flag & V3D_SHADING_SCENE_WORLD)) || - ((v3d->shading.type == OB_RENDER) && - (v3d->shading.flag & V3D_SHADING_SCENE_WORLD_RENDER))); - use_view_transform = v3d && (v3d->shading.type >= OB_MATERIAL); - use_render_settings = v3d && ((use_workbench && use_view_transform) || use_scene_lights || - use_scene_world); + const bool use_workbench = BKE_scene_uses_blender_workbench(scene); + const bool use_scene_lights = ((v3d->shading.type == OB_MATERIAL) && + (v3d->shading.flag & V3D_SHADING_SCENE_LIGHTS)) || + ((v3d->shading.type == OB_RENDER) && + (v3d->shading.flag & V3D_SHADING_SCENE_LIGHTS_RENDER)); + const bool use_scene_world = ((v3d->shading.type == OB_MATERIAL) && + (v3d->shading.flag & V3D_SHADING_SCENE_WORLD)) || + ((v3d->shading.type == OB_RENDER) && + (v3d->shading.flag & V3D_SHADING_SCENE_WORLD_RENDER)); + + if ((use_workbench && v3d->shading.type == OB_RENDER) || use_scene_lights || use_scene_world) { + return eDRWColorManagementType::UseRenderSettings; } - else if (DST.draw_ctx.space_data && DST.draw_ctx.space_data->spacetype == SPACE_IMAGE) { - SpaceImage *sima = (SpaceImage *)DST.draw_ctx.space_data; - Image *image = sima->image; - - /* Use inverse logic as there isn't a setting for `Color And Alpha`. */ - const eSpaceImage_Flag display_channels_mode = static_cast(sima->flag); - const bool display_color_channel = (display_channels_mode & (SI_SHOW_ALPHA | SI_SHOW_ZBUF)) == - 0; - if (display_color_channel && image && (image->source != IMA_SRC_GENERATED) && - ((image->flag & IMA_VIEW_AS_RENDER) != 0)) { - use_render_settings = true; - } + if (v3d->shading.type >= OB_MATERIAL) { + return eDRWColorManagementType::OnlyViewTransform; } - else if (DST.draw_ctx.space_data && DST.draw_ctx.space_data->spacetype == SPACE_NODE) { - SpaceNode *snode = (SpaceNode *)DST.draw_ctx.space_data; - const eSpaceNode_Flag display_channels_mode = static_cast(snode->flag); - const bool display_color_channel = (display_channels_mode & SNODE_SHOW_ALPHA) == 0; - if (display_color_channel) { - use_render_settings = true; - } + return eDRWColorManagementType::Off; +} + +static eDRWColorManagementType drw_color_management_type_for_space_image(const SpaceImage &sima) +{ + Image *image = sima.image; + + /* Use inverse logic as there isn't a setting for `Color And Alpha`. */ + const eSpaceImage_Flag display_channels_mode = static_cast(sima.flag); + const bool display_color_channel = (display_channels_mode & (SI_SHOW_ALPHA | SI_SHOW_ZBUF)) == 0; + + if (display_color_channel && image && (image->source != IMA_SRC_GENERATED) && + ((image->flag & IMA_VIEW_AS_RENDER) != 0)) { + return eDRWColorManagementType::UseRenderSettings; } - else { - use_render_settings = true; - use_view_transform = false; + return eDRWColorManagementType::Off; +} + +static eDRWColorManagementType drw_color_management_type_for_space_node(const SpaceNode &snode) +{ + const eSpaceNode_Flag display_channels_mode = static_cast(snode.flag); + const bool display_color_channel = (display_channels_mode & SNODE_SHOW_ALPHA) == 0; + if (display_color_channel) { + return eDRWColorManagementType::UseRenderSettings; } + return eDRWColorManagementType::Off; +} - if (use_render_settings) { - /* Use full render settings, for renders with scene lighting. */ - view_settings = scene->view_settings; - dither = scene->r.dither_intensity; +static eDRWColorManagementType drw_color_management_type_get(const Scene *scene, + const View3D *v3d, + const SpaceLink *space_data) +{ + if (v3d) { + return drw_color_management_type_for_v3d(scene, v3d); } - else if (use_view_transform) { - /* Use only view transform + look and nothing else for lookdev without - * scene lighting, as exposure depends on scene light intensity. */ - BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL); - STRNCPY(view_settings.view_transform, scene->view_settings.view_transform); - STRNCPY(view_settings.look, scene->view_settings.look); - dither = scene->r.dither_intensity; + if (space_data) { + switch (space_data->spacetype) { + case SPACE_IMAGE: { + const SpaceImage *sima = static_cast( + static_cast(space_data)); + return drw_color_management_type_for_space_image(*sima); + } + case SPACE_NODE: { + const SpaceNode *snode = static_cast( + static_cast(space_data)); + return drw_color_management_type_for_space_node(*snode); + } + } } - else { - /* For workbench use only default view transform in configuration, - * using no scene settings. */ - BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL); + return eDRWColorManagementType::UseRenderSettings; +} + +static void viewport_settings_apply(GPUViewport *viewport, + const Scene *scene, + const eDRWColorManagementType color_management_type) +{ + const ColorManagedDisplaySettings *display_settings = &scene->display_settings; + ColorManagedViewSettings view_settings; + + switch (color_management_type) { + case eDRWColorManagementType::Off: { + /* For workbench use only default view transform in configuration, + * using no scene settings. */ + BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL); + break; + } + case eDRWColorManagementType::OnlyViewTransform: { + /* Use only view transform + look and nothing else for lookdev without + * scene lighting, as exposure depends on scene light intensity. */ + BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL); + STRNCPY(view_settings.view_transform, scene->view_settings.view_transform); + STRNCPY(view_settings.look, scene->view_settings.look); + break; + } + case eDRWColorManagementType::UseRenderSettings: { + /* Use full render settings, for renders with scene lighting. */ + view_settings = scene->view_settings; + break; + } } + const float dither = dither_get(color_management_type, scene); GPU_viewport_colorspace_set(viewport, &view_settings, display_settings, dither); } +static void viewport_color_management_set(GPUViewport *viewport) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + + const eDRWColorManagementType color_management_type = drw_color_management_type_get( + draw_ctx->scene, draw_ctx->v3d, draw_ctx->space_data); + viewport_settings_apply(viewport, draw_ctx->scene, color_management_type); +} + +} // namespace blender::draw::color_management + +/* -------------------------------------------------------------------- */ +/** \name Color Management + * \{ */ + +void DRW_viewport_colormanagement_set(GPUViewport *viewport) +{ + blender::draw::color_management::viewport_color_management_set(viewport); +} + /* Draw texture to framebuffer without any color transforms */ void DRW_transform_none(GPUTexture *tex) { diff --git a/source/blender/draw/intern/draw_color_management.h b/source/blender/draw/intern/draw_color_management.h index df701eb526b..9be105b88ec 100644 --- a/source/blender/draw/intern/draw_color_management.h +++ b/source/blender/draw/intern/draw_color_management.h @@ -29,8 +29,7 @@ extern "C" { struct GPUViewport; void DRW_transform_none(struct GPUTexture *tex); -void DRW_viewport_colormanagement_set(struct GPUViewport *viewport, - struct DRWContextState *draw_ctx); +void DRW_viewport_colormanagement_set(struct GPUViewport *viewport); #ifdef __cplusplus } diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 1ed2b4005ee..7f850435a64 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1487,7 +1487,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, drw_context_state_init(); drw_viewport_var_init(); - DRW_viewport_colormanagement_set(DST.viewport, &DST.draw_ctx); + DRW_viewport_colormanagement_set(DST.viewport); const int object_type_exclude_viewport = v3d->object_type_exclude_viewport; /* Check if scene needs to perform the populate loop */ @@ -2007,7 +2007,7 @@ void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph, drw_context_state_init(); drw_viewport_var_init(); - DRW_viewport_colormanagement_set(DST.viewport, &DST.draw_ctx); + DRW_viewport_colormanagement_set(DST.viewport); /* TODO(jbakker): Only populate when editor needs to draw object. * for the image editor this is when showing UV's. */ -- cgit v1.2.3