]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/shadowmap.cpp
Use the shadow camera's projection matrix to form the shadow matrix
[libs/gl.git] / source / effects / shadowmap.cpp
index 49dfa36de0bb636d101900dc78e47ca42f03f723..a0627faabf14834fd959ad1abe043dbb79feef18 100644 (file)
@@ -1,6 +1,6 @@
 #include <msp/strings/format.h>
+#include "directionallight.h"
 #include "error.h"
-#include "light.h"
 #include "lighting.h"
 #include "renderer.h"
 #include "resources.h"
@@ -38,7 +38,7 @@ ShadowMap::ShadowMap(unsigned w, unsigned h, Renderable &r, const Lighting *l, R
        }
 }
 
-ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l, Renderable &c):
+ShadowMap::ShadowMap(unsigned s, Renderable &r, const DirectionalLight &l, Renderable &c):
        ShadowMap(s, s, r, 0, c)
 {
        add_light(l, s);
@@ -48,7 +48,7 @@ ShadowMap::ShadowMap(unsigned w, unsigned h, Renderable &r, const Lighting &l, R
        ShadowMap(w, h, r, &l, c)
 { }
 
-void ShadowMap::add_light(const Light &light, unsigned s)
+void ShadowMap::add_light(const DirectionalLight &light, unsigned s)
 {
        if(!lighting && !lights.empty())
                throw invalid_operation("ShadowMap::add_light");
@@ -153,10 +153,8 @@ void ShadowMap::setup_frame(Renderer &renderer)
                l.shadow_camera.set_orthographic(radius*2, radius*2);
                l.shadow_camera.set_depth_clip(-radius, radius);
 
-               Matrix shadow_matrix = l.shadow_camera.get_object_matrix();
-               shadow_matrix.scale(radius*2, radius*2, -radius*2);
-               shadow_matrix.translate(-0.5, -0.5, depth_bias/l.region.width-0.5);
-               shadow_matrix.invert();
+               Matrix to_texcoord = Matrix().translate(Vector3(0.5f, 0.5f, 0.5f-depth_bias/l.region.width)).scale(0.5f);
+               Matrix shadow_matrix = to_texcoord*l.shadow_camera.get_projection_matrix()*l.shadow_camera.get_view_matrix();
 
                shdata.uniform(format("shadows[%d].shd_world_matrix", l.index), shadow_matrix);
        }