Files
XCEngine/editor/app/Rendering/Viewport/SceneViewportRenderService.h
2026-04-25 16:46:01 +08:00

65 lines
1.9 KiB
C++

#pragma once
#include "Rendering/Viewport/ViewportContentRenderer.h"
#include "Rendering/Viewport/ViewportObjectPickerService.h"
#include "Rendering/Viewport/SceneViewportRenderPassBundle.h"
#include "Rendering/Viewport/SceneViewportRenderRequest.h"
#include <memory>
#include <string>
#include <cstdint>
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/UI/Types.h>
namespace XCEngine::Rendering {
class SceneRenderer;
} // namespace XCEngine::Rendering
namespace XCEngine::RHI {
class RHIDevice;
} // namespace XCEngine::RHI
namespace XCEngine::UI::Editor::App {
class SceneViewportRenderService
: public IViewportContentRenderer
, public IViewportObjectPickerService {
public:
SceneViewportRenderService();
~SceneViewportRenderService();
static ViewportResourceRequirements GetViewportResourceRequirements();
void Shutdown();
void SetRenderRequest(SceneViewportRenderRequest request);
ViewportRenderResult Render(
ViewportRenderTargets& targets,
::XCEngine::RHI::RHIDevice& device,
const ::XCEngine::Rendering::RenderContext& renderContext) override;
ViewportObjectIdPickResult PickObject(
const ::XCEngine::UI::UISize& viewportSize,
const ::XCEngine::UI::UIPoint& viewportMousePosition) const override;
private:
void EnsureSceneRenderer();
void InvalidateObjectIdFrame();
SceneViewportRenderRequest m_renderRequest = {};
std::unique_ptr<::XCEngine::Rendering::SceneRenderer> m_sceneRenderer = {};
SceneViewportRenderPassBundle m_renderPassBundle = {};
::XCEngine::RHI::RHIDevice* m_device = nullptr;
ViewportRenderTargets* m_lastTargets = nullptr;
::XCEngine::Rendering::RenderContext m_lastRenderContext = {};
::XCEngine::Components::Scene* m_lastObjectIdScene = nullptr;
::XCEngine::Components::CameraComponent* m_lastObjectIdCamera = nullptr;
std::uint64_t m_objectIdFrameSerialCounter = 0u;
};
} // namespace XCEngine::UI::Editor::App