From fd488f9603f22db0312eadcdb93b7880922dc9a7 Mon Sep 17 00:00:00 2001 From: quou Date: Tue, 14 Jan 2025 00:04:55 +1100 Subject: misc refactoring --- debugdraw.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 debugdraw.cpp (limited to 'debugdraw.cpp') diff --git a/debugdraw.cpp b/debugdraw.cpp new file mode 100644 index 0000000..43527ab --- /dev/null +++ b/debugdraw.cpp @@ -0,0 +1,119 @@ +#include "asset.hpp" +#include "camera.hpp" +#include "debugdraw.hpp" +#include "video.hpp" +extern "C" { +#include "plat.h" +} + +void Line_Renderer::init(Device* dev, Asset_Arena* assets) { + vb.init( + dev, + "Line Renderer mesh", + max_lines * sizeof(Vertex) * 2, + Buffer_Flags::vertex_buffer + ); + cb.init( + dev, + "Line Renderer cbuffer", + sizeof(CBuffer), + Buffer_Flags::constant_buffer + ); + shader = (Shader*)assets->load("debug.csh"); + vert_binding = shader->binding_index("verts"); + cbuffer_binding = shader->descriptor_binding("cbuf"); + assert(vert_binding >= 0); + assert(cbuffer_binding >= 0); + verts = (Vertex*)vb.map(dev); + cur = 0; +} + +void Line_Renderer::destroy(Device* dev) { + vb.unmap(dev); + vb.destroy(dev); + cb.destroy(dev); +} + +void Line_Renderer::begin(int wi, int he) { + cur = 0; + w = wi; + h = he; + cur_col = v3f(1.0f, 1.0f, 1.0f); +} + +void Line_Renderer::colour(const v3f& c) { + cur_col = c; +} + +void Line_Renderer::add_line(const v3f& s, const v3f& e) { + if (cur >= max_lines) { + assert(0); + return; + } + Vertex& a = verts[cur * 2]; + Vertex& b = verts[cur * 2 + 1]; + a.x = s.x; + a.y = s.y; + a.z = s.z; + b.x = e.x; + b.y = e.y; + b.z = e.z; + a.r = cur_col.x; + a.g = cur_col.y; + a.b = cur_col.z; + b.r = cur_col.x; + b.g = cur_col.y; + b.b = cur_col.z; + cur++; +} + +void Line_Renderer::add_box(const AABB& b) { + add_line(v3f(b.max.x, b.max.y, b.max.z), v3f(b.max.x, b.max.y, b.min.z)); + add_line(v3f(b.max.x, b.max.y, b.max.z), v3f(b.max.x, b.min.y, b.max.z)); + add_line(v3f(b.max.x, b.max.y, b.max.z), v3f(b.min.x, b.max.y, b.max.z)); + add_line(v3f(b.max.x, b.min.y, b.min.z), v3f(b.max.x, b.max.y, b.min.z)); + add_line(v3f(b.max.x, b.min.y, b.min.z), v3f(b.max.x, b.min.y, b.max.z)); + add_line(v3f(b.min.x, b.max.y, b.max.z), v3f(b.min.x, b.min.y, b.max.z)); + add_line(v3f(b.min.x, b.max.y, b.min.z), v3f(b.max.x, b.max.y, b.min.z)); + add_line(v3f(b.min.x, b.max.y, b.min.z), v3f(b.min.x, b.max.y, b.max.z)); + add_line(v3f(b.min.x, b.min.y, b.max.z), v3f(b.max.x, b.min.y, b.max.z)); + add_line(v3f(b.min.x, b.min.y, b.min.z), v3f(b.max.x, b.min.y, b.min.z)); + add_line(v3f(b.min.x, b.min.y, b.min.z), v3f(b.min.x, b.max.y, b.min.z)); + add_line(v3f(b.min.x, b.min.y, b.min.z), v3f(b.min.x, b.min.y, b.max.z)); +} + +void Line_Renderer::flush( + const Camera& cam, + Device* dev, + Arena* a, + Render_Pass& rp +) { + if (!cur) return; + CBuffer* c = (CBuffer*)cb.map(dev); + c->vp = cam.get_proj() * cam.get_view(); + cb.unmap(dev); + Pipeline_Builder pb(a, dev); + Context& ctx = dev->get_ctx(); + cb.update(ctx); + vb.update(ctx); + pb.begin(); + pb.shader(shader->id); + pb.cbuffer(cbuffer_binding, cb.gpuonly); + pb.vertex_format(shader->vf); + pb.geo(Geo_Type::lines); + if (rp.depth.id) + pb.depth(true, false, Depth_Mode::less); + Pipeline& pip = pb.build(); + Vertex_Buffer_Binding binding[] = {{ + .id = vb.gpuonly, + .offset = 0, + .target = vert_binding + }, {}}; + Draw d{}; + d.verts = binding; + d.vertex_count = cur * 2; + d.instance_count = 1; + ctx.submit(d, pip, rp); + cur = 0; +} + -- cgit v1.2.3-54-g00ecf