Files
XCEngine/editor/app/Services/Engine/EngineGameViewportBridge.cpp

67 lines
1.9 KiB
C++

#include "Engine/EngineGameViewportBridge.h"
#include <XCEngine/Scene/Scene.h>
#include <XCEngine/Scene/SceneManager.h>
#include <algorithm>
#include <vector>
namespace XCEngine::UI::Editor::App {
namespace {
using ::XCEngine::Components::Scene;
using ::XCEngine::Components::SceneManager;
Scene* ResolvePrimaryScene(SceneManager& sceneManager) {
if (Scene* activeScene = sceneManager.GetActiveScene();
activeScene != nullptr) {
return activeScene;
}
const std::vector<Scene*> scenes = sceneManager.GetAllScenes();
if (!scenes.empty() && scenes.front() != nullptr) {
sceneManager.SetActiveScene(scenes.front());
return scenes.front();
}
return nullptr;
}
} // namespace
GameViewportFramePlanBuildStatus EngineGameViewportBridge::BuildFramePlans(
const ::XCEngine::Rendering::RenderContext& renderContext,
const ::XCEngine::Rendering::RenderSurface& surface,
std::vector<::XCEngine::Rendering::CameraStackFramePlan>& outFramePlans) {
outFramePlans.clear();
Scene* scene = ResolvePrimaryScene(SceneManager::Get());
if (scene == nullptr) {
return GameViewportFramePlanBuildStatus::NoActiveScene;
}
outFramePlans = m_gameViewportRenderer.BuildStackFramePlans(
*scene,
nullptr,
renderContext,
surface);
outFramePlans.erase(
std::remove_if(
outFramePlans.begin(),
outFramePlans.end(),
[](const auto& plan) { return !plan.IsValid(); }),
outFramePlans.end());
return outFramePlans.empty()
? GameViewportFramePlanBuildStatus::NoRenderableCamera
: GameViewportFramePlanBuildStatus::Success;
}
bool EngineGameViewportBridge::RenderFramePlans(
const std::vector<::XCEngine::Rendering::CameraStackFramePlan>& framePlans) {
return !framePlans.empty() &&
m_gameViewportRenderer.Render(framePlans);
}
} // namespace XCEngine::UI::Editor::App