#include "Viewport/GameViewportRenderService.h" #include "Engine/GameViewportEngineBridge.h" #include "Viewport/ViewportRenderTargets.h" #include #include #include namespace XCEngine::UI::Editor::App { namespace { ViewportRenderResult BuildFallbackResult( std::string statusText, float r, float g, float b, float a) { ViewportRenderResult result = {}; result.rendered = false; result.requiresFallbackClear = true; result.statusText = std::move(statusText); result.fallbackClearR = r; result.fallbackClearG = g; result.fallbackClearB = b; result.fallbackClearA = a; return result; } } // namespace EditorViewportResourceRequirements GameViewportRenderService::GetViewportResourceRequirements() { return {}; } void GameViewportRenderService::Initialize(GameViewportEngineBridge& engineBridge) { m_engineBridge = &engineBridge; } void GameViewportRenderService::Shutdown() { m_engineBridge = nullptr; } ViewportRenderResult GameViewportRenderService::Render( ViewportRenderTargets& targets, ::XCEngine::RHI::RHIDevice& device, const ::XCEngine::Rendering::RenderContext& renderContext) { (void)device; if (m_engineBridge == nullptr) { return BuildFallbackResult( "Game renderer is unavailable", 0.18f, 0.07f, 0.07f, 1.0f); } std::vector<::XCEngine::Rendering::CameraStackFramePlan> framePlans = {}; const GameViewportFramePlanBuildStatus buildStatus = m_engineBridge->BuildGameViewportFramePlans( renderContext, BuildViewportColorSurface(targets), framePlans); switch (buildStatus) { case GameViewportFramePlanBuildStatus::Success: break; case GameViewportFramePlanBuildStatus::NoActiveScene: return BuildFallbackResult( "No active scene", 0.07f, 0.08f, 0.10f, 1.0f); case GameViewportFramePlanBuildStatus::NoRenderableCamera: return BuildFallbackResult( "No active game camera", 0.10f, 0.10f, 0.12f, 1.0f); case GameViewportFramePlanBuildStatus::Failed: default: return BuildFallbackResult( "Game renderer failed", 0.18f, 0.07f, 0.07f, 1.0f); } if (!m_engineBridge->RenderGameViewportFramePlans(framePlans)) { return BuildFallbackResult( "Game renderer failed", 0.18f, 0.07f, 0.07f, 1.0f); } ViewportRenderResult result = {}; result.rendered = true; return result; } } // namespace XCEngine::UI::Editor::App