[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