Files
tanks-reborn/source/render/renderer.hpp

67 lines
1.8 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 {
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());
struct loaded_mesh {
vuk::Unique<vuk::Buffer> vertices;
vuk::Unique<vuk::Buffer> indices;
vuk::Unique<vuk::Buffer> indirect_command;
};
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();
[[nodiscard]] std::uint32_t register_mesh(const game::mesh_node &mesh);
};
} // namespace trb::render
#endif