diff options
author | quou <quou@disroot.org> | 2025-02-22 17:01:35 +1100 |
---|---|---|
committer | quou <quou@disroot.org> | 2025-02-22 17:01:53 +1100 |
commit | 04db6b0ccd81d988cfe3a1d09e4eb00eeea77273 (patch) | |
tree | 5163857dca5070ecea802452c1e4e22806e4fbab /renderer.cpp | |
parent | 944ca7aede48f358329cc9e6cdac479648f30c17 (diff) |
basic shadows
Diffstat (limited to 'renderer.cpp')
-rw-r--r-- | renderer.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/renderer.cpp b/renderer.cpp index 2d28ceb..cc7cc6d 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -57,11 +57,12 @@ void Drawlist::render( Device* dev, Arena* a, const Lighting* l, - Render_Pass& pass + Render_Pass& pass, + void (*overrider)(Pipeline_Builder&) ) { int i, c = count; const Camera& cam = r.get_camera(camera); - Model_Resources res; + Model_Resources res{}; VP_Cbuffer* vpc = (VP_Cbuffer*)vp.map(dev); vpc->view_projection = cam.get_proj() * cam.get_view(); vp.unmap(dev); @@ -69,6 +70,7 @@ void Drawlist::render( res.sampler = r.clamped_linear; res.env_cubemap = r.env_cubemap; res.vp = vp.gpuonly; + res.overrider = overrider; for (i = 0; i < c; i++) { models[i]->render(dev, a, pass, l, res); } @@ -102,7 +104,7 @@ void Renderer::render( } ctx.debug_push("depth prepass"); - drawlists[FORWARD].render(*this, dev, a, l, depth_prepass); + drawlists[FORWARD].render(*this, dev, a, l, depth_prepass, 0); ctx.debug_pop(); ctx.debug_push("shadow maps"); @@ -111,14 +113,18 @@ void Renderer::render( i < SHADOW_MAP_END && j < l->caster_count; i++, j++ ) { + auto o = [](Pipeline_Builder& pb) { + pb.cull(Cull_Mode::front); + }; + setcam(i, l->cameras[j]); ctx.debug_push("shadow map"); - drawlists[i].render(*this, dev, a, l, *shadow_passes[j]); + drawlists[i].render(*this, dev, a, l, *shadow_passes[j], o); ctx.debug_pop(); } ctx.debug_pop(); ctx.debug_push("forward"); - drawlists[FORWARD].render(*this, dev, a, l, forward_pass); + drawlists[FORWARD].render(*this, dev, a, l, forward_pass, 0); ctx.debug_pop(); } @@ -167,3 +173,8 @@ const Camera& Renderer::get_camera(Camera_Id id) const { void Renderer::destroy_camera(Camera_Id cam) { cameras.remove(cam); } + +void Renderer::setcam(int did, Camera_Id cam) { + assert(cam.index); + drawlists[did].camera = cam; +} |