Add ImGui
- Initial ImGui commit, add support for showing demo window in Copium Engine
This commit is contained in:
@@ -119,7 +119,7 @@
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions);GLM_FORCE_LEFT_HANDED;GLFW_INCLUDE_VULKAN;GLM_FORCE_RADIANS;GLM_FORCE_DEPTH_ZERO_TO_ONE;MSDF_ATLAS_PUBLIC=;MSDFGEN_PUBLIC=</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)ext/include/;$(ProjectDir)src/;$(SolutionDir)ext/repos/msdf-atlas-gen/;$(SolutionDir)ext/repos/msdf-atlas-gen/msdfgen/;$(SolutionDir)ext/repos/stb/;$(SolutionDir)ext/repos/glfw/include;$(ProjectDir)ext/repos/glm/;$(VULKAN_SDK)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)ext/include/;$(ProjectDir)src/;$(SolutionDir)ext/repos/msdf-atlas-gen/;$(SolutionDir)ext/repos/msdf-atlas-gen/msdfgen/;$(SolutionDir)ext/repos/stb/;$(SolutionDir)ext/repos/glfw/include;$(ProjectDir)ext/repos/glm/;$(VULKAN_SDK)/Include;$(SolutionDir)ext/repos/imgui/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
@@ -128,7 +128,7 @@
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)libs\$(Platform)\$(Configuration)\;$(VULKAN_SDK)/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>vulkan-1.lib;glfw3.lib;shaderc_combinedd.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>vulkan-1.lib;imgui.lib;glfw3.lib;shaderc_combinedd.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
@@ -147,7 +147,7 @@
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions);GLM_FORCE_LEFT_HANDED;GLFW_INCLUDE_VULKAN;GLM_FORCE_RADIANS;GLM_FORCE_DEPTH_ZERO_TO_ONE;MSDF_ATLAS_PUBLIC=;MSDFGEN_PUBLIC=</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)ext/include/;$(ProjectDir)src/;$(SolutionDir)ext/repos/msdf-atlas-gen/;$(SolutionDir)ext/repos/msdf-atlas-gen/msdfgen/;$(SolutionDir)ext/repos/stb/;$(SolutionDir)ext/repos/glfw/include;$(ProjectDir)ext/repos/glm/;$(VULKAN_SDK)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)ext/include/;$(ProjectDir)src/;$(SolutionDir)ext/repos/msdf-atlas-gen/;$(SolutionDir)ext/repos/msdf-atlas-gen/msdfgen/;$(SolutionDir)ext/repos/stb/;$(SolutionDir)ext/repos/glfw/include;$(ProjectDir)ext/repos/glm/;$(VULKAN_SDK)/Include;$(SolutionDir)ext/repos/imgui/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
@@ -157,7 +157,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)libs\$(Platform)\$(Configuration)\;$(VULKAN_SDK)/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>vulkan-1.lib;glfw3.lib;shaderc_combined.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>vulkan-1.lib;imgui.lib;glfw3.lib;shaderc_combined.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
@@ -177,6 +177,7 @@
|
||||
<ClCompile Include="src\copium\core\Application.cpp" />
|
||||
<ClCompile Include="src\copium\buffer\Buffer.cpp" />
|
||||
<ClCompile Include="src\copium\core\Device.cpp" />
|
||||
<ClCompile Include="src\copium\core\ImGuiInstance.cpp" />
|
||||
<ClCompile Include="src\copium\core\Scene.cpp" />
|
||||
<ClCompile Include="src\copium\core\Vulkan.cpp" />
|
||||
<ClCompile Include="src\copium\core\Window.cpp" />
|
||||
@@ -247,6 +248,7 @@
|
||||
<ClInclude Include="src\copium\asset\AssetRef.h" />
|
||||
<ClInclude Include="src\copium\buffer\RendererVertexBuffer.h" />
|
||||
<ClInclude Include="src\copium\core\Device.h" />
|
||||
<ClInclude Include="src\copium\core\ImGuiInstance.h" />
|
||||
<ClInclude Include="src\copium\core\Scene.h" />
|
||||
<ClInclude Include="src\copium\core\Vulkan.h" />
|
||||
<ClInclude Include="src\copium\core\Window.h" />
|
||||
|
||||
@@ -222,6 +222,9 @@
|
||||
<ClCompile Include="src\copium\sampler\SamplerCreator.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\copium\core\ImGuiInstance.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\copium\sampler\DepthAttachment.h">
|
||||
@@ -524,5 +527,8 @@
|
||||
<ClInclude Include="src\copium\example\LevelGeneratorComponentListener.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\copium\core\ImGuiInstance.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
@@ -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()};
|
||||
|
||||
@@ -59,6 +59,7 @@ namespace Copium
|
||||
void Recreate();
|
||||
|
||||
int GetFlightIndex() const;
|
||||
int GetImageCount() const;
|
||||
|
||||
private:
|
||||
void Initialize();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user