summaryrefslogtreecommitdiff
path: root/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'renderer.cpp')
-rw-r--r--renderer.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/renderer.cpp b/renderer.cpp
index cc7cc6d..d8c4895 100644
--- a/renderer.cpp
+++ b/renderer.cpp
@@ -9,6 +9,12 @@ struct VP_Cbuffer {
m4f view_projection;
};
+struct Global_Cbuffer {
+ v3f camera_pos;
+ int light_count;
+ int frame;
+};
+
void init_drawlist(
Drawlist* l,
Device* d,
@@ -40,12 +46,20 @@ void Renderer::init(Arena* arena, Device* d) {
id(i, 512);
camera_count = 1;
cameras.init();
+ globals.init(
+ d,
+ "Renderer globals",
+ sizeof(Global_Cbuffer),
+ Buffer_Flags::constant_buffer
+ );
+ frame = 0;
}
void Renderer::destroy(Device* d) {
int i;
for (i = 0; i < drawlist_count; i++)
drawlists[i].vp.destroy(d);
+ globals.destroy(d);
}
void Renderer::set_camera(Camera_Id cam, int drawlist) {
@@ -70,22 +84,39 @@ void Drawlist::render(
res.sampler = r.clamped_linear;
res.env_cubemap = r.env_cubemap;
res.vp = vp.gpuonly;
+ res.globals = r.globals.gpuonly;
res.overrider = overrider;
for (i = 0; i < c; i++) {
models[i]->render(dev, a, pass, l, res);
}
}
+void Renderer::update_globals(
+ const Lighting* l,
+ Device* d,
+ Context& ctx
+) {
+ void* ptr = globals.map(d);
+ Global_Cbuffer* cb = (Global_Cbuffer*)ptr;
+ v3f& cp = get_camera(drawlists[FORWARD].camera).position;
+ cb->camera_pos = cp;
+ cb->frame = frame;
+ cb->light_count = l->light_count;
+ globals.unmap(d);
+ globals.update(ctx);
+}
+
void Renderer::render(
Device* dev,
- Arena* a,
- Texture_Id hdr_target,
+ Arena* a, Texture_Id hdr_target,
const Lighting* l
) {
int i, j;
Pipeline_Builder pb(a, dev);
Context& ctx = dev->get_ctx();
+ update_globals(l, dev, ctx);
+
Render_Pass& depth_prepass = pb
.begin_rp()
.rp_depth_target(dev->get_depth_target(), 1.0f)
@@ -126,6 +157,7 @@ void Renderer::render(
ctx.debug_push("forward");
drawlists[FORWARD].render(*this, dev, a, l, forward_pass, 0);
ctx.debug_pop();
+ frame++;
}
void Renderer::add_model(int drawlist, Model_Instance* m) {