From 9f9183ff73b1a85afff14a7c7f8ec053f30e01f9 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Mon, 23 Jul 2012 18:25:20 +0200
Subject: [PATCH 1/5] depth bias

---
 files/materials/shadows.h | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/files/materials/shadows.h b/files/materials/shadows.h
index 9127d28f7..769a4fea7 100644
--- a/files/materials/shadows.h
+++ b/files/materials/shadows.h
@@ -1,13 +1,15 @@
 
+#define FIXED_BIAS 0.005
+
 float depthShadowPCF (shTexture2D shadowMap, float4 shadowMapPos, float2 offset)
 {
     shadowMapPos /= shadowMapPos.w;
     float3 o = float3(offset.xy, -offset.x) * 0.3;
     //float3 o = float3(0,0,0);
-    float c =   (shadowMapPos.z <= shSample(shadowMap, shadowMapPos.xy - o.xy).r) ? 1 : 0; // top left
-    c +=        (shadowMapPos.z <= shSample(shadowMap, shadowMapPos.xy + o.xy).r) ? 1 : 0; // bottom right
-    c +=        (shadowMapPos.z <= shSample(shadowMap, shadowMapPos.xy + o.zy).r) ? 1 : 0; // bottom left
-    c +=        (shadowMapPos.z <= shSample(shadowMap, shadowMapPos.xy - o.zy).r) ? 1 : 0; // top right
+    float c =   (shadowMapPos.z <= FIXED_BIAS + shSample(shadowMap, shadowMapPos.xy - o.xy).r) ? 1 : 0; // top left
+    c +=        (shadowMapPos.z <= FIXED_BIAS + shSample(shadowMap, shadowMapPos.xy + o.xy).r) ? 1 : 0; // bottom right
+    c +=        (shadowMapPos.z <= FIXED_BIAS + shSample(shadowMap, shadowMapPos.xy + o.zy).r) ? 1 : 0; // bottom left
+    c +=        (shadowMapPos.z <= FIXED_BIAS + shSample(shadowMap, shadowMapPos.xy - o.zy).r) ? 1 : 0; // top right
     return c / 4;
 }
 

From a70f93b0244fde6065157d5a827be30af8e3e1e5 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Mon, 23 Jul 2012 20:12:42 +0200
Subject: [PATCH 2/5] fix "Crash when running openmw with --start="XYZ", remove
 HLSL for windows

---
 apps/openmw/mwgui/settingswindow.cpp      | 16 +++++++++-------
 apps/openmw/mwrender/renderingmanager.cpp |  9 +++++++--
 apps/openmw/mwrender/sky.cpp              |  1 +
 apps/openmw/mwrender/water.cpp            |  4 ----
 files/materials/core.h                    |  6 +++++-
 files/materials/objects.shaderset         |  2 +-
 files/materials/terrain.shaderset         |  2 +-
 7 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp
index 4f8ad77c9..599783e42 100644
--- a/apps/openmw/mwgui/settingswindow.cpp
+++ b/apps/openmw/mwgui/settingswindow.cpp
@@ -75,12 +75,9 @@ namespace
         return boost::lexical_cast<std::string>(xaspect) + " : " + boost::lexical_cast<std::string>(yaspect);
     }
 
-    std::string hlslGlsl ()
+    bool hasGLSL ()
     {
-        if (Ogre::Root::getSingleton ().getRenderSystem ()->getName ().find("OpenGL") == std::string::npos)
-            return "hlsl";
-        else
-            return "glsl";
+        return (Ogre::Root::getSingleton ().getRenderSystem ()->getName ().find("OpenGL") != std::string::npos);
     }
 }
 
