Browse Source

More work on volumetric lighting

rdb 17 years ago
parent
commit
19d45ffbfa
1 changed files with 18 additions and 13 deletions
  1. 18 13
      direct/src/filter/CommonFilters.py

+ 18 - 13
direct/src/filter/CommonFilters.py

@@ -16,7 +16,7 @@ clunky approach.  - Josh
 """
 """
 
 
 from FilterManager import FilterManager
 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 NodePath, PandaNode
 from pandac.PandaModules import Filename
 from pandac.PandaModules import Filename
 from pandac.PandaModules import AuxBitplaneAttrib
 from pandac.PandaModules import AuxBitplaneAttrib
@@ -51,6 +51,7 @@ class CommonFilters:
         self.manager = FilterManager(win, cam)
         self.manager = FilterManager(win, cam)
         self.configuration = {}
         self.configuration = {}
         self.cleanup()
         self.cleanup()
+        self.task = taskMgr.add(self.update, "common-filters-update")
 
 
     def loadShader(self, name):
     def loadShader(self, name):
         fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name)
         fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name)
@@ -143,10 +144,6 @@ class CommonFilters:
             if (configuration.has_key("Bloom")):
             if (configuration.has_key("Bloom")):
                 text += " uniform float4 texpad_txbloom3,\n"
                 text += " uniform float4 texpad_txbloom3,\n"
                 text += " out float4 l_texcoordB : TEXCOORD2,\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 += " uniform float4x4 mat_modelproj)\n"
             text += "{\n"
             text += "{\n"
             text += " l_position=mul(mat_modelproj, vtx_position);\n"
             text += " l_position=mul(mat_modelproj, vtx_position);\n"
@@ -159,8 +156,6 @@ class CommonFilters:
                 text += " l_texcoordC+=texpix_txcolor*0.5;\n"
                 text += " l_texcoordC+=texpix_txcolor*0.5;\n"
                 if (configuration.has_key("CartoonInk")):
                 if (configuration.has_key("CartoonInk")):
                     text += " l_texcoordN+=texpix_txaux*0.5;\n"
                     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 += "}\n"
 
 
             text += "void fshader(\n"
             text += "void fshader(\n"
@@ -176,8 +171,8 @@ class CommonFilters:
             if (configuration.has_key("CartoonInk")):
             if (configuration.has_key("CartoonInk")):
                 text += "uniform float4 k_cartoonseparation,\n"
                 text += "uniform float4 k_cartoonseparation,\n"
             if (configuration.has_key("VolumetricLighting")):
             if (configuration.has_key("VolumetricLighting")):
+                text += "uniform float4 k_casterpos,\n"
                 text += "uniform float4 k_vlparams,\n"
                 text += "uniform float4 k_vlparams,\n"
-                text += "float2 l_casterpos,\n"
             text += "out float4 o_color : COLOR)\n"
             text += "out float4 o_color : COLOR)\n"
             text += "{\n"
             text += "{\n"
             text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n"
             text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n"
@@ -192,7 +187,7 @@ class CommonFilters:
             if (configuration.has_key("VolumetricLighting")):
             if (configuration.has_key("VolumetricLighting")):
                 text += "float decay = 1.0f;\n"
                 text += "float decay = 1.0f;\n"
                 text += "float2 curcoord = l_texcoordC.xy;\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 += "half4 sample = tex2D(k_txcolor, curcoord);\n"
                 text += "float3 vlcolor = sample.rgb * sample.a;\n"
                 text += "float3 vlcolor = sample.rgb * sample.a;\n"
                 text += "for (int i = 0; i < k_vlparams.x; i++) {\n"
                 text += "for (int i = 0; i < k_vlparams.x; i++) {\n"
@@ -228,13 +223,23 @@ class CommonFilters:
         if (changed == "VolumetricLighting") or fullrebuild:
         if (changed == "VolumetricLighting") or fullrebuild:
             if (configuration.has_key("VolumetricLighting")):
             if (configuration.has_key("VolumetricLighting")):
                 config = configuration["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
         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):
     def setCartoonInk(self, separation=1):
         fullrebuild = (self.configuration.has_key("CartoonInk") == False)
         fullrebuild = (self.configuration.has_key("CartoonInk") == False)
         self.configuration["CartoonInk"] = separation
         self.configuration["CartoonInk"] = separation