89 lines
2.7 KiB
C++
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
|