test: close renderer phase boundary

This commit is contained in:
2026-04-02 15:03:31 +08:00
parent ec7a15d85b
commit 617b11f801
4 changed files with 320 additions and 42 deletions

View File

@@ -1,11 +1,14 @@
#pragma once
#include "IViewportHostService.h"
#include "ViewportHostRenderTargets.h"
#include <XCEngine/Core/Math/Color.h>
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/CameraRenderRequest.h>
#include <string>
#include <vector>
namespace XCEngine {
namespace Editor {
@@ -112,6 +115,52 @@ inline ViewportRenderFallbackPolicy BuildGameViewportRenderFailurePolicy(
return policy;
}
struct SceneViewportBuiltinPostProcessBuildResult {
Rendering::BuiltinPostProcessRequest request = {};
const char* warningStatusText = nullptr;
};
inline Rendering::Passes::InfiniteGridPassData BuildSceneViewportGridPassData(
const SceneViewportOverlayData& overlay) {
Rendering::Passes::InfiniteGridPassData data = {};
data.valid = overlay.valid;
data.cameraPosition = overlay.cameraPosition;
data.cameraForward = overlay.cameraForward;
data.cameraRight = overlay.cameraRight;
data.cameraUp = overlay.cameraUp;
data.verticalFovDegrees = overlay.verticalFovDegrees;
data.nearClipPlane = overlay.nearClipPlane;
data.farClipPlane = overlay.farClipPlane;
data.orbitDistance = overlay.orbitDistance;
return data;
}
inline SceneViewportBuiltinPostProcessBuildResult BuildSceneViewportBuiltinPostProcess(
const SceneViewportOverlayData& overlay,
const std::vector<uint64_t>& selectedObjectIds,
bool hasObjectIdShaderView,
bool debugSelectionMask = false) {
SceneViewportBuiltinPostProcessBuildResult result = {};
if (!overlay.valid) {
return result;
}
result.request.gridPassData = BuildSceneViewportGridPassData(overlay);
result.request.selectedObjectIds = selectedObjectIds;
result.request.outlineStyle = {};
result.request.outlineStyle.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
result.request.outlineStyle.outlineWidthPixels = 2.0f;
result.request.outlineStyle.debugSelectionMask = debugSelectionMask;
if (!selectedObjectIds.empty() &&
!debugSelectionMask &&
!hasObjectIdShaderView) {
result.warningStatusText = "Scene object id shader view is unavailable";
}
return result;
}
inline void ApplySceneViewportRenderRequestSetup(
const ViewportRenderTargets& targets,
const Rendering::BuiltinPostProcessRequest* builtinPostProcess,

View File

@@ -37,21 +37,6 @@ namespace {
constexpr bool kDebugSceneSelectionMask = false;
Rendering::Passes::InfiniteGridPassData BuildInfiniteGridPassData(
const SceneViewportOverlayData& overlay) {
Rendering::Passes::InfiniteGridPassData data = {};
data.valid = overlay.valid;
data.cameraPosition = overlay.cameraPosition;
data.cameraForward = overlay.cameraForward;
data.cameraRight = overlay.cameraRight;
data.cameraUp = overlay.cameraUp;
data.verticalFovDegrees = overlay.verticalFovDegrees;
data.nearClipPlane = overlay.nearClipPlane;
data.farClipPlane = overlay.farClipPlane;
data.orbitDistance = overlay.orbitDistance;
return data;
}
Math::Vector3 GetSceneViewportOrientationAxisVector(SceneViewportOrientationAxis axis) {
switch (axis) {
case SceneViewportOrientationAxis::PositiveX:
@@ -410,30 +395,6 @@ private:
policy.clearColor.a);
}
void BuildSceneViewBuiltinPostProcessRequest(
ViewportEntry& entry,
const SceneViewportOverlayData& overlay,
const std::vector<uint64_t>& selectedObjectIds,
Rendering::BuiltinPostProcessRequest& outRequest) {
if (!overlay.valid) {
outRequest = {};
return;
}
outRequest.gridPassData = BuildInfiniteGridPassData(overlay);
outRequest.selectedObjectIds = selectedObjectIds;
outRequest.outlineStyle = {};
outRequest.outlineStyle.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
outRequest.outlineStyle.outlineWidthPixels = 2.0f;
outRequest.outlineStyle.debugSelectionMask = kDebugSceneSelectionMask;
if (!selectedObjectIds.empty() &&
!kDebugSceneSelectionMask &&
entry.renderTargets.objectIdShaderView == nullptr) {
SetViewportStatusIfEmpty(entry.statusText, "Scene object id shader view is unavailable");
}
}
void BuildSceneViewportRenderState(
ViewportEntry& entry,
IEditorContext& context,
@@ -446,11 +407,16 @@ private:
}
outState.selectedObjectIds = context.GetSelectionManager().GetSelectedEntities();
BuildSceneViewBuiltinPostProcessRequest(
entry,
const SceneViewportBuiltinPostProcessBuildResult builtinPostProcess =
BuildSceneViewportBuiltinPostProcess(
outState.overlay,
outState.selectedObjectIds,
outState.builtinPostProcess);
entry.renderTargets.objectIdShaderView != nullptr,
kDebugSceneSelectionMask);
outState.builtinPostProcess = builtinPostProcess.request;
if (builtinPostProcess.warningStatusText != nullptr) {
SetViewportStatusIfEmpty(entry.statusText, builtinPostProcess.warningStatusText);
}
}
bool RenderSceneViewportEntry(