[Bf-blender-cvs] [281fb484408] draw-colormanagement: DRW: Color Management: Rework code to accept new color transform needed

Clément Foucault noreply at git.blender.org
Sat Jan 25 01:11:25 CET 2020


Commit: 281fb484408f47fabcce3e94d9ce1324d9bfc41e
Author: Clément Foucault
Date:   Sat Jan 25 01:11:04 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rB281fb484408f47fabcce3e94d9ce1324d9bfc41e

DRW: Color Management: Rework code to accept new color transform needed

===================================================================

M	source/blender/draw/intern/draw_color_management.c
M	source/blender/draw/intern/draw_color_management.h

===================================================================

diff --git a/source/blender/draw/intern/draw_color_management.c b/source/blender/draw/intern/draw_color_management.c
index 1313a033146..933fca95190 100644
--- a/source/blender/draw/intern/draw_color_management.c
+++ b/source/blender/draw/intern/draw_color_management.c
@@ -41,45 +41,40 @@
 /** \name Color Management
  * \{ */
 
-/* Use color management profile to draw texture to framebuffer */
-void DRW_transform_to_display(GPUTexture *tex, bool use_view_transform, bool use_render_settings)
+/* Draw texture to framebuffer without any color transforms */
+void DRW_transform_none(GPUTexture *tex)
 {
   drw_state_set(DRW_STATE_WRITE_COLOR);
 
+  GPU_matrix_identity_set();
+  GPU_matrix_identity_projection_set();
+
+  /* Draw as texture for final render (without immediate mode). */
   GPUBatch *geom = DRW_cache_fullscreen_quad_get();
+  GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_IMAGE_COLOR);
+  GPU_batch_uniform_4f(geom, "color", 1.0f, 1.0f, 1.0f, 1.0f);
+  GPU_batch_uniform_1i(geom, "image", 0);
 
-  const float dither = 1.0f;
+  GPU_texture_bind(tex, 0);
+  GPU_batch_draw(geom);
+  GPU_texture_unbind(tex);
+}
 
-  bool use_ocio = false;
+/* Use color management profile to draw texture to framebuffer */
+static void drw_colorspace_transform(GPUTexture *tex,
+                                     ColorManagedViewSettings *view_settings,
+                                     ColorManagedDisplaySettings *display_settings,
+                                     float dither)
+{
+  drw_state_set(DRW_STATE_WRITE_COLOR);
 
-  GPU_matrix_identity_set();
-  GPU_matrix_identity_projection_set();
+  GPUBatch *geom = DRW_cache_fullscreen_quad_get();
 
-  /* Should we apply the view transform */
-  if (DRW_state_do_color_management()) {
-    Scene *scene = DST.draw_ctx.scene;
-    ColorManagedDisplaySettings *display_settings = &scene->display_settings;
-    ColorManagedViewSettings view_settings;
-    if (use_render_settings) {
-      /* Use full render settings, for renders with scene lighting. */
-      view_settings = scene->view_settings;
-    }
-    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);
-    }
-    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);
-    }
+  bool use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
+      view_settings, display_settings, NULL, dither, false);
 
-    use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
-        &view_settings, display_settings, NULL, dither, false);
-  }
+  GPU_matrix_identity_set();
+  GPU_matrix_identity_projection_set();
 
   if (use_ocio) {
     GPU_batch_program_set_imm_shader(geom);
@@ -103,44 +98,64 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_transform, bool use
   GPU_texture_unbind(tex);
 }
 
-/* Draw texture to framebuffer without any color transforms */
-void DRW_transform_none(GPUTexture *tex)
+void DRW_transform_to_display_linear(void)
 {
-  drw_state_set(DRW_STATE_WRITE_COLOR);
-
-  /* Draw as texture for final render (without immediate mode). */
-  GPUBatch *geom = DRW_cache_fullscreen_quad_get();
-  GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_IMAGE_COLOR);
-
-  GPU_texture_bind(tex, 0);
-
-  const float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-  GPU_batch_uniform_4fv(geom, "color", white);
-
-  float mat[4][4];
-  unit_m4(mat);
-  GPU_batch_uniform_mat4(geom, "ModelViewProjectionMatrix", mat);
-
-  GPU_batch_program_use_begin(geom);
-  GPU_batch_bind(geom);
-  GPU_batch_draw_advanced(geom, 0, 0, 0, 0);
-  GPU_batch_program_use_end(geom);
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+  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;
+
+  /* TODO make it match old behavior. */
+  bool use_render_settings = v3d && (v3d->shading.type == OB_RENDER);
+  bool use_view_transform = v3d && (v3d->shading.type >= OB_MATERIAL);
+
+  /* TODO What ocio settings do we need here? */
+  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_texture_unbind(tex);
-}
+  if (DRW_state_do_color_management()) {
+    GPU_framebuffer_bind(dfbl->default_display_fb);
+    drw_colorspace_transform(dtxl->color, &view_settings, display_settings, dither);
 
-void DRW_transform_to_display_linear(void)
-{
-  /* TODO */
+    /* Copy back to default framebuffer. */
+    /* TODO get rid of this hack. */
+    GPU_framebuffer_bind(dfbl->default_fb);
+    DRW_transform_none(dtxl->color_display_space);
+  }
 }
 
 void DRW_transform_to_display_encoded(void)
 {
-  /* TODO */
   DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
   DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+#if 1 /* TODO Placeholder code. */
+  GPU_framebuffer_bind(dfbl->default_display_fb);
+  DRW_transform_none(dtxl->color);
+#else
+  /* TODO What ocio settings do we need here? */
   GPU_framebuffer_bind(dfbl->default_display_fb);
-  DRW_transform_to_display(dtxl->color, true, true);
+  drw_colorspace_transform(dtxl->color, &view_settings, display_settings, dither);
+#endif
 }
 
 /** \} */
diff --git a/source/blender/draw/intern/draw_color_management.h b/source/blender/draw/intern/draw_color_management.h
index efbe4bdc1df..55c4b27e403 100644
--- a/source/blender/draw/intern/draw_color_management.h
+++ b/source/blender/draw/intern/draw_color_management.h
@@ -23,9 +23,6 @@
 #ifndef __DRAW_COLOR_MANAGEMENT_H__
 #define __DRAW_COLOR_MANAGEMENT_H__
 
-void DRW_transform_to_display(struct GPUTexture *tex,
-                              bool use_view_transform,
-                              bool use_render_settings);
 void DRW_transform_none(struct GPUTexture *tex);
 void DRW_transform_to_display_linear(void);
 void DRW_transform_to_display_encoded(void);



More information about the Bf-blender-cvs mailing list