Files
XCEngine/new_editor/src/XCUIBackend/ImGuiWindowUICompositor.h

89 lines
2.7 KiB
C++

#pragma once
#include "XCUIBackend/IEditorHostCompositor.h"
#include "XCUIBackend/IWindowUICompositor.h"
#include <memory>
#include <utility>
namespace XCEngine {
namespace Editor {
namespace XCUIBackend {
class ImGuiWindowUICompositor final : public IWindowUICompositor {
public:
explicit ImGuiWindowUICompositor(
std::unique_ptr<IEditorHostCompositor> hostCompositor = CreateImGuiHostCompositor())
: m_hostCompositor(std::move(hostCompositor)) {
}
bool Initialize(
HWND hwnd,
::XCEngine::Editor::Platform::D3D12WindowRenderer& windowRenderer,
const ConfigureFontsCallback& configureFonts) override {
if (m_hostCompositor == nullptr) {
return false;
}
m_windowRenderer = &windowRenderer;
return m_hostCompositor->Initialize(hwnd, windowRenderer, configureFonts);
}
void Shutdown() override {
if (m_hostCompositor != nullptr) {
m_hostCompositor->Shutdown();
}
m_windowRenderer = nullptr;
}
bool HandleWindowMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) override {
return m_hostCompositor != nullptr &&
m_hostCompositor->HandleWindowMessage(hwnd, message, wParam, lParam);
}
void RenderFrame(
const float clearColor[4],
const UiRenderCallback& renderUi,
const RenderCallback& beforeUiRender,
const RenderCallback& afterUiRender) override {
if (m_hostCompositor == nullptr || m_windowRenderer == nullptr) {
return;
}
m_hostCompositor->BeginFrame();
if (renderUi) {
renderUi();
}
m_hostCompositor->EndFrameAndPresent(*m_windowRenderer, clearColor, beforeUiRender, afterUiRender);
}
bool CreateTextureDescriptor(
::XCEngine::RHI::RHIDevice* device,
::XCEngine::RHI::RHITexture* texture,
UITextureRegistration& outRegistration) override {
return m_hostCompositor != nullptr &&
m_hostCompositor->CreateTextureDescriptor(
device,
texture,
outRegistration);
}
void FreeTextureDescriptor(const UITextureRegistration& registration) override {
if (m_hostCompositor != nullptr) {
m_hostCompositor->FreeTextureDescriptor(registration);
}
}
private:
::XCEngine::Editor::Platform::D3D12WindowRenderer* m_windowRenderer = nullptr;
std::unique_ptr<IEditorHostCompositor> m_hostCompositor;
};
inline std::unique_ptr<IWindowUICompositor> CreateImGuiWindowUICompositor() {
return std::make_unique<ImGuiWindowUICompositor>();
}
} // namespace XCUIBackend
} // namespace Editor
} // namespace XCEngine