From 6931a6f3bd282b42d6d5f88c0d9763eccbb487bd Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 31 Aug 2021 12:51:28 +0200 Subject: Cleanup: Moved DRW_vieport_colormanagement_set to draw_color_management. --- .../blender/draw/intern/draw_color_management.cc | 79 +++++++++++++++++++ source/blender/draw/intern/draw_color_management.h | 4 + source/blender/draw/intern/draw_manager.c | 88 +--------------------- 3 files changed, 85 insertions(+), 86 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/intern/draw_color_management.cc b/source/blender/draw/intern/draw_color_management.cc index bd851dc4ba7..42843d38b00 100644 --- a/source/blender/draw/intern/draw_color_management.cc +++ b/source/blender/draw/intern/draw_color_management.cc @@ -31,6 +31,8 @@ #include "GPU_matrix.h" #include "GPU_texture.h" +#include "DNA_space_types.h" + #include "BKE_colortools.h" #include "IMB_colormanagement.h" @@ -41,6 +43,83 @@ /** \name Color Management * \{ */ +void DRW_viewport_colormanagement_set(GPUViewport *viewport, DRWContextState *draw_ctx) +{ + const Scene *scene = draw_ctx->scene; + const View3D *v3d = draw_ctx->v3d; + + const ColorManagedDisplaySettings *display_settings = &scene->display_settings; + ColorManagedViewSettings view_settings; + float dither = 0.0f; + + bool use_render_settings = false; + bool use_view_transform = false; + + 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); + } + 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; + } + } + 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; + } + } + else { + use_render_settings = true; + use_view_transform = false; + } + + if (use_render_settings) { + /* Use full render settings, for renders with scene lighting. */ + view_settings = scene->view_settings; + dither = scene->r.dither_intensity; + } + 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; + } + 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); + } + + GPU_viewport_colorspace_set(viewport, &view_settings, display_settings, dither); +} + /* 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 771da80e120..df701eb526b 100644 --- a/source/blender/draw/intern/draw_color_management.h +++ b/source/blender/draw/intern/draw_color_management.h @@ -26,7 +26,11 @@ extern "C" { #endif +struct GPUViewport; + void DRW_transform_none(struct GPUTexture *tex); +void DRW_viewport_colormanagement_set(struct GPUViewport *viewport, + struct DRWContextState *draw_ctx); #ifdef __cplusplus } diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 294ac6d8d2b..1ed2b4005ee 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -311,90 +311,6 @@ struct DupliObject *DRW_object_get_dupli(const Object *UNUSED(ob)) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Color Management - * \{ */ - -/* TODO(fclem): This should be a render engine callback to determine if we need CM or not. */ -static void drw_viewport_colormanagement_set(void) -{ - Scene *scene = DST.draw_ctx.scene; - View3D *v3d = DST.draw_ctx.v3d; - - ColorManagedDisplaySettings *display_settings = &scene->display_settings; - ColorManagedViewSettings view_settings; - float dither = 0.0f; - - bool use_render_settings = false; - bool use_view_transform = false; - - 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); - } - 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 = 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; - } - } - 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 = snode->flag; - const bool display_color_channel = (display_channels_mode & SNODE_SHOW_ALPHA) == 0; - if (display_color_channel) { - use_render_settings = true; - } - } - else { - use_render_settings = true; - use_view_transform = false; - } - - if (use_render_settings) { - /* Use full render settings, for renders with scene lighting. */ - view_settings = scene->view_settings; - dither = scene->r.dither_intensity; - } - 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; - } - 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); - } - - GPU_viewport_colorspace_set(DST.viewport, &view_settings, display_settings, dither); -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Viewport (DRW_viewport) * \{ */ @@ -1571,7 +1487,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, drw_context_state_init(); drw_viewport_var_init(); - drw_viewport_colormanagement_set(); + DRW_viewport_colormanagement_set(DST.viewport, &DST.draw_ctx); const int object_type_exclude_viewport = v3d->object_type_exclude_viewport; /* Check if scene needs to perform the populate loop */ @@ -2091,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(); + DRW_viewport_colormanagement_set(DST.viewport, &DST.draw_ctx); /* TODO(jbakker): Only populate when editor needs to draw object. * for the image editor this is when showing UV's. */ -- cgit v1.2.3