diff options
Diffstat (limited to 'source/blender/draw/intern/draw_color_management.cc')
-rw-r--r-- | source/blender/draw/intern/draw_color_management.cc | 79 |
1 files changed, 79 insertions, 0 deletions
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<eSpaceImage_Flag>(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<eSpaceNode_Flag>(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) { |