-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#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"
{
private:
unsigned size;
- const Scene &scene;
const Light &light;
- Framebuffer fbo;
- unsigned unit;
+ mutable Framebuffer fbo;
+ mutable Matrix shadow_matrix;
Texture2D depth_buf;
Vector3 target;
float radius;
+ float depth_bias;
+ mutable ProgramData shdata;
+ mutable bool rendered;
public:
- ShadowMap(unsigned, const Scene &, const Light &);
+ ShadowMap(unsigned, const 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);
+
+ /** 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);
+
+ virtual void setup_frame() const;
+ virtual void finish_frame() const;
- virtual void prepare();
- virtual void cleanup();
+ virtual void render(Renderer &, const Tag &) const;
};
} // namespace GL