67 lines
1.8 KiB
C++
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
|