DRW: Convert common theme color to linear for viewport render
authorClément Foucault <foucault.clem@gmail.com>
Tue, 11 Sep 2018 15:05:07 +0000 (17:05 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Tue, 11 Sep 2018 15:05:16 +0000 (17:05 +0200)
This is not 100% correct (it should use a transfer function depending
on the display profile) but this is already much better than using srgb.

source/blender/draw/intern/draw_common.c
source/blender/draw/intern/draw_common.h

index 4e903b264c67eb7abb285e29014fd628303fcd6b..3d6b2015e4922616717027c08ff7418b74a59031 100644 (file)
@@ -132,6 +132,16 @@ void DRW_globals_update(void)
        ts.sizeEdge = U.pixelsize * (1.0f / 2.0f); /* TODO Theme */
        ts.sizeEdgeFix = U.pixelsize * (0.5f + 2.0f * (2.0f * (MAX2(ts.sizeVertex, ts.sizeEdge)) * (float)M_SQRT1_2));
 
+       /* Color management. */
+       if (DRW_state_is_image_render()) {
+               float *color = ts.UBO_FIRST_COLOR;
+               do {
+                       /* TODO more accurate transform. */
+                       srgb_to_linearrgb_v4(color, color);
+                       color += 4;
+               } while (color != ts.UBO_LAST_COLOR);
+       }
+
        if (globals_ubo == NULL) {
                globals_ubo = DRW_uniformbuffer_create(sizeof(GlobalsUboStorage), &ts);
        }
index c402f63f6a22988a1e02f770c2244d1d595a95f2..da136c8f377d0a5a9cbf4da90f54c5af14ed63c0 100644 (file)
@@ -36,8 +36,12 @@ struct ModifierData;
 struct ParticleSystem;
 struct PTCacheEdit;
 
+#define UBO_FIRST_COLOR colorWire
+#define UBO_LAST_COLOR colorGridAxisZ
+
 /* Used as ubo but colors can be directly referenced as well */
 /* Keep in sync with: common_globals_lib.glsl (globalsBlock) */
+/* NOTE! Also keep all color as vec4 and between UBO_FIRST_COLOR and UBO_LAST_COLOR */
 typedef struct GlobalsUboStorage {
        /* UBOs data needs to be 16 byte aligned (size of vec4) */
        float colorWire[4];
@@ -99,6 +103,8 @@ typedef struct GlobalsUboStorage {
        float colorGridAxisY[4];
        float colorGridAxisZ[4];
 
+       /* NOTE! Put all color before UBO_LAST_COLOR */
+
        /* Pack individual float at the end of the buffer to avoid alignement errors */
        float sizeLampCenter, sizeLampCircle, sizeLampCircleShadow;
        float sizeVertex, sizeEdge, sizeEdgeFix, sizeFaceDot;