summaryrefslogtreecommitdiff
path: root/renderer.cpp
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2025-02-22 17:01:35 +1100
committerquou <quou@disroot.org>2025-02-22 17:01:53 +1100
commit04db6b0ccd81d988cfe3a1d09e4eb00eeea77273 (patch)
tree5163857dca5070ecea802452c1e4e22806e4fbab /renderer.cpp
parent944ca7aede48f358329cc9e6cdac479648f30c17 (diff)
basic shadows
Diffstat (limited to 'renderer.cpp')
-rw-r--r--renderer.cpp21
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;
+}