From a362258a03b5f1c4bd63b656b65934ec273b3ec6 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sun, 8 Dec 2024 23:00:39 +0800 Subject: [PATCH] editor --- .../render/include/render/imgui_system.h | 12 +++ engine/modules/engine/render/xmake.lua | 6 +- .../render/vulkan/include/vkn/vulkan_imgui.h | 9 +++ .../render/vulkan/src/vulkan_imgui.cpp | 74 +++++++++++++++++++ engine/src/editor/editor.cpp | 14 +--- engine/xmake.lua | 3 +- 6 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 engine/modules/engine/render/include/render/imgui_system.h create mode 100644 engine/modules/render/vulkan/include/vkn/vulkan_imgui.h create mode 100644 engine/modules/render/vulkan/src/vulkan_imgui.cpp diff --git a/engine/modules/engine/render/include/render/imgui_system.h b/engine/modules/engine/render/include/render/imgui_system.h new file mode 100644 index 0000000..a05926a --- /dev/null +++ b/engine/modules/engine/render/include/render/imgui_system.h @@ -0,0 +1,12 @@ +#ifdef WITH_EDITOR +#include "module/module_manager.h" +namespace api { + class RENDER_API ImguiSystem : public ISystem + { + public: + // 渲染开始和结束 + // virtual void BeginFrame() = 0; + // virtual void EndFrame(void* command_buffer) = 0; + }; +} +#endif // WITH_EDITOR \ No newline at end of file diff --git a/engine/modules/engine/render/xmake.lua b/engine/modules/engine/render/xmake.lua index 766fba3..5605e9e 100644 --- a/engine/modules/engine/render/xmake.lua +++ b/engine/modules/engine/render/xmake.lua @@ -7,4 +7,8 @@ static_component("render","engine") add_files("src/**.cpp") add_deps("asset", "zlib", "core") add_syslinks("user32", {public = true}) - add_packages("lemon", "libsdl","shaderc","spirv-cross", {public = true}) \ No newline at end of file + add_packages("lemon", "libsdl","shaderc","spirv-cross", {public = true}) + if WITH_EDITOR then + add_defines("WITH_EDITOR", {public = true}) + add_packages("imgui",{public = true}) + end \ No newline at end of file diff --git a/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h b/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h new file mode 100644 index 0000000..0aa6f13 --- /dev/null +++ b/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h @@ -0,0 +1,9 @@ +#pragma once +#include "render/imgui_system.h" +namespace vkn { + class VulkanImguiSystem : public api::ImguiSystem { + void Initialize() override; + void Finalize() override; + + }; +} \ No newline at end of file diff --git a/engine/modules/render/vulkan/src/vulkan_imgui.cpp b/engine/modules/render/vulkan/src/vulkan_imgui.cpp new file mode 100644 index 0000000..a19255b --- /dev/null +++ b/engine/modules/render/vulkan/src/vulkan_imgui.cpp @@ -0,0 +1,74 @@ +#include "vkn/vulkan_imgui.h" +#include "vkn/vulkan_api.h" +#include "vkn/vulkan_api_help.h" +#include "vkn/backend.h" +#include "vkn/wrapper/device.h" +#include "vkn/wrapper/instance.h" +#include "vkn/wrapper/queue.h" +#include "render/window.h" +#include "imgui.h" +#include "backends/imgui_impl_sdl2.h" +#include "backends/imgui_impl_vulkan.h" +#include "tinyimageformat/tinyimageformat_apis.h" +namespace vkn { + static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; + void CreateDescriptorPool(VkDevice device, VkDescriptorPool& descriptorPool) { + VkDescriptorPoolSize pool_sizes[] = + { + { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } + }; + VkDescriptorPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes); + pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + VkResult err = vkCreateDescriptorPool(device, &pool_info, VK_NULL_HANDLE, &descriptorPool); + } + void CreateRenderPass(VulkanAPI* API) { + RenderPassKey config{}; + config.colorFormat[0] = (VkFormat)TinyImageFormat_ToVkFormat(API->context.surface.format); + config.samples = VK_SAMPLE_COUNT_1_BIT; + + } + void VulkanImguiSystem::Initialize() + { + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // 可选:启用键盘导航 + io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // 可选:启用Docking + io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // 可选:启用多视口 + ImGui::StyleColorsDark(); + + ImGui_ImplSDL2_InitForVulkan(api::Window::Ptr()->GetPtr()); + Backend& backend = VulkanAPI::Ptr()->GetBackend(); + Queue* pQueue = backend.GetDevice().GetQueue(Queue::RenderQueue); + CreateDescriptorPool(backend.GetDevice().Ptr(), g_DescriptorPool); + ImGui_ImplVulkan_InitInfo init_info = {}; + init_info.Instance = backend.GetInstance().Ptr(); + init_info.PhysicalDevice = backend.GetDevice().GetPhysical(); + init_info.Device = backend.GetDevice().Ptr(); + init_info.QueueFamily = pQueue->QueueFamilyIndex(); + init_info.Queue = pQueue->Ptr(); + init_info.DescriptorPool = g_DescriptorPool; + init_info.MinImageCount = 2; + init_info.ImageCount = swapchainImageCount; + + ImGui_ImplVulkan_Init(&init_info, renderPass); + } + void VulkanImguiSystem::Finalize() + { + + } +} diff --git a/engine/src/editor/editor.cpp b/engine/src/editor/editor.cpp index a17ccbf..00c1c14 100644 --- a/engine/src/editor/editor.cpp +++ b/engine/src/editor/editor.cpp @@ -1,6 +1,7 @@ #include "editor/editor.h" #include "data/global.h" -#include "imgui.h" +#include "render/window.h" +#include "render/renderapi.h" namespace api { void EditorModule::OnLoad(int argc, char** argv) { @@ -12,15 +13,6 @@ namespace api { } void EditorModule::Initialize(void) { - IDynamicModule::Initialize(); - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGui::StyleColorsDark(); - ImGuiIO& io = ImGui::GetIO(); - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // 可选:启用键盘导航 - io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // 可选:启用Docking - io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // 可选:启用多视口 - if (gEngineConfig.API == GraphicsAPI::Vulkan) { - } + } } \ No newline at end of file diff --git a/engine/xmake.lua b/engine/xmake.lua index c6b1fdc..9e83b4c 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -1,3 +1,4 @@ +WITH_EDITOR = true target("engine") add_defines("ENGINE_ROOT="..os.curdir():gsub("\\", "\\\\"),{public = false}) add_headerfiles("include/*.natvis") @@ -13,8 +14,6 @@ target("editor") add_headerfiles("include/editor/*.h") add_includedirs("include") add_files("src/editor/*.cpp") - add_defines("WITH_EDITOR", {public = true}) - add_packages("imgui",{public = true}) add_deps("engine",{public = true}) includes("xmake/xmake.lua") includes("3rdparty/xmake.lua")