]> git.tdb.fi Git - libs/gl.git/blobdiff - source/shadowmap.h
Allow access to ShadowMap's texture and matrix from outside
[libs/gl.git] / source / shadowmap.h
index 11407462c3e1922c48cd9bb0b3725829e207f595..fe36fca0e5bac9e6e7eff35f3a33065d9fb3d85e 100644 (file)
@@ -1,8 +1,9 @@
-#ifndef SHADOWMAP_H_
-#define SHADOWMAP_H_
+#ifndef MSP_GL_SHADOWMAP_H_
+#define MSP_GL_SHADOWMAP_H_
 
 #include "effect.h"
 #include "framebuffer.h"
+#include "programdata.h"
 #include "texture2d.h"
 #include "vector.h"
 
@@ -23,25 +24,41 @@ class ShadowMap: public Effect
 private:
        unsigned size;
        const Light &light;
-       mutable Framebuffer fbo;
-       unsigned unit;
+       Framebuffer fbo;
+       Matrix shadow_matrix;
        Texture2D depth_buf;
        Vector3 target;
        float radius;
+       float depth_bias;
+       mutable ProgramData shdata;
+       bool rendered;
 
 public:
-       ShadowMap(unsigned, const Renderable &, const Light &);
+       ShadowMap(unsigned, Renderable &, const Light &);
 
        /** Sets the ShadowMap target point and radius.  The transformation matrix is
        computed so that a sphere with the specified parameters will be completely
        covered by the ShadowMap. */
        void set_target(const Vector3 &, float);
 
-       /** Sets the texture unit to bind the shadow map to during the rendering
-       phase.  The default is texture unit 3. */
-       void set_texture_unit(unsigned);
+       /** Sets the darkness of shadows.  Must be in the range between 0.0 and 1.0,
+       inclusive.  Only usable with shaders, and provided through the
+       shadow_darkness uniform. */
+       void set_darkness(float);
 
-       virtual void render(Renderer &, const Tag &) const;
+       /** Sets a distance beyond objects from which the shadow starts.  Expressed
+       in pixel-sized units.  Must be positive; values less than 1.0 are not
+       recommended.  Larger values produce less depth artifacts, but may prevent
+       thin objects from casting shadows on nearby sufraces. */
+       void set_depth_bias(float);
+
+       const Texture2D &get_depth_texture() const { return depth_buf; }
+       const Matrix &get_shadow_matrix() const { return shadow_matrix; }
+
+       virtual void setup_frame(Renderer &);
+       virtual void finish_frame();
+
+       virtual void render(Renderer &, const Tag & = Tag()) const;
 };
 
 } // namespace GL