]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/shadowmap.cpp
Use persistent cameras in effects
[libs/gl.git] / source / effects / shadowmap.cpp
index e43e9bdeb97392f8439e22c2351b3fa8bc7fa787..0af9327132cf88c8222b31e11d2846329219f605 100644 (file)
@@ -59,15 +59,14 @@ void ShadowMap::setup_frame(Renderer &renderer)
        rendered = true;
        renderable.setup_frame(renderer);
 
-       Camera camera;
-       camera.set_object_matrix(*light.get_matrix());
-       camera.set_position(target);
+       shadow_camera.set_object_matrix(*light.get_matrix());
+       shadow_camera.set_position(target);
        // TODO support point and spot lights with a frustum projection.
        // Omnidirectional lights also need a cube shadow map.
-       camera.set_orthographic(radius*2, radius*2);
-       camera.set_depth_clip(-radius, radius);
+       shadow_camera.set_orthographic(radius*2, radius*2);
+       shadow_camera.set_depth_clip(-radius, radius);
 
-       shadow_matrix = camera.get_object_matrix();
+       shadow_matrix = shadow_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();
@@ -77,7 +76,7 @@ void ShadowMap::setup_frame(Renderer &renderer)
        fbo.clear(DEPTH_BUFFER_BIT);
 
        Renderer::Push push(renderer);
-       renderer.set_camera(camera);
+       renderer.set_camera(shadow_camera);
 
        renderer.render(renderable, "shadow");
 }
@@ -93,15 +92,6 @@ void ShadowMap::render(Renderer &renderer, Tag tag) const
        if(!enabled_passes.count(tag))
                return renderer.render(renderable, tag);
 
-       Renderer::Push _push_rend(renderer);
-
-       unsigned unit = renderer.allocate_effect_texunit();
-       int iunit = unit;
-       shdata.uniform("shadow_map", iunit);
-
-       Bind _bind_sampler(sampler, unit);
-       Bind _bind_depth(depth_buf, unit);
-
        if(const Camera *camera = renderer.get_camera())
                /* Multiply by camera's object matrix to form a matrix that transforms
                from eye space to shadow space. */
@@ -109,6 +99,9 @@ void ShadowMap::render(Renderer &renderer, Tag tag) const
        else
                shdata.uniform("shd_eye_matrix", shadow_matrix);
 
+       Renderer::Push _push_rend(renderer);
+
+       renderer.set_texture("shadow_map", &depth_buf, &sampler);
        renderer.add_shader_data(shdata);
        renderer.render(renderable, tag);
 }