Checkpoint workspace changes

This commit is contained in:
2026-04-29 01:24:21 +08:00
parent 9b6adf1806
commit ef11651ec2
67 changed files with 3161 additions and 1904 deletions

View File

@@ -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