Files
XCEngine/new_editor/app/Rendering/Viewport/ViewportHostService.h

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