Checkpoint workspace changes
This commit is contained in:
@@ -3,9 +3,6 @@
|
||||
#include "Engine/EditorEngineServices.h"
|
||||
#include "Viewport/ViewportObjectIdPicker.h"
|
||||
|
||||
#include <XCEngine/Rendering/Execution/SceneRenderer.h>
|
||||
#include <XCEngine/Scene/Scene.h>
|
||||
|
||||
#include <utility>
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
@@ -63,12 +60,10 @@ void SceneViewportRenderService::Shutdown() {
|
||||
m_renderRequest = {};
|
||||
m_renderPassBundle.Shutdown();
|
||||
m_engineServices = nullptr;
|
||||
m_sceneRenderer.reset();
|
||||
m_device = nullptr;
|
||||
m_lastTargets = nullptr;
|
||||
m_lastRenderContext = {};
|
||||
m_lastObjectIdScene = nullptr;
|
||||
m_lastObjectIdCamera = nullptr;
|
||||
m_lastObjectIdRequestRevision = 0u;
|
||||
m_objectIdFrameSerialCounter = 0u;
|
||||
}
|
||||
|
||||
@@ -76,8 +71,7 @@ void SceneViewportRenderService::SetRenderRequest(
|
||||
SceneViewportRenderRequest request) {
|
||||
if (m_lastTargets != nullptr &&
|
||||
m_lastTargets->hasValidObjectIdFrame &&
|
||||
(request.scene != m_lastObjectIdScene ||
|
||||
request.camera != m_lastObjectIdCamera)) {
|
||||
request.requestRevision != m_lastObjectIdRequestRevision) {
|
||||
InvalidateObjectIdFrame();
|
||||
}
|
||||
|
||||
@@ -96,7 +90,7 @@ ViewportRenderResult SceneViewportRenderService::Render(
|
||||
m_lastTargets = &targets;
|
||||
m_lastRenderContext = renderContext;
|
||||
|
||||
if (m_renderRequest.camera == nullptr) {
|
||||
if (!m_renderRequest.IsValid()) {
|
||||
return BuildFallbackResult(
|
||||
"Scene view camera is unavailable",
|
||||
0.18f,
|
||||
@@ -105,7 +99,18 @@ ViewportRenderResult SceneViewportRenderService::Render(
|
||||
1.0f);
|
||||
}
|
||||
|
||||
if (m_renderRequest.scene == nullptr) {
|
||||
::XCEngine::Rendering::RenderSurface surface =
|
||||
BuildViewportColorSurface(targets);
|
||||
::XCEngine::Rendering::CameraFramePlan framePlan = {};
|
||||
const SceneViewportFramePlanBuildStatus buildStatus =
|
||||
m_engineServices != nullptr
|
||||
? m_engineServices->BuildSceneViewportFramePlan(
|
||||
m_renderRequest,
|
||||
renderContext,
|
||||
surface,
|
||||
framePlan)
|
||||
: SceneViewportFramePlanBuildStatus::Failed;
|
||||
if (buildStatus == SceneViewportFramePlanBuildStatus::NoActiveScene) {
|
||||
return BuildFallbackResult(
|
||||
"No active scene",
|
||||
0.07f,
|
||||
@@ -113,18 +118,8 @@ ViewportRenderResult SceneViewportRenderService::Render(
|
||||
0.10f,
|
||||
1.0f);
|
||||
}
|
||||
|
||||
EnsureSceneRenderer();
|
||||
|
||||
::XCEngine::Rendering::RenderSurface surface =
|
||||
BuildViewportColorSurface(targets);
|
||||
std::vector<::XCEngine::Rendering::CameraFramePlan> plans =
|
||||
m_sceneRenderer->BuildFramePlans(
|
||||
*m_renderRequest.scene,
|
||||
m_renderRequest.camera,
|
||||
renderContext,
|
||||
surface);
|
||||
if (plans.empty()) {
|
||||
if (buildStatus != SceneViewportFramePlanBuildStatus::Success ||
|
||||
!framePlan.IsValid()) {
|
||||
return BuildFallbackResult(
|
||||
"Scene renderer failed",
|
||||
0.18f,
|
||||
@@ -139,12 +134,13 @@ ViewportRenderResult SceneViewportRenderService::Render(
|
||||
ApplySceneViewportRenderPlan(
|
||||
targets,
|
||||
renderPlan.plan,
|
||||
plans.front());
|
||||
framePlan);
|
||||
if (renderPlan.warningStatusText != nullptr) {
|
||||
SetStatusIfEmpty(result.statusText, renderPlan.warningStatusText);
|
||||
}
|
||||
|
||||
if (!m_sceneRenderer->Render(plans)) {
|
||||
if (m_engineServices == nullptr ||
|
||||
!m_engineServices->RenderSceneViewportFramePlan(framePlan)) {
|
||||
return BuildFallbackResult(
|
||||
"Scene renderer failed",
|
||||
0.18f,
|
||||
@@ -156,19 +152,17 @@ ViewportRenderResult SceneViewportRenderService::Render(
|
||||
MarkSceneViewportRenderSuccess(
|
||||
targets,
|
||||
renderPlan.plan,
|
||||
plans.front());
|
||||
if (plans.front().request.objectId.IsRequested()) {
|
||||
framePlan);
|
||||
if (framePlan.request.objectId.IsRequested()) {
|
||||
++m_objectIdFrameSerialCounter;
|
||||
if (m_objectIdFrameSerialCounter == 0u) {
|
||||
m_objectIdFrameSerialCounter = 1u;
|
||||
}
|
||||
targets.objectIdFrameSerial = m_objectIdFrameSerialCounter;
|
||||
m_lastObjectIdScene = m_renderRequest.scene;
|
||||
m_lastObjectIdCamera = m_renderRequest.camera;
|
||||
m_lastObjectIdRequestRevision = m_renderRequest.requestRevision;
|
||||
} else {
|
||||
targets.objectIdFrameSerial = 0u;
|
||||
m_lastObjectIdScene = nullptr;
|
||||
m_lastObjectIdCamera = nullptr;
|
||||
m_lastObjectIdRequestRevision = 0u;
|
||||
}
|
||||
result.rendered = true;
|
||||
return result;
|
||||
@@ -213,37 +207,25 @@ ViewportObjectIdPickResult SceneViewportRenderService::PickObject(
|
||||
return result;
|
||||
}
|
||||
|
||||
std::uint64_t runtimeObjectId = 0u;
|
||||
EditorSceneObjectId runtimeObjectId = kInvalidEditorSceneObjectId;
|
||||
if (m_engineServices == nullptr ||
|
||||
!m_engineServices->TryResolveRenderObjectId(
|
||||
!m_engineServices->TryResolveActiveSceneRenderObjectId(
|
||||
result.renderObjectId,
|
||||
runtimeObjectId)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (m_lastObjectIdScene == nullptr ||
|
||||
m_lastObjectIdScene->FindByID(runtimeObjectId) == nullptr) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result.resolvedEntityId = runtimeObjectId;
|
||||
return result;
|
||||
}
|
||||
|
||||
void SceneViewportRenderService::EnsureSceneRenderer() {
|
||||
if (!m_sceneRenderer) {
|
||||
m_sceneRenderer = std::make_unique<::XCEngine::Rendering::SceneRenderer>();
|
||||
}
|
||||
}
|
||||
|
||||
void SceneViewportRenderService::InvalidateObjectIdFrame() {
|
||||
if (m_lastTargets != nullptr) {
|
||||
m_lastTargets->hasValidObjectIdFrame = false;
|
||||
m_lastTargets->objectIdFrameSerial = 0u;
|
||||
}
|
||||
|
||||
m_lastObjectIdScene = nullptr;
|
||||
m_lastObjectIdCamera = nullptr;
|
||||
m_lastObjectIdRequestRevision = 0u;
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App
|
||||
|
||||
Reference in New Issue
Block a user