BGE: World color management fix
authorThomas Szepe <HG1_public@gmx.net>
Mon, 23 Mar 2015 22:56:46 +0000 (23:56 +0100)
committerThomas Szepe <HG1_public@gmx.net>
Mon, 23 Mar 2015 22:56:46 +0000 (23:56 +0100)
This patch will fix the color management for the mist and global ambient color.
It will remove the old "Color Management" switch in the BGE "Render > Shading" panel and will use the "Display Device" setting in the "Scene > Color Management" panel instead.

Reviewers: moguri, brecht

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D154

release/scripts/startup/bl_ui/properties_game.py
source/blender/gpu/intern/gpu_material.c
source/blender/makesrna/intern/rna_color.c
source/gameengine/Converter/BL_BlenderDataConversion.cpp
source/gameengine/Converter/BlenderWorldInfo.cpp
source/gameengine/Converter/BlenderWorldInfo.h

index 8ef9a083104d7fb0ac551462dd4a6a48bcd9ca11..84ad2426aa0955e0a36847aceaee595e476fc79d 100644 (file)
@@ -397,7 +397,6 @@ class RENDER_PT_game_shading(RenderButtonsPanel, Panel):
             col.prop(gs, "use_glsl_lights", text="Lights")
             col.prop(gs, "use_glsl_shaders", text="Shaders")
             col.prop(gs, "use_glsl_shadows", text="Shadows")
-            col.prop(gs, "use_glsl_color_management", text="Color Management")
 
             col = split.column()
             col.prop(gs, "use_glsl_ramps", text="Ramps")
index 480972d161f85bd6885db82ebef9aa67daab5419..4d46ef3af7b4d5e3e435a4647d6dbd7b66e15f08 100644 (file)
@@ -452,7 +452,7 @@ bool GPU_material_do_color_management(GPUMaterial *mat)
        if (!BKE_scene_check_color_management_enabled(mat->scene))
                return false;
 
-       return !((mat->scene->gm.flag & GAME_GLSL_NO_COLOR_MANAGEMENT));
+       return true;
 }
 
 bool GPU_material_use_new_shading_nodes(GPUMaterial *mat)
index 5e114a51ceb0eacb586254d7305dd1283591e1e2..e6193b31260d9704d6a8523d7bb5fc3ece6823be 100644 (file)
@@ -447,6 +447,7 @@ static void rna_ColorManagedDisplaySettings_display_device_update(Main *UNUSED(b
 
                IMB_colormanagement_validate_settings(&scene->display_settings, &scene->view_settings);
 
+               DAG_id_tag_update(id, 0);
                WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
        }
 }
