X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fshadowmap.cpp;h=921a1747875b4bf0b349042dac6aab26095cff84;hp=4ad192cad1d737cb90dc464f4e9ca7b639ca8d70;hb=639238c53510fb9483e92fb1b808d33fce992bff;hpb=e645768be035f155e1deda931079cf1e84851a86 diff --git a/source/shadowmap.cpp b/source/shadowmap.cpp index 4ad192ca..921a1747 100644 --- a/source/shadowmap.cpp +++ b/source/shadowmap.cpp @@ -2,20 +2,17 @@ #include #include "camera.h" #include "light.h" -#include "matrix.h" -#include "misc.h" #include "renderer.h" #include "scene.h" #include "shadowmap.h" #include "tests.h" -#include "texunit.h" 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), @@ -27,7 +24,7 @@ ShadowMap::ShadowMap(unsigned s, const Renderable &r, const Light &l): depth_buf.set_compare_enabled(true); depth_buf.set_compare_func(LEQUAL); depth_buf.set_wrap(CLAMP_TO_EDGE); - depth_buf.storage(DEPTH_COMPONENT, size, size); + depth_buf.storage(DEPTH_COMPONENT, size, size, 1); fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0); fbo.require_complete(); @@ -56,22 +53,19 @@ 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(); - /* 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)); - - camera.set_up_direction((abs(camera.get_look_direction().z)<0.99) ? Vector3(0, 0, 1) : Vector3(0, 1, 0)); + camera.set_object_matrix(*light.get_matrix()); 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); @@ -84,11 +78,13 @@ void ShadowMap::setup_frame() const Bind bind_depth(DepthTest::lequal()); fbo.clear(DEPTH_BUFFER_BIT); - Renderer renderer(&camera); - renderable.render(renderer, "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;