diff --git a/direct/src/filter/CommonFilters.py b/direct/src/filter/CommonFilters.py index 4eaba1105f..67bc0a0538 100644 --- a/direct/src/filter/CommonFilters.py +++ b/direct/src/filter/CommonFilters.py @@ -65,6 +65,7 @@ class CommonFilters: self.finalQuad = None self.bloom = [] self.blur = [] + self.ssao = [] if self.task != None: taskMgr.remove(self.task) self.task = None @@ -88,6 +89,13 @@ class CommonFilters: if (configuration.has_key("CartoonInk")): needtex["aux"] = True auxbits |= AuxBitplaneAttrib.ABOAuxNormal + if (configuration.has_key("AmbientOcclusion")): + needtex["depth"] = True + needtex["ssao0"] = True + needtex["ssao1"] = True + needtex["ssao2"] = True + needtex["aux"] = True + auxbits |= AuxBitplaneAttrib.ABOAuxNormal if (configuration.has_key("BlurSharpen")): needtex["blur0"] = True needtex["blur1"] = True @@ -120,6 +128,22 @@ class CommonFilters: self.blur[1].setShaderInput("src", blur0) self.blur[1].setShader(self.loadShader("filter-blury.sha")) + if (configuration.has_key("AmbientOcclusion")): + ssao0=self.textures["ssao0"] + ssao1=self.textures["ssao1"] + ssao2=self.textures["ssao2"] + self.ssao.append(self.manager.renderQuadInto(colortex=ssao0)) + self.ssao.append(self.manager.renderQuadInto(colortex=ssao1,div=2)) + self.ssao.append(self.manager.renderQuadInto(colortex=ssao2)) + self.ssao[0].setShaderInput("depth", self.textures["depth"]) + self.ssao[0].setShaderInput("normal", self.textures["aux"]) + self.ssao[0].setShaderInput("random", loader.loadTexture("maps/random.rgb")) + self.ssao[0].setShader(self.loadShader("filter-ssao.sha")) + self.ssao[1].setShaderInput("src", ssao0) + self.ssao[1].setShader(self.loadShader("filter-blurx.sha")) + self.ssao[2].setShaderInput("src", ssao1) + self.ssao[2].setShader(self.loadShader("filter-blury.sha")) + if (configuration.has_key("Bloom")): bloomconf = configuration["Bloom"] bloom0=self.textures["bloom0"] @@ -164,6 +188,9 @@ class CommonFilters: if (configuration.has_key("BlurSharpen")): text += " uniform float4 texpad_txblur1,\n" text += " out float4 l_texcoordBS : TEXCOORD3,\n" + if (configuration.has_key("AmbientOcclusion")): + text += " uniform float4 texpad_txssao2,\n" + text += " out float4 l_texcoordAO : TEXCOORD4,\n" text += " uniform float4x4 mat_modelproj)\n" text += "{\n" text += " l_position=mul(mat_modelproj, vtx_position);\n" @@ -174,6 +201,8 @@ class CommonFilters: text += " l_texcoordB=(vtx_position.xzxz * texpad_txbloom3) + texpad_txbloom3;\n" if (configuration.has_key("BlurSharpen")): text += " l_texcoordBS=(vtx_position.xzxz * texpad_txblur1) + texpad_txblur1;\n" + if (configuration.has_key("AmbientOcclusion")): + text += " l_texcoordAO=(vtx_position.xzxz * texpad_txssao2) + texpad_txssao2;\n" if (configuration.has_key("HalfPixelShift")): text += " l_texcoordC+=texpix_txcolor*0.5;\n" if (configuration.has_key("CartoonInk")): @@ -191,6 +220,8 @@ class CommonFilters: if (configuration.has_key("BlurSharpen")): text += "float4 l_texcoordBS : TEXCOORD3,\n" text += "uniform float4 k_blurval,\n" + if (configuration.has_key("AmbientOcclusion")): + text += "float4 l_texcoordAO : TEXCOORD4,\n" for key in self.textures: text += "uniform sampler2D k_tx" + key + ",\n" if (configuration.has_key("CartoonInk")): @@ -203,6 +234,8 @@ class CommonFilters: text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n" if (configuration.has_key("CartoonInk")): text += CARTOON_BODY + if (configuration.has_key("AmbientOcclusion")): + text += "o_color *= tex2D(k_txssao2, l_texcoordAO.xy).r;\n" if (configuration.has_key("BlurSharpen")): text += " o_color = lerp(tex2D(k_txblur1, l_texcoordBS.xy), o_color, k_blurval.x);\n" if (configuration.has_key("Bloom")): @@ -261,6 +294,12 @@ class CommonFilters: tcparam = config.density / float(config.numsamples) self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, config.decay, config.exposure) + if (changed == "AmbientOcclusion") or fullrebuild: + if (configuration.has_key("AmbientOcclusion")): + config = configuration["AmbientOcclusion"] + self.ssao[0].setShaderInput("params1", config.numsamples, -float(config.amount) / config.numsamples, config.radius, 0) + self.ssao[0].setShaderInput("params2", config.strength, config.falloff, 0, 0) + self.update() return True @@ -378,3 +417,20 @@ class CommonFilters: return self.reconfigure(True, "BlurSharpen") return True + def setAmbientOcclusion(self, numsamples = 16, radius = 0.05, amount = 2.0, strength = 0.01, falloff = 0.000002): + fullrebuild = (self.configuration.has_key("AmbientOcclusion") == False) + newconfig = FilterConfig() + newconfig.numsamples = numsamples + newconfig.radius = radius + newconfig.amount = amount + newconfig.strength = strength + newconfig.falloff = falloff + self.configuration["AmbientOcclusion"] = newconfig + return self.reconfigure(fullrebuild, "AmbientOcclusion") + + def delAmbientOcclusion(self): + if (self.configuration.has_key("AmbientOcclusion")): + del self.configuration["AmbientOcclusion"] + return self.reconfigure(True, "AmbientOcclusion") + return True + diff --git a/direct/src/filter/filter-blurx.sha b/direct/src/filter/filter-blurx.sha index 9b0873eaab..2cb6c1512d 100644 --- a/direct/src/filter/filter-blurx.sha +++ b/direct/src/filter/filter-blurx.sha @@ -6,10 +6,11 @@ void vshader(float4 vtx_position : POSITION, float2 vtx_texcoord0 : TEXCOORD0, out float4 l_position : POSITION, out float2 l_texcoord0 : TEXCOORD0, + uniform float4 texpad_src, uniform float4x4 mat_modelproj) { l_position=mul(mat_modelproj, vtx_position); - l_texcoord0=vtx_texcoord0; + l_texcoord0 = (vtx_position.xz * texpad_src.xy) + texpad_src.xy; } @@ -18,7 +19,7 @@ void fshader(float2 l_texcoord0 : TEXCOORD0, uniform float2 texpix_src, uniform sampler2D k_src : TEXUNIT0) { - float3 offset = float3(2.0*texpix_src.x, 3.0*texpix_src.x, 5.0*texpix_src.x); + float3 offset = float3(1.0*texpix_src.x, 2.0*texpix_src.x, 3.0*texpix_src.x); o_color = tex2D(k_src, l_texcoord0); o_color += tex2D(k_src, float2(l_texcoord0.x - offset.z, l_texcoord0.y)); o_color += tex2D(k_src, float2(l_texcoord0.x - offset.y, l_texcoord0.y)); diff --git a/direct/src/filter/filter-blury.sha b/direct/src/filter/filter-blury.sha index 192fcecb68..b927cf0329 100644 --- a/direct/src/filter/filter-blury.sha +++ b/direct/src/filter/filter-blury.sha @@ -5,11 +5,12 @@ void vshader(float4 vtx_position : POSITION, float2 vtx_texcoord0 : TEXCOORD0, out float4 l_position : POSITION, - out float2 l_texcoord0 : TEXCOORD0, + out float2 l_texcoord0 : TEXCOORD0, + uniform float4 texpad_src, uniform float4x4 mat_modelproj) { l_position=mul(mat_modelproj, vtx_position); - l_texcoord0=vtx_texcoord0; + l_texcoord0 = (vtx_position.xz * texpad_src.xy) + texpad_src.xy; } @@ -18,7 +19,7 @@ void fshader(float2 l_texcoord0 : TEXCOORD0, uniform float2 texpix_src, uniform sampler2D k_src : TEXUNIT0) { - float3 offset = float3(2.0*texpix_src.y, 3.0*texpix_src.y, 5.0*texpix_src.y); + float3 offset = float3(1.0*texpix_src.y, 2.0*texpix_src.y, 3.0*texpix_src.y); o_color = tex2D(k_src, l_texcoord0); o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y - offset.z)); o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y - offset.y));