editor window
This commit is contained in:
parent
5c695160d3
commit
99803e7391
3
engine/3rdparty/xmake.lua
vendored
3
engine/3rdparty/xmake.lua
vendored
@ -1,4 +1,5 @@
|
|||||||
add_requires("spdlog", "libsdl", "vulkansdk","shaderc","spirv","spirv-cross")
|
add_requires("spdlog", "vulkansdk","shaderc","spirv","spirv-cross")
|
||||||
add_requires("mimalloc", {configs = {shared = true, debug = true, copy = true}})
|
add_requires("mimalloc", {configs = {shared = true, debug = true, copy = true}})
|
||||||
add_requires("imgui",{configs = {shared = true, debug = true, copy = true}})
|
add_requires("imgui",{configs = {shared = true, debug = true, copy = true}})
|
||||||
|
add_requires("libsdl",{configs = {shared = true}})
|
||||||
includes("*/xmake.lua")
|
includes("*/xmake.lua")
|
||||||
8
engine/include/editor/panel/asset_preview_panel.h
Normal file
8
engine/include/editor/panel/asset_preview_panel.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "render/editor_system.h"
|
||||||
|
namespace api {
|
||||||
|
class AssetPreviewPanel : public EditorPanel{
|
||||||
|
public:
|
||||||
|
void DrawPanel() override;
|
||||||
|
};
|
||||||
|
}
|
||||||
8
engine/include/editor/panel/menu_bar_panel.h
Normal file
8
engine/include/editor/panel/menu_bar_panel.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "render/editor_system.h"
|
||||||
|
namespace api {
|
||||||
|
class MenuBarPanel : public EditorPanel {
|
||||||
|
public:
|
||||||
|
void DrawPanel() override;
|
||||||
|
};
|
||||||
|
}
|
||||||
9
engine/include/editor/window/editor_main_window.h
Normal file
9
engine/include/editor/window/editor_main_window.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "render/editor_system.h"
|
||||||
|
namespace api {
|
||||||
|
class EditorMainWindow : public EditorWindow {
|
||||||
|
public:
|
||||||
|
EditorMainWindow();
|
||||||
|
void Draw() override;
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -4,4 +4,5 @@ static_component("asset","engine")
|
|||||||
})
|
})
|
||||||
add_headerfiles("include/**.h","include/**.inl")
|
add_headerfiles("include/**.h","include/**.inl")
|
||||||
add_files("src/**.cpp")
|
add_files("src/**.cpp")
|
||||||
add_deps("core", "zlib")
|
add_deps("core", "zlib")
|
||||||
|
add_syslinks("Ole32",{public = true})
|
||||||
@ -1,10 +1,10 @@
|
|||||||
#include "render/renderapi.h"
|
#include "render/renderapi.h"
|
||||||
#include "render/module.h"
|
#include "render/module.h"
|
||||||
#ifdef WITH_EDITOR
|
#ifdef WITH_EDITOR
|
||||||
#include "render/imgui_system.h"
|
#include "render/editor_system.h"
|
||||||
namespace api {
|
namespace api {
|
||||||
SINGLETON_DEFINE(ImguiSystem)
|
SINGLETON_DEFINE(EditorSystem)
|
||||||
ImguiSystem::ImguiSystem()
|
EditorSystem::EditorSystem()
|
||||||
{
|
{
|
||||||
SINGLETON_PTR();
|
SINGLETON_PTR();
|
||||||
}
|
}
|
||||||
|
|||||||
40
engine/modules/engine/render/include/render/editor_system.h
Normal file
40
engine/modules/engine/render/include/render/editor_system.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifdef WITH_EDITOR
|
||||||
|
#include "module/module_manager.h"
|
||||||
|
namespace api {
|
||||||
|
class EditorPanel {
|
||||||
|
public:
|
||||||
|
EditorPanel() = default;
|
||||||
|
~EditorPanel() = default;
|
||||||
|
virtual void DrawPanel() = 0;
|
||||||
|
};
|
||||||
|
class EditorWindow {
|
||||||
|
protected:
|
||||||
|
std::vector<EditorPanel*> mPanels;
|
||||||
|
public:
|
||||||
|
EditorWindow() = default;
|
||||||
|
~EditorWindow() = default;
|
||||||
|
virtual void Draw() = 0;
|
||||||
|
template<typename T, typename ... Args>
|
||||||
|
T* AddPanel(Args&&... args) {
|
||||||
|
T* ptr = new (GlobalPool()) T(std::forward<Args>(args)...);
|
||||||
|
mPanels.push_back(ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class RENDER_API EditorSystem : public ISystem
|
||||||
|
{
|
||||||
|
SINGLETON_IMPL(EditorSystem)
|
||||||
|
protected:
|
||||||
|
std::vector<EditorWindow*> mWindows;
|
||||||
|
public:
|
||||||
|
EditorSystem();
|
||||||
|
template<typename T, typename ... Args>
|
||||||
|
T* AddWindow(Args&&... args) {
|
||||||
|
T* ptr = new (GlobalPool()) T(std::forward<Args>(args)...);
|
||||||
|
mWindows.push_back(ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // WITH_EDITOR
|
||||||
@ -1,12 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#ifdef WITH_EDITOR
|
|
||||||
#include "module/module_manager.h"
|
|
||||||
namespace api {
|
|
||||||
class RENDER_API ImguiSystem : public ISystem
|
|
||||||
{
|
|
||||||
SINGLETON_IMPL(ImguiSystem)
|
|
||||||
public:
|
|
||||||
ImguiSystem();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
#endif // WITH_EDITOR
|
|
||||||
@ -1,14 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "render/imgui_system.h"
|
#include "render/editor_system.h"
|
||||||
#include "render/graph/frame_graph.h"
|
#include "render/graph/frame_graph.h"
|
||||||
namespace vkn {
|
namespace vkn {
|
||||||
using api::FrameGraph;
|
using api::FrameGraph;
|
||||||
using api::RenderPassContext;
|
using api::RenderPassContext;
|
||||||
class VulkanImguiSystem : public api::ImguiSystem {
|
class VulkanImguiEditor : public api::EditorSystem {
|
||||||
public:
|
public:
|
||||||
void Initialize() override;
|
void Initialize() override;
|
||||||
void Finalize() override;
|
void Finalize() override;
|
||||||
void Render();
|
void Render();
|
||||||
|
void OnBeginRenderFrame();
|
||||||
|
static VulkanImguiEditor* Ptr() {
|
||||||
|
return (VulkanImguiEditor*)api::EditorSystem::Ptr();
|
||||||
|
};
|
||||||
static void Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder);
|
static void Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder);
|
||||||
static void Execute(FrameGraph&, RenderPassContext&);
|
static void Execute(FrameGraph&, RenderPassContext&);
|
||||||
};
|
};
|
||||||
@ -1,6 +1,6 @@
|
|||||||
#include "xmalloc_new_delete.h"
|
#include "xmalloc_new_delete.h"
|
||||||
#include "vkn/module.h"
|
#include "vkn/module.h"
|
||||||
#include "vkn/vulkan_imgui.h"
|
#include "vkn/vulkan_imgui_editor.h"
|
||||||
#include "vkn/loader/vulkan_glsl_loader.h"
|
#include "vkn/loader/vulkan_glsl_loader.h"
|
||||||
#include "pmr/frame_allocator.h"
|
#include "pmr/frame_allocator.h"
|
||||||
using namespace vkn;
|
using namespace vkn;
|
||||||
@ -8,7 +8,7 @@ void VulkanModule::OnLoad(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
VulkanGlslLoader::Init();
|
VulkanGlslLoader::Init();
|
||||||
#ifdef WITH_EDITOR
|
#ifdef WITH_EDITOR
|
||||||
AddSystem<VulkanImguiSystem>();
|
AddSystem<VulkanImguiEditor>();
|
||||||
#endif // WITH_EDITOR
|
#endif // WITH_EDITOR
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "vkn/vulkan_imgui.h"
|
#include "vkn/vulkan_imgui_editor.h"
|
||||||
#include "vkn/vulkan_window.h"
|
#include "vkn/vulkan_window.h"
|
||||||
#include "vkn/vulkan_api.h"
|
#include "vkn/vulkan_api.h"
|
||||||
#include "vkn/vulkan_api_help.h"
|
#include "vkn/vulkan_api_help.h"
|
||||||
@ -14,6 +14,7 @@ namespace vkn {
|
|||||||
using namespace api;
|
using namespace api;
|
||||||
static Name ImguiPassName{"ImguiPass"};
|
static Name ImguiPassName{"ImguiPass"};
|
||||||
static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE;
|
static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE;
|
||||||
|
// Vulkan的ImGui接入比较麻烦,参考教程: https://frguthmann.github.io/posts/vulkan_imgui/
|
||||||
VkDescriptorPool CreateDescriptorPool(VkDevice device) {
|
VkDescriptorPool CreateDescriptorPool(VkDevice device) {
|
||||||
VkDescriptorPoolSize pool_sizes[] =
|
VkDescriptorPoolSize pool_sizes[] =
|
||||||
{
|
{
|
||||||
@ -80,7 +81,7 @@ namespace vkn {
|
|||||||
throw std::runtime_error("Could not create Dear ImGui's render pass");
|
throw std::runtime_error("Could not create Dear ImGui's render pass");
|
||||||
return renderPass;
|
return renderPass;
|
||||||
}
|
}
|
||||||
void VulkanImguiSystem::Initialize()
|
void VulkanImguiEditor::Initialize()
|
||||||
{
|
{
|
||||||
VulkanAPI* API = VulkanAPI::Ptr();
|
VulkanAPI* API = VulkanAPI::Ptr();
|
||||||
VulkanWindow* window = VulkanWindow::Ptr();
|
VulkanWindow* window = VulkanWindow::Ptr();
|
||||||
@ -105,18 +106,24 @@ namespace vkn {
|
|||||||
init_info.Allocator = VK_NULL_HANDLE;
|
init_info.Allocator = VK_NULL_HANDLE;
|
||||||
ImGui_ImplVulkan_Init(&init_info);
|
ImGui_ImplVulkan_Init(&init_info);
|
||||||
API->SetRenderPassInfo(ImguiPassName, renderPass);
|
API->SetRenderPassInfo(ImguiPassName, renderPass);
|
||||||
EventSystem::Ptr()->BeginRenderFrame.Subscribe(&VulkanImguiSystem::Render, this);
|
EventSystem::Ptr()->BeginRenderFrame.Subscribe(&VulkanImguiEditor::OnBeginRenderFrame, this);
|
||||||
|
|
||||||
}
|
}
|
||||||
void VulkanImguiSystem::Finalize()
|
void VulkanImguiEditor::Finalize()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
void VulkanImguiSystem::Render()
|
void VulkanImguiEditor::Render()
|
||||||
{
|
{
|
||||||
VulkanAPI::Ptr()->graph.AddRenderPass<VulkanImguiSystem>();
|
for (auto win : mWindows)
|
||||||
|
{
|
||||||
|
win->Draw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void VulkanImguiSystem::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder)
|
void VulkanImguiEditor::OnBeginRenderFrame()
|
||||||
|
{
|
||||||
|
VulkanAPI::Ptr()->graph.AddRenderPass<VulkanImguiEditor>();
|
||||||
|
}
|
||||||
|
void VulkanImguiEditor::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder)
|
||||||
{
|
{
|
||||||
AttachmentDesc surface{};
|
AttachmentDesc surface{};
|
||||||
surface.FromTexture(graph.mSurface);
|
surface.FromTexture(graph.mSurface);
|
||||||
@ -127,17 +134,14 @@ namespace vkn {
|
|||||||
.Type(RenderPassNodeType::Imgui, RenderPassNodeFlag::Output)
|
.Type(RenderPassNodeType::Imgui, RenderPassNodeFlag::Output)
|
||||||
.Write(edge, ResourceState::COLOR_ATTACHMENT);
|
.Write(edge, ResourceState::COLOR_ATTACHMENT);
|
||||||
}
|
}
|
||||||
void VulkanImguiSystem::Execute(FrameGraph& graph, RenderPassContext& context)
|
void VulkanImguiEditor::Execute(FrameGraph& graph, RenderPassContext& context)
|
||||||
{
|
{
|
||||||
graph.mSurface.state = ResourceState::PRESENT;
|
graph.mSurface.state = ResourceState::PRESENT;
|
||||||
ImGui_ImplVulkan_NewFrame();
|
ImGui_ImplVulkan_NewFrame();
|
||||||
ImGui_ImplSDL2_NewFrame();
|
ImGui_ImplSDL2_NewFrame();
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
static float my_float = 0.5f;
|
|
||||||
ImGui::Begin("Hello, ImGui!");
|
VulkanImguiEditor::Ptr()->Render();
|
||||||
ImGui::Text("This is some useful text.");
|
|
||||||
ImGui::SliderFloat("float", &my_float, 0.0f, 1.0f);
|
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
VulkanContext& ctx = *(VulkanContext*)context.parent;
|
VulkanContext& ctx = *(VulkanContext*)context.parent;
|
||||||
@ -2,6 +2,7 @@
|
|||||||
#include "data/global.h"
|
#include "data/global.h"
|
||||||
#include "render/window.h"
|
#include "render/window.h"
|
||||||
#include "render/renderapi.h"
|
#include "render/renderapi.h"
|
||||||
|
#include "editor/window/editor_main_window.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
namespace api {
|
namespace api {
|
||||||
void EditorModule::OnLoad(int argc, char** argv)
|
void EditorModule::OnLoad(int argc, char** argv)
|
||||||
@ -20,6 +21,7 @@ namespace api {
|
|||||||
}
|
}
|
||||||
void EditorModule::Initialize(void)
|
void EditorModule::Initialize(void)
|
||||||
{
|
{
|
||||||
|
EditorSystem* Editor = EditorSystem::Ptr();
|
||||||
|
Editor->AddWindow<EditorMainWindow>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
9
engine/src/editor/panel/asset_preview_panel.cpp
Normal file
9
engine/src/editor/panel/asset_preview_panel.cpp
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "editor/panel/asset_preview_panel.h"
|
||||||
|
#include <imgui.h>
|
||||||
|
namespace api {
|
||||||
|
void AssetPreviewPanel::DrawPanel() {
|
||||||
|
static float my_float = 0.5f;
|
||||||
|
ImGui::Text("This is some useful text.");
|
||||||
|
ImGui::SliderFloat("float", &my_float, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
25
engine/src/editor/panel/menu_bar_panel.cpp
Normal file
25
engine/src/editor/panel/menu_bar_panel.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "editor/panel/menu_bar_panel.h"
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
void MenuBarPanel::DrawPanel()
|
||||||
|
{
|
||||||
|
// 面板大小和位置
|
||||||
|
if (ImGui::BeginMenu("Tools")) {
|
||||||
|
if (ImGui::MenuItem("Performance Analyzer")) {
|
||||||
|
// 显示性能分析工具
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem("Debug Console")) {
|
||||||
|
// 显示调试控制台
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginMenu("Help")) {
|
||||||
|
if (ImGui::MenuItem("About")) {
|
||||||
|
// 显示关于信息
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
engine/src/editor/window/editor_main_window.cpp
Normal file
19
engine/src/editor/window/editor_main_window.cpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include "editor/window/editor_main_window.h"
|
||||||
|
#include "editor/panel/asset_preview_panel.h"
|
||||||
|
#include "editor/panel/menu_bar_panel.h"
|
||||||
|
#include <imgui.h>
|
||||||
|
namespace api {
|
||||||
|
EditorMainWindow::EditorMainWindow()
|
||||||
|
{
|
||||||
|
AddPanel<MenuBarPanel>();
|
||||||
|
AddPanel<AssetPreviewPanel>();
|
||||||
|
}
|
||||||
|
void EditorMainWindow::Draw()
|
||||||
|
{
|
||||||
|
ImGui::Begin("MainWindow");
|
||||||
|
for (auto panel : mPanels) {
|
||||||
|
panel->DrawPanel();
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -6,14 +6,14 @@ target("engine")
|
|||||||
set_kind("shared")
|
set_kind("shared")
|
||||||
set_group("Engine")
|
set_group("Engine")
|
||||||
add_rules("engine.api")
|
add_rules("engine.api")
|
||||||
add_files("src/engine/*.cpp")
|
add_files("src/engine/**.cpp")
|
||||||
target("editor")
|
target("editor")
|
||||||
set_kind("shared")
|
set_kind("shared")
|
||||||
set_group("Engine")
|
set_group("Engine")
|
||||||
add_rules("engine.api")
|
add_rules("engine.api")
|
||||||
add_headerfiles("include/editor/*.h")
|
add_headerfiles("include/editor/**.h")
|
||||||
add_includedirs("include")
|
add_includedirs("include")
|
||||||
add_files("src/editor/*.cpp")
|
add_files("src/editor/**.cpp")
|
||||||
add_deps("engine",{public = true})
|
add_deps("engine",{public = true})
|
||||||
includes("xmake/xmake.lua")
|
includes("xmake/xmake.lua")
|
||||||
includes("3rdparty/xmake.lua")
|
includes("3rdparty/xmake.lua")
|
||||||
|
|||||||
@ -10,5 +10,11 @@ ViewportId=0x41ACA57A
|
|||||||
Size=191,71
|
Size=191,71
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][MainWindow]
|
||||||
|
ViewportPos=480,240
|
||||||
|
ViewportId=0x72FC8CA3
|
||||||
|
Size=191,105
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
[Docking][Data]
|
[Docking][Data]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user