105 lines
3.3 KiB
C++
105 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include "Host/HostFwd.h"
|
|
#include "SceneViewportRenderPassBundle.h"
|
|
#include "ViewportObjectIdPicker.h"
|
|
#include "ViewportRenderTargets.h"
|
|
|
|
#include <memory>
|
|
|
|
#include <XCEngine/Rendering/RenderContext.h>
|
|
#include <XCEngine/UI/Types.h>
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
namespace XCEngine::Rendering {
|
|
|
|
class SceneRenderer;
|
|
|
|
} // namespace XCEngine::Rendering
|
|
|
|
namespace XCEngine::UI::Editor::App {
|
|
|
|
class ViewportHostService {
|
|
public:
|
|
ViewportHostService();
|
|
~ViewportHostService();
|
|
|
|
void AttachWindowRenderer(Host::ViewportRenderHost& windowRenderer);
|
|
void DetachWindowRenderer();
|
|
void SetSurfacePresentationEnabled(bool enabled);
|
|
void SetSceneViewportRenderRequest(SceneViewportRenderRequest request);
|
|
|
|
void Shutdown();
|
|
void BeginFrame();
|
|
|
|
ViewportFrame RequestViewport(
|
|
ViewportKind kind,
|
|
const ::XCEngine::UI::UISize& requestedSize);
|
|
ViewportObjectIdPickResult PickSceneViewportObject(
|
|
const ::XCEngine::UI::UISize& viewportSize,
|
|
const ::XCEngine::UI::UIPoint& viewportMousePosition);
|
|
|
|
void RenderRequestedViewports(
|
|
const ::XCEngine::Rendering::RenderContext& renderContext);
|
|
|
|
private:
|
|
struct ViewportEntry {
|
|
ViewportKind kind = ViewportKind::Scene;
|
|
std::uint32_t requestedWidth = 0;
|
|
std::uint32_t requestedHeight = 0;
|
|
bool requestedThisFrame = false;
|
|
bool renderedThisFrame = false;
|
|
ViewportRenderTargets renderTargets = {};
|
|
std::string statusText = {};
|
|
};
|
|
|
|
ViewportEntry& GetEntry(ViewportKind kind);
|
|
const ViewportEntry& GetEntry(ViewportKind kind) const;
|
|
void DestroyViewportEntry(ViewportEntry& entry);
|
|
void EnsureSceneRenderer();
|
|
bool EnsureViewportResources(ViewportEntry& entry);
|
|
bool RenderSceneViewport(
|
|
ViewportEntry& entry,
|
|
const ::XCEngine::Rendering::RenderContext& renderContext);
|
|
ViewportObjectIdPickResult PickSceneViewportObjectWithObjectId(
|
|
ViewportEntry& entry,
|
|
const ::XCEngine::UI::UISize& viewportSize,
|
|
const ::XCEngine::UI::UIPoint& viewportMousePosition);
|
|
void ApplySceneViewportFallback(
|
|
ViewportEntry& entry,
|
|
const ::XCEngine::Rendering::RenderContext& renderContext,
|
|
std::string statusText,
|
|
float r,
|
|
float g,
|
|
float b,
|
|
float a);
|
|
void ClearViewport(
|
|
ViewportEntry& entry,
|
|
const ::XCEngine::Rendering::RenderContext& renderContext,
|
|
float r,
|
|
float g,
|
|
float b,
|
|
float a);
|
|
ViewportFrame BuildFrame(
|
|
const ViewportEntry& entry,
|
|
const ::XCEngine::UI::UISize& requestedSize) const;
|
|
|
|
Host::ViewportRenderHost* m_windowRenderer = nullptr;
|
|
::XCEngine::RHI::RHIDevice* m_device = nullptr;
|
|
std::unique_ptr<Host::ShaderResourceDescriptorAllocator> m_textureDescriptorAllocator = {};
|
|
ViewportRenderTargetManager m_renderTargetManager = {};
|
|
bool m_surfacePresentationEnabled = false;
|
|
SceneViewportRenderRequest m_sceneViewportRenderRequest = {};
|
|
std::unique_ptr<::XCEngine::Rendering::SceneRenderer> m_sceneRenderer = {};
|
|
SceneViewportRenderPassBundle m_sceneViewportRenderPassBundle = {};
|
|
::XCEngine::Rendering::RenderContext m_sceneViewportLastRenderContext = {};
|
|
std::array<ViewportEntry, 2> m_entries = {};
|
|
};
|
|
|
|
} // namespace XCEngine::UI::Editor::App
|
|
|