diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index cd7a902a292b4cc2dafe1172ed5d479081ad99f5..97a555d6f6f6505d4a01d36e4961fbcdb3d6095c 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -118,6 +118,7 @@ void export_Scene() .def("SetShadow",&Scene::SetShadow) .def("SetShadowQuality",&Scene::SetShadowQuality) .def("SetDepthDarkening",&Scene::SetDepthDarkening) + .def("SetDepthDarkeningFactor",&Scene::SetDepthDarkeningFactor) .def("SetAmbientOcclusion",&Scene::SetAmbientOcclusion) .def("SetAmbientOcclusionFactor",&Scene::SetAmbientOcclusionFactor) .def("AttachObserver",&Scene::AttachObserver) diff --git a/modules/gfx/src/impl/scene_fx.cc b/modules/gfx/src/impl/scene_fx.cc index 4c70d8417291f903256d69b6f85bfd3355aae205..a4da9955ab033a5522c127208e8490e4aac5069a 100644 --- a/modules/gfx/src/impl/scene_fx.cc +++ b/modules/gfx/src/impl/scene_fx.cc @@ -25,16 +25,20 @@ SceneFX::SceneFX(): shadow_flag(false), shadow_quality(1), depth_dark_flag(false), + depth_dark_factor(1.0), amb_occl_flag(false), amb_occl_factor(1.0), scene_tex_id_(), depth_tex_id_(), shadow_tex_id_(), + shadow_tex_mat_(), occl_tex_id_(), dark_tex_id_(), norm_tex_id_(), kernel_tex_id_(), kernel_size_(0), + kernel2_tex_id_(), + kernel2_size_(0), scene_tex2_id_(), norm_tex2_id_(), scene_fb_(), @@ -56,6 +60,7 @@ void SceneFX::Setup() glGenTextures(1,&dark_tex_id_); glGenTextures(1,&norm_tex_id_); glGenTextures(1,&kernel_tex_id_); + glGenTextures(1,&kernel2_tex_id_); glGenFramebuffers(1,&scene_fb_); glGenRenderbuffers(1,&depth_rb_); @@ -103,24 +108,51 @@ void SceneFX::Setup() glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP); - + std::vector<GLfloat> tmp; for(int u=-20;u<=20;++u) { for(int v=-20;v<=20;++v) { if(UniformRandom()<0.1) { - // norm to 1 - float x = static_cast<float>(u+20)*0.025; - float y = static_cast<float>(v+20)*0.025; - tmp.push_back(x); - tmp.push_back(y); - tmp.push_back(0.0); - tmp.push_back(0.0); + // norm to 1 + float x = static_cast<float>(u+20)*0.025; + float y = static_cast<float>(v+20)*0.025; + tmp.push_back(x); + tmp.push_back(y); + tmp.push_back(0.0); + tmp.push_back(0.0); } } } kernel_size_=tmp.size()/4; glTexImage1D(GL_TEXTURE_1D,0,4,kernel_size_,0,GL_RGBA, GL_FLOAT, &tmp[0]); + + glBindTexture(GL_TEXTURE_1D, kernel2_tex_id_); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP); + + // depth darkening kernel + tmp.clear(); + for(int u=-5;u<=5;++u) { + for(int v=-5;v<=5;++v) { + if(UniformRandom()<0.5) { + // norm to -1 ... 1 + float x = static_cast<float>(u)*0.2; + float y = static_cast<float>(v)*0.2; + // gaussian kernel with sigma + float v = exp((-x*x-y*y)*0.5); + // norml to 0 ... 1 + tmp.push_back(x*0.5+0.5); + tmp.push_back(y*0.5+0.5); + tmp.push_back(v); + tmp.push_back(0.0); + } + } + } + + kernel2_size_=tmp.size()/4; + glTexImage1D(GL_TEXTURE_1D,0,4,kernel2_size_,0,GL_RGBA, GL_FLOAT, &tmp[0]); } void SceneFX::Resize(unsigned int w, unsigned int h) @@ -163,11 +195,18 @@ void SceneFX::Preprocess() void SceneFX::Postprocess() { - Viewport vp=Scene::Instance().GetViewport(); - if(use_fb_) { glBindFramebuffer(GL_FRAMEBUFFER, 0); - } else { + } + + if(!shadow_flag && !amb_occl_flag && !depth_dark_flag) { + // no postprocessing is needed + return; + } + + Viewport vp=Scene::Instance().GetViewport(); + + if(!use_fb_) { // grab color buffer glBindTexture(GL_TEXTURE_2D, scene_tex_id_); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, vp.x, vp.y, vp.width, vp.height, 0); @@ -194,10 +233,9 @@ void SceneFX::Postprocess() prep_amb_occlusion(); } if(depth_dark_flag) { - //prep_depth_darkening(); + prep_depth_darkening(); } - Shader::Instance().PushProgram(); glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_1D); @@ -207,14 +245,18 @@ void SceneFX::Postprocess() glBindTexture(GL_TEXTURE_2D,depth_tex_id_); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,scene_tex_id_); - glUniform1i(glGetUniformLocation(cpr,"scene"),0); - glUniform1i(glGetUniformLocation(cpr,"depth"),1); + glUniform1i(glGetUniformLocation(cpr,"scene_map"),0); + glUniform1i(glGetUniformLocation(cpr,"depth_map"),1); glUniform2f(glGetUniformLocation(cpr,"scalef"), 1.0f/static_cast<float>(vp.width), 1.0f/static_cast<float>(vp.height)); glUniform2f(glGetUniformLocation(cpr,"zmorph"), Scene::Instance().GetFar()-Scene::Instance().GetNear(), Scene::Instance().GetNear()); + glUniform2f(glGetUniformLocation(cpr,"i_vp"),1.0/static_cast<float>(vp.width),1.0/static_cast<float>(vp.height)); + double pm[16]; + glGetDoublev(GL_PROJECTION_MATRIX,pm); + glUniform4f(glGetUniformLocation(cpr,"abcd"),pm[0],pm[5],pm[10],pm[14]); if(shadow_flag) { glActiveTexture(GL_TEXTURE2); @@ -224,6 +266,13 @@ void SceneFX::Postprocess() glUniform1f(glGetUniformLocation(cpr,"shadow_depth_bias"),0.008); glUniform1f(glGetUniformLocation(cpr,"shadow_epsilon"),0.002); glUniform1f(glGetUniformLocation(cpr,"shadow_multiplier"),0.4); + glActiveTexture(GL_TEXTURE0); + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + // make explicit object instead of temporary to avoid potential crash with Data() + geom::Mat4 ttmp=Transpose(shadow_tex_mat_); + glLoadMatrix(ttmp.Data()); + glMatrixMode(GL_MODELVIEW); } else { glUniform1i(glGetUniformLocation(cpr,"shadow_flag"),0); } @@ -236,8 +285,25 @@ void SceneFX::Postprocess() } else { glUniform1i(glGetUniformLocation(cpr,"occl_flag"),0); } + if(depth_dark_flag) { + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D,dark_tex_id_); + glUniform1i(glGetUniformLocation(cpr,"dark_flag"),1); + glUniform1i(glGetUniformLocation(cpr,"dark_map"),4); + glUniform1f(glGetUniformLocation(cpr,"dark_mult"),depth_dark_factor); + } else { + glUniform1i(glGetUniformLocation(cpr,"dark_flag"),0); + } draw_screen_quad(vp.width,vp.height); + + if(shadow_flag) { + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + } + + glDisable(GL_TEXTURE_1D); glDisable(GL_TEXTURE_2D); Shader::Instance().PopProgram(); } @@ -262,12 +328,12 @@ void SceneFX::prep_shadow_map() glDisable(GL_FOG); glDisable(GL_COLOR_MATERIAL); glDisable(GL_NORMALIZE); - glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); + //glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); // render scene with only depth components // seen from the light's perspective glViewport(0,0,smap_size,smap_size); - glClear(GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); @@ -284,7 +350,7 @@ void SceneFX::prep_shadow_map() glMultMatrix(ltrans.GetTransposedMatrix().Data()); // only render non-transparent objects for the shadow map - Scene::Instance().GetRootNode()->RenderGL(DEPTH_RENDER_PASS); + Scene::Instance().GetRootNode()->RenderGL(STANDARD_RENDER_PASS); // now get the shadow map glActiveTexture(GL_TEXTURE2); @@ -298,21 +364,25 @@ void SceneFX::prep_shadow_map() glMatrixMode(GL_MODELVIEW); glPopAttrib(); - glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + //glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); // set up appropriate texture matrix geom::Mat4 bias(0.5,0.0,0.0,0.5, 0.0,0.5,0.0,0.5, 0.0,0.0,0.5,0.5, 0.0,0.0,0.0,1.0); - - geom::Mat4 texm = bias*pmat*ltrans.GetMatrix(); - - glMatrixMode(GL_TEXTURE); - // make explicit object instead of temporary to avoid potential crash with Data() - geom::Mat4 ttmp=Transpose(texm); - glLoadMatrix(ttmp.Data()); - glMatrixMode(GL_MODELVIEW); + float glpmat2[16]; + glGetv(GL_PROJECTION_MATRIX, glpmat2); + geom::Mat4 pmat2(Transpose(geom::Mat4(glpmat2))); + float glmmat2[16]; + glGetv(GL_MODELVIEW_MATRIX, glmmat2); + geom::Mat4 mmat2(Transpose(geom::Mat4(glmmat2))); + + geom::Mat4 lmat2; + lmat2.PasteRotation(Scene::Instance().GetLightRot()); + + shadow_tex_mat_ = bias*pmat*ltrans.GetMatrix(); + //shadow_tex_mat_ = bias*pmat*lmat2*geom::Invert(pmat2); } void SceneFX::prep_amb_occlusion() @@ -355,22 +425,25 @@ void SceneFX::prep_depth_darkening() { Viewport vp=Scene::Instance().GetViewport(); - // kernel is static for now, inside the convolution shader Shader::Instance().PushProgram(); Shader::Instance().Activate("convolute1"); GLuint cpr=Shader::Instance().GetCurrentProgram(); // assign tex units glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D,depth_tex_id_); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_1D,kernel2_tex_id_); glUniform1i(glGetUniformLocation(cpr,"data"),1); - glUniform1i(glGetUniformLocation(cpr,"vp_width"),vp.width/2); - glUniform1i(glGetUniformLocation(cpr,"vp_height"),vp.height/2); + glUniform1i(glGetUniformLocation(cpr,"kernel"),2); + glUniform1f(glGetUniformLocation(cpr,"step"),1.0/static_cast<float>(kernel2_size_)); + glUniform2f(glGetUniformLocation(cpr,"i_vp"),1.0/static_cast<float>(vp.width),1.0/static_cast<float>(vp.height)); // set up viewport filling quad to run the fragment shader draw_screen_quad(vp.width/2,vp.height/2); + glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, dark_tex_id_); - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0,0,vp.width/2, vp.height/2, 0); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0,0,vp.width/2, vp.height/2, 0); Shader::Instance().PopProgram(); } @@ -422,32 +495,13 @@ void SceneFX::draw_screen_quad(unsigned int w, unsigned int h) // this debug code draws the given texture across the complete screen void SceneFX::draw_debug_tex(unsigned int w, unsigned int h, GLuint texid) { - glPushAttrib(GL_ALL_ATTRIB_BITS); Shader::Instance().PushProgram(); - Shader::Instance().Activate(""); - glViewport(0,0,w,h); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0,1,0,1,-1,1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glColor3f(1.0,0.0,1.0); - glEnable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texid); - glBegin(GL_QUADS); - glTexCoord2f(0.0,0.0); - glVertex2f(0.01,0.01); - glTexCoord2f(0.0,1.0); - glVertex2f(0.01,0.99); - glTexCoord2f(1.0,1.0); - glVertex2f(0.99,0.99); - glTexCoord2f(1.0,0.0); - glVertex2f(0.99,0.01); - glEnd(); - glPopAttrib(); + + draw_screen_quad(w,h); + Shader::Instance().PopProgram(); } diff --git a/modules/gfx/src/impl/scene_fx.hh b/modules/gfx/src/impl/scene_fx.hh index 884ae425a9bdefed8053b012c7bcb3610e145012..c71ba6bd7154b828c5a8ddf6e5300e9371ca83ab 100644 --- a/modules/gfx/src/impl/scene_fx.hh +++ b/modules/gfx/src/impl/scene_fx.hh @@ -20,6 +20,7 @@ #define OST_SCENE_FX_HH #include <ost/gfx/gl_helper.hh> +#include <ost/geom/geom.hh> /* low level code for scene shading effects @@ -49,6 +50,7 @@ public: bool shadow_flag; int shadow_quality; bool depth_dark_flag; + float depth_dark_factor; bool amb_occl_flag; float amb_occl_factor; @@ -66,11 +68,14 @@ private: GLuint scene_tex_id_; GLuint depth_tex_id_; GLuint shadow_tex_id_; + geom::Mat4 shadow_tex_mat_; GLuint occl_tex_id_; GLuint dark_tex_id_; GLuint norm_tex_id_; GLuint kernel_tex_id_; uint kernel_size_; + GLuint kernel2_tex_id_; + uint kernel2_size_; GLuint scene_tex2_id_; GLuint norm_tex2_id_; diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 028b78fbd2c7cbdb76c036c1d4c1ddd268360ac2..4b70553e266c74cbf07b2db49f9ed330c5b3b4c6 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -112,6 +112,8 @@ Scene::Scene(): auto_autoslab_(true), offscreen_flag_(false), main_offscreen_buffer_(0), + old_vp_(), + def_shading_mode_("default"), selection_mode_(1), test_flag_(false), tmp_tex_(), @@ -191,6 +193,15 @@ void Scene::SetDepthDarkening(bool f) #endif } +void Scene::SetDepthDarkeningFactor(float f) +{ +#if OST_SHADER_SUPPORT_ENABLED + impl::SceneFX::Instance().depth_dark_factor=f; + // the redraw routine will deal with the Shader + RequestRedraw(); +#endif +} + void Scene::SetAmbientOcclusion(bool f) { #if OST_SHADER_SUPPORT_ENABLED @@ -212,6 +223,9 @@ void Scene::SetAmbientOcclusionFactor(float f) void Scene::SetShadingMode(const std::string& smode) { #if OST_SHADER_SUPPORT_ENABLED + // this here is required - in case SetShadingMode is called + // before GL is initialized (e.g. during batch mode rendering) + def_shading_mode_=smode; if(smode=="fallback") { Shader::Instance().Activate(""); } else if(smode=="basic") { @@ -332,7 +346,7 @@ void Scene::InitGL() #if OST_SHADER_SUPPORT_ENABLED LOGN_DEBUG("scene: shader setup"); Shader::Instance().Setup(); - SetShadingMode("default"); + SetShadingMode(def_shading_mode_); LOGN_DEBUG("scene: scenefx setup"); impl::SceneFX::Instance().Setup(); #endif diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index bedf2774fef15c02ae88c7cd39e269ea838a22e7..29fd72a5069c78febdb913f1ab83b78d3cd31efc 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -112,6 +112,7 @@ class DLLEXPORT_OST_GFX Scene { void SetShadowQuality(int q); void SetDepthDarkening(bool f); + void SetDepthDarkeningFactor(float f); void SetAmbientOcclusion(bool f); void SetAmbientOcclusionFactor(float f); @@ -415,6 +416,7 @@ private: bool offscreen_flag_; // a simple indicator whether in offscreen mode or not OffscreenBuffer* main_offscreen_buffer_; // not null if a main offscreen buffer is present uint old_vp_[2]; // used by the offline rendering code + std::string def_shading_mode_; uint selection_mode_; diff --git a/modules/gfx/src/shader/amboccl_fs.glsl b/modules/gfx/src/shader/amboccl_fs.glsl index b1a8be162a5d25181a828f3a16623d1e1474bb1f..01f7a7217d49fd121e86ea7cefbf305414e872ed 100644 --- a/modules/gfx/src/shader/amboccl_fs.glsl +++ b/modules/gfx/src/shader/amboccl_fs.glsl @@ -8,8 +8,10 @@ uniform vec4 abcd; vec3 unproject(in vec3 scr) { vec3 tmp=vec3(scr.x*i_vp.x*2.0-1.0,scr.y*i_vp.y*2.0-1.0,scr.z); - float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w); - return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0); + //float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w); + //return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0); + vec4 tmp2 = gl_ProjectionMatrixInverse*vec4(tmp,1.0); + return tmp2.xyz/tmp2.w; } float ao(in vec2 tab, in vec3 pos_p, in vec3 norm_p, in vec3 t_pos_p) @@ -22,7 +24,7 @@ float ao(in vec2 tab, in vec3 pos_p, in vec3 norm_p, in vec3 t_pos_p) vec3 t_pos_q = unproject(pos_q); vec3 diff=t_pos_q-t_pos_p; - float fac=1.0+dot(diff,diff)/25.0; + float fac=1.0+dot(diff,diff)/5.0; return max(0.0,dot(normalize(norm_p),normalize(diff)))/fac; } @@ -40,8 +42,7 @@ void main() float i; float sum=0.0; for(i=0.0;i<1.0;i+=step) { - vec2 nn=texture1D(kernel,i).xy; - nn=(nn-0.5)*40.0; + vec2 nn=texture1D(kernel,i).xy*40.0-20.0; sum+=ao(nn,pos_p,norm_p,t_pos_p); } sum*=step; diff --git a/modules/gfx/src/shader/convolute1_fs.glsl b/modules/gfx/src/shader/convolute1_fs.glsl index 67cc0cdb1d5094c8118e0a5d442b051986fc65ba..3e1564ecd4662ab159ab0006eec6d1e5d2f0c1c1 100644 --- a/modules/gfx/src/shader/convolute1_fs.glsl +++ b/modules/gfx/src/shader/convolute1_fs.glsl @@ -1,62 +1,25 @@ uniform sampler2D data; uniform sampler1D kernel; -uniform int kernel_size; -uniform int vp_width; -uniform int vp_height; +uniform float step; +uniform vec2 i_vp; void main() { - vec3 kernel_data[13]; - vec3 kmod=vec3(1.0/(float)vp_width,1.0/(float)vp_height,1.0); - kernel_data[0]=kmod*vec3(-2,0,0.02); - kernel_data[1]=kmod*vec3(-1,-1,0.141421); - kernel_data[2]=kmod*vec3(-1,0,0.37606); - kernel_data[3]=kmod*vec3(-1,1,0.141421); - kernel_data[4]=kmod*vec3(0,-2,0.02); - kernel_data[5]=kmod*vec3(0,-1,0.37606); - kernel_data[6]=kmod*vec3(0,0,1); - kernel_data[7]=kmod*vec3(0,1,0.37606); - kernel_data[8]=kmod*vec3(0,2,0.02); - kernel_data[9]=kmod*vec3(1,-1,0.141421); - kernel_data[10]=kmod*vec3(1,0,0.37606); - kernel_data[11]=kmod*vec3(1,1,0.141421); - kernel_data[12]=kmod*vec3(2,0,0.02); - + float i; float sum=0.0; float sum2=0.0; - int i; - for (i=0;i<13;i=i+1) { - sum+=kernel_data[i].z*texture2D(data,gl_TexCoord[0].xy+kernel_data[i].xy).r; - sum2+=kernel_data[i].z; + for (i=0.0;i<1.0;i=i+step) { + vec3 kvalue = texture1D(kernel,i).xyz; + kvalue.xy=(kvalue.xy-0.5)*10.0*i_vp; + sum+=kvalue.z*texture2D(data,gl_TexCoord[0].xy+kvalue.xy).r; + sum2+=kvalue.z; } sum=sum/sum2; float delta=5.0*(sum-texture2D(data,gl_TexCoord[0].xy).r); if(delta<0.0) { - gl_FragColor.rgb=vec3(1+delta,1+delta,1+delta); - } else { - gl_FragColor.rgb=vec3(1,1,1); - } - gl_FragColor.a=1.0; - - -/* - float sum=0.0; - float sum2=0.0; - float isize=1.0/(float)(kernel_size); - for (i=0;i<kernel_size;i=i+1) { - float ii=(float(i)+0.5)*isize; - vec3 kernel_value=texture1D(kernel,ii).xyz; - vec2 offset = kernel_value.xy*2.0-1.0; - sum+=kernel_value.z*texture2D(data,gl_TexCoord[0].xy+offset).r; - sum2+=kernel_value.z; - } - sum=sum/sum2; - float delta=(sum-texture2D(data,gl_TexCoord[0].xy).r); - if(delta<0.0) { - gl_FragColor.rgb=vec3(1+delta,1+delta,1+delta); + gl_FragColor.rgb=vec3(1.0+delta,1.0+delta,1.0+delta); } else { - gl_FragColor.rgb=vec3(1,1,1); + gl_FragColor.rgb=vec3(1.0,1.0,1.0); } gl_FragColor.a=1.0; -*/ } diff --git a/modules/gfx/src/shader/scenefx_fs.glsl b/modules/gfx/src/shader/scenefx_fs.glsl index ce63193f1cc7e48dbce6a74363bffaf97eb8335b..bed4469eded2d9271a2da51def4dff176d2e8f7c 100644 --- a/modules/gfx/src/shader/scenefx_fs.glsl +++ b/modules/gfx/src/shader/scenefx_fs.glsl @@ -1,5 +1,5 @@ -uniform sampler2D scene; -uniform sampler2D depth; +uniform sampler2D scene_map; +uniform sampler2D depth_map; uniform vec2 scalef; uniform vec2 zmorph; uniform bool shadow_flag; @@ -10,6 +10,18 @@ uniform float shadow_multiplier; uniform bool occl_flag; uniform sampler2D occl_map; uniform float occl_mult; +uniform bool dark_flag; +uniform sampler2D dark_map; +uniform float dark_mult; +uniform vec2 i_vp; +uniform vec4 abcd; + +vec3 unproject(in vec3 scr) +{ + vec3 tmp=vec3(scr.x*i_vp.x*2.0-1.0,scr.y*i_vp.y*2.0-1.0,scr.z); + float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w); + return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0); +} float CalcShadowFactor(in vec4 coord, in vec2 o) { @@ -20,10 +32,17 @@ float CalcShadowFactor(in vec4 coord, in vec2 o) void main() { + vec4 scene_color=texture2D(scene_map,gl_TexCoord[0].xy); + gl_FragColor.a = scene_color.a; + float shadow_factor=1.0; if(shadow_flag) { - // TODO: calculate appropriate coord from glTexCoord[1].xy and the depth map - vec4 coord; + float depth = texture2D(depth_map,gl_TexCoord[0].xy).r; + vec4 tcoord = gl_ModelViewProjectionMatrixInverse*vec4(gl_FragCoord.xy*i_vp*2.0-1.0,depth,1.0); + vec4 coord = gl_TextureMatrix[0]*tcoord; + //vec4 coord = gl_TextureMatrix[0]*vec4(gl_FragCoord.xy*i_vp*2.0-1.0,depth,1.0); + coord/=coord.w; + shadow_factor = 0.0; shadow_factor += 0.18*CalcShadowFactor(coord, vec2(-0.7, -0.7)); shadow_factor += 0.18*CalcShadowFactor(coord, vec2(0.7, -0.7)); @@ -36,8 +55,11 @@ void main() if(occl_flag) { occl_factor=max(0.0,1.0-occl_mult*texture2D(occl_map,gl_TexCoord[0].xy).r); } + + float dark_factor=1.0; + if(dark_flag) { + dark_factor=max(0.0,1.0-dark_mult*(1.0-texture2D(dark_map,gl_TexCoord[0].xy).r)); + } - vec4 scene_color=texture2D(scene,gl_TexCoord[0].xy); - gl_FragColor.rgb = shadow_factor*occl_factor*scene_color.rgb; - gl_FragColor.a = scene_color.a; + gl_FragColor.rgb = shadow_factor*occl_factor*dark_factor*scene_color.rgb; } diff --git a/modules/gfx/src/shader/scenefx_vs.glsl b/modules/gfx/src/shader/scenefx_vs.glsl index 59aa7bb4e40cb464102a85b54b902f36376398df..6732327afc56aaee4a7fc353ed0c2e26d58c6f5b 100644 --- a/modules/gfx/src/shader/scenefx_vs.glsl +++ b/modules/gfx/src/shader/scenefx_vs.glsl @@ -3,6 +3,5 @@ void main() gl_Position = ftransform(); // relative screen coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - gl_TexCoord[1] = gl_Vertex; } diff --git a/modules/mol/base/pymod/wrap_mol.cc b/modules/mol/base/pymod/wrap_mol.cc index 82a449f681fbe98866c42acb0b8581fefd66d331..202636aff4ae7cf9b0716ca437407a6e46a746d7 100644 --- a/modules/mol/base/pymod/wrap_mol.cc +++ b/modules/mol/base/pymod/wrap_mol.cc @@ -63,6 +63,7 @@ BOOST_PYTHON_MODULE(_mol) export_QueryViewWrapper(); class_<Transform>("Transform", init<>()) + .def(init<const Transform&>()) // shouldn't this be there automatically ? .def("GetMatrix",&Transform::GetMatrix) .def("GetTransposedMatrix",&Transform::GetTransposedMatrix) .def("SetTrans",&Transform::SetTrans)