45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
#include "engine.hpp"
|
|
|
|
#include <exception>
|
|
#include <ranges>
|
|
|
|
namespace {
|
|
[[nodiscard]] auto load_scene_to_renderer(trb::render::renderer &renderer,
|
|
trb::game::scene &scene) {
|
|
const auto is_mesh_node = [](const auto &v) {
|
|
return std::holds_alternative<trb::game::mesh_node>(v);
|
|
};
|
|
|
|
const auto upload_mesh_node = [&](const auto &v) {
|
|
return renderer.register_mesh(std::get<trb::game::mesh_node>(v));
|
|
};
|
|
|
|
return scene.nodes | std::views::filter(is_mesh_node) |
|
|
std::views::transform(upload_mesh_node) |
|
|
std::ranges::to<std::vector<std::uint32_t>>();
|
|
}
|
|
} // namespace
|
|
|
|
namespace trb::game {
|
|
engine::engine()
|
|
: display(&input, {1920, 1080}, "Tanks Reborn"), renderer(&display),
|
|
level_border(load_glb("../assets/models/level_scene.glb")),
|
|
level_border_render_ids(
|
|
::load_scene_to_renderer(renderer, level_border)) {}
|
|
|
|
void engine::run() {
|
|
while (!display.should_close()) {
|
|
try {
|
|
renderer.render();
|
|
} catch (const vuk::VkException &ex) {
|
|
if (ex.what() != std::string("Out of date.")) {
|
|
std::rethrow_exception(std::current_exception());
|
|
}
|
|
}
|
|
|
|
display.poll_events();
|
|
}
|
|
}
|
|
|
|
} // namespace trb::game
|