@@ -389,8 +386,13 @@ namespace MWGui
     {
         std::string val = static_cast<MyGUI::Button*>(_sender)->getCaption();
         if (val == "off")
-            val = hlslGlsl();
-        else if (val == hlslGlsl())
+        {
+            if (hasGLSL ())
+                val = "glsl";
+            else
+                val = "cg";
+        }
+        else if (val == "glsl")
             val = "cg";
         else
             val = "off";
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index b535cb6ae..bcf9f2101 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -46,7 +46,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
     if (Settings::Manager::getString("shader mode", "General") == "")
     {
         if (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") == std::string::npos)
-            Settings::Manager::setString("shader mode", "General", "hlsl");
+            Settings::Manager::setString("shader mode", "General", "cg");
         else
             Settings::Manager::setString("shader mode", "General", "glsl");
     }
@@ -113,6 +113,10 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
 
     sh::Factory::getInstance ().setSharedParameter ("viewportBackground", sh::makeProperty<sh::Vector3> (new sh::Vector3(0,0,0)));
     sh::Factory::getInstance ().setSharedParameter ("waterEnabled", sh::makeProperty<sh::FloatValue> (new sh::FloatValue(0.0)));
+    sh::Factory::getInstance ().setSharedParameter ("waterLevel", sh::makeProperty<sh::FloatValue>(new sh::FloatValue(0)));
+    sh::Factory::getInstance ().setSharedParameter ("waterTimer", sh::makeProperty<sh::FloatValue>(new sh::FloatValue(0)));
+    sh::Factory::getInstance ().setSharedParameter ("windDir_windSpeed", sh::makeProperty<sh::Vector3>(new sh::Vector3(0.5, -0.8, 0.2)));
+    sh::Factory::getInstance ().setSharedParameter ("waterSunFade_sunHeight", sh::makeProperty<sh::Vector2>(new sh::Vector2(1, 0.6)));
 
     applyCompositors();
 
@@ -269,7 +273,8 @@ void RenderingManager::update (float duration){
 
     checkUnderwater();
 
-    mWater->update(duration);
+    if (mWater)
+        mWater->update(duration);
 }
 void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){
     if(store->cell->data.flags & store->cell->HasWater
diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp
index 2a2df7943..aeefb95d1 100644
--- a/apps/openmw/mwrender/sky.cpp
+++ b/apps/openmw/mwrender/sky.cpp
@@ -297,6 +297,7 @@ void SkyManager::create()
         sh::makeProperty<sh::FloatValue>(new sh::FloatValue(0)));
     sh::Factory::getInstance().setSharedParameter ("nightFade",
         sh::makeProperty<sh::FloatValue>(new sh::FloatValue(0)));
+    sh::Factory::getInstance().setSharedParameter ("atmosphereColour", sh::makeProperty<sh::Vector4>(new sh::Vector4(0,0,0,1)));
 
     sh::Factory::getInstance().setTextureAlias ("cloud_texture_1", "");
     sh::Factory::getInstance().setTextureAlias ("cloud_texture_2", "");
diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp
index 3aff334d1..92fc97b3b 100644
--- a/apps/openmw/mwrender/water.cpp
+++ b/apps/openmw/mwrender/water.cpp
@@ -37,10 +37,6 @@ Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cel
 {
     mSky = rend->getSkyManager();
 
-    sh::Factory::getInstance ().setSharedParameter ("windDir_windSpeed", sh::makeProperty<sh::Vector3>(new sh::Vector3(0.5, -0.8, 0.2)));
-    sh::Factory::getInstance ().setSharedParameter ("waterTimer", sh::makeProperty<sh::FloatValue>(new sh::FloatValue(0)));
-    sh::Factory::getInstance ().setSharedParameter ("waterSunFade_sunHeight", sh::makeProperty<sh::Vector2>(new sh::Vector2(1, 0.6)));
-
     mMaterial = MaterialManager::getSingleton().getByName("Water");
 
     mTop = cell->water;
diff --git a/files/materials/core.h b/files/materials/core.h
index 306073a77..6e27d349c 100644
--- a/files/materials/core.h
+++ b/files/materials/core.h
@@ -1,4 +1,8 @@
-#if SH_HLSL == 1 || SH_CG == 1
+#if SH_HLSL == 1
+    #error "HLSL is unsupported"
+#endif
+
+#if SH_CG == 1
 
     #define shTexture2D sampler2D
     #define shSample(tex, coord) tex2D(tex, coord)
diff --git a/files/materials/objects.shaderset b/files/materials/objects.shaderset
index e84368a5b..ccb975fe9 100644
--- a/files/materials/objects.shaderset
+++ b/files/materials/objects.shaderset
@@ -10,6 +10,6 @@ shader_set openmw_objects_fragment
 {
     source objects.shader
     type fragment
-    profiles_cg ps_2_x ps_2_0 ps fp40 arbfp1
+    profiles_cg ps_3_0 ps_2_x ps_2_0 fp40 arbfp1
     profiles_hlsl ps_2_0
 }
diff --git a/files/materials/terrain.shaderset b/files/materials/terrain.shaderset
index 4132b8e9c..be8ecd7d8 100644
--- a/files/materials/terrain.shaderset
+++ b/files/materials/terrain.shaderset
@@ -10,6 +10,6 @@ shader_set terrain_fragment
 {
     source terrain.shader
     type fragment
-    profiles_cg ps_2_x ps_2_0 ps fp40 arbfp1
+    profiles_cg ps_3_0 ps_2_x ps_2_0 fp40 arbfp1
     profiles_hlsl ps_2_0
 }

From 3ebc6fd5904f78e10e04fa749a257ae668ef2fbd Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Mon, 23 Jul 2012 20:50:56 +0200
Subject: [PATCH 3/5] fixed a settings window bug

---
 apps/openmw/mwgui/settingswindow.cpp      | 13 ++++++++-----
 files/mygui/openmw_settings_window.layout |  4 ++--
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp
index 599783e42..3c8e06dc0 100644
--- a/apps/openmw/mwgui/settingswindow.cpp
+++ b/apps/openmw/mwgui/settingswindow.cpp
@@ -419,11 +419,14 @@ namespace MWGui
         else
         {
             // re-enable
-            mWaterShaderButton->setEnabled(true);
-            mReflectObjectsButton->setEnabled(true);
-            mReflectActorsButton->setEnabled(true);
-            mReflectTerrainButton->setEnabled(true);
-            mShadowsEnabledButton->setEnabled(true);
+            if (MWRender::RenderingManager::waterShaderSupported())
+            {
+                mWaterShaderButton->setEnabled(true);
+                mReflectObjectsButton->setEnabled(true);
+                mReflectActorsButton->setEnabled(true);
+                mReflectTerrainButton->setEnabled(true);
+                mShadowsEnabledButton->setEnabled(true);
+            }
 
             Settings::Manager::setBool("shaders", "Objects", true);
             Settings::Manager::setString("shader mode", "General", val);
diff --git a/files/mygui/openmw_settings_window.layout b/files/mygui/openmw_settings_window.layout
index 07c307324..a14606ade 100644
--- a/files/mygui/openmw_settings_window.layout
+++ b/files/mygui/openmw_settings_window.layout
@@ -189,10 +189,10 @@
 
                         </Widget>
 
-                        <Widget type="TextBox" skin="SandText" position="42 200 120 24" align="Left Top">
+                        <Widget type="TextBox" skin="SandText" position="42 135 300 24" align="Left Top">
                             <Property key="Caption" value="Underwater effects (caustics, fog)"/>
                         </Widget>
-                        <Widget type="Button" skin="MW_Button" position="4 200 34 24" align="Left Top" name="UnderwaterButton"/>
+                        <Widget type="Button" skin="MW_Button" position="4 135 34 24" align="Left Top" name="UnderwaterButton"/>
                     </Widget>
 
                     <Widget type="TabItem" skin="" position="4 28 344 272">

From 02a52c0ff1f7f92170ac25e162da9f34a02686a4 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Mon, 23 Jul 2012 21:39:22 +0200
Subject: [PATCH 4/5] fixed some more settings bugs

---
 apps/openmw/mwgui/settingswindow.cpp      | 17 +++++++++++++----
 apps/openmw/mwrender/renderingmanager.cpp |  2 ++
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp
index 3c8e06dc0..f20b72d4a 100644
--- a/apps/openmw/mwgui/settingswindow.cpp
+++ b/apps/openmw/mwgui/settingswindow.cpp
@@ -238,6 +238,12 @@ namespace MWGui
             mReflectTerrainButton->setEnabled(false);
         }
 
+        if (shaders == "off")
+        {
+            mUnderwaterButton->setEnabled (false);
+            mShadowsEnabledButton->setEnabled(false);
+        }
+
         mFullscreenButton->setCaptionWithReplacing(Settings::Manager::getBool("fullscreen", "Video") ? "#{sOn}" : "#{sOff}");
         mVSyncButton->setCaptionWithReplacing(Settings::Manager::getBool("vsync", "Video") ? "#{sOn}": "#{sOff}");
         mFPSButton->setCaptionWithReplacing(fpsLevelToStr(Settings::Manager::getInt("fps", "HUD")));
@@ -409,7 +415,9 @@ namespace MWGui
             mReflectObjectsButton->setEnabled(false);
             mReflectActorsButton->setEnabled(false);
             mReflectTerrainButton->setEnabled(false);
+            mUnderwaterButton->setEnabled(false);
             Settings::Manager::setBool("shader", "Water", false);
+            Settings::Manager::setBool("underwater effect", "Water", false);
 
             // shadows not supported
             mShadowsEnabledButton->setEnabled(false);
@@ -418,6 +426,9 @@ namespace MWGui
         }
         else
         {
+            Settings::Manager::setBool("shaders", "Objects", true);
+            Settings::Manager::setString("shader mode", "General", val);
+/
             // re-enable
             if (MWRender::RenderingManager::waterShaderSupported())
             {
@@ -425,11 +436,9 @@ namespace MWGui
                 mReflectObjectsButton->setEnabled(true);
                 mReflectActorsButton->setEnabled(true);
                 mReflectTerrainButton->setEnabled(true);
-                mShadowsEnabledButton->setEnabled(true);
             }
-
-            Settings::Manager::setBool("shaders", "Objects", true);
-            Settings::Manager::setString("shader mode", "General", val);
+            mUnderwaterButton->setEnabled(true);
+            mShadowsEnabledButton->setEnabled(true);
         }
 
         apply();
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index bcf9f2101..c5449cfba 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -104,6 +104,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
     if (!Settings::Manager::getBool("shaders", "Objects"))
         Settings::Manager::setBool("enabled", "Shadows", false);
 
+    sh::Factory::getInstance ().setShadersEnabled (Settings::Manager::getBool("shaders", "Objects"));
+
     sh::Factory::getInstance ().setGlobalSetting ("mrt_output", useMRT() ? "true" : "false");
     sh::Factory::getInstance ().setGlobalSetting ("fog", "true");
     sh::Factory::getInstance ().setGlobalSetting ("lighting", "true");

From 2d080ce4efef7e6596578acd5537a27240c4d3ca Mon Sep 17 00:00:00 2001
From: Marc Zinnschlag <marc@zpages.de>
Date: Mon, 23 Jul 2012 21:47:53 +0200
Subject: [PATCH 5/5] compile fix

---
 apps/openmw/mwgui/settingswindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp
index f20b72d4a..d8b0c96d7 100644
--- a/apps/openmw/mwgui/settingswindow.cpp
+++ b/apps/openmw/mwgui/settingswindow.cpp
@@ -428,7 +428,7 @@ namespace MWGui
         {
             Settings::Manager::setBool("shaders", "Objects", true);
             Settings::Manager::setString("shader mode", "General", val);
-/
+
             // re-enable
             if (MWRender::RenderingManager::waterShaderSupported())
             {