]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/shadowmap.cpp
Overhaul texture management in rendering classes
[libs/gl.git] / source / effects / shadowmap.cpp
index eaf6e1373cb126a387d535e9e2b1352199eed2e7..41a97f806b1da20480374f98fe99ac2e1071ed7a 100644 (file)
@@ -3,6 +3,7 @@
 #include "camera.h"
 #include "light.h"
 #include "renderer.h"
+#include "resources.h"
 #include "scene.h"
 #include "shadowmap.h"
 #include "tests.h"
@@ -12,25 +13,15 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-WeakPtr<Sampler> ShadowMap::shadow_sampler;
-
-ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l):
+ShadowMap::ShadowMap(Resources &resources, unsigned s, Renderable &r, const Light &l):
        Effect(r),
        size(s),
        light(l),
+       sampler(resources.get<Sampler>("_linear_clamp_shadow.samp")),
        radius(1),
        depth_bias(4),
        rendered(false)
 {
-       sampler = shadow_sampler;
-       if(!sampler)
-       {
-               sampler = new Sampler;
-               sampler->set_filter(LINEAR);
-               sampler->set_compare(LEQUAL);
-               sampler->set_wrap(CLAMP_TO_EDGE);
-               shadow_sampler = sampler;
-       }
        depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1);
        fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0);
        fbo.require_complete();
@@ -97,20 +88,11 @@ void ShadowMap::finish_frame()
        rendered = false;
 }
 
-void ShadowMap::render(Renderer &renderer, const Tag &tag) const
+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. */
@@ -118,6 +100,9 @@ void ShadowMap::render(Renderer &renderer, const 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);
 }