Route editor actions by active target

This commit is contained in:
2026-03-26 22:10:43 +08:00
parent 5c8042775c
commit 5735e769b0
21 changed files with 609 additions and 104 deletions

View File

@@ -7,16 +7,12 @@
#include <XCEngine/Debug/Logger.h>
#include <XCEngine/Debug/FileLogSink.h>
#include <XCEngine/Debug/ConsoleLogSink.h>
#include <imgui_impl_win32.h>
#include <imgui_impl_dx12.h>
#include <imgui_internal.h>
#include <filesystem>
#include <stdio.h>
#include <windows.h>
#include <string>
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
namespace {
std::string WideToUtf8(const std::wstring& value) {
@@ -66,10 +62,6 @@ std::string GetExecutableLogPath(const char* fileName) {
return GetExecutableDirectoryUtf8() + "\\" + fileName;
}
std::string BuildEditorConfigDirectory(const std::string& projectPath) {
return (std::filesystem::path(projectPath) / ".xceditor").string();
}
} // namespace
static LONG WINAPI GlobalExceptionFilter(EXCEPTION_POINTERS* exceptionPointers) {
@@ -142,12 +134,9 @@ bool Application::Initialize(HWND hwnd) {
PostMessageW(m_hwnd, WM_CLOSE, 0, 0);
}
});
ConfigureImGui(m_editorContext->GetProjectPath());
m_imguiSession.Initialize(m_editorContext->GetProjectPath());
ImGui_ImplWin32_Init(hwnd);
ImGui_ImplDX12_Init(m_device, 3, DXGI_FORMAT_R8G8B8A8_UNORM, m_srvHeap,
m_srvHeap->GetCPUDescriptorHandleForHeapStart(),
m_srvHeap->GetGPUDescriptorHandleForHeapStart());
m_imguiBackend.Initialize(hwnd, m_device, m_srvHeap);
m_editorLayer = new EditorLayer();
m_editorLayer->SetContext(m_editorContext);
@@ -159,16 +148,14 @@ bool Application::Initialize(HWND hwnd) {
void Application::Shutdown() {
m_layerStack.onDetach();
SaveImGuiSettings();
if (m_editorContext && m_exitRequestedHandlerId) {
m_editorContext->GetEventBus().Unsubscribe<EditorExitRequestedEvent>(m_exitRequestedHandlerId);
m_exitRequestedHandlerId = 0;
}
ImGui_ImplDX12_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
m_imguiBackend.Shutdown();
m_imguiSession.Shutdown();
CleanupRenderTarget();
@@ -183,9 +170,7 @@ void Application::Shutdown() {
}
void Application::Render() {
ImGui_ImplDX12_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
m_imguiBackend.BeginFrame();
m_layerStack.onImGuiRender();
UpdateWindowTitle();
@@ -214,7 +199,7 @@ void Application::Render() {
ID3D12DescriptorHeap* heaps[] = { m_srvHeap };
m_commandList->SetDescriptorHeaps(1, heaps);
ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), m_commandList);
m_imguiBackend.RenderDrawData(m_commandList);
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
@@ -233,45 +218,6 @@ void Application::Render() {
}
}
void Application::ConfigureImGui(const std::string& projectPath) {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
ConfigureImGuiIniFile(projectPath, io);
if (ImFont* uiFont = io.Fonts->AddFontFromFileTTF("C:/Windows/Fonts/msyh.ttc", 15.0f)) {
io.FontDefault = uiFont;
} else {
io.FontDefault = io.Fonts->AddFontDefault();
}
unsigned char* pixels = nullptr;
int width = 0;
int height = 0;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
ApplyUnityDarkTheme();
}
void Application::ConfigureImGuiIniFile(const std::string& projectPath, ImGuiIO& io) {
const std::filesystem::path configDir = BuildEditorConfigDirectory(projectPath);
std::error_code ec;
std::filesystem::create_directories(configDir, ec);
m_imguiIniPath = (configDir / "imgui_layout.ini").string();
io.IniFilename = m_imguiIniPath.c_str();
}
void Application::SaveImGuiSettings() {
if (m_imguiIniPath.empty() || ImGui::GetCurrentContext() == nullptr) {
return;
}
ImGui::SaveIniSettingsToDisk(m_imguiIniPath.c_str());
}
void Application::UpdateWindowTitle() {
if (!m_hwnd || !m_editorContext) {
return;