From 19d45ffbfad0ee70b8a003006746e7c03b392aa4 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 7 Mar 2009 12:33:17 +0000 Subject: [PATCH] More work on volumetric lighting --- direct/src/filter/CommonFilters.py | 31 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/direct/src/filter/CommonFilters.py b/direct/src/filter/CommonFilters.py index 3b641b0d1a..d0021e2ab5 100644 --- a/direct/src/filter/CommonFilters.py +++ b/direct/src/filter/CommonFilters.py @@ -16,7 +16,7 @@ clunky approach. - Josh """ from FilterManager import FilterManager -from pandac.PandaModules import Point3, Vec3, Vec4 +from pandac.PandaModules import Point3, Vec3, Vec4, Point2 from pandac.PandaModules import NodePath, PandaNode from pandac.PandaModules import Filename from pandac.PandaModules import AuxBitplaneAttrib @@ -51,6 +51,7 @@ class CommonFilters: self.manager = FilterManager(win, cam) self.configuration = {} self.cleanup() + self.task = taskMgr.add(self.update, "common-filters-update") def loadShader(self, name): fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name) @@ -143,10 +144,6 @@ class CommonFilters: if (configuration.has_key("Bloom")): text += " uniform float4 texpad_txbloom3,\n" text += " out float4 l_texcoordB : TEXCOORD2,\n" - if (configuration.has_key("VolumetricLighting")): - text += "uniform float4x4 trans_model_to_clip_of_camera,\n" - text += "uniform float4 mspos_caster,\n" - text += "out float2 l_casterpos,\n" text += " uniform float4x4 mat_modelproj)\n" text += "{\n" text += " l_position=mul(mat_modelproj, vtx_position);\n" @@ -159,8 +156,6 @@ class CommonFilters: text += " l_texcoordC+=texpix_txcolor*0.5;\n" if (configuration.has_key("CartoonInk")): text += " l_texcoordN+=texpix_txaux*0.5;\n" - if (configuration.has_key("VolumetricLighting")): - text += " l_casterpos=(mul(trans_model_to_clip_of_camera, mspos_caster).xy);\n" text += "}\n" text += "void fshader(\n" @@ -176,8 +171,8 @@ class CommonFilters: if (configuration.has_key("CartoonInk")): text += "uniform float4 k_cartoonseparation,\n" if (configuration.has_key("VolumetricLighting")): + text += "uniform float4 k_casterpos,\n" text += "uniform float4 k_vlparams,\n" - text += "float2 l_casterpos,\n" text += "out float4 o_color : COLOR)\n" text += "{\n" text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n" @@ -192,7 +187,7 @@ class CommonFilters: if (configuration.has_key("VolumetricLighting")): text += "float decay = 1.0f;\n" text += "float2 curcoord = l_texcoordC.xy;\n" - text += "float2 lightdir = normalize(curcoord - l_casterpos);\n" text += "lightdir *= k_vlparams.y;\n" + text += "float2 lightdir = curcoord - k_casterpos.xy;\n" text += "lightdir *= k_vlparams.y;\n" text += "half4 sample = tex2D(k_txcolor, curcoord);\n" text += "float3 vlcolor = sample.rgb * sample.a;\n" text += "for (int i = 0; i < k_vlparams.x; i++) {\n" @@ -228,13 +223,23 @@ class CommonFilters: if (changed == "VolumetricLighting") or fullrebuild: if (configuration.has_key("VolumetricLighting")): config = configuration["VolumetricLighting"] - tcparam = (1.0 / config.density) / float(config.numsamples) - self.finalQuad.setShaderInput("camera", self.manager.camera) - self.finalQuad.setShaderInput("caster", config.caster) - self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, 1.0 - config.decay, config.exposure) + tcparam = config.density / float(config.numsamples) + self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, config.decay, config.exposure) + self.update() return True + def update(self, task = None): + """Updates the shader inputs that need to be updated every frame. + Normally, you shouldn't call this, it's being called in a task.""" + if self.configuration.has_key("VolumetricLighting"): + caster = self.configuration["VolumetricLighting"].caster + casterpos = Point2() + self.manager.camera.node().getLens().project(caster.getPos(self.manager.camera), casterpos) + self.finalQuad.setShaderInput("casterpos", Vec4(casterpos.getX() * 0.5 + 0.5, (casterpos.getY() * 0.5 + 0.5), 0, 0)) + if task != None: + return task.cont + def setCartoonInk(self, separation=1): fullrebuild = (self.configuration.has_key("CartoonInk") == False) self.configuration["CartoonInk"] = separation