]> git.tdb.fi Git - libs/gl.git/blobdiff - source/shadowmap.cpp
Refresh lighting and culling uniforms if the camera changes in pop_state
[libs/gl.git] / source / shadowmap.cpp
index bc46f2c1b298827738a9db5c6d5140c1362edb50..6056141f763376edaa39531b0070d348c9effb9f 100644 (file)
@@ -15,7 +15,7 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-ShadowMap::ShadowMap(unsigned s, const Renderable &r, const Light &l):
+ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l):
        Effect(r),
        size(s),
        light(l),
@@ -56,49 +56,26 @@ void ShadowMap::set_depth_bias(float b)
        depth_bias = b;
 }
 
-void ShadowMap::setup_frame() const
+void ShadowMap::setup_frame(Renderer &renderer)
 {
        if(rendered)
                return;
 
        rendered = true;
-       renderable.setup_frame();
+       renderable.setup_frame(renderer);
 
+       Camera camera;
        const Vector4 &lpos = light.get_position();
-       Vector3 back;
-       if(lpos.w)
-       {
-               /* XXX Not really proper way to support positional lights, but good
-               enough when the light source is far away */
-               back = lpos.slice<3>(0)-target;
-       }
-       else
-               back = lpos.slice<3>(0);
-       back.normalize();
-
-       Vector3 up;
-       if(abs(back.z)<0.99)
-               up = Vector3(0, 0, 1);
-       else
-               up = Vector3(0, 1, 0);
-
-       Vector3 right = normalize(cross(up, back));
+       /* XXX Not really proper way to support positional lights, but good
+       enough when the light source is far away */
+       camera.set_look_direction(lpos.w*target-lpos.slice<3>(0));
 
-       Vector4 columns[4];
-       columns[0] = compose(right, 0.0f);
-       columns[1] = compose(normalize(cross(back, right)), 0.0f);
-       columns[2] = compose(back, 0.0f);
-       columns[3] = compose(target, 1.0f);
-       light_matrix = Matrix::from_columns(columns);
-       view_matrix = invert(light_matrix);
+       camera.set_up_direction((abs(camera.get_look_direction().z)<0.99) ? Vector3(0, 0, 1) : Vector3(0, 1, 0));
+       camera.set_position(target);
+       camera.set_orthographic(radius*2, radius*2);
+       camera.set_depth_clip(-radius, radius);
 
-       MatrixStack::Push push_mv(MatrixStack::modelview());
-       MatrixStack::Push push_proj(MatrixStack::projection());
-
-       MatrixStack::projection() = Matrix::ortho(-radius, radius, -radius, radius, -radius, radius);
-       MatrixStack::modelview() = view_matrix;
-
-       shadow_matrix = light_matrix;
+       shadow_matrix = camera.get_object_matrix();
        shadow_matrix.scale(radius*2, radius*2, -radius*2);
        shadow_matrix.translate(-0.5, -0.5, depth_bias/size-0.5);
        shadow_matrix.invert();
@@ -106,10 +83,14 @@ void ShadowMap::setup_frame() const
        BindRestore bind_fbo(fbo);
        Bind bind_depth(DepthTest::lequal());
        fbo.clear(DEPTH_BUFFER_BIT);
-       renderable.render("shadow");
+
+       Renderer::Push push(renderer);
+       renderer.set_camera(camera);
+
+       renderer.render(renderable, "shadow");
 }
 
-void ShadowMap::finish_frame() const
+void ShadowMap::finish_frame()
 {
        renderable.finish_frame();
        rendered = false;