index 6e3a321bfdf1ba263038e3b8c63f782298a25d82..3e7e104ed46b5538bd8f712518ab9d4c0572c46e 100644 (file)
@@ -1651,7 +1651,7 @@ static KX_GameObject *gameobject_from_blenderobject(
 
        case OB_FONT:
        {
-               bool do_color_management = !(blenderscene->gm.flag & GAME_GLSL_NO_COLOR_MANAGEMENT);
+               bool do_color_management = BKE_scene_check_color_management_enabled(blenderscene);
                /* font objects have no bounding box */
                gameobj = new KX_FontObject(kxscene,KX_Scene::m_callbacks, rendertools, ob, do_color_management);
 
index 40293d7479b43ce27845e66ab144c044b2806c4b..6daecccf15c755e744bf4b4896717567044b5cc1 100644 (file)
 BlenderWorldInfo::BlenderWorldInfo(Scene *blenderscene, World *blenderworld)
 {
        if (blenderworld) {
+               m_do_color_management = BKE_scene_check_color_management_enabled(blenderscene);
                m_hasworld = true;
                m_hasmist = ((blenderworld->mode) & WO_MIST ? true : false);
                m_misttype = blenderworld->mistype;
                m_miststart = blenderworld->miststa;
                m_mistdistance = blenderworld->mistdist;
                m_mistintensity = blenderworld->misi;
-               copy_v3_v3(m_mistcolor, &blenderworld->horr);
-               copy_v3_v3(m_backgroundcolor, &blenderworld->horr);
-               copy_v3_v3(m_ambientcolor, &blenderworld->ambr);
-
-               if (BKE_scene_check_color_management_enabled(blenderscene)) {
-                       linearrgb_to_srgb_v3_v3(m_mistcolor, m_mistcolor);
-                       linearrgb_to_srgb_v3_v3(m_backgroundcolor, m_backgroundcolor);
-                       linearrgb_to_srgb_v3_v3(m_ambientcolor, m_ambientcolor);
-               }
+               setMistColor(blenderworld->horr, blenderworld->horg, blenderworld->horb);
+               setBackColor(blenderworld->horr, blenderworld->horg, blenderworld->horb);
+               setAmbientColor(blenderworld->ambr, blenderworld->ambg, blenderworld->ambb);
        }
        else {
                m_hasworld = false;
@@ -159,6 +154,13 @@ void BlenderWorldInfo::setBackColor(float r, float g, float b)
        m_backgroundcolor[0] = r;
        m_backgroundcolor[1] = g;
        m_backgroundcolor[2] = b;
+
+       if (m_do_color_management) {
+               linearrgb_to_srgb_v3_v3(m_con_backgroundcolor, m_backgroundcolor);
+       }
+       else {
+               copy_v3_v3(m_con_backgroundcolor, m_backgroundcolor);
+       }
 }
 
 void BlenderWorldInfo::setMistType(short type)
@@ -190,6 +192,13 @@ void BlenderWorldInfo::setMistColor(float r, float g, float b)
        m_mistcolor[0] = r;
        m_mistcolor[1] = g;
        m_mistcolor[2] = b;
+
+       if (m_do_color_management) {
+               linearrgb_to_srgb_v3_v3(m_con_mistcolor, m_mistcolor);
+       }
+       else {
+               copy_v3_v3(m_con_mistcolor, m_mistcolor);
+       }
 }
 
 void BlenderWorldInfo::setAmbientColor(float r, float g, float b)
@@ -197,6 +206,13 @@ void BlenderWorldInfo::setAmbientColor(float r, float g, float b)
        m_ambientcolor[0] = r;
        m_ambientcolor[1] = g;
        m_ambientcolor[2] = b;
+
+       if (m_do_color_management) {
+               linearrgb_to_srgb_v3_v3(m_con_ambientcolor, m_ambientcolor);
+       }
+       else {
+               copy_v3_v3(m_con_ambientcolor, m_ambientcolor);
+       }
 }
 
 void BlenderWorldInfo::UpdateBackGround()
@@ -205,7 +221,7 @@ void BlenderWorldInfo::UpdateBackGround()
                RAS_IRasterizer *m_rasterizer = KX_GetActiveEngine()->GetRasterizer();
 
                if (m_rasterizer->GetDrawingMode() >= RAS_IRasterizer::KX_SOLID) {
-                       m_rasterizer->SetBackColor(m_backgroundcolor);
+                       m_rasterizer->SetBackColor(m_con_backgroundcolor);
                        GPU_horizon_update_color(m_backgroundcolor);
                }
        }
@@ -217,11 +233,11 @@ void BlenderWorldInfo::UpdateWorldSettings()
                RAS_IRasterizer *m_rasterizer = KX_GetActiveEngine()->GetRasterizer();
 
                if (m_rasterizer->GetDrawingMode() >= RAS_IRasterizer::KX_SOLID) {
-                       m_rasterizer->SetAmbientColor(m_ambientcolor);
+                       m_rasterizer->SetAmbientColor(m_con_ambientcolor);
                        GPU_ambient_update_color(m_ambientcolor);
 
                        if (m_hasmist) {
-                               m_rasterizer->SetFog(m_misttype, m_miststart, m_mistdistance, m_mistintensity, m_mistcolor);
+                               m_rasterizer->SetFog(m_misttype, m_miststart, m_mistdistance, m_mistintensity, m_con_mistcolor);
                                GPU_mist_update_values(m_misttype, m_miststart, m_mistdistance, m_mistintensity, m_mistcolor);
                                m_rasterizer->EnableFog(true);
                                GPU_mist_update_enable(true);
index 395e8f723aae569053fe6e7f2f9f63e6c4418489..5c1cbd28104eba15f2fadb9e33018bec7a3931c8 100644 (file)
@@ -51,11 +51,15 @@ class BlenderWorldInfo : public KX_WorldInfo
        float m_mistcolor[3];
        float m_backgroundcolor[3];
        float m_ambientcolor[3];
+       float m_con_mistcolor[3];
+       float m_con_backgroundcolor[3];
+       float m_con_ambientcolor[3];
 
 public:
        BlenderWorldInfo(Scene *blenderscene, World *blenderworld);
        ~BlenderWorldInfo();
 
+       bool m_do_color_management;
        bool hasWorld();
        bool hasMist();
        short getMistType();