Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2021-08-31 13:51:28 +0300
committerJeroen Bakker <jeroen@blender.org>2021-08-31 14:26:13 +0300
commit6931a6f3bd282b42d6d5f88c0d9763eccbb487bd (patch)
treea6c81e5173d3241c257f454e45423a1477e06b0f
parent63dc286b016060950c69ebc8f8cbfcd2febd563b (diff)
Cleanup: Moved DRW_vieport_colormanagement_set to draw_color_management.
-rw-r--r--source/blender/draw/intern/draw_color_management.cc79
-rw-r--r--source/blender/draw/intern/draw_color_management.h4
-rw-r--r--source/blender/draw/intern/draw_manager.c88
3 files changed, 85 insertions, 86 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)
{
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
@@ -312,90 +312,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. */