From d11ad124232256e4824eda056b29868be0d0e845 Mon Sep 17 00:00:00 2001
From: Ansgar Philippsen <ansgar.philippsen@gmail.com>
Date: Tue, 10 Jul 2012 15:38:04 -0400
Subject: [PATCH] added gfx ao size property

---
 modules/gfx/pymod/export_scene.cc      |  1 +
 modules/gfx/src/impl/scene_fx.cc       |  2 ++
 modules/gfx/src/impl/scene_fx.hh       |  1 +
 modules/gfx/src/scene.cc               | 18 ++++++++++++++++++
 modules/gfx/src/scene.hh               |  4 ++++
 modules/gfx/src/shader/amboccl_fs.glsl |  3 ++-
 6 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index b9313b2d6..dbf9ce5bb 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -217,6 +217,7 @@ void export_Scene()
     .def("SetAmbientOcclusionQuality",&Scene::SetAmbientOcclusionQuality)
     .add_property("ambient_occlusion_quality",&Scene::GetAmbientOcclusionQuality,&Scene::SetAmbientOcclusionQuality)
     .add_property("ao_quality",&Scene::GetAmbientOcclusionQuality,&Scene::SetAmbientOcclusionQuality)
+    .add_property("ao_size",&Scene::GetAmbientOcclusionSize,&Scene::SetAmbientOcclusionSize)
     .def("AttachObserver",&Scene::AttachObserver)
     .def("StartOffscreenMode",&Scene::StartOffscreenMode)
     .def("StopOffscreenMode",&Scene::StopOffscreenMode)
diff --git a/modules/gfx/src/impl/scene_fx.cc b/modules/gfx/src/impl/scene_fx.cc
index f47e997ae..53be9d7c6 100644
--- a/modules/gfx/src/impl/scene_fx.cc
+++ b/modules/gfx/src/impl/scene_fx.cc
@@ -35,6 +35,7 @@ SceneFX::SceneFX():
   amb_occl_factor(1.0),
   amb_occl_mode(1),
   amb_occl_quality(1),
+  amb_occl_size(20.0),
   use_beacon(false),
   beacon(),
   scene_tex_id_(),
@@ -506,6 +507,7 @@ void SceneFX::prep_amb_occlusion()
   glUniform1i(glGetUniformLocation(cpr,"norm_map"),1);
   glUniform1i(glGetUniformLocation(cpr,"kernel"),2);
   glUniform1f(glGetUniformLocation(cpr,"step"),1.0/static_cast<float>(kernel_size_));
+  glUniform1f(glGetUniformLocation(cpr,"size"),amb_occl_size);
   glUniform2f(glGetUniformLocation(cpr,"i_vp"),1.0/static_cast<float>(width),1.0/static_cast<float>(height));
   glUniform1i(glGetUniformLocation(cpr,"mode"),amb_occl_mode);
   double pm[16];
diff --git a/modules/gfx/src/impl/scene_fx.hh b/modules/gfx/src/impl/scene_fx.hh
index 6e1f8b596..3b8e1fa38 100644
--- a/modules/gfx/src/impl/scene_fx.hh
+++ b/modules/gfx/src/impl/scene_fx.hh
@@ -65,6 +65,7 @@ public:
   float amb_occl_factor;
   uint amb_occl_mode;
   uint amb_occl_quality;
+  float amb_occl_size;
   bool use_beacon;
   Beacon beacon;
 
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index f7899f715..fde6ad665 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -313,6 +313,24 @@ uint Scene::GetAmbientOcclusionQuality() const
 #endif
 }
 
+void Scene::SetAmbientOcclusionSize(float f)
+{
+#if OST_SHADER_SUPPORT_ENABLED
+  impl::SceneFX::Instance().amb_occl_size=f;
+  // the redraw routine will deal with the Shader
+  RequestRedraw();
+#endif
+}
+
+float Scene::GetAmbientOcclusionSize() const
+{
+#if OST_SHADER_SUPPORT_ENABLED
+  return impl::SceneFX::Instance().amb_occl_size;
+#else
+  return 1.0;
+#endif
+}
+
 void Scene::SetShadingMode(const std::string& smode)
 {
 #if OST_SHADER_SUPPORT_ENABLED
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index f127ee28f..62630ced6 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -137,6 +137,10 @@ class DLLEXPORT_OST_GFX Scene {
   void SetAmbientOcclusionQuality(uint q);
   /// experimental feature
   uint GetAmbientOcclusionQuality() const;
+  /// experimental feature
+  void SetAmbientOcclusionSize(float f);
+  /// experimental feature
+  float GetAmbientOcclusionSize() const;
   
   /// \brief select shading mode
   /// one of fallback, basic, default, hf, toon1, toon2
diff --git a/modules/gfx/src/shader/amboccl_fs.glsl b/modules/gfx/src/shader/amboccl_fs.glsl
index 2d7819565..2c888d9e5 100644
--- a/modules/gfx/src/shader/amboccl_fs.glsl
+++ b/modules/gfx/src/shader/amboccl_fs.glsl
@@ -2,6 +2,7 @@ uniform sampler2D depth_map;
 uniform sampler2D norm_map;
 uniform sampler1D kernel;
 uniform float step;
+uniform float size;
 uniform vec2 i_vp;
 uniform vec4 abcd;
 uniform int mode;
@@ -66,7 +67,7 @@ void main()
   float i;
   float sum=0.0;
   for(i=0.0;i<1.0;i+=step) {
-    vec2 nn=texture1D(kernel,i).xy*40.0-20.0;
+    vec2 nn=(texture1D(kernel,i).xy-0.5)*size;
     sum+=ao(nn,depth_p,norm_p,t_pos_p);
   }
   sum*=step;
-- 
GitLab