diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index b9313b2d6d997ed0f64e40718e41f243862953b3..dbf9ce5bbc39da3573fb4482258c349d3ab6b5e9 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 f47e997ae081a06f7e95277c229a372c1e50cb32..53be9d7c6210c145cdca18578f538b99ff841e55 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 6e1f8b5968896141a58de57b1e79b163fe08634b..3b8e1fa388b67ea0c51be27676b437875c0e7aa6 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 f7899f7156a4969f158bff402b7f9f6d8aee3f0c..fde6ad665d0ce3537bf9c97d5e3d26d1055bb62a 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 f127ee28fddcf37df4759542c67fea038ae2386e..62630ced64dd95afd7b36957e2a97d6f35a3ba61 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 2d7819565c59158fc80272ce19bc059e7dfaeb9f..2c888d9e5a57d8dfbd983e9932035d98f30178be 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;