Add ImGui

- Initial ImGui commit, add support for showing demo window in Copium
  Engine
This commit is contained in:
Thraix
2023-07-13 18:18:52 +02:00
parent 4a1a149a68
commit cb120ef731
21 changed files with 381 additions and 6 deletions
@@ -15,6 +15,8 @@
#include <glm/gtc/matrix_transform.hpp>
#include <imgui.h>
namespace Copium
{
const std::vector<Vertex> vertices = {
@@ -74,6 +76,7 @@ namespace Copium
return true;
RecordCommandBuffer();
Vulkan::GetSwapChain().SubmitToGraphicsQueue(*commandBuffer);
Vulkan::GetSwapChain().EndPresent();
@@ -164,6 +167,8 @@ namespace Copium
void Application::RecordCommandBuffer()
{
Vulkan::GetImGuiInstance().Begin();
ImGui::ShowDemoWindow();
commandBuffer->Begin();
Framebuffer& fb = AssetManager::GetAsset<Framebuffer>(framebuffer);
@@ -193,6 +198,9 @@ namespace Copium
meshPassthrough->Bind(*commandBuffer);
meshPassthrough->Render(*commandBuffer);
Vulkan::GetImGuiInstance().End();
Vulkan::GetImGuiInstance().Render(*commandBuffer);
Vulkan::GetSwapChain().EndFrameBuffer(*commandBuffer);
commandBuffer->End();
}
+10
View File
@@ -18,6 +18,16 @@ namespace Copium
vkDestroyDevice(device, nullptr);
}
uint32_t Device::GetGraphicsQueueFamily() const
{
return graphicsQueueIndex;
}
uint32_t Device::GetPresentQueueFamily() const
{
return presentQueueIndex;
}
VkQueue Device::GetGraphicsQueue() const
{
return graphicsQueue;
+2
View File
@@ -27,6 +27,8 @@ namespace Copium
Device();
~Device();
uint32_t GetGraphicsQueueFamily() const;
uint32_t GetPresentQueueFamily() const;
VkQueue GetGraphicsQueue() const;
VkQueue GetPresentQueue() const;
VkCommandPool GetCommandPool() const;
@@ -0,0 +1,77 @@
#include "ImGuiInstance.h"
#include "copium/core/Vulkan.h"
#include "copium/buffer/CommandBufferScoped.h"
#include <imgui.h>
#include <backends/imgui_impl_glfw.h>
#include <backends/imgui_impl_vulkan.h>
namespace Copium
{
ImGuiInstance::ImGuiInstance()
: descriptorPool{std::make_unique<DescriptorPool>()}
{
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForVulkan(Vulkan::GetWindow().GetWindow(), true);
ImGui_ImplVulkan_InitInfo init_info = {};
init_info.Instance = Vulkan::GetInstance();
init_info.PhysicalDevice = Vulkan::GetDevice().GetPhysicalDevice();
init_info.Device = Vulkan::GetDevice();
init_info.QueueFamily = Vulkan::GetDevice().GetGraphicsQueueFamily();
init_info.Queue = Vulkan::GetDevice().GetGraphicsQueue();
init_info.PipelineCache = VK_NULL_HANDLE;
init_info.DescriptorPool = *descriptorPool.get();
init_info.Subpass = 0;
init_info.MinImageCount = SwapChain::MAX_FRAMES_IN_FLIGHT;
init_info.ImageCount = Vulkan::GetSwapChain().GetImageCount();
init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT;
init_info.Allocator = nullptr;
init_info.CheckVkResultFn = CheckVkResult;
ImGui_ImplVulkan_Init(&init_info, Vulkan::GetSwapChain().GetRenderPass());
{
CommandBufferScoped commandBuffer;
ImGui_ImplVulkan_CreateFontsTexture(commandBuffer);
}
ImGui_ImplVulkan_DestroyFontUploadObjects();
}
ImGuiInstance::~ImGuiInstance()
{
ImGui_ImplVulkan_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
}
void ImGuiInstance::Begin()
{
ImGui_ImplVulkan_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
}
void ImGuiInstance::End()
{
ImGui::EndFrame();
}
void ImGuiInstance::Render(CommandBuffer& commandBuffer)
{
ImGui::Render();
ImDrawData* draw_data = ImGui::GetDrawData();
ImGui_ImplVulkan_RenderDrawData(draw_data, commandBuffer);
}
void ImGuiInstance::CheckVkResult(VkResult err)
{
CP_VK_ASSERT(err, "Failed to initialize ImGui");
}
}
@@ -0,0 +1,28 @@
#pragma once
#include <memory>
#include "copium/buffer/CommandBuffer.h"
#include "copium/pipeline/DescriptorPool.h"
namespace Copium
{
class ImGuiInstance
{
CP_DELETE_COPY_AND_MOVE_CTOR(ImGuiInstance);
private:
std::unique_ptr<DescriptorPool> descriptorPool;
public:
ImGuiInstance();
~ImGuiInstance();
void Begin();
void End();
void Render(CommandBuffer& commandBuffer);
private:
static void CheckVkResult(VkResult err);
};
}
+6 -1
View File
@@ -189,11 +189,16 @@ namespace Copium
InitializeFramebuffers();
}
int SwapChain::GetFlightIndex() const
int SwapChain::GetFlightIndex() const
{
return flightIndex;
}
int SwapChain::GetImageCount() const
{
return images.size();
}
void SwapChain::Initialize()
{
SwapChainSupportDetails swapChainSupport{Vulkan::GetWindow().GetSurface(), Vulkan::GetDevice().GetPhysicalDevice()};
+1
View File
@@ -59,6 +59,7 @@ namespace Copium
void Recreate();
int GetFlightIndex() const;
int GetImageCount() const;
private:
void Initialize();
+8
View File
@@ -13,6 +13,7 @@ namespace Copium
std::unique_ptr<Window> Vulkan::window;
std::unique_ptr<Device> Vulkan::device;
std::unique_ptr<SwapChain> Vulkan::swapChain;
std::unique_ptr<ImGuiInstance> Vulkan::imGuiInstance;
AssetHandle Vulkan::emptyTexture2D;
void Vulkan::Initialize()
@@ -21,6 +22,7 @@ namespace Copium
window = std::make_unique<Window>("Copium Engine", 1440, 810, WindowMode::Windowed);
device = std::make_unique<Device>();
swapChain = std::make_unique<SwapChain>();
imGuiInstance = std::make_unique<ImGuiInstance>();
AssetManager::RegisterAssetType<Texture2D>("Texture2D");
AssetManager::RegisterAssetType<ColorAttachment>("RenderTexture");
@@ -39,6 +41,7 @@ namespace Copium
AssetManager::UnloadAsset(emptyTexture2D);
AssetManager::UnregisterAssetDir("assets/");
AssetManager::Cleanup();
imGuiInstance.reset();
swapChain.reset();
device.reset();
window.reset();
@@ -65,6 +68,11 @@ namespace Copium
return *swapChain;
}
ImGuiInstance& Vulkan::GetImGuiInstance()
{
return *imGuiInstance;
}
AssetHandle Vulkan::GetEmptyTexture2D()
{
return emptyTexture2D;
+3
View File
@@ -4,6 +4,7 @@
#include "copium/core/Instance.h"
#include "copium/core/SwapChain.h"
#include "copium/core/Window.h"
#include "copium/core/ImGuiInstance.h"
#include "copium/util/Common.h"
#include <memory>
@@ -18,6 +19,7 @@ namespace Copium
static std::unique_ptr<Window> window;
static std::unique_ptr<Device> device;
static std::unique_ptr<SwapChain> swapChain;
static std::unique_ptr<ImGuiInstance> imGuiInstance;
static AssetHandle emptyTexture2D;
public:
@@ -27,6 +29,7 @@ namespace Copium
static Window& GetWindow();
static Device& GetDevice();
static SwapChain& GetSwapChain();
static ImGuiInstance& GetImGuiInstance();
static bool Valid();
static AssetHandle GetEmptyTexture2D();
};
@@ -47,4 +47,9 @@ namespace Copium
{
vkFreeDescriptorSets(Vulkan::GetDevice(), descriptorPool, descriptorSets.size(), descriptorSets.data());
}
DescriptorPool::operator VkDescriptorPool() const
{
return descriptorPool;
}
}
@@ -18,5 +18,7 @@ namespace Copium
std::vector<VkDescriptorSet> AllocateDescriptorSets(VkDescriptorSetLayout descriptorSetLayout);
void FreeDescriptorSets(const std::vector<VkDescriptorSet>& descriptorSets);
operator VkDescriptorPool() const;
};
}