Files
tanks-reborn/source/game/engine.cpp

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