Files
tanks-reborn/source/render/renderer.hpp
2026-04-01 02:40:09 -03:00

74 lines
2.0 KiB
C++

#ifndef TANKS_RENDER_HPP
#define TANKS_RENDER_HPP
#include "game/model.hpp"
#include "render/context.hpp"
#include "render/shader_compiler.hpp"
#include "ui/display.hpp"
#include <limits>
#include <random>
#include <unordered_map>
namespace trb::render {
class renderer {
public:
struct loaded_mesh {
vuk::Unique<vuk::Buffer> vertices;
vuk::Unique<vuk::Buffer> indices;
vuk::Unique<vuk::Buffer> indirect_command;
vuk::Unique<vuk::Image> albedo;
vuk::Unique<vuk::ImageView> albedo_view;
vuk::Unique<vuk::Buffer> transform;
};
private:
render::shader_compiler compiler =
render::shader_compiler(std::filesystem::path("../assets/shaders"));
render::context context;
std::mt19937_64 rng;
std::uniform_int_distribution<std::uint32_t> id_dist =
std::uniform_int_distribution<std::uint32_t>(
0, std::numeric_limits<std::uint32_t>::max());
std::unordered_map<std::uint32_t, loaded_mesh> registered_meshes;
[[nodiscard]] std::uint32_t next_mesh_id();
[[nodiscard]] vuk::PipelineBaseCreateInfo
create_compute_pipeline(std::string_view comp_module,
std::string_view comp_entry);
[[nodiscard]] vuk::PipelineBaseCreateInfo create_graphics_pipeline(
std::string_view vs_module, std::string_view vs_entry,
std::string_view fs_module, std::string_view fs_entry);
[[nodiscard]] vuk::PipelineBaseCreateInfo
create_graphics_pipeline(std::string_view module);
void create_pipelines();
[[nodiscard]] vuk::Value<vuk::ImageAttachment> get_swap_target();
struct vuk_frame_resources {
vuk::Allocator allocator;
vuk::Value<vuk::ImageAttachment> swap_target;
};
[[nodiscard]] vuk_frame_resources get_next_frame_resources();
public:
explicit renderer(ui::display *display);
void render(std::span<const std::uint32_t> meshes, glm::mat4 view,
glm::mat4 projection);
[[nodiscard]] std::uint32_t register_mesh(const game::mesh_node &mesh,
const game::texture_source &albedo);
};
} // namespace trb::render
#endif