67 lines
1.9 KiB
C++
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
|