hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/core/application.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/application.cpp')
-rw-r--r--src/core/application.cpp115
1 files changed, 83 insertions, 32 deletions
diff --git a/src/core/application.cpp b/src/core/application.cpp
index fa5fd6e..0f07979 100644
--- a/src/core/application.cpp
+++ b/src/core/application.cpp
@@ -8,10 +8,14 @@
#include "states/world_builder_state.h"
#include <GLFW/glfw3.h>
+#include <imgui.h>
#include <ImGuizmo.h>
+#include "platform/vulkan/vulkan_renderer.h"
+
#ifdef __APPLE__
#include "platform/metal/metal_context.h"
+#include "platform/vulkan/vulkan_context.h"
#endif
namespace Donut
@@ -23,8 +27,19 @@ namespace Donut
{
s_instance = this;
+ Logger::init();
+ SettingsManager::initialize();
+ {
+ const auto& settings = SettingsManager::get_settings_const();
+ RendererAPI::set_api(settings.graphics.render_api == "Vulkan"
+ ? RendererAPI::API::Vulkan : RendererAPI::API::OpenGL);
+ }
+
+ if (RendererAPI::get_api() == RendererAPI::API::Vulkan)
+ vulkan_prepare_glfw();
+
m_window = create_scope<Window>(name, width, height);
- m_window->set_event_callback([this](Event& event)
+ m_window->set_event_callback([this](Event& event)
{
on_event(event);
});
@@ -42,16 +57,36 @@ namespace Donut
{
while (m_running)
{
- if (!m_minimized)
+ if (m_vulkan_renderer)
{
- on_update();
- on_render();
+ glfwPollEvents();
+ if (!m_minimized)
+ m_vulkan_renderer->draw_frame(glm::vec4(0.05f, 0.06f, 0.10f, 1.0f),
+ [this] { build_vulkan_ui(); });
+ }
+ else
+ {
+ if (!m_minimized)
+ {
+ on_update();
+ on_render();
+ }
+ m_window->on_update();
}
-
- m_window->on_update();
}
}
+ void Application::build_vulkan_ui()
+ {
+ ImGui::Begin("Donut - Vulkan backend");
+ ImGui::Text("Geodesic black hole through Vulkan (MoltenVK).");
+ ImGui::Text("%.1f FPS", ImGui::GetIO().Framerate);
+ ImGui::Separator();
+ ImGui::TextWrapped("Drag to orbit, scroll to zoom. HDRI starfield is live; "
+ "next is porting the simulation UI to Vulkan.");
+ ImGui::End();
+ }
+
void Application::close()
{
m_running = false;
@@ -73,15 +108,24 @@ namespace Donut
m_minimized = true;
else
m_minimized = false;
-
- Renderer::on_window_resize(e.get_width(), e.get_height());
- m_engine->set_window_dimensions(e.get_width(), e.get_height());
+
+ if (m_vulkan_renderer)
+ {
+ m_vulkan_renderer->on_resize(e.get_width(), e.get_height());
+ }
+ else
+ {
+ Renderer::on_window_resize(e.get_width(), e.get_height());
+ if (m_engine) m_engine->set_window_dimensions(e.get_width(), e.get_height());
+ }
event.handled = true;
return true;
});
- dispatcher.dispatch<KeyPressedEvent>([this, &event](KeyPressedEvent& e)
+ dispatcher.dispatch<KeyPressedEvent>([this, &event](KeyPressedEvent& e)
{
+ if (!m_state_manager)
+ return true;
if (e.get_key_code() == GLFW_KEY_1)
{
m_state_manager->switch_to_state("Config");
@@ -103,34 +147,34 @@ namespace Donut
return true;
});
-
- m_state_manager->on_event(event);
+
+ if (m_state_manager)
+ m_state_manager->on_event(event);
}
void Application::on_init()
{
- Logger::init();
+ if (RendererAPI::get_api() == RendererAPI::API::Vulkan)
+ {
+ int w = 0, h = 0;
+ glfwGetFramebufferSize((GLFWwindow*)m_window->get_native_window(), &w, &h);
+ m_vulkan_renderer = create_scope<VulkanRenderer>();
+ if (!m_vulkan_renderer->init(m_window->get_native_window(), w, h))
+ DONUT_ERROR("Vulkan renderer initialization failed");
+ else
+ m_vulkan_renderer->init_im_gui();
+ return;
+ }
-#ifdef __APPLE__
- metal_probe();
- metal_compute_self_test();
-#endif
-
- SettingsManager::initialize();
-
- const auto& settings = SettingsManager::get_settings_const();
- RendererAPI::API api = (settings.graphics.render_api == "Vulkan") ? RendererAPI::API::Vulkan : RendererAPI::API::OpenGL;
- RendererAPI::set_api(api);
-
Renderer::init();
m_window->init_im_gui();
-
+
Renderer::on_window_resize(1280, 720);
RenderCommand::set_face_culling(false);
m_engine = create_scope<Engine>();
m_engine->set_window_dimensions(1280, 720);
-
+
m_state_manager = create_scope<StateManager>();
m_state_manager->register_state("Config", create_scope<ConfigState>());
m_state_manager->register_state("Simulation", create_scope<SimulationState>());
@@ -138,12 +182,19 @@ namespace Donut
m_state_manager->switch_to_state("Config");
}
- void Application::on_shutdown()
- {
- if (m_state_manager)
- m_state_manager->shutdown();
-
- Renderer::shutdown();
+ void Application::on_shutdown()
+ {
+ if (m_vulkan_renderer)
+ {
+ m_vulkan_renderer->shutdown();
+ m_vulkan_renderer.reset();
+ }
+ else
+ {
+ if (m_state_manager)
+ m_state_manager->shutdown();
+ Renderer::shutdown();
+ }
SettingsManager::shutdown();
Logger::shutdown();
}