#pragma once #include "Rendering/Viewport/ViewportContentRenderer.h" #include "Rendering/Viewport/ViewportObjectPickerService.h" #include "Rendering/Viewport/SceneViewportRenderPassBundle.h" #include "Rendering/Viewport/SceneViewportRenderRequest.h" #include #include #include #include #include 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