diff options
Diffstat (limited to 'renderer.cpp')
-rw-r--r-- | renderer.cpp | 36 |
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) { |