110 lines
2.8 KiB
C++
110 lines
2.8 KiB
C++
|
|
#include "Viewport/GameViewportRenderService.h"
|
||
|
|
|
||
|
|
#include "Engine/GameViewportEngineBridge.h"
|
||
|
|
#include "Viewport/ViewportRenderTargets.h"
|
||
|
|
|
||
|
|
#include <XCEngine/Rendering/Execution/CameraStackFramePlan.h>
|
||
|
|
|
||
|
|
#include <utility>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
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
|