#pragma once #include "Viewport/EditorViewportRuntimeServices.h" #include "Viewport/ViewportContentRenderer.h" #include "Viewport/SceneViewportRenderPassBundle.h" #include #include #include #include #include namespace XCEngine::RHI { class RHIDevice; } // namespace XCEngine::RHI namespace XCEngine::UI::Editor::App { class EditorShaderProvider; class SceneViewportEngineBridge; class SceneViewportRenderService : public IViewportContentRenderer , public EditorSceneViewportRuntime , public IViewportObjectPickerService { public: SceneViewportRenderService(); ~SceneViewportRenderService(); static EditorViewportResourceRequirements GetViewportResourceRequirements(); void Initialize( const SceneViewportShaderPaths& shaderPaths, SceneViewportEngineBridge& engineBridge, EditorShaderProvider& shaderProvider); void Shutdown(); void SetRenderRequest(SceneViewportRenderRequest request) override; const IViewportObjectPickerService& GetObjectPicker() const override; 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 InvalidateObjectIdFrame(); SceneViewportRenderRequest m_renderRequest = {}; SceneViewportRenderPassBundle m_renderPassBundle = {}; SceneViewportEngineBridge* m_engineBridge = nullptr; ::XCEngine::RHI::RHIDevice* m_device = nullptr; ViewportRenderTargets* m_lastTargets = nullptr; ::XCEngine::Rendering::RenderContext m_lastRenderContext = {}; std::uint64_t m_lastObjectIdRequestRevision = 0u; std::uint64_t m_objectIdFrameSerialCounter = 0u; }; } // namespace XCEngine::UI::Editor::App